Skip to content

Commit eb7c7f5

Browse files
Olivia Alcabesoalcabes
authored andcommitted
making implicit solve much more readable
1 parent 8788845 commit eb7c7f5

File tree

1 file changed

+56
-67
lines changed

1 file changed

+56
-67
lines changed

src/prognostic_equations/implicit/implicit_solver.jl

Lines changed: 56 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -184,14 +184,30 @@ function ImplicitEquationJacobian(
184184
is_in_Y(@name(c.sgs⁰.ρatke)) ? (@name(c.sgs⁰.ρatke),) : ()
185185
sfc_if_available = is_in_Y(@name(sfc)) ? (@name(sfc),) : ()
186186

187-
tracer_names = (
188-
@name(c.ρq_tot),
189-
@name(c.ρq_liq),
190-
@name(c.ρq_ice),
191-
@name(c.ρq_rai),
192-
@name(c.ρq_sno),
187+
condensate_names =
188+
(@name(c.ρq_liq), @name(c.ρq_ice), @name(c.ρq_rai), @name(c.ρq_sno))
189+
available_condensate_names =
190+
MatrixFields.unrolled_filter(is_in_Y, condensate_names)
191+
available_tracer_names =
192+
(ρq_tot_if_available..., available_condensate_names...)
193+
194+
sgs_tracer_names = (
195+
@name(c.sgsʲs.:(1).q_tot),
196+
@name(c.sgsʲs.:(1).q_liq),
197+
@name(c.sgsʲs.:(1).q_ice),
198+
@name(c.sgsʲs.:(1).q_rai),
199+
@name(c.sgsʲs.:(1).q_sno),
193200
)
194-
available_tracer_names = MatrixFields.unrolled_filter(is_in_Y, tracer_names)
201+
available_sgs_tracer_names =
202+
MatrixFields.unrolled_filter(is_in_Y, sgs_tracer_names)
203+
204+
sgs_scalar_names =
205+
(sgs_tracer_names..., @name(c.sgsʲs.:(1).mse), @name(c.sgsʲs.:(1).ρa))
206+
available_sgs_scalar_names =
207+
MatrixFields.unrolled_filter(is_in_Y, sgs_scalar_names)
208+
209+
sgs_u³_if_available =
210+
is_in_Y(@name(f.sgsʲs.:(1).u₃)) ? (@name(f.sgsʲs.:(1).u₃),) : ()
195211

196212
# Note: We have to use FT(-1) * I instead of -I because inv(-1) == -1.0,
197213
# which means that multiplying inv(-1) by a Float32 will yield a Float64.
@@ -266,21 +282,8 @@ function ImplicitEquationJacobian(
266282
)
267283
end
268284

269-
sgs_scalar_names = (
270-
@name(c.sgsʲs.:(1).q_tot),
271-
@name(c.sgsʲs.:(1).q_liq),
272-
@name(c.sgsʲs.:(1).q_ice),
273-
@name(c.sgsʲs.:(1).q_rai),
274-
@name(c.sgsʲs.:(1).q_sno),
275-
@name(c.sgsʲs.:(1).mse),
276-
@name(c.sgsʲs.:(1).ρa)
277-
)
278-
available_sgs_scalar_names =
279-
MatrixFields.unrolled_filter(is_in_Y, sgs_scalar_names)
280-
281285
sgs_advection_blocks = if atmos.turbconv_model isa PrognosticEDMFX
282286
@assert n_prognostic_mass_flux_subdomains(atmos.turbconv_model) == 1
283-
284287
if use_derivative(sgs_advection_flag)
285288
(
286289
MatrixFields.unrolled_map(
@@ -353,79 +356,65 @@ function ImplicitEquationJacobian(
353356
sgs_massflux_blocks...,
354357
)
355358

356-
sgs_u³_names_if_available = if atmos.turbconv_model isa PrognosticEDMFX
357-
(@name(f.sgsʲs.:(1).u₃),)
358-
else
359-
()
360-
end
361-
362-
names₁_group₁ = (@name(c.ρ), sfc_if_available...)
363-
names₁_group₂ = (available_tracer_names..., ρatke_if_available...)
364-
names₁_group₃ = (@name(c.ρe_tot),)
365-
names₁ = (
366-
names₁_group₁...,
359+
mass_and_surface_names = (@name(c.ρ), sfc_if_available...)
360+
available_scalar_names = (
361+
mass_and_surface_names...,
362+
available_tracer_names...,
363+
@name(c.ρe_tot),
364+
ρatke_if_available...,
367365
available_sgs_scalar_names...,
368-
names₁_group₂...,
369-
names₁_group₃...,
370366
)
371367

372-
alg₂ = MatrixFields.BlockLowerTriangularSolve(
368+
velocity_alg = MatrixFields.BlockLowerTriangularSolve(
373369
@name(c.uₕ),
374-
sgs_u³_names_if_available...,
370+
sgs_u³_if_available...,
375371
)
376-
alg =
372+
full_alg =
377373
if use_derivative(diffusion_flag) ||
378374
use_derivative(sgs_advection_flag) ||
379375
!(atmos.moisture_model isa DryModel)
380-
alg₁_subalg₂ =
376+
gs_scalar_subalg = if !(atmos.moisture_model isa DryModel)
377+
MatrixFields.BlockLowerTriangularSolve(@name(c.ρq_tot))
378+
else
379+
MatrixFields.BlockDiagonalSolve()
380+
end
381+
scalar_subalg =
381382
if atmos.turbconv_model isa PrognosticEDMFX &&
382383
use_derivative(sgs_advection_flag)
383-
diff_subalg =
384-
use_derivative(diffusion_flag) ?
385-
(;
386-
alg₂ = MatrixFields.BlockLowerTriangularSolve(
387-
names₁_group₂...,
388-
)
389-
) : (;)
390-
(;
384+
MatrixFields.BlockLowerTriangularSolve(
385+
available_sgs_tracer_names...;
391386
alg₂ = MatrixFields.BlockLowerTriangularSolve(
392-
# TODO: What needs to be changed here for 1M?
393-
@name(c.sgsʲs.:(1).q_tot);
387+
@name(c.sgsʲs.:(1).mse);
394388
alg₂ = MatrixFields.BlockLowerTriangularSolve(
395-
@name(c.sgsʲs.:(1).mse);
396-
alg₂ = MatrixFields.BlockLowerTriangularSolve(
397-
@name(c.sgsʲs.:(1).ρa);
398-
diff_subalg...,
399-
),
389+
@name(c.sgsʲs.:(1).ρa);
390+
alg₂ = gs_scalar_subalg,
400391
),
401-
)
392+
),
402393
)
403394
else
404-
is_in_Y(@name(c.ρq_tot)) ?
405-
(;
406-
alg₂ = MatrixFields.BlockLowerTriangularSolve(
407-
names₁_group₂...,
408-
)
409-
) : (;)
395+
gs_scalar_subalg
410396
end
411-
alg₁ = MatrixFields.BlockLowerTriangularSolve(
412-
names₁_group₁...;
413-
alg₁_subalg₂...,
397+
scalar_alg = MatrixFields.BlockLowerTriangularSolve(
398+
mass_and_surface_names...;
399+
alg= scalar_subalg,
414400
)
415401
MatrixFields.ApproximateBlockArrowheadIterativeSolve(
416-
names₁...;
417-
alg₁,
418-
alg₂,
402+
available_scalar_names...;
403+
alg₁ = scalar_alg,
404+
alg₂ = velocity_alg,
419405
P_alg₁ = MatrixFields.MainDiagonalPreconditioner(),
420406
n_iters = approximate_solve_iters,
421407
)
422408
else
423-
MatrixFields.BlockArrowheadSolve(names₁...; alg₂)
409+
MatrixFields.BlockArrowheadSolve(
410+
available_scalar_names...;
411+
alg₂ = velocity_alg,
412+
)
424413
end
425414

426415
return ImplicitEquationJacobian(
427416
matrix,
428-
MatrixFields.FieldMatrixSolver(alg, matrix, Y),
417+
MatrixFields.FieldMatrixSolver(full_alg, matrix, Y),
429418
diffusion_flag,
430419
topography_flag,
431420
sgs_advection_flag,

0 commit comments

Comments
 (0)