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