FE-Project
Loading...
Searching...
No Matches
scale_atm_phy_cp_dgm_mconv_adjustment Module Reference

module FElib / Atmosphere / Physics cumulus parameterization More...

Functions/Subroutines

subroutine, public atm_phy_cp_dgm_mconv_adjustment_setup ()
 Setup a module for moist convective adjustment scheme.
subroutine, public atm_phy_cp_dgm_mconv_adjustment_calc_tendency (dens_t, rhot_t, rhoqv_t, sflx_rain, sflx_engi, ddens, drhot, qv, pt, pres, dens_hyd, rtot, cptot, dtsec, lmesh, elem, elem1d)
 Calculate tendencies with moist convective adjustment scheme.
subroutine, public atm_phy_cp_dgm_mconv_adjustment_finalize ()
 Finalize a module for moist convective adjustment scheme.

Detailed Description

module FElib / Atmosphere / Physics cumulus parameterization

Description
A module providing a moist convective adjustment scheme.

Saturated convective instability is diagnosed from the vertical gradient of saturated moist static energy in nearly saturated layers. The diagnosed layer is adjusted toward a moist-neutral temperature profile subject to column-integrated moist-static-energy and available-water constraints. Condensed water is immediately removed as precipitation.

Author
Yuta Kawai, Team SCALE
Reference
Manabe, S., J. Smagorinsky, and R. F. Strickler (1965): Simulated Climatology of a General Circulation Model with a Hydrologic Cycle. Monthly Weather Review, 93, 769-798.

Function/Subroutine Documentation

◆ atm_phy_cp_dgm_mconv_adjustment_setup()

subroutine, public scale_atm_phy_cp_dgm_mconv_adjustment::atm_phy_cp_dgm_mconv_adjustment_setup

Setup a module for moist convective adjustment scheme.

Definition at line 109 of file scale_atm_phy_cp_dgm_mconv_adjustment.F90.

110 implicit none
111 !----------------------------------------------------
112 return

◆ atm_phy_cp_dgm_mconv_adjustment_calc_tendency()

subroutine, public scale_atm_phy_cp_dgm_mconv_adjustment::atm_phy_cp_dgm_mconv_adjustment_calc_tendency ( real(rp), dimension(elem%np,lmesh%nea), intent(out) dens_t,
real(rp), dimension(elem%np,lmesh%nea), intent(out) rhot_t,
real(rp), dimension(elem%np,lmesh%nea), intent(out) rhoqv_t,
real(rp), dimension(elem%nnode_h1d**2,lmesh%ne2da), intent(out) sflx_rain,
real(rp), dimension(elem%nnode_h1d**2,lmesh%ne2da), intent(out) sflx_engi,
real(rp), dimension(elem%np,lmesh%nea), intent(in) ddens,
real(rp), dimension(elem%np,lmesh%nea), intent(in) drhot,
real(rp), dimension(elem%np,lmesh%nea), intent(in) qv,
real(rp), dimension(elem%np,lmesh%nea), intent(in) pt,
real(rp), dimension(elem%np,lmesh%nea), intent(in) pres,
real(rp), dimension(elem%np,lmesh%nea), intent(in) dens_hyd,
real(rp), dimension(elem%np,lmesh%nea), intent(in) rtot,
real(rp), dimension(elem%np,lmesh%nea), intent(in) cptot,
real(rp), intent(in) dtsec,
class(localmesh3d), intent(in) lmesh,
class(elementbase3d), intent(in) elem,
class(elementbase1d), intent(in) elem1d )

Calculate tendencies with moist convective adjustment scheme.

Definition at line 117 of file scale_atm_phy_cp_dgm_mconv_adjustment.F90.

