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