Skip to content

Commit 2388a59

Browse files
committed
add du3_dq jacobian for microphysics tracers
1 parent a85ba64 commit 2388a59

File tree

3 files changed

+67
-6
lines changed

3 files changed

+67
-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: 63 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
)
@@ -183,6 +192,10 @@ function jacobian_cache(alg::ManualSparseJacobian, Y, atmos)
183192
similar(Y.c, TridiagonalRow),
184193
) : ()
185194
)...,
195+
MatrixFields.unrolled_map(
196+
name -> (@name(c.ρe_tot), name) => similar(Y.f, TridiagonalRow),
197+
available_condensate_mass_names,
198+
)...,
186199
(@name(c.uₕ), @name(c.uₕ)) =>
187200
!isnothing(atmos.turbconv_model) ||
188201
!disable_momentum_vertical_diffusion(
@@ -421,10 +434,14 @@ function update_jacobian!(alg::ManualSparseJacobian, cache, Y, p, dtγ, t)
421434
LH_s0 = FT(CAP.LH_s0(params))
422435
Δcp_l = FT(CAP.cp_l(params) - CAP.cp_v(params))
423436
Δcp_i = FT(CAP.cp_i(params) - CAP.cp_v(params))
437+
Δcv_l = FT(CAP.cp_l(params)) - FT(CAP.cv_v(params))
438+
Δcv_i = FT(CAP.cp_i(params)) - FT(CAP.cv_v(params))
439+
e_int_v0 = FT(CAP.e_int_v0(params))
440+
e_int_s0 = FT(CAP.e_int_i0(params)) + FT(CAP.e_int_v0(params))
424441
# This term appears a few times in the Jacobian, and is technically
425442
# minus ∂e_int_∂q_tot
426-
thermo_params = CAP.thermodynamics_params(params)
427443
∂e_int_∂q_tot = T_0 * (Δcv_v - R_d) - e_int_v0
444+
thermo_params = CAP.thermodynamics_params(params)
428445
ᶜh_tot = @. lazy(
429446
TD.total_specific_enthalpy(
430447
thermo_params,
@@ -532,6 +549,24 @@ function update_jacobian!(alg::ManualSparseJacobian, cache, Y, p, dtγ, t)
532549
dtγ * ᶠp_grad_matrix DiagonalMatrixRow(ᶜ∂p∂ρq_tot)
533550
end
534551

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

728+
# TODO using unrolled_foreach here allocates! (breaks the flame tests)
729+
# MatrixFields.unrolled_foreach(
730+
# microphysics_tracers,
731+
# ) do (q_name, e_int_q, ∂cv∂q)
732+
for (q_name, e_int_q, ∂cv∂q) in microphysics_tracers
733+
MatrixFields.has_field(Y, q_name) || continue
734+
∂ᶜρe_tot_err_∂ᶜρq = matrix[@name(c.ρe_tot), @name(q_name)]
735+
@. ∂ᶜρe_tot_err_∂ᶜρq =
736+
dtγ * ᶜdiffusion_h_matrix
737+
DiagonalMatrixRow((ᶜkappa_m * (e_int_q - ∂cv∂q * (T - T_0)) - R_v * T) / ᶜρ)
738+
end
739+
693740
MatrixFields.unrolled_foreach(tracer_info) do (ρχ_name, _, α)
694741
MatrixFields.has_field(Y, ρχ_name) || return
695742
∂ᶜρχ_err_∂ᶜρ = matrix[ρχ_name, @name(c.ρ)]
@@ -1218,6 +1265,20 @@ function update_jacobian!(alg::ManualSparseJacobian, cache, Y, p, dtγ, t)
12181265
p.scratch.ᶜtridiagonal_matrix_scalar
12191266
DiagonalMatrixRow(ᶜ∂p∂ρq_tot / ᶜρ)
12201267

1268+
# TODO using unrolled_foreach here allocates! (breaks the flame tests)
1269+
# MatrixFields.unrolled_foreach(
1270+
# microphysics_tracers,
1271+
# ) do (q_name, e_int_q, ∂cv∂q)
1272+
for (q_name, e_int_q, ∂cv∂q) in microphysics_tracers
1273+
MatrixFields.has_field(Y, q_name) || continue
1274+
∂ᶜρe_tot_err_∂ᶜρq = matrix[@name(c.ρe_tot), @name(q_name)]
1275+
@. ∂ᶜρe_tot_err_∂ᶜρq +=
1276+
p.scratch.ᶜtridiagonal_matrix_scalar
1277+
DiagonalMatrixRow(
1278+
(ᶜkappa_m * (e_int_q - ∂cv∂q * (T - T_0)) - R_v * T) / ᶜρ,
1279+
)
1280+
end
1281+
12211282
@. ∂ᶜρe_tot_err_∂ᶜρe_tot +=
12221283
p.scratch.ᶜtridiagonal_matrix_scalar
12231284
DiagonalMatrixRow((1 + ᶜkappa_m) / ᶜρ)

0 commit comments

Comments
 (0)