Skip to content

Commit 3de24cb

Browse files
committed
add du3_dq jacobian for microphysics tracers
1 parent a85ba64 commit 3de24cb

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

config/model_configs/baroclinic_wave_equil.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
precip_model: "0M"
1+
precip_model: "1M"
22
dt_save_state_to_disk: "2days"
33
reproducibility_test: true
44
initial_condition: "MoistBaroclinicWave"
55
dt: "450secs"
6-
t_end: "10days"
7-
moist: "equil"
6+
t_end: "6days"
7+
moist: "nonequil"
88
disable_surface_flux_tendency: true
99
diagnostics:
1010
- short_name: [pfull, wa, va, rv, hus, ke]

src/parameters/Parameters.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ for var in fieldnames(TD.Parameters.ThermodynamicsParameters)
141141
@eval $var(ps::ACAP) = TD.Parameters.$var(thermodynamics_params(ps))
142142
end
143143
# Thermodynamics derived parameters
144-
for var in [:Rv_over_Rd, :kappa_d, :e_int_v0, :cv_v, :cv_l, :cv_d]
144+
for var in [:Rv_over_Rd, :kappa_d, :e_int_v0, :e_int_i0, :cv_v, :cv_l, :cv_d]
145145
@eval $var(ps::ACAP) = TD.Parameters.$var(thermodynamics_params(ps))
146146
end
147147

src/prognostic_equations/implicit/manual_sparse_jacobian.jl

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,16 @@ function jacobian_cache(alg::ManualSparseJacobian, Y, atmos)
9191
is_in_Y(@name(c.sgs⁰.ρatke)) ? (@name(c.sgs⁰.ρatke),) : ()
9292
sfc_if_available = is_in_Y(@name(sfc)) ? (@name(sfc),) : ()
9393

94-
condensate_names = (
94+
condensate_mass_names = (
9595
@name(c.ρq_liq),
9696
@name(c.ρq_ice),
9797
@name(c.ρq_rai),
9898
@name(c.ρq_sno),
99+
)
100+
available_condensate_mass_names =
101+
MatrixFields.unrolled_filter(is_in_Y, condensate_mass_names)
102+
condensate_names = (
103+
condensate_mass_names...,
99104
@name(c.ρn_liq),
100105
@name(c.ρn_rai),
101106
# P3 frozen
@@ -161,6 +166,10 @@ function jacobian_cache(alg::ManualSparseJacobian, Y, atmos)
161166
name -> (@name(f.u₃), name) => similar(Y.f, BidiagonalRow_C3),
162167
active_scalar_names,
163168
)...,
169+
MatrixFields.unrolled_map(
170+
name -> (@name(f.u₃), name) => similar(Y.f, BidiagonalRow_C3),
171+
available_condensate_mass_names,
172+
)...,
164173
(@name(f.u₃), @name(c.uₕ)) => similar(Y.f, BidiagonalRow_C3xACT12),
165174
(@name(f.u₃), @name(f.u₃)) => similar(Y.f, TridiagonalRow_C3xACT3),
166175
)
@@ -421,10 +430,14 @@ function update_jacobian!(alg::ManualSparseJacobian, cache, Y, p, dtγ, t)
421430
LH_s0 = FT(CAP.LH_s0(params))
422431
Δcp_l = FT(CAP.cp_l(params) - CAP.cp_v(params))
423432
Δcp_i = FT(CAP.cp_i(params) - CAP.cp_v(params))
433+
Δcv_l = FT(CAP.cp_l(params)) - FT(CAP.cv_v(params))
434+
Δcv_i = FT(CAP.cp_i(params)) - FT(CAP.cv_v(params))
435+
e_int_v0 = FT(CAP.e_int_v0(params))
436+
e_int_s0 = FT(CAP.e_int_i0(params)) + FT(CAP.e_int_v0(params))
424437
# This term appears a few times in the Jacobian, and is technically
425438
# minus ∂e_int_∂q_tot
426-
thermo_params = CAP.thermodynamics_params(params)
427439
∂e_int_∂q_tot = T_0 * (Δcv_v - R_d) - e_int_v0
440+
thermo_params = CAP.thermodynamics_params(params)
428441
ᶜh_tot = @. lazy(
429442
TD.total_specific_enthalpy(
430443
thermo_params,
@@ -532,6 +545,24 @@ function update_jacobian!(alg::ManualSparseJacobian, cache, Y, p, dtγ, t)
532545
dtγ * ᶠp_grad_matrix DiagonalMatrixRow(ᶜ∂p∂ρq_tot)
533546
end
534547

548+
microphysics_tracers = (
549+
(@name(c.ρq_liq), e_int_v0, Δcv_l),
550+
(@name(c.ρq_ice), e_int_s0, Δcv_i),
551+
(@name(c.ρq_rai), e_int_v0, Δcv_l),
552+
(@name(c.ρq_sno), e_int_s0, Δcv_i),
553+
)
554+
# TODO using unrolled_foreach here allocates! (breaks the flame tests)
555+
# MatrixFields.unrolled_foreach(
556+
# microphysics_tracers,
557+
# ) do (q_name, e_int_q, ∂cv∂q)
558+
for (q_name, e_int_q, ∂cv∂q) in microphysics_tracers
559+
MatrixFields.has_field(Y, q_name) || continue
560+
∂ᶠu₃_err_∂ᶜρq = matrix[@name(f.u₃), q_name]
561+
@. ∂ᶠu₃_err_∂ᶜρq =
562+
dtγ * ᶠp_grad_matrix
563+
DiagonalMatrixRow(ᶜkappa_m * (e_int_q - ∂cv∂q * (T - T_0)) - R_v * T)
564+
end
565+
535566
∂ᶠu₃_err_∂ᶜuₕ = matrix[@name(f.u₃), @name(c.uₕ)]
536567
∂ᶠu₃_err_∂ᶠu₃ = matrix[@name(f.u₃), @name(f.u₃)]
537568
I_u₃ = DiagonalMatrixRow(one_C3xACT3)
@@ -690,6 +721,18 @@ function update_jacobian!(alg::ManualSparseJacobian, cache, Y, p, dtγ, t)
690721
dtγ * ᶜdiffusion_h_matrix DiagonalMatrixRow(1 / ᶜρ)
691722
end
692723

724+
# TODO using unrolled_foreach here allocates! (breaks the flame tests)
725+
# MatrixFields.unrolled_foreach(
726+
# microphysics_tracers,
727+
# ) do (q_name, e_int_q, ∂cv∂q)
728+
for (q_name, e_int_q, ∂cv∂q) in microphysics_tracers
729+
MatrixFields.has_field(Y, qʲ_name) || continue
730+
∂ᶜρe_tot_err_∂ᶜρq = matrix[@name(c.ρe_tot), @name(q_name)]
731+
@. ∂ᶜρe_tot_err_∂ᶜρq =
732+
dtγ * ᶜdiffusion_h_matrix
733+
DiagonalMatrixRow((ᶜkappa_m * (e_int_q - ∂cv∂q * (T - T_0)) - R_v * T) / ᶜρ)
734+
end
735+
693736
MatrixFields.unrolled_foreach(tracer_info) do (ρχ_name, _, α)
694737
MatrixFields.has_field(Y, ρχ_name) || return
695738
∂ᶜρχ_err_∂ᶜρ = matrix[ρχ_name, @name(c.ρ)]

0 commit comments

Comments
 (0)