121
122 use scale_tracer, only: &
123 tracer_cv
124 use scale_atmos_hydrometeor, only: &
125 cv_water, i_qv
126 implicit none
127 class(LocalMesh3D), intent(in) :: lmesh
128 class(ElementBase3D), intent(in) :: elem
129 class(ElementBase1D), intent(in) :: elem1D
130 real(RP), intent(out) :: DENS_t(elem%Np,lmesh%NeA)
131 real(RP), intent(out) :: RHOT_t(elem%Np,lmesh%NeA)
132 real(RP), intent(out) :: RHOQV_t(elem%Np,lmesh%NeA)
133 real(RP), intent(out) :: SFLX_RAIN(elem%Nnode_h1D**2,lmesh%Ne2DA)
134 real(RP), intent(out) :: SFLX_ENGI(elem%Nnode_h1D**2,lmesh%Ne2DA)
135 real(RP), intent(in) :: DDENS(elem%Np,lmesh%NeA)
136 real(RP), intent(in) :: DRHOT(elem%Np,lmesh%NeA)
137 real(RP), intent(in) :: QV(elem%Np,lmesh%NeA)
138 real(RP), intent(in) :: PT(elem%Np,lmesh%NeA)
139 real(RP), intent(in) :: PRES(elem%Np,lmesh%NeA)
140 real(RP), intent(in) :: DENS_hyd(elem%Np,lmesh%NeA)
141 real(RP), intent(in) :: Rtot(elem%Np,lmesh%NeA)
142 real(RP), intent(in) :: CPtot(elem%Np,lmesh%NeA)
143 real(RP), intent(in) :: dtsec
144
145 integer :: ke, ke_xy, ke_z
146 integer :: ph, pz, p
147 real(RP) :: dens_z(elem%Nnode_v,lmesh%NeZ)
148 real(RP) :: pres_z(elem%Nnode_v,lmesh%NeZ)
149 real(RP) :: zlev_z(elem%Nnode_v,lmesh%NeZ)
150 real(RP) :: temp_z(elem%Nnode_v,lmesh%NeZ)
151 real(RP) :: pott_z(elem%Nnode_v,lmesh%NeZ) ! work array
152 real(RP) :: qvap_z(elem%Nnode_v,lmesh%NeZ) ! work array
153 real(RP) :: qsat
154 real(RP) :: rh_z
155 real(RP) :: rtot_, cptot_, qdry
156
157 real(RP) :: elem_width_z
158 real(RP) :: int_weight(elem%Nnode_v,lmesh%NeZ)
159
160 real(RP) :: pott_ini(elem%Nnode_v,lmesh%NeZ)
161 real(RP) :: qvap_ini(elem%Nnode_v,lmesh%NeZ)
162 real(RP) :: dens_ini(elem%Nnode_v,lmesh%NeZ)
163 real(RP) :: rhoqvap_ini(elem%Nnode_v,lmesh%NeZ)
164
165 integer :: iter_expand
166 integer :: MCA_MAX_MASK_EXPAND
167 integer :: lbase, ltop, lbase_try, ltop_try
168 real(RP) :: zbase_try, ztop_try
169 logical :: mask_expanded
170
171 logical :: is_unstable
172 logical :: unstable_core_mask(elem%Nnode_v,lmesh%NeZ)
173 logical :: forced_saturation_mask(elem%Nnode_v,lmesh%NeZ)
174 logical :: adjustment_mask(elem%Nnode_v,lmesh%NeZ)
175
176 logical :: current_saturation_mask(elem%Nnode_v,lmesh%NeZ)
177 logical :: persistent_saturation_mask(elem%Nnode_v,lmesh%NeZ)
178
179 logical :: physical_active_mask(elem%Nnode_v,lmesh%NeZ)
180 integer :: iter_adj
181 real(RP) :: temp_adj(elem%Nnode_v,lmesh%NeZ)
182 real(RP) :: qvap_adj(elem%Nnode_v,lmesh%NeZ)
183 real(RP) :: rhoqvap_adj(elem%Nnode_v,lmesh%NeZ)
184 real(RP) :: rhoprecip_adj(elem%Nnode_v,lmesh%NeZ) ! Water-vapor mass density diagnosed to be removed as precipitation during the current adjustment iteration [kg m-3]
185 real(RP) :: rhoprecip_accum(elem%Nnode_v,lmesh%NeZ) ! Accumulated vapor mass density removed as precipitation [kg m-3]
186 real(RP) :: precip_engi_accum
187
188 real(RP), allocatable :: zlev_diag(:)
189 integer :: nlev_diag
190
191 logical :: profile_converged
192 integer :: profile_status
193 logical :: do_adjustment
194 logical :: adjustment_converged
195
196 integer :: Hslice_b(elem%Nnode_h1D**2), Hslice_t(elem%Nnode_h1D**2)
197
198 logical :: debug_flag
199
200 integer :: lactive_base
201 integer :: lactive_top
202 logical :: active_region_initialized
203 !----------------------------------------------------
204
205 nlev_diag = lmesh%NeZ * (elem%Nnode_v-1) + 1
206 allocate( zlev_diag(nlev_diag) )
207
208 hslice_b(:) = elem%Hslice(:,1)
209 hslice_t(:) = elem%Hslice(:,elem%Nnode_v)
210
211 mca_max_mask_expand = nlev_diag
212
213 !$omp parallel do collapse(2) private(ke,p, &
214 !$omp dens_z, pres_z, temp_z, zlev_z, pott_z, qvap_z, qsat, rh_z, rtot_,cptot_, &
215 !$omp dens_ini, pott_ini, qvap_ini, rhoqvap_ini, &
216 !$omp zlev_diag, &
217 !$omp lbase, ltop, lbase_try, ltop_try, zbase_try, ztop_try, iter_expand, mask_expanded, &
218 !$omp is_unstable, unstable_core_mask, forced_saturation_mask, adjustment_mask, &
219 !$omp current_saturation_mask, persistent_saturation_mask, physical_active_mask, &
220 !$omp temp_adj, qdry, qvap_adj, rhoqvap_adj, rhoprecip_adj, rhoprecip_accum, &
221 !$omp profile_converged, profile_status, do_adjustment, adjustment_converged, &
222 !$omp int_weight,elem_width_z, debug_flag, lactive_base, lactive_top, active_region_initialized )
223 do ke_xy=1, lmesh%Ne2D
224 do ph=1, elem%Nnode_h1D**2
225
226 ! if ( lmesh%PRC_myrank == 1 .and. ph == 32 .and. ke_xy == 13 ) then
227 ! debug_flag = .true.
228 ! else
229 debug_flag = .false.
230 ! end if
231
232 !- Extract vertical 1D DG column
233
234 do ke_z=1, lmesh%NeZ
235 ke = ke_xy + (ke_z-1)*lmesh%Ne2D
236
237 elem_width_z = lmesh%zlev(hslice_t(ph),ke) - lmesh%zlev(hslice_b(ph),ke)
238 do pz=1, elem%Nnode_v
239 p = ph + (pz-1)*elem%Nnode_h1D**2
240 dens_z(pz,ke_z) = ddens(p,ke) + dens_hyd(p,ke)
241 pres_z(pz,ke_z) = pres(p,ke)
242 zlev_z(pz,ke_z) = lmesh%zlev(p,ke)
243 int_weight(pz,ke_z) = elem1d%IntWeight_lgl(pz) * 0.5_rp * elem_width_z
244
245 temp_z(pz,ke_z) = pres(p,ke)/ ( dens_z(pz,ke_z) * rtot(p,ke) )
246 qvap_z(pz,ke_z) = qv(p,ke)
247 pott_z(pz,ke_z) = pt(p,ke)
248 end do
249 end do
250
251 !- Set initial state
252
253 do ke_z=1, lmesh%NeZ
254 dens_ini(:,ke_z) = dens_z(:,ke_z)
255 pott_ini(:,ke_z) = pott_z(:,ke_z)
256 qvap_ini(:,ke_z) = qvap_z(:,ke_z)
257 rhoqvap_ini(:,ke_z) = dens_ini(:,ke_z) * qvap_ini(:,ke_z)
258
259 temp_adj(:,ke_z) = temp_z(:,ke_z)
260 rhoqvap_adj(:,ke_z) = rhoqvap_ini(:,ke_z)
261 rhoprecip_accum(:,ke_z) = 0.0_rp
262 end do
263
264 !* Iteratively diagnose and remove remaining saturated convective instability. ***************************************
265 ! A single profile adjustment may generate a new unstable layer adjacent to or outside the previously adjusted region.
266
267 adjustment_converged = .false.
268 do_adjustment = .false.
269
270 active_region_initialized = .false.
271 lactive_base = 0
272 lactive_top = 0
273
274 forced_saturation_mask(:,:) = .false.
275 current_saturation_mask(:,:) = .false.
276 persistent_saturation_mask(:,:) = .false.
277 physical_active_mask(:,:) = .false.
278
279 do iter_adj=1, mca_max_adjust_iter
280
281 qvap_adj(:,:) = rhoqvap_adj(:,:) / dens_z(:,:)
282
283 ! Reconstruct the saturation constraint from the current state.
284 current_saturation_mask(:,:) = .false.
285 forced_saturation_mask(:,:) = .false.
286
287 !- Diagnose unstable layers
288
289 call diagnose_convective_layer( lbase, ltop, is_unstable, zlev_diag, & ! (out)
290 temp_adj, qvap_adj, pres_z, zlev_z, lmesh, elem, nlev_diag, debug_flag ) ! (in)
291
292 if ( debug_flag ) then
293 write(*,*) "ke_xy=", ke_xy, "ph=", ph, "iter_adj=", iter_adj
294 write(*,*) " lbase, ltop, is_unstable = ", lbase, ltop, is_unstable
295 end if
296
297 if ( .not. is_unstable ) then
298 adjustment_converged = .true.
299 exit
300 end if
301 do_adjustment = .true.
302
303 ! Maintain the smallest diagnostic-level interval containing
304 ! all physically diagnosed unstable regions belonging to the
305 ! current connected convective-adjustment event.
306 if ( .not. active_region_initialized ) then
307 lactive_base = lbase
308 lactive_top = ltop
309 active_region_initialized = .true.
310 else if ( lbase <= lactive_top + 1 .and. &
311 ltop >= lactive_base - 1 ) then
312 ! Overlapping or directly touching region:
313 ! continue the same connected adjustment.
314 lactive_base = min(lactive_base, lbase)
315 lactive_top = max(lactive_top, ltop)
316 else
317 ! Disconnected instability:
318 ! start a new independent adjustment region.
319 lactive_base = lbase
320 lactive_top = ltop
321 persistent_saturation_mask(:,:) = .false.
322 end if
323
324 if ( debug_flag ) then
325 write(*,*) " persistent active region=", lactive_base, lactive_top
326 end if
327
328 ! Construct the physically connected active region.
329 ! This does not include numerical expansion used only for water/energy feasibility.
330 call make_dg_vertical_range_mask( &
331 physical_active_mask, & ! (out)
332 zlev_z, zlev_diag(lactive_base), zlev_diag(lactive_top), & ! (in)
333 elem%Nnode_v, lmesh%NeZ ) ! (in)
334
335 ! Mark nearly saturated DG nodes inside the diagnosed unstable core.
336 ! These nodes will be constrained to saturation in each trial moist-neutral profile.
337 call make_dg_vertical_range_mask( &
338 unstable_core_mask, & ! (out)
339 zlev_z, zlev_diag(lbase), zlev_diag(ltop), & ! (in)
340 elem%Nnode_v, lmesh%NeZ ) ! (in)
341
342 do ke_z = 1, lmesh%NeZ
343 do pz = 1, elem%Nnode_v
344 if ( unstable_core_mask(pz,ke_z) ) then
345 call atmos_saturation_pres2qsat_liq( temp_adj(pz,ke_z), pres_z(pz,ke_z), &
346 qsat ) ! (out)
347
348 rh_z = qvap_adj(pz,ke_z) / max(qsat, eps)
349 current_saturation_mask(pz,ke_z) = rh_z >= mca_rh_forced_saturation
350 end if
351 end do
352 end do
353
354 ! Keep saturation constraints inherited from previous adjustment iterations within this connected convective event.
355
356 forced_saturation_mask(:,:) = persistent_saturation_mask(:,:) .or. current_saturation_mask(:,:)
357
358 !- Construct a moist-neutral profile.
359 ! If no water-feasible and energy-conserving solution exists, expand the adjustment layer and retry.
360
361 lbase_try = lactive_base
362 ltop_try = lactive_top
363
364 profile_converged = .false.
365 profile_status = mca_profile_energy_maxiter
366
367 do iter_expand=0, mca_max_mask_expand
368 zbase_try = zlev_diag(lbase_try)
369 ztop_try = zlev_diag(ltop_try)
370
371 !- Construct a mask for the adjustment layer
372 call make_dg_vertical_range_mask( adjustment_mask, & ! (out)
373 zlev_z, zbase_try, ztop_try, elem%Nnode_v, lmesh%NeZ ) ! (in)
374
375 if ( debug_flag ) then
376 write(*,*) "* Adjustment-profile attempt: iter_expand=", iter_expand
377 write(*,*) " lactive_base, lactive_top=", lactive_base, lactive_top
378 write(*,*) " lbase_try, ltop_try=", lbase_try, ltop_try
379 write(*,*) " zbase_try, ztop_try=", zbase_try, ztop_try
380 write(*,*) " saturation, mixing nodes=", count(forced_saturation_mask), count(adjustment_mask)
381 end if
382
383 !- Solve for a water-feasible and energy-conserving trial moist-neutral profile
384
385 call solve_moist_neutral_adjustment( &
386 temp_adj, qvap_adj, rhoqvap_adj, rhoprecip_adj, profile_converged, profile_status, & ! (out)
387 qvap_z, pres_z, zlev_z, dens_z, temp_z, & ! (in)
388 int_weight, adjustment_mask, forced_saturation_mask, elem%Nnode_v, lmesh%NeZ, debug_flag ) ! (in)
389
390 if ( profile_converged ) then
391 ! Update the persistent saturation history using the post-adjustment state in the physically connected region.
392 do ke_z = 1, lmesh%NeZ
393 do pz = 1, elem%Nnode_v
394 if ( physical_active_mask(pz,ke_z) ) then
395
396 call atmos_saturation_pres2qsat_liq( temp_adj(pz,ke_z), pres_z(pz,ke_z), &
397 qsat )
398
399 rh_z = qvap_adj(pz,ke_z) / qsat
400 if ( rh_z >= mca_rh_forced_saturation ) then
401 persistent_saturation_mask(pz,ke_z) = .true.
402 end if
403 end if
404 end do
405 end do
406
407 if ( debug_flag ) then
408 write(*,*) "Moist-neutral profile converged: iter_expand=", iter_expand
409 write(*,*) "final solve region: lbase, ltop=", lbase_try, ltop_try
410 write(*,*) "physical active region=", lactive_base, lactive_top
411 write(*,*) "persistent saturated nodes=", count(persistent_saturation_mask)
412 end if
413 exit
414 end if
415
416 select case ( profile_status )
417 case ( mca_profile_no_energy_root )
418 call expand_adjustment_layer( lbase_try, ltop_try, mask_expanded, nlev_diag )
419 if ( .not. mask_expanded ) then
420 exit
421 end if
422 case default
423 exit
424 end select
425
426 end do ! end loop for iter_expand
427
428 if ( .not. profile_converged ) then
429 log_info("atm_phy_cp_dgm_mconv_adjustment_calc_tendency",*) "iter_adj=", iter_adj, "ph=", ph, "ke_xy=", ke_xy, "iter_expand=", iter_expand
430 select case ( profile_status )
431 case ( mca_profile_no_energy_root )
432 log_info("atm_phy_cp_dgm_mconv_adjustment_calc_tendency",*) "No energy-conserving root exists in the water-feasible temperature interval, even after adjustment-layer expansion."
433 log_info("atm_phy_cp_dgm_mconv_adjustment_calc_tendency",*) "original lbase,ltop=", lbase, ltop, "final lbase,ltop=", lbase_try, ltop_try
434 do_adjustment = .false.
435 exit
436 ! call PRC_abort
437 case ( mca_profile_no_water_feasible_state )
438 log_info("atm_phy_cp_dgm_mconv_adjustment_calc_tendency",*) "No water-feasible trial moist-neutral profile exists."
439 call prc_abort
440 case ( mca_profile_adiabat_failure )
441 log_info("atm_phy_cp_dgm_mconv_adjustment_calc_tendency",*) "Moist-adiabat profile integration failed."
442 call prc_abort
443 case ( mca_profile_energy_maxiter )
444 log_info("atm_phy_cp_dgm_mconv_adjustment_calc_tendency",*) "Energy root was bracketed, but bisection did not converge."
445 call prc_abort
446 case ( mca_profile_no_adjusted_node )
447 log_info("atm_phy_cp_dgm_mconv_adjustment_calc_tendency",*) "No adjusted DG node was found."
448 call prc_abort
449 case default
450 log_info("atm_phy_cp_dgm_mconv_adjustment_calc_tendency",*) "Unknown moist-neutral-profile construction error."
451 call prc_abort
452 end select
453 end if
454
455 ! Accumulate the precipitation density from the current iteration
456 rhoprecip_accum(:,:) = rhoprecip_accum(:,:) + rhoprecip_adj(:,:)
457
458 ! Update the state for the next iteration
459 temp_z(:,:) = temp_adj(:,:)
460 qvap_z(:,:) = qvap_adj(:,:)
461
462 do ke_z = 1, lmesh%NeZ
463 do pz = 1, elem%Nnode_v
464 qdry = 1.0_rp - qvap_z(pz,ke_z)
465 rtot_ = rdry * qdry &
466 + rvap * qvap_z(pz,ke_z)
467 pres_z(pz,ke_z) = dens_z(pz,ke_z) * rtot_ * temp_z(pz,ke_z)
468 enddo
469 enddo
470 end do ! End loop for iteration
471
472 if ( do_adjustment .and. ( .not. adjustment_converged ) ) then
473 log_info("atm_phy_cp_dgm_mconv_adjustment_calc_tendency",*) "Moist convective adjustment did not converge: ph=", ph, "ke_xy=", ke_xy
474 call prc_abort
475 end if
476
477
478 !- Convert the adjusted state to DG tendencies
479
480 sflx_rain(ph,ke_xy) = 0.0_rp
481 sflx_engi(ph,ke_xy) = 0.0_rp
482
483 if ( do_adjustment ) then
484
485 do ke_z=1, lmesh%NeZ
486 ke = ke_xy + (ke_z-1)*lmesh%Ne2D
487
488 dens_z(:,ke_z) = dens_ini(:,ke_z) - rhoprecip_accum(:,ke_z)
489 qvap_z(:,ke_z) = rhoqvap_adj(:,ke_z) / dens_z(:,ke_z)
490
491 do pz=1, elem%Nnode_v
492 qdry = 1.0_rp - qvap_z(pz,ke_z)
493 rtot_ = rdry * qdry + rvap * qvap_z(pz,ke_z)
494 cptot_ = cpdry * qdry + cp_vapor * qvap_z(pz,ke_z)
495
496 pres_z(pz,ke_z) = dens_z(pz,ke_z) * rtot_ * temp_z(pz,ke_z)
497 pott_z(pz,ke_z) = temp_adj(pz,ke_z) * ( pres0 / pres_z(pz,ke_z) )**( rtot_ / cptot_ )
498
499 sflx_rain(ph,ke_xy) = sflx_rain(ph,ke_xy) &
500 - rhoprecip_accum(pz,ke_z) * int_weight(pz,ke_z) / dtsec
501 sflx_engi(ph,ke_xy) = sflx_engi(ph,ke_xy) &
502 - temp_adj(pz,ke_z) * rhoprecip_accum(pz,ke_z) * int_weight(pz,ke_z) * cptot_ / dtsec
503 end do
504
505 do pz=1, elem%Nnode_v
506 p = ph + (pz-1)*elem%Nnode_h1D**2
507 dens_t(p,ke) = ( dens_z(pz,ke_z) - dens_ini(pz,ke_z) ) / dtsec
508 rhot_t(p,ke) = ( dens_z(pz,ke_z) * pott_z(pz,ke_z) - dens_ini(pz,ke_z) * pott_ini(pz,ke_z) ) / dtsec
509 rhoqv_t(p,ke) = ( dens_z(pz,ke_z) * qvap_z(pz,ke_z) - rhoqvap_ini(pz,ke_z) ) / dtsec
510 end do
511 end do
512
513 if ( debug_flag ) then
514 write(*,*) " MCA summary:"
515 write(*,*) " del_DENS: ", dens_z(:,:) - dens_ini(:,:)
516 write(*,*) " del_RHOT: ", dens_z(:,:) * pott_z(:,:) - dens_ini(:,:) * pott_ini(:,:)
517 write(*,*) " del_RHOQV: ", dens_z(:,:) * qvap_z(:,:) - rhoqvap_ini(:,:)
518 write(*,*) "----------------------------------------------------------------"
519 end if
520 else
521 do ke_z=1, lmesh%NeZ
522 ke = ke_xy + (ke_z-1)*lmesh%Ne2D
523 do pz=1, elem%Nnode_v
524 p = ph + (pz-1)*elem%Nnode_h1D**2
525 dens_t(p,ke) = 0.0_rp
526 rhot_t(p,ke) = 0.0_rp
527 rhoqv_t(p,ke) = 0.0_rp
528 end do
529 end do
530 end if
531
532 end do ! end loop for ph
533 end do ! end loop for ke_xy
534
535 return

◆ atm_phy_cp_dgm_mconv_adjustment_finalize()

subroutine, public scale_atm_phy_cp_dgm_mconv_adjustment::atm_phy_cp_dgm_mconv_adjustment_finalize

Finalize a module for moist convective adjustment scheme.

Definition at line 539 of file scale_atm_phy_cp_dgm_mconv_adjustment.F90.

540 implicit none
541 !----------------------------------------------------
542 return