Skip to content

Commit 3d99876

Browse files
authored
Merge pull request #3702 from CliMA/zs/scale_diffusion
add a scaling factor for precipitation diffusion
2 parents 7ef3d88 + 4b82a94 commit 3d99876

File tree

8 files changed

+47
-11
lines changed

8 files changed

+47
-11
lines changed

.buildkite/Manifest-v1.11.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,9 +394,9 @@ version = "0.2.12"
394394

395395
[[deps.ClimaParams]]
396396
deps = ["TOML"]
397-
git-tree-sha1 = "5f624b24e522ce61bbe0b63ce6fb1c7381b9fa91"
397+
git-tree-sha1 = "bf8fdee01cf5ea7e5e9fa00ac32367f65448484e"
398398
uuid = "5c42b081-d73a-476f-9059-fd94b934656c"
399-
version = "0.10.21"
399+
version = "0.10.23"
400400

401401
[[deps.ClimaReproducibilityTests]]
402402
deps = ["OrderedCollections", "PrettyTables"]

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ AtmosphericProfilesLibrary = "0.1.7"
4545
ClimaComms = "0.6.6"
4646
ClimaCore = "0.14.24"
4747
ClimaDiagnostics = "0.2.12"
48-
ClimaParams = "0.10.19"
48+
ClimaParams = "0.10.23"
4949
ClimaTimeSteppers = "0.8.2"
5050
ClimaUtilities = "0.1.22"
5151
CloudMicrophysics = "0.22.9"

src/cache/temporary_quantities.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ function temporary_quantities(Y, atmos)
6565
BidiagonalMatrixRow{Adjoint{FT, C3{FT}}},
6666
),
6767
ᶜdiffusion_h_matrix = similar(Y.c, TridiagonalMatrixRow{FT}),
68+
ᶜdiffusion_h_matrix_scaled = similar(Y.c, TridiagonalMatrixRow{FT}),
69+
ᶜtridiagonal_matrix_scalar = similar(Y.c, TridiagonalMatrixRow{FT}),
6870
ᶜdiffusion_u_matrix = similar(Y.c, TridiagonalMatrixRow{FT}),
6971
ᶠtridiagonal_matrix_c3 = similar(Y.f, TridiagonalMatrixRow{C3{FT}}),
7072
)

src/parameters/Parameters.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ Base.@kwdef struct ClimaAtmosParameters{
106106
water_refractive_index::FT
107107
optics_lookup_temperature_min::FT
108108
optics_lookup_temperature_max::FT
109+
# Hyperdiffusion
110+
α_hyperdiff_tracer::FT
111+
# Vertical diffusion
112+
α_vert_diff_tracer::FT
109113
end
110114

111115
Base.eltype(::ClimaAtmosParameters{FT}) where {FT} = FT

src/parameters/create_parameters.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ atmos_name_map = (;
105105
:water_refractive_index => :water_refractive_index,
106106
:optics_lookup_temperature_min => :optics_lookup_temperature_min,
107107
:optics_lookup_temperature_max => :optics_lookup_temperature_max,
108+
:tracer_hyperdiffusion_factor => :α_hyperdiff_tracer,
109+
:tracer_vertical_diffusion_factor => :α_vert_diff_tracer,
108110
)
109111

110112
cloud_parameters(::Type{FT}) where {FT <: AbstractFloat} =

src/prognostic_equations/hyperdiffusion.jl

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ NVTX.@annotate function apply_tracer_hyperdiffusion_tendency!(Yₜ, Y, p, t)
230230
(; hyperdiff, turbconv_model) = p.atmos
231231
isnothing(hyperdiff) && return nothing
232232

233+
α_hyperdiff_tracer = CAP.α_hyperdiff_tracer(p.params)
233234
(; ν₄_scalar_coeff) = hyperdiff
234235
h_space = Spaces.horizontal_space(axes(Y.c))
235236
h_length_scale = Spaces.node_horizontal_length_scale(h_space) # mean nodal distance
@@ -244,11 +245,13 @@ NVTX.@annotate function apply_tracer_hyperdiffusion_tendency!(Yₜ, Y, p, t)
244245
# TODO: Figure out why caching the duplicated tendencies in ᶜtemp_scalar
245246
# triggers allocations.
246247
for (ᶜρχₜ, ᶜ∇²χ, χ_name) in matching_subfields(Yₜ.c, ᶜ∇²specific_tracers)
247-
ν₄_scalar = ifelse(χ_name in (:q_rai, :q_sno), 0 * ν₄_scalar, ν₄_scalar)
248+
ν₄_scalar = ifelse(
249+
χ_name in (:q_rai, :q_sno),
250+
α_hyperdiff_tracer * ν₄_scalar,
251+
ν₄_scalar,
252+
)
248253
@. ᶜρχₜ -= ν₄_scalar * wdivₕ(Y.c.ρ * gradₕ(ᶜ∇²χ))
249-
if !(χ_name in (:q_rai, :q_sno))
250-
@. Yₜ.c.ρ -= ν₄_scalar * wdivₕ(Y.c.ρ * gradₕ(ᶜ∇²χ))
251-
end
254+
@. Yₜ.c.ρ -= ν₄_scalar * wdivₕ(Y.c.ρ * gradₕ(ᶜ∇²χ))
252255
end
253256
if turbconv_model isa PrognosticEDMFX
254257
(; ᶜ∇²q_totʲs) = p.hyperdiff

src/prognostic_equations/implicit/implicit_solver.jl

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,8 @@ NVTX.@annotate function Wfact!(A, Y, p, dtγ, t)
503503
p.scratch.ᶠp_grad_matrix,
504504
p.scratch.ᶜadvection_matrix,
505505
p.scratch.ᶜdiffusion_h_matrix,
506+
p.scratch.ᶜdiffusion_h_matrix_scaled,
507+
p.scratch.ᶜtridiagonal_matrix_scalar,
506508
p.scratch.ᶜdiffusion_u_matrix,
507509
p.scratch.ᶠbidiagonal_matrix_ct3,
508510
p.scratch.ᶠbidiagonal_matrix_ct3_2,
@@ -540,7 +542,13 @@ function update_implicit_equation_jacobian!(A, Y, p, dtγ)
540542
ᶠbidiagonal_matrix_ct3_2,
541543
ᶠtridiagonal_matrix_c3,
542544
) = p
543-
(; ᶜdiffusion_h_matrix, ᶜdiffusion_u_matrix, params) = p
545+
(;
546+
ᶜdiffusion_h_matrix,
547+
ᶜdiffusion_h_matrix_scaled,
548+
ᶜtridiagonal_matrix_scalar,
549+
ᶜdiffusion_u_matrix,
550+
params,
551+
) = p
544552
(; edmfx_upwinding) = p.atmos.numerics
545553

