@@ -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