124 use constants_mod
, only: grav, pi=>pi_8, radius, hlv, rdgas, omega, rvgas, cp_vapor
131 use fv_mp_mod, only: group_halo_update_type
132 use fv_mp_mod, only: start_group_halo_update, complete_group_halo_update
134 use diag_manager_mod
, only: send_data
136 use mpp_domains_mod
, only: dgrid_ne, cgrid_ne, mpp_update_domains, domain2d
137 use mpp_mod
, only: mpp_pe
138 use field_manager_mod
, only: model_atmos
139 use tracer_manager_mod
, only: get_tracer_index
157 real,
allocatable ::
rf(:)
163 real,
allocatable:: u00(:,:,:), v00(:,:,:)
174 subroutine fv_dynamics(npx, npy, npz, nq_tot, ng, bdt, consv_te, fill, &
175 reproduce_sum, kappa, cp_air, zvir, ptop, ks, ncnst, n_split, &
176 q_split, u, v, w, delz, hydrostatic, pt, delp, q, &
177 ps, pe, pk, peln, pkz, phis, q_con, omga, ua, va, uc, vc, &
178 ak, bk, mfx, mfy, cx, cy, ze0, hybrid_z, &
179 gridstruct, flagstruct, neststruct, idiag, bd, &
180 parent_grid, domain, diss_est, time_total)
183 use mpp_mod
, only: fatal, mpp_error
184 use ccpp_data
, only: ccpp_interstitial
187 real,
intent(IN) :: bdt
188 real,
intent(IN) :: consv_te
189 real,
intent(IN) :: kappa, cp_air
190 real,
intent(IN) :: zvir, ptop
191 real,
intent(IN),
optional :: time_total
193 integer,
intent(IN) :: npx
194 integer,
intent(IN) :: npy
195 integer,
intent(IN) :: npz
196 integer,
intent(IN) :: nq_tot
197 integer,
intent(IN) :: ng
198 integer,
intent(IN) :: ks
199 integer,
intent(IN) :: ncnst
200 integer,
intent(IN) :: n_split
201 integer,
intent(IN) :: q_split
202 logical,
intent(IN) :: fill
203 logical,
intent(IN) :: reproduce_sum
204 logical,
intent(IN) :: hydrostatic
205 logical,
intent(IN) :: hybrid_z
208 real,
intent(inout),
dimension(bd%isd:bd%ied ,bd%jsd:bd%jed+1,npz) :: u
209 real,
intent(inout),
dimension(bd%isd:bd%ied+1,bd%jsd:bd%jed ,npz) :: v
210 real,
intent(inout) :: w( bd%isd: ,bd%jsd: ,1:)
211 real,
intent(inout) :: pt( bd%isd:bd%ied ,bd%jsd:bd%jed ,npz)
212 real,
intent(inout) :: delp(bd%isd:bd%ied ,bd%jsd:bd%jed ,npz)
213 real,
intent(inout) :: q( bd%isd:bd%ied ,bd%jsd:bd%jed ,npz, ncnst)
214 real,
intent(inout) :: delz(bd%is:,bd%js:,1:)
215 real,
intent(inout) :: ze0(bd%is:, bd%js: ,1:)
216 real,
intent(inout),
dimension(bd%isd:bd%ied ,bd%jsd:bd%jed,npz) :: diss_est
224 real,
intent(inout) :: ps (bd%isd:bd%ied ,bd%jsd:bd%jed)
225 real,
intent(inout) :: pe (bd%is-1:bd%ie+1, npz+1,bd%js-1:bd%je+1)
226 real,
intent(inout) :: pk (bd%is:bd%ie,bd%js:bd%je, npz+1)
227 real,
intent(inout) :: peln(bd%is:bd%ie,npz+1,bd%js:bd%je)
228 real,
intent(inout) :: pkz (bd%is:bd%ie,bd%js:bd%je,npz)
229 real,
intent(inout):: q_con(bd%isd:, bd%jsd:, 1:)
234 real,
intent(inout) :: phis(bd%isd:bd%ied,bd%jsd:bd%jed)
235 real,
intent(inout) :: omga(bd%isd:bd%ied,bd%jsd:bd%jed,npz)
236 real,
intent(inout) :: uc(bd%isd:bd%ied+1,bd%jsd:bd%jed ,npz)
237 real,
intent(inout) :: vc(bd%isd:bd%ied ,bd%jsd:bd%jed+1,npz)
239 real,
intent(inout),
dimension(bd%isd:bd%ied ,bd%jsd:bd%jed ,npz):: ua, va
240 real,
intent(in),
dimension(npz+1):: ak, bk
243 real,
intent(inout) :: mfx(bd%is:bd%ie+1, bd%js:bd%je, npz)
244 real,
intent(inout) :: mfy(bd%is:bd%ie , bd%js:bd%je+1, npz)
246 real,
intent(inout) :: cx(bd%is:bd%ie+1, bd%jsd:bd%jed, npz)
247 real,
intent(inout) :: cy(bd%isd:bd%ied ,bd%js:bd%je+1, npz)
252 type(domain2d),
intent(INOUT) :: domain
257 real :: ws(bd%is:bd%ie,bd%js:bd%je)
259 real :: te_2d(bd%is:bd%ie,bd%js:bd%je)
261 real :: teq(bd%is:bd%ie,bd%js:bd%je)
262 real :: ps2(bd%isd:bd%ied,bd%jsd:bd%jed)
263 real :: m_fac(bd%is:bd%ie,bd%js:bd%je)
265 real,
dimension(bd%is:bd%ie):: cvm
267 real,
allocatable :: dp1(:,:,:), dtdt_m(:,:,:), cappa(:,:,:)
270 real,
allocatable :: kapad(:,:,:)
272 real:: akap, rdg, ph1, ph2, mdt, gam, amdt, u0
273 real:: recip_k_split,reg_bc_update_time
274 integer:: kord_tracer(ncnst)
275 integer :: i,j,k, n, iq, n_map, nq, nr, nwat, k_split
276 integer :: sphum, liq_wat = -999, ice_wat = -999
277 integer :: rainwat = -999, snowwat = -999, graupel = -999, cld_amt = -999
278 integer :: theta_d = -999
280 logical used, do_omega
282 logical used, last_step, do_omega
285 integer,
parameter :: max_packs=13
287 integer,
parameter :: max_packs=12
289 type(group_halo_update_type),
save :: i_pack(max_packs)
290 integer :: is, ie, js, je
291 integer :: isd, ied, jsd, jed
298 ccpp_associate: associate( cappa => ccpp_interstitial%cappa, &
299 dp1 => ccpp_interstitial%te0, &
300 dtdt_m => ccpp_interstitial%dtdt, &
301 last_step => ccpp_interstitial%last_step, &
302 te_2d => ccpp_interstitial%te0_2d )
318 k_split = flagstruct%k_split
319 recip_k_split=1./
real(k_split)
320 nwat = flagstruct%nwat
321 nq = nq_tot - flagstruct%dnats
322 nr = nq_tot - flagstruct%dnrts
329 call ccpp_interstitial%reset()
330 if (flagstruct%do_sat_adj)
then 331 ccpp_interstitial%out_dt = (idiag%id_mdt > 0)
337 allocate ( dp1(isd:ied, jsd:jed, 1:npz) )
341 allocate ( cappa(isd:ied,jsd:jed,npz) )
344 allocate ( cappa(isd:isd,jsd:jsd,1) )
350 allocate ( kapad(isd:ied, jsd:jed, npz) )
356 if (gridstruct%nested .or. any(neststruct%child_grids))
then 359 u, v, w, pt, delp, delz, q, uc, vc, &
366 neststruct%nested, flagstruct%inline_q, flagstruct%make_nh, ng, &
367 gridstruct, flagstruct, neststruct, &
368 neststruct%nest_timestep, neststruct%tracer_nest_timestep, &
369 domain, parent_grid, bd, nwat, ak, bk)
378 if (flagstruct%regional)
then 382 call set_regional_bcs &
390 ,q,u,v,uc,vc, bd, npz, reg_bc_update_time )
395 if ( flagstruct%no_dycore )
then 396 if ( nwat.eq.2 .and. (.not.hydrostatic) )
then 397 sphum = get_tracer_index(model_atmos,
'sphum')
406 sphum = get_tracer_index(model_atmos,
'sphum')
407 liq_wat = get_tracer_index(model_atmos,
'liq_wat')
408 ice_wat = get_tracer_index(model_atmos,
'ice_wat')
409 rainwat = get_tracer_index(model_atmos,
'rainwat')
410 snowwat = get_tracer_index(model_atmos,
'snowwat')
411 graupel = get_tracer_index(model_atmos,
'graupel')
412 cld_amt = get_tracer_index(model_atmos,
'cld_amt')
415 theta_d = get_tracer_index(model_atmos,
'theta_d')
419 pfull(1) = 0.5*flagstruct%p_ref
426 ph1 = ak(k ) + bk(k )*flagstruct%p_ref
427 ph2 = ak(k+1) + bk(k+1)*flagstruct%p_ref
428 pfull(k) = (ph2 - ph1) / log(ph2/ph1)
431 if ( hydrostatic )
then 432 #if defined(CCPP) && defined(__GFORTRAN__) 441 call moist_cp(is,ie,isd,ied,jsd,jed, npz, j, k, nwat, sphum, liq_wat, rainwat, &
442 ice_wat, snowwat, graupel, q, q_con(is:ie,j,k), cvm)
445 dp1(i,j,k) = zvir*q(i,j,k,sphum)
450 #if defined(CCPP) && defined(__GFORTRAN__) 459 #if defined(CCPP) && defined(__GFORTRAN__) 466 if ( flagstruct%moist_phys )
then 469 call moist_cv(is,ie,isd,ied,jsd,jed, npz, j, k, nwat, sphum, liq_wat, rainwat, &
470 ice_wat, snowwat, graupel, q, q_con(is:ie,j,k), cvm)
474 dp1(i,j,k) =
virq(q(i,j,k,:))-1.
475 kapad(i,j,k)= kappa * (
virqd(q(i,j,k,:))/
vicpqd(q(i,j,k,:)))
477 dp1(i,j,k) = zvir*q(i,j,k,sphum)
481 cappa(i,j,k) = rdgas/(rdgas + cvm(i)/(1.+dp1(i,j,k)))
482 pkz(i,j,k) = exp(cappa(i,j,k)*log(rdg*delp(i,j,k)*pt(i,j,k)* &
484 (1.+dp1(i,j,k)) /delz(i,j,k)) )
486 (1.+dp1(i,j,k))*(1.-q_con(i,j,k))/delz(i,j,k)) )
489 pkz(i,j,k) = exp( kappa*log(rdg*delp(i,j,k)*pt(i,j,k)* &
490 (1.+dp1(i,j,k))/delz(i,j,k)) )
503 kapad(i,j,k)= kappa * (
virqd(q(i,j,k,:))/
vicpqd(q(i,j,k,:)))
504 pkz(i,j,k) = exp(kapad(i,j,k)*log(rdg*
virqd(q(i,j,k,:))*delp(i,j,k)*pt(i,j,k)/delz(i,j,k)))
506 pkz(i,j,k) = exp(kappa*log(rdg*delp(i,j,k)*pt(i,j,k)/delz(i,j,k)))
514 if ( flagstruct%fv_debug )
then 516 call prt_mxm(
'cappa', cappa, is, ie, js, je, ng, npz, 1., gridstruct%area_64, domain)
518 call prt_mxm(
'PS', ps, is, ie, js, je, ng, 1, 0.01, gridstruct%area_64, domain)
519 call prt_mxm(
'T_dyn_b', pt, is, ie, js, je, ng, npz, 1., gridstruct%area_64, domain)
520 if ( .not. hydrostatic)
call prt_mxm(
'delz', delz, is, ie, js, je, 0, npz, 1., gridstruct%area_64, domain)
521 call prt_mxm(
'delp_b ', delp, is, ie, js, je, ng, npz, 0.01, gridstruct%area_64, domain)
522 call prt_mxm(
'pk_b', pk, is, ie, js, je, 0, npz+1, 1.,gridstruct%area_64, domain)
523 call prt_mxm(
'pkz_b', pkz,is, ie, js, je, 0, npz, 1.,gridstruct%area_64, domain)
531 u, v, w, delz, pt, delp, q, dp1, pe, peln, phis, &
532 gridstruct%rsin2, gridstruct%cosa_s, &
533 zvir, cp_air, rdgas, hlv, te_2d, ua, va, teq, &
534 flagstruct%moist_phys, nwat, sphum, liq_wat, rainwat, &
535 ice_wat, snowwat, graupel, hydrostatic, idiag%id_te)
536 if( idiag%id_te>0 )
then 537 used = send_data(idiag%id_te, teq,
fv_time)
543 if( (flagstruct%consv_am.or.idiag%id_amdt>0) .and. (.not.
do_adiabatic_init) )
then 544 call compute_aam(npz, is, ie, js, je, isd, ied, jsd, jed, gridstruct, bd, &
545 ptop, ua, va, u, v, delp, teq, ps2, m_fac)
548 if( .not.flagstruct%RF_fast .and. flagstruct%tau .ne. 0. )
then 549 if ( gridstruct%grid_type<4 )
then 554 call rayleigh_super(abs(bdt), npx, npy, npz, ks, pfull, phis, flagstruct%tau, u, v, w, pt, &
555 ua, va, delz, gridstruct%agrid, cp_air, rdgas, ptop, hydrostatic, &
556 .not. gridstruct%bounded_domain, flagstruct%rf_cutoff, gridstruct, domain, bd)
559 call rayleigh_friction(abs(bdt), npx, npy, npz, ks, pfull, flagstruct%tau, u, v, w, pt, &
560 ua, va, delz, cp_air, rdgas, ptop, hydrostatic, .true., flagstruct%rf_cutoff, gridstruct, domain, bd)
568 if ( flagstruct%adiabatic .and. flagstruct%kord_tm>0 )
then 574 pt(i,j,k) = pt(i,j,k)/pkz(i,j,k)
577 if ( theta_d>0 )
then 580 q(i,j,k,theta_d) = pt(i,j,k)
588 #if defined(CCPP) && defined(__GFORTRAN__) 598 pt(i,j,k) = pt(i,j,k)*(1.+dp1(i,j,k))/pkz(i,j,k)
601 pt(i,j,k) = pt(i,j,k)*(1.+dp1(i,j,k))*(1.-q_con(i,j,k))/pkz(i,j,k)
603 pt(i,j,k) = pt(i,j,k)*(1.+dp1(i,j,k))/pkz(i,j,k)
613 mdt = bdt /
real(k_split)
617 allocate ( dtdt_m(is:ie,js:je,npz) )
634 call start_group_halo_update(i_pack(11), q_con, domain)
636 call start_group_halo_update(i_pack(12), cappa, domain)
640 call start_group_halo_update(i_pack(13), kapad, domain)
642 call start_group_halo_update(i_pack(1), delp, domain, complete=.false.)
643 call start_group_halo_update(i_pack(1), pt, domain, complete=.true.)
645 call start_group_halo_update(i_pack(8), u, v, domain, gridtype=dgrid_ne)
648 #if defined(CCPP) && defined(__GFORTRAN__) 656 dp1(i,j,k) = delp(i,j,k)
661 if ( n_map==k_split ) last_step = .true.
665 call complete_group_halo_update(i_pack(11), domain)
667 call complete_group_halo_update(i_pack(12), domain)
672 call complete_group_halo_update(i_pack(13), domain)
676 call dyn_core(npx, npy, npz, ng, sphum, nq, mdt, n_map, n_split, zvir, cp_air, akap, cappa, &
681 u, v, w, delz, pt, q, delp, pe, pk, phis, ws, omga, ptop, pfull, ua, va, &
682 uc, vc, mfx, mfy, cx, cy, pkz, peln, q_con, ak, bk, ks, &
683 gridstruct, flagstruct, neststruct, idiag, bd, &
684 domain, n_map==1, i_pack, last_step, diss_est,time_total)
692 ps(i,j) = delp(i,j,1) *
agrav 696 if( .not. flagstruct%inline_q .and. nq /= 0 )
then 702 if (gridstruct%bounded_domain)
then 703 call tracer_2d_nested(q, dp1, mfx, mfy, cx, cy, gridstruct, bd, domain, npx, npy, npz, nq, &
704 flagstruct%hord_tr, q_split, mdt, idiag%id_divg, i_pack(10), &
705 flagstruct%nord_tr, flagstruct%trdm2, &
706 k_split, neststruct, parent_grid, n_map, flagstruct%lim_fac)
708 if ( flagstruct%z_tracer )
then 709 call tracer_2d_1l(q, dp1, mfx, mfy, cx, cy, gridstruct, bd, domain, npx, npy, npz, nq, &
710 flagstruct%hord_tr, q_split, mdt, idiag%id_divg, i_pack(10), &
711 flagstruct%nord_tr, flagstruct%trdm2, flagstruct%lim_fac)
713 call tracer_2d(q, dp1, mfx, mfy, cx, cy, gridstruct, bd, domain, npx, npy, npz, nq, &
714 flagstruct%hord_tr, q_split, mdt, idiag%id_divg, i_pack(10), &
715 flagstruct%nord_tr, flagstruct%trdm2, flagstruct%lim_fac)
721 if ( flagstruct%hord_tr<8 .and. flagstruct%moist_phys )
then 724 call fill2d(is, ie, js, je, ng, npz, q(isd,jsd,1,liq_wat), delp, gridstruct%area, domain, gridstruct%bounded_domain, npx, npy)
726 call fill2d(is, ie, js, je, ng, npz, q(isd,jsd,1,rainwat), delp, gridstruct%area, domain, gridstruct%bounded_domain, npx, npy)
728 call fill2d(is, ie, js, je, ng, npz, q(isd,jsd,1,ice_wat), delp, gridstruct%area, domain, gridstruct%bounded_domain, npx, npy)
730 call fill2d(is, ie, js, je, ng, npz, q(isd,jsd,1,snowwat), delp, gridstruct%area, domain, gridstruct%bounded_domain, npx, npy)
732 call fill2d(is, ie, js, je, ng, npz, q(isd,jsd,1,graupel), delp, gridstruct%area, domain, gridstruct%bounded_domain, npx, npy)
737 if( last_step .and. idiag%id_divg>0 )
then 738 used = send_data(idiag%id_divg, dp1,
fv_time)
739 if(flagstruct%fv_debug)
call prt_mxm(
'divg', dp1, is, ie, js, je, 0, npz, 1.,gridstruct%area_64, domain)
752 kord_tracer(iq) = flagstruct%kord_tr
753 if ( iq==cld_amt ) kord_tracer(iq) = 9
756 do_omega = hydrostatic .and. last_step
759 call avec_timer_start(6)
763 pkz, pk, mdt, bdt, npx, npy, npz, is,ie,js,je, isd,ied,jsd,jed, &
764 nr, nwat, sphum, q_con, u, v, w, delz, pt, q, phis, &
765 zvir, cp_air, akap, cappa, flagstruct%kord_mt, flagstruct%kord_wz, &
766 kord_tracer, flagstruct%kord_tm, peln, te_2d, &
767 ng, ua, va, omga, dp1, ws, fill, reproduce_sum, &
768 idiag%id_mdt>0, dtdt_m, ptop, ak, bk, pfull, gridstruct, domain, &
769 flagstruct%do_sat_adj, hydrostatic, hybrid_z, do_omega, &
771 flagstruct%c2l_ord, bd, flagstruct%fv_debug, &
772 flagstruct%moist_phys)
774 if ( flagstruct%fv_debug )
then 775 if (is_master())
write(*,
'(A, I3, A1, I3)')
'finished k_split ', n_map,
'/', k_split
776 call prt_mxm(
'T_dyn_a3', pt, is, ie, js, je, ng, npz, 1., gridstruct%area_64, domain)
777 if (sphum > 0)
call prt_mxm(
'SPHUM_dyn', q(isd,jsd,1,sphum ), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
778 if (liq_wat > 0)
call prt_mxm(
'liq_wat_dyn', q(isd,jsd,1,liq_wat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
779 if (rainwat > 0)
call prt_mxm(
'rainwat_dyn', q(isd,jsd,1,rainwat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
780 if (ice_wat > 0)
call prt_mxm(
'ice_wat_dyn', q(isd,jsd,1,ice_wat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
781 if (snowwat > 0)
call prt_mxm(
'snowwat_dyn', q(isd,jsd,1,snowwat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
782 if (graupel > 0)
call prt_mxm(
'graupel_dyn', q(isd,jsd,1,graupel), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
785 call avec_timer_stop(6)
789 if ( neststruct%nested .and. .not. last_step)
then 791 0, 0, npx, npy, npz, bd,
real(n_map+1),
real(k_split), &
792 neststruct%cappa_BC, bctype=neststruct%nestbctype )
794 if ( flagstruct%regional .and. .not. last_step)
then 796 call regional_boundary_update(cappa,
'cappa', &
797 isd, ied, jsd, jed, npz, &
799 isd, ied, jsd, jed, &
805 if( .not. hydrostatic )
then 810 omga(i,j,k) = delp(i,j,k)/delz(i,j,k)*w(i,j,k)
818 if(flagstruct%nf_omega>0) &
819 call del2_cubed(omga, 0.18*gridstruct%da_min, gridstruct, domain, npx, npy, npz, flagstruct%nf_omega, bd)
827 #if defined(CCPP) && defined(__GFORTRAN__) 835 dtdt_m(i,j,k) = dtdt_m(i,j,k) / bdt * 86400.
840 used = send_data(idiag%id_mdt, dtdt_m,
fv_time)
842 deallocate ( dtdt_m )
847 if (cld_amt > 0)
then 848 call neg_adj3(is, ie, js, je, ng, npz, &
849 flagstruct%hydrostatic, &
851 pt, delp, q(isd,jsd,1,sphum), &
852 q(isd,jsd,1,liq_wat), &
853 q(isd,jsd,1,rainwat), &
854 q(isd,jsd,1,ice_wat), &
855 q(isd,jsd,1,snowwat), &
856 q(isd,jsd,1,graupel), &
857 q(isd,jsd,1,cld_amt), flagstruct%check_negative)
859 call neg_adj3(is, ie, js, je, ng, npz, &
860 flagstruct%hydrostatic, &
862 pt, delp, q(isd,jsd,1,sphum), &
863 q(isd,jsd,1,liq_wat), &
864 q(isd,jsd,1,rainwat), &
865 q(isd,jsd,1,ice_wat), &
866 q(isd,jsd,1,snowwat), &
867 q(isd,jsd,1,graupel), check_negative=flagstruct%check_negative)
869 if ( flagstruct%fv_debug )
then 870 call prt_mxm(
'T_dyn_a3', pt, is, ie, js, je, ng, npz, 1., gridstruct%area_64, domain)
871 call prt_mxm(
'SPHUM_dyn', q(isd,jsd,1,sphum ), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
872 call prt_mxm(
'liq_wat_dyn', q(isd,jsd,1,liq_wat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
873 call prt_mxm(
'rainwat_dyn', q(isd,jsd,1,rainwat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
874 call prt_mxm(
'ice_wat_dyn', q(isd,jsd,1,ice_wat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
875 call prt_mxm(
'snowwat_dyn', q(isd,jsd,1,snowwat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
876 call prt_mxm(
'graupel_dyn', q(isd,jsd,1,graupel), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
881 if (cld_amt > 0)
then 882 call neg_adj2(is, ie, js, je, ng, npz, &
883 flagstruct%hydrostatic, &
885 pt, delp, q(isd,jsd,1,sphum), &
886 q(isd,jsd,1,liq_wat), &
887 q(isd,jsd,1,rainwat), &
888 q(isd,jsd,1,ice_wat), &
889 q(isd,jsd,1,snowwat), &
890 q(isd,jsd,1,cld_amt), flagstruct%check_negative)
892 call neg_adj2(is, ie, js, je, ng, npz, &
893 flagstruct%hydrostatic, &
895 pt, delp, q(isd,jsd,1,sphum), &
896 q(isd,jsd,1,liq_wat), &
897 q(isd,jsd,1,rainwat), &
898 q(isd,jsd,1,ice_wat), &
899 q(isd,jsd,1,snowwat), &
900 check_negative=flagstruct%check_negative)
902 if ( flagstruct%fv_debug )
then 903 call prt_mxm(
'T_dyn_a3', pt, is, ie, js, je, ng, npz, 1., gridstruct%area_64, domain)
904 call prt_mxm(
'SPHUM_dyn', q(isd,jsd,1,sphum ), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
905 call prt_mxm(
'liq_wat_dyn', q(isd,jsd,1,liq_wat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
906 call prt_mxm(
'rainwat_dyn', q(isd,jsd,1,rainwat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
907 call prt_mxm(
'ice_wat_dyn', q(isd,jsd,1,ice_wat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
908 call prt_mxm(
'snowwat_dyn', q(isd,jsd,1,snowwat), is, ie, js, je, ng, npz, 1.,gridstruct%area_64, domain)
912 if( (flagstruct%consv_am.or.idiag%id_amdt>0.or.idiag%id_aam>0) .and. (.not.
do_adiabatic_init) )
then 913 call compute_aam(npz, is, ie, js, je, isd, ied, jsd, jed, gridstruct, bd, &
914 ptop, ua, va, u, v, delp, te_2d, ps, m_fac)
915 if( idiag%id_aam>0 )
then 916 used = send_data(idiag%id_aam, te_2d,
fv_time)
918 gam =
g_sum( domain, te_2d, is, ie, js, je, ng, gridstruct%area_64, 0)
919 if( is_master() )
write(6,*)
'Total AAM =', gam
924 if( (flagstruct%consv_am.or.idiag%id_amdt>0) .and. (.not.
do_adiabatic_init) )
then 925 #if defined(CCPP) && defined(__GFORTRAN__) 934 te_2d(i,j) = te_2d(i,j)-teq(i,j) + dt2*(ps2(i,j)+ps(i,j))*idiag%zxg(i,j)
937 if( idiag%id_amdt>0 ) used = send_data(idiag%id_amdt, te_2d/bdt,
fv_time)
939 if ( flagstruct%consv_am .or.
prt_minmax )
then 940 amdt =
g_sum( domain, te_2d, is, ie, js, je, ng, gridstruct%area_64, 0, reproduce=.true.)
941 u0 = -radius*amdt/
g_sum( domain, m_fac, is, ie, js, je, ng, gridstruct%area_64, 0,reproduce=.true.)
943 write(6,*)
'Dynamic AM tendency (Hadleys)=', amdt/(bdt*1.e18),
'del-u (per day)=', u0*86400./bdt
946 if( flagstruct%consv_am )
then 950 m_fac(i,j) = u0*cos(gridstruct%agrid(i,j,2))
958 u(i,j,k) = u(i,j,k) + u0*gridstruct%l2c_u(i,j)
963 v(i,j,k) = v(i,j,k) + u0*gridstruct%l2c_v(i,j)
971 npx, npy, npz, 1, gridstruct%grid_type, domain, gridstruct%bounded_domain, flagstruct%c2l_ord, bd)
981 if ( flagstruct%fv_debug )
then 982 call prt_mxm(
'UA', ua, is, ie, js, je, ng, npz, 1., gridstruct%area_64, domain)
983 call prt_mxm(
'VA', va, is, ie, js, je, ng, npz, 1., gridstruct%area_64, domain)
984 call prt_mxm(
'TA', pt, is, ie, js, je, ng, npz, 1., gridstruct%area_64, domain)
985 if (.not. hydrostatic)
call prt_mxm(
'W ', w, is, ie, js, je, ng, npz, 1., gridstruct%area_64, domain)
988 if ( flagstruct%range_warn )
then 989 call range_check(
'UA_dyn', ua, is, ie, js, je, ng, npz, gridstruct%agrid, &
991 call range_check(
'VA_dyn', ua, is, ie, js, je, ng, npz, gridstruct%agrid, &
993 call range_check(
'TA_dyn', pt, is, ie, js, je, ng, npz, gridstruct%agrid, &
995 if ( .not. hydrostatic ) &
996 call range_check(
'W_dyn', w, is, ie, js, je, ng, npz, gridstruct%agrid, &
1001 end associate ccpp_associate
1007 subroutine rayleigh_fast(dt, npx, npy, npz, pfull, tau, u, v, w, &
1008 ks, dp, ptop, hydrostatic, rf_cutoff, bd)
1010 real,
intent(in):: dt
1011 real,
intent(in):: tau
1012 real,
intent(in):: ptop, rf_cutoff
1013 real,
intent(in),
dimension(npz):: pfull
1014 integer,
intent(in):: npx, npy, npz, ks
1015 logical,
intent(in):: hydrostatic
1016 type(fv_grid_bounds_type),
intent(IN) :: bd
1017 real,
intent(inout):: u(bd%isd:bd%ied ,bd%jsd:bd%jed+1,npz)
1018 real,
intent(inout):: v(bd%isd:bd%ied+1,bd%jsd:bd%jed,npz)
1019 real,
intent(inout):: w(bd%isd: ,bd%jsd: ,1: )
1020 real,
intent(in):: dp(npz)
1022 real(kind=R_GRID):: rff(npz)
1023 real,
parameter:: sday = 86400.
1024 real,
dimension(bd%is:bd%ie+1):: dmv
1025 real,
dimension(bd%is:bd%ie):: dmu
1029 integer :: is, ie, js, je
1030 integer :: isd, ied, jsd, jed
1046 if( is_master() )
write(6,*)
'Fast Rayleigh friction E-folding time (days):' 1048 if ( pfull(k) < rf_cutoff )
then 1049 rff(k) = dt/tau0*sin(0.5*pi*log(rf_cutoff/pfull(k))/log(rf_cutoff/ptop))**2
1051 if( is_master() )
write(6,*) k, 0.01*pfull(k), dt/(rff(k)*sday)
1053 rff(k) = 1.d0 / (1.0d0+rff(k))
1061 if ( pfull(k) < 100.e2 )
then 1068 if( is_master() )
write(6,*)
'k_rf=',
k_rf, 0.01*pfull(
k_rf),
'dm=', dm
1085 dmu(i) = dmu(i) + (1.-
rf(k))*dp(k)*u(i,j,k)
1086 u(i,j,k) =
rf(k)*u(i,j,k)
1090 dmv(i) = dmv(i) + (1.-
rf(k))*dp(k)*v(i,j,k)
1091 v(i,j,k) =
rf(k)*v(i,j,k)
1093 if ( .not. hydrostatic )
then 1095 w(i,j,k) =
rf(k)*w(i,j,k)
1102 dmu(i) = dmu(i) / dm
1106 dmv(i) = dmv(i) / dm
1112 u(i,j,k) = u(i,j,k) + dmu(i)
1116 v(i,j,k) = v(i,j,k) + dmv(i)
1123 end subroutine rayleigh_fast
1128 subroutine rayleigh_super(dt, npx, npy, npz, ks, pm, phis, tau, u, v, w, pt, &
1129 ua, va, delz, agrid, cp, rg, ptop, hydrostatic, &
1130 conserve, rf_cutoff, gridstruct, domain, bd)
1131 real,
intent(in):: dt
1132 real,
intent(in):: tau
1133 real,
intent(in):: cp, rg, ptop, rf_cutoff
1134 real,
intent(in),
dimension(npz):: pm
1135 integer,
intent(in):: npx, npy, npz, ks
1136 logical,
intent(in):: hydrostatic
1137 logical,
intent(in):: conserve
1138 type(fv_grid_bounds_type),
intent(IN) :: bd
1139 real,
intent(inout):: u(bd%isd:bd%ied ,bd%jsd:bd%jed+1,npz)
1140 real,
intent(inout):: v(bd%isd:bd%ied+1,bd%jsd:bd%jed,npz)
1141 real,
intent(inout):: w(bd%isd: ,bd%jsd: ,1: )
1142 real,
intent(inout):: pt(bd%isd:bd%ied,bd%jsd:bd%jed,npz)
1143 real,
intent(inout):: ua(bd%isd:bd%ied,bd%jsd:bd%jed,npz)
1144 real,
intent(inout):: va(bd%isd:bd%ied,bd%jsd:bd%jed,npz)
1145 real,
intent(inout):: delz(bd%isd: ,bd%jsd: ,1: )
1146 real,
intent(in) :: agrid(bd%isd:bd%ied, bd%jsd:bd%jed,2)
1147 real,
intent(in) :: phis(bd%isd:bd%ied,bd%jsd:bd%jed)
1148 type(fv_grid_type),
intent(IN) :: gridstruct
1149 type(domain2d),
intent(INOUT) :: domain
1151 real,
allocatable :: u2f(:,:,:)
1152 real,
parameter:: u0 = 60.
1153 real,
parameter:: sday = 86400.
1157 integer :: is, ie, js, je
1158 integer :: isd, ied, jsd, jed
1169 rcv = 1. / (cp - rg)
1173 allocate ( u00(is:ie, js:je+1,npz) )
1174 allocate ( v00(is:ie+1,js:je ,npz) )
1179 u00(i,j,k) = u(i,j,k)
1184 v00(i,j,k) = v(i,j,k)
1192 tau0 = abs( tau * sday )
1194 if( is_master() )
write(6,*)
'Rayleigh_Super tau=',tau
1199 if( is_master() )
write(6,*) k, 0.01*pm(k)
1201 if( is_master() )
write(6,*)
'Rayleigh friction E-folding time (days):' 1203 if ( pm(k) < rf_cutoff )
then 1205 rf(k) = dt/tau0*( log(rf_cutoff/pm(k)) )**2
1207 rf(k) = dt/tau0*sin(0.5*pi*log(rf_cutoff/pm(k))/log(rf_cutoff/ptop))**2
1209 if( is_master() )
write(6,*) k, 0.01*pm(k), dt/(
rf(k)*sday)
1218 call c2l_ord2(u, v, ua, va, gridstruct, npz, gridstruct%grid_type, bd, gridstruct%bounded_domain)
1220 allocate( u2f(isd:ied,jsd:jed,
kmax) )
1225 if ( pm(k) < rf_cutoff )
then 1226 u2f(:,:,k) = 1. / (1.+
rf(k))
1231 call timing_on(
'COMM_TOTAL')
1232 call mpp_update_domains(u2f, domain)
1233 call timing_off(
'COMM_TOTAL')
1241 if ( pm(k) < rf_cutoff )
then 1243 if (.not. hydrostatic)
then 1246 w(i,j,k) = w(i,j,k)/(1.+
rf(k))
1252 u(i,j,k) = (u(i,j,k)+
rf(k)*u00(i,j,k))/(1.+
rf(k))
1257 v(i,j,k) = (v(i,j,k)+
rf(k)*v00(i,j,k))/(1.+
rf(k))
1262 if ( conserve )
then 1263 if ( hydrostatic )
then 1266 pt(i,j,k) = pt(i,j,k) + 0.5*(ua(i,j,k)**2+va(i,j,k)**2)*(1.-u2f(i,j,k)**2)/(cp-rg*ptop/pm(k))
1272 pt(i,j,k) = pt(i,j,k) + 0.5*(ua(i,j,k)**2+va(i,j,k)**2+w(i,j,k)**2)*(1.-u2f(i,j,k)**2)*rcv
1280 u(i,j,k) = 0.5*(u2f(i,j-1,k)+u2f(i,j,k))*u(i,j,k)
1285 v(i,j,k) = 0.5*(u2f(i-1,j,k)+u2f(i,j,k))*v(i,j,k)
1288 if ( .not. hydrostatic )
then 1291 w(i,j,k) = u2f(i,j,k)*w(i,j,k)
1304 subroutine rayleigh_friction(dt, npx, npy, npz, ks, pm, tau, u, v, w, pt, &
1305 ua, va, delz, cp, rg, ptop, hydrostatic, conserve, &
1306 rf_cutoff, gridstruct, domain, bd)
1307 real,
intent(in):: dt
1308 real,
intent(in):: tau
1309 real,
intent(in):: cp, rg, ptop, rf_cutoff
1310 real,
intent(in),
dimension(npz):: pm
1311 integer,
intent(in):: npx, npy, npz, ks
1312 logical,
intent(in):: hydrostatic
1313 logical,
intent(in):: conserve
1314 type(fv_grid_bounds_type),
intent(IN) :: bd
1315 real,
intent(inout):: u(bd%isd:bd%ied ,bd%jsd:bd%jed+1,npz)
1316 real,
intent(inout):: v(bd%isd:bd%ied+1,bd%jsd:bd%jed,npz)
1317 real,
intent(inout):: w(bd%isd: ,bd%jsd: ,1: )
1318 real,
intent(inout):: pt(bd%isd:bd%ied,bd%jsd:bd%jed,npz)
1319 real,
intent(inout):: ua(bd%isd:bd%ied,bd%jsd:bd%jed,npz)
1320 real,
intent(inout):: va(bd%isd:bd%ied,bd%jsd:bd%jed,npz)
1321 real,
intent(inout):: delz(bd%isd: ,bd%jsd: ,1: )
1322 type(fv_grid_type),
intent(IN) :: gridstruct
1323 type(domain2d),
intent(INOUT) :: domain
1325 real,
allocatable :: u2f(:,:,:)
1326 real,
parameter:: sday = 86400.
1327 real,
parameter:: u000 = 4900.
1331 integer :: is, ie, js, je
1332 integer :: isd, ied, jsd, jed
1345 rcv = 1. / (cp - rg)
1349 if( is_master() )
write(6,*)
'Rayleigh friction E-folding time (days):' 1351 if ( pm(k) < rf_cutoff )
then 1352 rf(k) = dt/(tau*sday)*sin(0.5*pi*log(rf_cutoff/pm(k))/log(rf_cutoff/ptop))**2
1353 if( is_master() )
write(6,*) k, 0.01*pm(k), dt/(
rf(k)*sday)
1362 allocate( u2f(isd:ied,jsd:jed,
kmax) )
1364 call c2l_ord2(u, v, ua, va, gridstruct, npz, gridstruct%grid_type, bd, gridstruct%bounded_domain)
1368 if ( hydrostatic )
then 1371 u2f(i,j,k) = ua(i,j,k)**2 + va(i,j,k)**2
1377 u2f(i,j,k) = ua(i,j,k)**2 + va(i,j,k)**2 + w(i,j,k)**2
1383 call timing_on(
'COMM_TOTAL')
1384 call mpp_update_domains(u2f, domain)
1385 call timing_off(
'COMM_TOTAL')
1391 if ( conserve )
then 1392 if ( hydrostatic )
then 1395 pt(i,j,k) = pt(i,j,k) + 0.5*u2f(i,j,k)/(cp-rg*ptop/pm(k)) &
1396 * ( 1. - 1./(1.+
rf(k)*sqrt(u2f(i,j,k)/u000))**2 )
1402 delz(i,j,k) = delz(i,j,k) / pt(i,j,k)
1403 pt(i,j,k) = pt(i,j,k) + 0.5*u2f(i,j,k) * rcv &
1404 * ( 1. - 1./(1.+
rf(k)*sqrt(u2f(i,j,k)/u000))**2 )
1405 delz(i,j,k) = delz(i,j,k) * pt(i,j,k)
1413 u2f(i,j,k) =
rf(k)*sqrt(u2f(i,j,k)/u000)
1419 u(i,j,k) = u(i,j,k) / (1.+0.5*(u2f(i,j-1,k)+u2f(i,j,k)))
1424 v(i,j,k) = v(i,j,k) / (1.+0.5*(u2f(i-1,j,k)+u2f(i,j,k)))
1428 if ( .not. hydrostatic )
then 1431 w(i,j,k) = w(i,j,k) / (1.+u2f(i,j,k))
1443 subroutine compute_aam(npz, is, ie, js, je, isd, ied, jsd, jed, gridstruct, bd, &
1444 ptop, ua, va, u, v, delp, aam, ps, m_fac)
1446 integer,
intent(in):: npz
1447 integer,
intent(in):: is, ie, js, je
1448 integer,
intent(in):: isd, ied, jsd, jed
1449 real,
intent(in):: ptop
1450 real,
intent(inout):: u(isd:ied ,jsd:jed+1,npz)
1451 real,
intent(inout):: v(isd:ied+1,jsd:jed,npz)
1452 real,
intent(inout):: delp(isd:ied,jsd:jed,npz)
1453 real,
intent(inout),
dimension(isd:ied,jsd:jed, npz):: ua, va
1454 real,
intent(out):: aam(is:ie,js:je)
1455 real,
intent(out):: m_fac(is:ie,js:je)
1456 real,
intent(out):: ps(isd:ied,jsd:jed)
1457 type(fv_grid_bounds_type),
intent(IN) :: bd
1458 type(fv_grid_type),
intent(IN) :: gridstruct
1460 real,
dimension(is:ie):: r1, r2, dm
1463 call c2l_ord2(u, v, ua, va, gridstruct, npz, gridstruct%grid_type, bd, gridstruct%bounded_domain)
1469 r1(i) = radius*cos(gridstruct%agrid(i,j,2))
1478 ps(i,j) = ps(i,j) + dm(i)
1480 aam(i,j) = aam(i,j) + (r2(i)*omega + r1(i)*ua(i,j,k)) * dm(i)
1481 m_fac(i,j) = m_fac(i,j) + dm(i)*r2(i)
subroutine, public init_ijk_mem(i1, i2, j1, j2, km, array, var)
subroutine, public lagrangian_to_eulerian(last_step, consv, ps, pe, delp, pkz, pk, mdt, pdt, npx, npy, km, is, ie, js, je, isd, ied, jsd, jed, nq, nwat, sphum, q_con, u, v, w, delz, pt, q, hs, r_vir, cp, akap, cappa, kord_mt, kord_wz, kord_tr, kord_tm, peln, te0_2d, ng, ua, va, omga, te, ws, fill, reproduce_sum, out_dt, dtdt, ptop, ak, bk, pfull, gridstruct, domain, do_sat_adj, hydrostatic, hybrid_z, do_omega, adiabatic, do_adiabatic_init, c2l_ord, bd, fv_debug, moist_phys)
The subroutine 'Lagrangian_to_Eulerian' remaps deformed Lagrangian layers back to the reference Euler...
logical, public do_adiabatic_init
pure real function, public vicpqd(q)
subroutine, public regional_boundary_update(array, bc_vbl_name, lbnd_x, ubnd_x, lbnd_y, ubnd_y, ubnd_z, is, ie, js, je, isd, ied, jsd, jed, fcst_time, index4)
real, public current_time_in_seconds
The module 'fv_mp_mod' is a single program multiple data (SPMD) parallel decompostion/communication m...
subroutine timing_off(blk_name)
The subroutine 'timing_off' stops a timer.
The type 'fv_grid_type' is made up of grid-dependent information from fv_grid_tools and fv_grid_utils...
subroutine, public neg_adj3(is, ie, js, je, ng, kbot, hydrostatic, peln, delz, pt, dp, qv, ql, qr, qi, qs, qg, qa, check_negative)
integer, parameter, public h_stagger
subroutine, public moist_cv(is, ie, isd, ied, jsd, jed, km, j, k, nwat, sphum, liq_wat, rainwat, ice_wat, snowwat, graupel, q, qd, cvm, t1)
The subroutine 'moist_cv' computes the FV3-consistent moist heat capacity under constant volume...
subroutine, public setup_nested_grid_bcs(npx, npy, npz, zvir, ncnst, u, v, w, pt, delp, delz, q, uc, vc, nested, inline_q, make_nh, ng, gridstruct, flagstruct, neststruct, nest_timestep, tracer_nest_timestep, domain, parent_grid, bd, nwat, ak, bk)
The subroutine 'setup_nested_grid_BCs' fetches data from the coarse grid to set up the nested-grid bo...
The module 'multi_gases' peforms multi constitutents computations.
subroutine compute_aam(npz, is, ie, js, je, isd, ied, jsd, jed, gridstruct, bd, ptop, ua, va, u, v, delp, aam, ps, m_fac)
The subroutine 'compute_aam' computes vertically (mass) integrated Atmospheric Angular Momentum...
real function, public g_sum(domain, p, ifirst, ilast, jfirst, jlast, ngc, area, mode, reproduce)
The function 'g_sum' is the fast version of 'globalsum'.
subroutine, public compute_total_energy(is, ie, js, je, isd, ied, jsd, jed, km, u, v, w, delz, pt, delp, q, qc, pe, peln, hs, rsin2_l, cosa_s_l, r_vir, cp, rg, hlv, te_2d, ua, va, teq, moist_phys, nwat, sphum, liq_wat, rainwat, ice_wat, snowwat, graupel, hydrostatic, id_te)
The subroutine 'compute_total_energy' performs the FV3-consistent computation of the global total ene...
The module 'fv_dynamics' is the top-level routine for the dynamical core.
The module 'fv_sg' performs FV sub-grid mixing.
pure real function, public virqd(q)
The module fv_nwp_nudge contains routines for nudging to input analyses. note This module is currentl...
subroutine, public prt_mxm(qname, q, is, ie, js, je, n_g, km, fac, area, domain)
The module 'fv_timing' contains FV3 timers.
pure real function, public virq(q)
The module 'boundary' contains utility routines for grid nesting and boundary conditions.
subroutine, public fv_dynamics(npx, npy, npz, nq_tot, ng, bdt, consv_te, fill, reproduce_sum, kappa, cp_air, zvir, ptop, ks, ncnst, n_split, q_split, u, v, w, delz, hydrostatic, pt, delp, q, ps, pe, pk, peln, pkz, phis, q_con, omga, ua, va, uc, vc, ak, bk, mfx, mfy, cx, cy, ze0, hybrid_z, gridstruct, flagstruct, neststruct, idiag, bd, parent_grid, domain, diss_est, time_total)
The module 'fv_tracer2d.F90' performs sub-cycled tracer advection.
subroutine, public set_regional_bcs(delp, delz, w, pt ifdef USE_COND
The module 'fv_mapz' contains the vertical mapping routines .
subroutine, public tracer_2d_nested(q, dp1, mfx, mfy, cx, cy, gridstruct, bd, domain, npx, npy, npz, nq, hord, q_split, dt, id_divg, q_pack, nord_tr, trdm, k_split, neststruct, parent_grid, n_map, lim_fac)
subroutine, public dyn_core(npx, npy, npz, ng, sphum, nq, bdt, n_map, n_split, zvir, cp, akap, cappa, grav, hydrostatic, u, v, w, delz, pt, q, delp, pe, pk, phis, ws, omga, ptop, pfull, ua, va, uc, vc, mfx, mfy, cx, cy, pkz, peln, q_con, ak, bk, ks, gridstruct, flagstruct, neststruct, idiag, bd, domain, init_step, i_pack, end_step, diss_est, time_total)
logical, public prt_minmax
subroutine, public cubed_to_latlon(u, v, ua, va, gridstruct, npx, npy, km, mode, grid_type, domain, bounded_domain, c2l_ord, bd)
The module 'fv_arrays' contains the 'fv_atmos_type' and associated datatypes.
subroutine, public moist_cp(is, ie, isd, ied, jsd, jed, km, j, k, nwat, sphum, liq_wat, rainwat, ice_wat, snowwat, graupel, q, qd, cpm, t1)
The subroutine 'moist_cp' computes the FV3-consistent moist heat capacity under constant pressure...
subroutine, public del2_cubed(q, cd, gridstruct, domain, npx, npy, km, nmax, bd)
The subroutine 'del2-cubed' filters the omega field for the physics.
subroutine, public fill2d(is, ie, js, je, ng, km, q, delp, area, domain, bounded_domain, npx, npy)
The subroutine 'fill2D' fills in nonphysical negative values in a single scalar field using a two-dim...
type(time_type), public fv_time
subroutine rayleigh_friction(dt, npx, npy, npz, ks, pm, tau, u, v, w, pt, ua, va, delz, cp, rg, ptop, hydrostatic, conserve, rf_cutoff, gridstruct, domain, bd)
subroutine timing_on(blk_name)
The subroutine 'timing_on' starts a timer.
integer, parameter, public v_stagger
subroutine, public c2l_ord2(u, v, ua, va, gridstruct, km, grid_type, bd, do_halo)
@ The module 'fv_diagnostics' contains routines to compute diagnosic fields.
The module 'fv_grid_utils' contains routines for setting up and computing grid-related quantities...
The module 'dyn_core' peforms the Lagrangian acoustic dynamics described by .
subroutine rayleigh_super(dt, npx, npy, npz, ks, pm, phis, tau, u, v, w, pt, ua, va, delz, agrid, cp, rg, ptop, hydrostatic, conserve, rf_cutoff, gridstruct, domain, bd)
subroutine, public nested_grid_bc_apply_intt(var_nest, istag, jstag, npx, npy, npz, bd, step, split, BC, bctype)
The subroutine 'nested_grid_BC_apply_intT' performs linear interpolation or extrapolation in time for...
subroutine, public neg_adj2(is, ie, js, je, ng, kbot, hydrostatic, peln, delz, pt, dp, qv, ql, qr, qi, qs, qa, check_negative)
real, dimension(:), allocatable rf
subroutine, public tracer_2d_1l(q, dp1, mfx, mfy, cx, cy, gridstruct, bd, domain, npx, npy, npz, nq, hord, q_split, dt, id_divg, q_pack, nord_tr, trdm, lim_fac)
The subroutine 'tracer_2d_1L' performs 2-D horizontal-to-lagrangian transport.
subroutine, public tracer_2d(q, dp1, mfx, mfy, cx, cy, gridstruct, bd, domain, npx, npy, npz, nq, hord, q_split, dt, id_divg, q_pack, nord_tr, trdm, lim_fac)
The subroutine 'tracer_2d' is the standard routine for sub-cycled tracer advection.
integer, parameter, public u_stagger
The module 'fv_nesting' is a collection of routines pertaining to grid nesting .