@@ -399,7 +399,7 @@ function update_jacobian!(alg::ManualSparseJacobian, cache, Y, p, dtγ, t)
399399 (; matrix) = cache
400400 (; params) = p
401401 (; ᶜΦ, ᶠgradᵥ_ᶜΦ) = p. core
402- (; ᶜspecific, ᶠu³, ᶜK, ᶜts, ᶜp, ᶜh_tot) = p. precomputed
402+ (; ᶠu³, ᶜK, ᶜts, ᶜp, ᶜh_tot) = p. precomputed
403403 (;
404404 ∂ᶜK_∂ᶜuₕ,
405405 ∂ᶜK_∂ᶠu₃,
@@ -477,20 +477,22 @@ function update_jacobian!(alg::ManualSparseJacobian, cache, Y, p, dtγ, t)
477477 ∂ᶜρ_err_∂ᶠu₃ = matrix[@name (c. ρ), @name (f. u₃)]
478478 @. ∂ᶜρ_err_∂ᶠu₃ = dtγ * ᶜadvection_matrix ⋅ DiagonalMatrixRow (g³³ (ᶠgⁱʲ))
479479
480- tracer_info = (
481- (@name (c. ρe_tot), @name (ᶜh_tot)),
482- (@name (c. ρq_tot), @name (ᶜspecific. q_tot)),
483- )
484- MatrixFields. unrolled_foreach (tracer_info) do (ρχ_name, χ_name)
480+ tracer_info = (@name (c. ρe_tot), @name (c. ρq_tot))
481+ MatrixFields. unrolled_foreach (tracer_info) do ρχ_name
485482 MatrixFields. has_field (Y, ρχ_name) || return
486- ᶜχ = MatrixFields. get_field (p. precomputed, χ_name)
483+ ᶜχ = if ρχ_name === @name (c. ρe_tot)
484+ p. precomputed. ᶜh_tot
485+ else
486+ @. lazy (specific (Y. c. ρq_tot, Y. c. ρ))
487+ end
487488 if use_derivative (topography_flag)
488489 ∂ᶜρχ_err_∂ᶜuₕ = matrix[ρχ_name, @name (c. uₕ)]
490+ @. ∂ᶜρχ_err_∂ᶜuₕ =
491+ dtγ * ᶜadvection_matrix ⋅ DiagonalMatrixRow (ᶠinterp (ᶜχ)) ⋅
492+ ᶠwinterp_matrix (ᶜJ * ᶜρ) ⋅ DiagonalMatrixRow (g³ʰ (ᶜgⁱʲ))
489493 end
494+
490495 ∂ᶜρχ_err_∂ᶠu₃ = matrix[ρχ_name, @name (f. u₃)]
491- use_derivative (topography_flag) && @. ∂ᶜρχ_err_∂ᶜuₕ =
492- dtγ * ᶜadvection_matrix ⋅ DiagonalMatrixRow (ᶠinterp (ᶜχ)) ⋅
493- ᶠwinterp_matrix (ᶜJ * ᶜρ) ⋅ DiagonalMatrixRow (g³ʰ (ᶜgⁱʲ))
494496 @. ∂ᶜρχ_err_∂ᶠu₃ =
495497 dtγ * ᶜadvection_matrix ⋅ DiagonalMatrixRow (ᶠinterp (ᶜχ) * g³³ (ᶠgⁱʲ))
496498 end
@@ -536,12 +538,12 @@ function update_jacobian!(alg::ManualSparseJacobian, cache, Y, p, dtγ, t)
536538 end
537539
538540 tracer_info = (
539- (@name (c. ρq_liq), @name (q_liq), @name ( ᶜwₗ)),
540- (@name (c. ρq_ice), @name (q_ice), @name ( ᶜwᵢ)),
541- (@name (c. ρq_rai), @name (q_rai), @name ( ᶜwᵣ)),
542- (@name (c. ρq_sno), @name (q_sno), @name ( ᶜwₛ)),
543- (@name (c. ρn_liq), @name (n_liq), @name ( ᶜwnₗ)),
544- (@name (c. ρn_rai), @name (n_rai), @name ( ᶜwnᵣ)),
541+ (@name (c. ρq_liq), @name (ᶜwₗ)),
542+ (@name (c. ρq_ice), @name (ᶜwᵢ)),
543+ (@name (c. ρq_rai), @name (ᶜwᵣ)),
544+ (@name (c. ρq_sno), @name (ᶜwₛ)),
545+ (@name (c. ρn_liq), @name (ᶜwnₗ)),
546+ (@name (c. ρn_rai), @name (ᶜwnᵣ)),
545547 )
546548 if ! (p. atmos. moisture_model isa DryModel) || use_derivative (diffusion_flag)
547549 ∂ᶜρe_tot_err_∂ᶜρe_tot = matrix[@name (c. ρe_tot), @name (c. ρe_tot)]
@@ -583,13 +585,13 @@ function update_jacobian!(alg::ManualSparseJacobian, cache, Y, p, dtγ, t)
583585 # DiagonalMatrixRow(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) ⋅ ᶠright_bias_matrix() ⋅
584586 # DiagonalMatrixRow(
585587 # -1 / ᶜρ * ifelse(
586- # ᶜspecific.q_tot == 0,
588+ # specific(Y.c.ρq_tot, Y.c.ρ) == 0,
587589 # (Geometry.WVector(FT(0)),),
588- # p.precomputed.ᶜwₜqₜ / ᶜspecific.q_tot ,
590+ # p.precomputed.ᶜwₜqₜ / specific(Y.c.ρq_tot, Y.c.ρ) ,
589591 # ),
590592 # ) - (I,)
591593
592- MatrixFields. unrolled_foreach (tracer_info) do (ρχₚ_name, _, wₚ_name)
594+ MatrixFields. unrolled_foreach (tracer_info) do (ρχₚ_name, wₚ_name)
593595 MatrixFields. has_field (Y, ρχₚ_name) || return
594596 ∂ᶜρχₚ_err_∂ᶜρχₚ = matrix[ρχₚ_name, ρχₚ_name]
595597 ᶜwₚ = MatrixFields. get_field (p. precomputed, wₚ_name)
@@ -651,13 +653,14 @@ function update_jacobian!(alg::ManualSparseJacobian, cache, Y, p, dtγ, t)
651653 dtγ * ᶜdiffusion_h_matrix ⋅ DiagonalMatrixRow (1 / ᶜρ)
652654 end
653655
654- MatrixFields. unrolled_foreach (tracer_info) do (ρχ_name, χ_name, _)
656+ MatrixFields. unrolled_foreach (tracer_info) do (ρχ_name, _)
655657 MatrixFields. has_field (Y, ρχ_name) || return
656- ᶜχ = MatrixFields. get_field (ᶜspecific, χ_name)
658+ ᶜρχ = MatrixFields. get_field (Y, ρχ_name)
659+ ᶜχ = @. lazy (specific (ᶜρχ, Y. c. ρ))
657660 ∂ᶜρχ_err_∂ᶜρ = matrix[ρχ_name, @name (c. ρ)]
658661 ∂ᶜρχ_err_∂ᶜρχ = matrix[ρχ_name, ρχ_name]
659662 ᶜtridiagonal_matrix_scalar = ifelse (
660- χ_name in (@name (q_rai ), @name (q_sno ), @name (n_rai )),
663+ ρχ_name in (@name (c . ρq_rai ), @name (c . ρq_sno ), @name (c . ρn_rai )),
661664 ᶜdiffusion_h_matrix_scaled,
662665 ᶜdiffusion_h_matrix,
663666 )
0 commit comments