@@ -184,14 +184,30 @@ function ImplicitEquationJacobian(
184
184
is_in_Y (@name (c. sgs⁰. ρatke)) ? (@name (c. sgs⁰. ρatke),) : ()
185
185
sfc_if_available = is_in_Y (@name (sfc)) ? (@name (sfc),) : ()
186
186
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),
193
200
)
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₃),) : ()
195
211
196
212
# Note: We have to use FT(-1) * I instead of -I because inv(-1) == -1.0,
197
213
# which means that multiplying inv(-1) by a Float32 will yield a Float64.
@@ -266,21 +282,8 @@ function ImplicitEquationJacobian(
266
282
)
267
283
end
268
284
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
-
281
285
sgs_advection_blocks = if atmos. turbconv_model isa PrognosticEDMFX
282
286
@assert n_prognostic_mass_flux_subdomains (atmos. turbconv_model) == 1
283
-
284
287
if use_derivative (sgs_advection_flag)
285
288
(
286
289
MatrixFields. unrolled_map (
@@ -353,79 +356,65 @@ function ImplicitEquationJacobian(
353
356
sgs_massflux_blocks... ,
354
357
)
355
358
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... ,
367
365
available_sgs_scalar_names... ,
368
- names₁_group₂... ,
369
- names₁_group₃... ,
370
366
)
371
367
372
- alg₂ = MatrixFields. BlockLowerTriangularSolve (
368
+ velocity_alg = MatrixFields. BlockLowerTriangularSolve (
373
369
@name (c. uₕ),
374
- sgs_u³_names_if_available ... ,
370
+ sgs_u³_if_available ... ,
375
371
)
376
- alg =
372
+ full_alg =
377
373
if use_derivative (diffusion_flag) ||
378
374
use_derivative (sgs_advection_flag) ||
379
375
! (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 =
381
382
if atmos. turbconv_model isa PrognosticEDMFX &&
382
383
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... ;
391
386
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);
394
388
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,
400
391
),
401
- )
392
+ ),
402
393
)
403
394
else
404
- is_in_Y (@name (c. ρq_tot)) ?
405
- (;
406
- alg₂ = MatrixFields. BlockLowerTriangularSolve (
407
- names₁_group₂... ,
408
- )
409
- ) : (;)
395
+ gs_scalar_subalg
410
396
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 ,
414
400
)
415
401
MatrixFields. ApproximateBlockArrowheadIterativeSolve (
416
- names₁ ... ;
417
- alg₁,
418
- alg₂,
402
+ available_scalar_names ... ;
403
+ alg₁ = scalar_alg ,
404
+ alg₂ = velocity_alg ,
419
405
P_alg₁ = MatrixFields. MainDiagonalPreconditioner (),
420
406
n_iters = approximate_solve_iters,
421
407
)
422
408
else
423
- MatrixFields. BlockArrowheadSolve (names₁... ; alg₂)
409
+ MatrixFields. BlockArrowheadSolve (
410
+ available_scalar_names... ;
411
+ alg₂ = velocity_alg,
412
+ )
424
413
end
425
414
426
415
return ImplicitEquationJacobian (
427
416
matrix,
428
- MatrixFields. FieldMatrixSolver (alg , matrix, Y),
417
+ MatrixFields. FieldMatrixSolver (full_alg , matrix, Y),
429
418
diffusion_flag,
430
419
topography_flag,
431
420
sgs_advection_flag,
0 commit comments