546554
FT = Spaces.undertype(axes(Y.c))
@@ -716,10 +724,15 @@ function update_implicit_equation_jacobian!(A, Y, p, dtγ)
716724
end
717725

718726
if use_derivative(diffusion_flag)
727+
α_vert_diff_tracer = CAP.α_vert_diff_tracer(params)
719728
(; ᶜK_h, ᶜK_u) = p
720729
@. ᶜdiffusion_h_matrix =
721730
ᶜadvdivᵥ_matrix() DiagonalMatrixRow(ᶠinterp(ᶜρ) * ᶠinterp(ᶜK_h))
722731
ᶠgradᵥ_matrix()
732+
@. ᶜdiffusion_h_matrix_scaled =
733+
ᶜadvdivᵥ_matrix() DiagonalMatrixRow(
734+
ᶠinterp(ᶜρ) * ᶠinterp(α_vert_diff_tracer * ᶜK_h),
735+
) ᶠgradᵥ_matrix()
723736
if (
724737
MatrixFields.has_field(Y, @name(c.sgs⁰.ρatke)) ||
725738
!isnothing(p.atmos.turbconv_model) ||
@@ -759,10 +772,15 @@ function update_implicit_equation_jacobian!(A, Y, p, dtγ)
759772
ᶜq = MatrixFields.get_field(ᶜspecific, q_name)
760773
∂ᶜρq_err_∂ᶜρ = matrix[ρq_name, @name(c.ρ)]
761774
∂ᶜρq_err_∂ᶜρq = matrix[ρq_name, ρq_name]
775+
ᶜtridiagonal_matrix_scalar = ifelse(
776+
q_name in (:q_rai, :q_sno),
777+
ᶜdiffusion_h_matrix_scaled,
778+
ᶜdiffusion_h_matrix,
779+
)
762780
@. ∂ᶜρq_err_∂ᶜρ =
763-
dtγ * ᶜdiffusion_h_matrix DiagonalMatrixRow(-(ᶜq) / ᶜρ)
781+
dtγ * ᶜtridiagonal_matrix_scalar DiagonalMatrixRow(-(ᶜq) / ᶜρ)
764782
@. ∂ᶜρq_err_∂ᶜρq +=
765-
dtγ * ᶜdiffusion_h_matrix DiagonalMatrixRow(1 / ᶜρ)
783+
dtγ * ᶜtridiagonal_matrix_scalar DiagonalMatrixRow(1 / ᶜρ)
766784
end
767785

768786
if MatrixFields.has_field(Y, @name(c.sgs⁰.ρatke))

src/prognostic_equations/vertical_diffusion_boundary_layer.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ function vertical_diffusion_boundary_layer_tendency!(
1818
::Union{VerticalDiffusion, DecayWithHeightDiffusion},
1919
)
2020
FT = eltype(Y)
21-
(; ᶜu, ᶜh_tot, ᶜspecific, ᶜK_u, ᶜK_h, sfc_conditions) = p.precomputed
21+
α_vert_diff_tracer = CAP.α_vert_diff_tracer(p.params)
22+
(; ᶜu, ᶜh_tot, ᶜspecific, ᶜK_u, ᶜK_h) = p.precomputed
2223
ᶠgradᵥ = Operators.GradientC2F() # apply BCs to ᶜdivᵥ, which wraps ᶠgradᵥ
2324

2425
if !disable_momentum_vertical_diffusion(p.atmos.vert_diff)
@@ -38,8 +39,14 @@ function vertical_diffusion_boundary_layer_tendency!(
3839
ᶜdivᵥ_ρe_tot(-(ᶠinterp(Y.c.ρ) * ᶠinterp(ᶜK_h) * ᶠgradᵥ(ᶜh_tot)))
3940

4041
ᶜρχₜ_diffusion = p.scratch.ᶜtemp_scalar
42+
ᶜK_h_scaled = p.scratch.ᶜtemp_scalar_2
4143
for (ᶜρχₜ, ᶜχ, χ_name) in matching_subfields(Yₜ.c, ᶜspecific)
4244
χ_name == :e_tot && continue
45+
if χ_name in (:q_rai, :q_sno)
46+
@. ᶜK_h_scaled = α_vert_diff_tracer * ᶜK_h
47+
else
48+
@. ᶜK_h_scaled = ᶜK_h
49+
end
4350
ᶜdivᵥ_ρχ = Operators.DivergenceF2C(
4451
top = Operators.SetValue(C3(FT(0))),
4552
bottom = Operators.SetValue(C3(FT(0))),

0 commit comments

Comments
 (0)