140 #include <fms_platform.h> 145 use block_control_mod
, only: block_control_type
146 use constants_mod
, only: cp_air, rdgas, grav, rvgas, kappa, pstd_mks
147 use time_manager_mod
, only: time_type, get_time, set_time,
operator(+), &
148 operator(-),
operator(/), time_type_to_real
149 use fms_mod
, only: file_exist, open_namelist_file, &
150 close_file, error_mesg, fatal, &
151 check_nml_error, stdlog, &
152 write_version_number, &
155 mpp_clock_id, mpp_clock_begin, &
156 mpp_clock_end, clock_subcomponent, &
157 clock_flag_default, nullify_domain
158 use mpp_mod
, only: mpp_error, stdout, fatal, warning, note, &
159 input_nml_file, mpp_root_pe, &
160 mpp_npes, mpp_pe, mpp_chksum, &
161 mpp_get_current_pelist, &
162 mpp_set_current_pelist, mpp_sync
163 use mpp_parameter_mod
, only: eupdate, wupdate, supdate, nupdate
164 use mpp_domains_mod
, only: domain2d, mpp_update_domains
165 use xgrid_mod
, only: grid_box_type
166 use field_manager_mod
, only: model_atmos
167 use tracer_manager_mod
, only: get_tracer_index, get_number_tracers, &
168 no_tracer, get_tracer_names
170 use ipd_typedefs
, only: ipd_data_type, kind_phys => ipd_kind_phys
197 use mpp_domains_mod
, only: mpp_get_data_domain, mpp_get_compute_domain
227 #include<file_version.h> 228 character(len=20) ::
mod_name =
'fvGFS/atmosphere_mod' 273 subroutine atmosphere_init (Time_init, Time, Time_step, Grid_box, area)
275 use ccpp_static_api
, only: ccpp_physics_init
276 use ccpp_data
, only: ccpp_suite, &
277 cdata => cdata_tile, &
283 type(time_type),
intent(in) :: time_init, time, time_step
284 type(grid_box_type),
intent(inout) :: Grid_box
285 real(kind=kind_phys),
pointer,
dimension(:,:),
intent(inout) :: area
289 logical :: do_atmos_nudge
290 character(len=32) :: tracer_name, tracer_units
297 integer :: nlunit = 9999
298 character (len = 64) :: fn_nml =
'input.nml' 306 allocate(
pelist(mpp_npes()))
307 call mpp_get_current_pelist(
pelist)
309 zvir = rvgas/rdgas - 1.
319 cold_start = (.not.file_exist(
'INPUT/fv_core.res.nc') .and. .not.file_exist(
'INPUT/fv_core.res.tile1.nc'))
325 if(
atm(
mygrid)%flagstruct%warm_start)
then 330 call write_version_number (
'fvGFS/ATMOSPHERE_MOD', version )
351 sphum = get_tracer_index(model_atmos,
'sphum' )
352 liq_wat = get_tracer_index(model_atmos,
'liq_wat' )
353 ice_wat = get_tracer_index(model_atmos,
'ice_wat' )
354 rainwat = get_tracer_index(model_atmos,
'rainwat' )
355 snowwat = get_tracer_index(model_atmos,
'snowwat' )
356 graupel = get_tracer_index(model_atmos,
'graupel' )
358 cld_amt = get_tracer_index(model_atmos,
'cld_amt')
362 call mpp_error (fatal,
' atmosphere_init: condensate species are not first in the list of & 363 &tracers defined in the field_table')
374 allocate(grid_box%edge_w(
jsc:
jec+1))
375 allocate(grid_box%edge_e(
jsc:
jec+1))
376 allocate(grid_box%edge_s(
isc:
iec+1 ))
377 allocate(grid_box%edge_n(
isc:
iec+1 ))
422 id_dynam = mpp_clock_id(
'FV dy-core', flags = clock_flag_default, grain=clock_subcomponent )
423 id_subgridz = mpp_clock_id(
'FV subgrid_z',flags = clock_flag_default, grain=clock_subcomponent )
424 id_fv_diag = mpp_clock_id(
'FV Diag', flags = clock_flag_default, grain=clock_subcomponent )
438 nthreads = omp_get_max_threads()
450 cld_amt>0, kappa,
atm(
mygrid)%flagstruct%hydrostatic, &
467 mpirank=mpp_pe(), mpiroot=mpp_root_pe())
469 if (
atm(
mygrid)%flagstruct%do_sat_adj)
then 471 call ccpp_physics_init(cdata, suite_name=trim(ccpp_suite), group_name=
"fast_physics", ierr=ierr)
473 cdata%errmsg =
' atmosphere_dynamics: error in ccpp_physics_init for group fast_physics: ' // trim(cdata%errmsg)
474 call mpp_error (fatal, cdata%errmsg)
491 call mpp_error(note,
'NWP nudging is active')
496 if (
atm(
mygrid)%flagstruct%na_init>0 )
then 497 call nullify_domain ( )
498 if ( .not.
atm(
mygrid)%flagstruct%hydrostatic )
then 502 if ( .not.
atm(
mygrid)%flagstruct%hydrostatic )
then 505 call prt_height(
'na_ini Z500',
isc,
iec,
jsc,
jec, 3,
npz, 500.e2,
atm(
mygrid)%phis,
atm(
mygrid)%delz, &
509 call mpp_error(note,
'No adiabatic initialization correction in use')
513 call nullify_domain()
524 subroutine p_adi(km, ng, ifirst, ilast, jfirst, jlast, ptop, &
525 delp, pt, ps, pe, peln, pk, pkz, hydrostatic)
528 integer,
intent(in):: km, ng
529 integer,
intent(in):: ifirst, ilast
530 integer,
intent(in):: jfirst, jlast
531 logical,
intent(in):: hydrostatic
532 real,
intent(in):: ptop
533 real,
intent(in):: pt(ifirst-ng:ilast+ng,jfirst-ng:jlast+ng, km)
534 real,
intent(in):: delp(ifirst-ng:ilast+ng,jfirst-ng:jlast+ng, km)
536 real,
intent(out) :: ps(ifirst-ng:ilast+ng, jfirst-ng:jlast+ng)
537 real,
intent(out) :: pk(ifirst:ilast, jfirst:jlast, km+1)
538 real,
intent(out) :: pe(ifirst-1:ilast+1,km+1,jfirst-1:jlast+1)
539 real,
intent(out) :: peln(ifirst:ilast, km+1, jfirst:jlast)
540 real,
intent(out) :: pkz(ifirst:ilast, jfirst:jlast, km)
558 pe(i,k,j) = pe(i,k-1,j) + delp(i,j,k-1)
559 peln(i,k,j) = log(pe(i,k,j))
560 pk(i,j,k) = exp( kappa*peln(i,k,j) )
565 ps(i,j) = pe(i,km+1,j)
568 if ( hydrostatic )
then 571 pkz(i,j,k) = (pk(i,j,k+1)-pk(i,j,k))/(kappa*(peln(i,k+1,j)-peln(i,k,j)))
583 type(time_type),
intent(in) :: Time
584 integer :: n, psc, atmos_time_step
585 integer :: k, w_diff, nt_dyn, n_split_loc, seconds, days
587 type(time_type) :: atmos_time
595 call get_time (time, seconds, days)
598 if (seconds < nint(3600*
atm(n)%flagstruct%fhouri) .and.
atm(n)%flagstruct%fac_n_spl > 1.0)
then 599 n_split_loc = nint(
atm(n)%flagstruct%n_split *
atm(n)%flagstruct%fac_n_spl)
601 n_split_loc =
atm(n)%flagstruct%n_split
611 if(
atm(n)%flagstruct%regional)
then 622 Atm(n)%flagstruct%consv_te, Atm(n)%flagstruct%fill, &
623 Atm(n)%flagstruct%reproduce_sum, kappa, cp_air, zvir, &
624 Atm(n)%ptop, Atm(n)%ks, nq, &
625 n_split_loc, Atm(n)%flagstruct%q_split, &
627 atm(n)%u, atm(n)%v, atm(n)%w, atm(n)%delz, &
628 atm(n)%flagstruct%hydrostatic, &
629 atm(n)%pt , atm(n)%delp, atm(n)%q, atm(n)%ps, &
630 atm(n)%pe, atm(n)%pk, atm(n)%peln, &
631 atm(n)%pkz, atm(n)%phis, atm(n)%q_con, &
632 atm(n)%omga, atm(n)%ua, atm(n)%va, atm(n)%uc, &
633 atm(n)%vc, atm(n)%ak, atm(n)%bk, atm(n)%mfx, &
634 atm(n)%mfy , atm(n)%cx, atm(n)%cy, atm(n)%ze0, &
635 atm(n)%flagstruct%hybrid_z, &
636 atm(n)%gridstruct, atm(n)%flagstruct, &
637 atm(n)%neststruct, atm(n)%idiag, atm(n)%bd, &
638 atm(n)%parent_grid, atm(n)%domain,atm(n)%diss_est)
661 w_diff = get_tracer_index(model_atmos,
'w_diff' )
662 if ( atm(n)%flagstruct%fv_sg_adj > 0 )
then 664 if ( w_diff /= no_tracer )
then 668 nt_dyn,
dt_atmos, atm(n)%flagstruct%fv_sg_adj, &
669 atm(n)%flagstruct%nwat, atm(n)%delp, atm(n)%pe, &
670 atm(n)%peln, atm(n)%pkz, atm(n)%pt, atm(n)%q, &
671 atm(n)%ua, atm(n)%va, atm(n)%flagstruct%hydrostatic,&
673 atm(n)%flagstruct%n_sponge)
677 if ( .not. atm(n)%flagstruct%hydrostatic .and. w_diff /= no_tracer )
then 683 q_dt(:,:,k,w_diff) = 0.
697 use ccpp_static_api
, only: ccpp_physics_finalize
698 use ccpp_data
, only: ccpp_suite
699 use ccpp_data
, only: cdata => cdata_tile
701 type(time_type),
intent(in) :: time
702 type(grid_box_type),
intent(inout) :: Grid_box
703 logical,
intent(in) :: restart_endfcst
707 if (
atm(
mygrid)%flagstruct%do_sat_adj)
then 709 call ccpp_physics_finalize(cdata, suite_name=trim(ccpp_suite), group_name=
"fast_physics", ierr=ierr)
711 cdata%errmsg =
' atmosphere_dynamics: error in ccpp_physics_finalize for group fast_physics: ' // trim(cdata%errmsg)
712 call mpp_error (fatal, cdata%errmsg)
721 call nullify_domain ( )
744 character(len=*),
intent(in) :: timestamp
755 integer,
intent(out) :: i_size, j_size
756 logical,
intent(in),
optional :: global
760 if(
PRESENT(global) ) local = .NOT.global
775 real,
dimension(:,:),
intent(inout) :: p_ref
783 integer,
intent(out) :: i1, i2, j1, j2, kt
784 logical,
intent(out),
optional :: p_hydro, hydro
785 integer,
intent(out),
optional :: tile_num
792 if (
present(tile_num)) tile_num =
atm(
mygrid)%tile_of_mosaic
793 if (
present(p_hydro)) p_hydro =
atm(
mygrid)%flagstruct%phys_hydrostatic
794 if (
present( hydro)) hydro =
atm(
mygrid)%flagstruct%hydrostatic
802 real(kind=kind_phys),
intent(out) :: lon(:,:), lat(:,:)
819 real,
intent(out) :: blon(:,:), blat(:,:)
820 logical,
intent(in),
optional :: global
824 if(
PRESENT(global) )
then 825 if (global)
call mpp_error(fatal,
'==> global grid is no longer available & 826 & in the Cubed Sphere')
840 call mpp_set_current_pelist(
atm(
mygrid)%pelist, no_sync=.true.)
849 type(domain2d),
intent(out) :: fv_domain
850 integer,
intent(out) :: layout(2)
851 logical,
intent(out) :: regional
852 logical,
intent(out) :: nested
853 integer,
pointer,
intent(out) :: pelist(:)
857 fv_domain =
atm(
mygrid)%domain_for_coupler
859 regional =
atm(
mygrid)%flagstruct%regional
870 integer,
intent(out) :: axes (:)
873 if (
size(axes(:)) < 0 .or.
size(axes(:)) > 4 )
call error_mesg ( &
874 'get_atmosphere_axes in atmosphere_mod', &
875 'size of argument is incorrect', fatal )
877 axes(1:
size(axes(:))) =
atm(
mygrid)%atmos_axes (1:
size(axes(:)))
887 real(kind=kind_phys),
pointer,
dimension(:),
intent(inout) :: ak, bk
888 logical,
intent(in) :: flip
909 real(kind=kind_phys),
pointer,
dimension(:,:,:),
intent(inout) :: hgt
910 character(len=5),
intent(in) :: position
911 logical,
intent(in) :: relative
912 logical,
intent(in) :: flip
914 integer:: lev, k, j, i
915 real(kind=kind_phys),
allocatable,
dimension(:,:,:) :: z, dz
917 if ((position .ne.
"layer") .and. (position .ne.
"level"))
then 918 call mpp_error (fatal,
'atmosphere_hgt:: incorrect position specification')
926 if (
atm(
mygrid)%flagstruct%hydrostatic)
then 946 if (.not. relative)
then 950 z(:,:,k) = z(:,:,k-1) - dz(:,:,
npz+2-k)
953 if (.not. relative)
then 957 z(:,:,k) = z(:,:,k+1) - dz(:,:,k)
962 if (position ==
"level")
then 965 elseif (position ==
"layer")
then 967 hgt(:,:,1:
npz) = 0.5d0 * (z(:,:,1:
npz) + z(:,:,2:
npz+1))
993 real(kind=kind_phys),
dimension(1:isize,1:jsize,ksize),
intent(inout) :: data
996 integer,
intent(in) :: halo
997 integer,
intent(in) :: isize
998 integer,
intent(in) :: jsize
999 integer,
intent(in) :: ksize
1000 real(kind=kind_phys),
dimension(:,:),
optional,
intent(in) :: data_p
1004 character(len=44) :: modname =
'atmosphere_mod::atmosphere_scalar_field_halo' 1005 integer :: mpp_flags
1008 if (halo .gt. 3)
call mpp_error(fatal, modname//.gt.
' - halo3 requires extending the MPP domain to support')
1009 ic = isize - 2 * halo
1010 jc = jsize - 2 * halo
1013 if (
present(data_p))
then 1014 if (ic*jc .ne.
size(data_p,1))
call mpp_error(fatal, modname//
' - incorrect sizes for incoming & 1015 &variables data and data_p')
1023 data(i+halo, j+halo, k) = data_p(i + (j-1)*ic, k)
1029 mpp_flags = eupdate + wupdate + supdate + nupdate
1031 call mpp_update_domains(
data,
atm(
mygrid)%domain_for_coupler, flags=mpp_flags, complete=.true.)
1032 elseif (halo == 3)
then 1033 call mpp_update_domains(
data,
atm(
mygrid)%domain, flags=mpp_flags, complete=.true.)
1035 call mpp_error(fatal, modname//
' - unsupported halo size')
1044 if ((
isc== 1) .and. (
jsc== 1))
data(halo+1-j ,halo+1-i ,k) =
data(halo+i ,halo+1-j ,k)
1045 if ((
isc== 1) .and. (
jec==
npy-1))
data(halo+1-j ,halo+jc+i,k) =
data(halo+i ,halo+jc+j,k)
1046 if ((
iec==
npx-1) .and. (
jsc== 1))
data(halo+ic+j,halo+1-i ,k) =
data(halo+ic-i+1,halo+1-j ,k)
1047 if ((
iec==
npx-1) .and. (
jec==
npy-1))
data(halo+ic+j,halo+jc+i,k) =
data(halo+ic-i+1,halo+jc+j,k)
1060 integer,
intent(in) :: npass
1066 do k = 1,min(3,npass)
1088 type(time_type),
intent(in) :: Time
1089 logical,
optional,
intent(in) :: init, ltavg
1090 real,
optional,
intent(in) :: avg_max_length
1091 if (
PRESENT(init))
then 1096 call mpp_error(fatal,
'atmosphere_nggps_diag - calling with init present, but set to .false.')
1099 if (
PRESENT(ltavg))
then 1149 subroutine get_bottom_mass ( t_bot, tr_bot, p_bot, z_bot, p_surf, slp )
1155 real,
intent(out),
dimension(isc:iec,jsc:jec):: t_bot, p_bot, z_bot, p_surf
1156 real,
intent(out),
optional,
dimension(isc:iec,jsc:jec):: slp
1157 real,
intent(out),
dimension(isc:iec,jsc:jec,nq):: tr_bot
1159 integer :: i, j, m, k, kr
1160 real :: rrg, sigtop, sigbot
1161 real,
dimension(isc:iec,jsc:jec) :: tref
1162 real,
parameter :: tlaps = 6.5e-3
1171 z_bot(i,j) = rrg*t_bot(i,j)*(1. -
atm(
mygrid)%pe(i,
npz,j)/p_bot(i,j))
1180 if (
present(slp) )
then 1185 if (sigbot+sigtop > 1.6)
then 1196 slp(i,j) =
atm(
mygrid)%ps(i,j)*(1.+tlaps*
atm(
mygrid)%phis(i,j)/(tref(i,j)*grav))**(1./(rrg*tlaps))
1218 real,
intent(out),
dimension(isc:iec,jsc:jec):: u_bot, v_bot
1243 type(block_control_type),
intent(in) :: Atm_block
1246 integer :: ix, i, j, nt, k, nb
1247 real :: rrg, sigtop, sigbot, tref
1249 real,
parameter :: tlaps = 6.5e-3
1252 logical,
save :: first_time = .true.
1256 if (first_time)
then 1261 if (sigbot+sigtop > 1.6)
then 1268 do nb = 1,atm_block%nblks
1269 call dycore_data(nb)%Coupling%create (atm_block%blksz(nb),
nq)
1271 first_time = .false.
1277 do nb = 1,atm_block%nblks
1278 do ix = 1,atm_block%blksz(nb)
1279 i = atm_block%index(nb)%ii(ix)
1280 j = atm_block%index(nb)%jj(ix)
1282 dycore_data(nb)%Coupling%p_srf(ix) =
atm(
mygrid)%ps(i,j)
1284 dycore_data(nb)%Coupling%t_bot(ix) =
atm(
mygrid)%pt(i,j,
npz)
1286 dycore_data(nb)%Coupling%u_bot(ix) =
atm(
mygrid)%u_srf(i,j)
1287 dycore_data(nb)%Coupling%v_bot(ix) =
atm(
mygrid)%v_srf(i,j)
1289 dycore_data(nb)%Coupling%z_bot(ix) = rrg*dycore_data(nb)%Coupling%t_bot(ix) * &
1290 (1. -
atm(
mygrid)%pe(i,
npz,j)/dycore_data(nb)%Coupling%p_bot(ix))
1292 dycore_data(nb)%Coupling%z_bot(ix) = dycore_data(nb)%Coupling%z_bot(ix)*
virq(
atm(
mygrid)%q(i,j,
npz,:))
1294 dycore_data(nb)%Coupling%z_bot(ix) = dycore_data(nb)%Coupling%z_bot(ix)*(1.+
zvir*
atm(
mygrid)%q(i,j,
npz,1))
1299 dycore_data(nb)%Coupling%slp(ix) =
atm(
mygrid)%ps(i,j)*(1.+tlaps*
atm(
mygrid)%phis(i,j)/(tref*grav))**(1./(rrg*tlaps))
1304 do ix = 1,atm_block%blksz(nb)
1305 i = atm_block%index(nb)%ii(ix)
1306 j = atm_block%index(nb)%jj(ix)
1307 dycore_data(nb)%Coupling%tr_bot(ix,nt) =
atm(
mygrid)%q(i,j,
npz,nt)
1316 integer,
intent(in) :: index
1317 real,
intent(out) :: value
1325 real,
pointer :: area(:,:)
1358 value =
value + wm(i,j)*area(i,j)
1373 type(time_type),
intent(in) :: Time
1374 type(ipd_data_type),
intent(in) :: IPD_Data(:)
1376 type(block_control_type),
intent(in) :: Atm_block
1377 logical,
intent(in) :: flip_vc
1379 type(time_type) :: Time_prev, Time_next
1380 integer :: i, j, ix, k, k1, n, w_diff, nt_dyn, iq
1381 integer :: nb, blen, nwat, dnats, nq_adv
1382 real(kind=kind_phys):: rcp, q0, qwat(
nq), qt, rdt
1383 real psum, qsum, psumb, qsumb, betad
1384 character(len=32) :: tracer_name
1390 nwat =
atm(n)%flagstruct%nwat
1394 if(
nq<3 )
call mpp_error(fatal,
'GFS phys must have 3 interactive tracers')
1396 if (iau_data%in_interval)
then 1397 if (iau_data%drymassfixer)
then 1404 if (is_master())
then 1405 print *,
'dry ps before IAU/physics',psumb+
atm(n)%ptop-qsumb
1416 u_dt(i,j,k) =
u_dt(i,j,k) + iau_data%ua_inc(i,j,k)
1417 v_dt(i,j,k) =
v_dt(i,j,k) + iau_data%va_inc(i,j,k)
1418 t_dt(i,j,k) =
t_dt(i,j,k) + iau_data%temp_inc(i,j,k)
1419 atm(n)%delp(i,j,k) =
atm(n)%delp(i,j,k) + iau_data%delp_inc(i,j,k)*
dt_atmos 1423 if (.not.
atm(
mygrid)%flagstruct%hydrostatic)
then 1427 atm(n)%delz(i,j,k) =
atm(n)%delz(i,j,k) + iau_data%delz_inc(i,j,k)*
dt_atmos 1433 do nb = 1,atm_block%nblks
1435 blen = atm_block%blksz(nb)
1443 i = atm_block%index(nb)%ii(ix)
1444 j = atm_block%index(nb)%jj(ix)
1445 ipd_data(nb)%Stateout%gq0(ix,k,:) = ipd_data(nb)%Stateout%gq0(ix,k,:) + iau_data%tracer_inc(i,j,k1,:)*
dt_atmos 1464 do nb = 1,atm_block%nblks
1468 blen = atm_block%blksz(nb)
1469 if (
atm(n)%flagstruct%fill_gfs)
call fill_gfs(blen,
npz, ipd_data(nb)%Statein%prsi, ipd_data(nb)%Stateout%gq0, 1.e-9_kind_phys)
1474 call get_tracer_names (model_atmos, iq, tracer_name)
1475 if (index(tracer_name,
'nopbl') > 0)
then 1476 ipd_data(nb)%Stateout%gq0(:,:,iq) = ipd_data(nb)%Statein%qgrs(:,:,iq)
1488 i = atm_block%index(nb)%ii(ix)
1489 j = atm_block%index(nb)%jj(ix)
1490 u_dt(i,j,k1) =
u_dt(i,j,k1) + (ipd_data(nb)%Stateout%gu0(ix,k) - ipd_data(nb)%Statein%ugrs(ix,k)) * rdt
1491 v_dt(i,j,k1) =
v_dt(i,j,k1) + (ipd_data(nb)%Stateout%gv0(ix,k) - ipd_data(nb)%Statein%vgrs(ix,k)) * rdt
1493 t_dt(i,j,k1) =
t_dt(i,j,k1) + (ipd_data(nb)%Stateout%gt0(ix,k) - ipd_data(nb)%Statein%tgrs(ix,k)) * rdt
1501 q0 = ipd_data(nb)%Statein%prsi(ix,k) - ipd_data(nb)%Statein%prsi(ix,k+1)
1503 q0 = ipd_data(nb)%Statein%prsi(ix,k+1) - ipd_data(nb)%Statein%prsi(ix,k)
1505 qwat(1:nq_adv) = q0*ipd_data(nb)%Stateout%gq0(ix,k,1:nq_adv)
1512 q0 =
atm(n)%delp(i,j,k1)*(1.-sum(
atm(n)%q(i,j,k1,1:max(nwat,
num_gas)))) + sum(qwat(1:max(nwat,
num_gas)))
1514 qt = sum(qwat(1:nwat))
1515 q0 =
atm(n)%delp(i,j,k1)*(1.-sum(
atm(n)%q(i,j,k1,1:nwat))) + qt
1517 atm(n)%delp(i,j,k1) = q0
1518 atm(n)%q(i,j,k1,1:nq_adv) = qwat(1:nq_adv) / q0
1534 i = atm_block%index(nb)%ii(ix)
1535 j = atm_block%index(nb)%jj(ix)
1536 atm(
mygrid)%qdiag(i,j,k1,iq) = ipd_data(nb)%Stateout%gq0(ix,k,iq)
1545 if (iau_data%in_interval .and. iau_data%drymassfixer)
then 1553 betad = (psum - (psumb - qsumb))/qsum
1554 if (is_master())
then 1555 print *,
'dry ps after IAU/physics',psum+
atm(n)%ptop-qsum
1557 atm(n)%q(:,:,:,1:nwat) = betad*
atm(n)%q(:,:,:,1:nwat)
1568 w_diff = get_tracer_index(model_atmos,
'w_diff' )
1570 if ( w_diff /= no_tracer )
then 1576 if ( .not.
atm(n)%flagstruct%hydrostatic .and. w_diff /= no_tracer )
then 1584 atm(n)%q(i,j,k,w_diff) = q_dt(i,j,k,w_diff)
1586 t_dt(i,j,k) =
t_dt(i,j,k) - q_dt(i,j,k,w_diff)*rcp*&
1597 call fv_update_phys(
dt_atmos,
isc,
iec,
jsc,
jec,
isd,
ied,
jsd,
jed,
atm(n)%ng, nt_dyn, &
1599 atm(n)%q,
atm(n)%qdiag, &
1604 .true., time_next,
atm(n)%flagstruct%nudge,
atm(n)%gridstruct, &
1605 atm(n)%gridstruct%agrid(:,:,1),
atm(n)%gridstruct%agrid(:,:,2), &
1606 atm(n)%npx,
atm(n)%npy,
atm(n)%npz,
atm(n)%flagstruct, &
1607 atm(n)%neststruct,
atm(n)%bd,
atm(n)%domain,
atm(n)%ptop,
atm(n)%phys_diag)
1619 call nullify_domain()
1622 if (
atm(
mygrid)%flagstruct%print_freq /= -99)
then 1628 call nullify_domain()
1644 type(time_type),
intent(in) :: time
1645 real,
allocatable,
dimension(:,:,:):: u0, v0, t0, dz0, dp0
1646 real,
intent(in) :: zvir
1647 logical,
intent(inout):: nudge_dz
1649 real,
parameter:: wt = 2.
1653 real,
parameter:: q1_h2o = 2.2e-6
1654 real,
parameter:: q7_h2o = 3.8e-6
1655 real,
parameter:: q100_h2o = 3.8e-6
1656 real,
parameter:: q1000_h2o = 3.1e-6
1657 real,
parameter:: q2000_h2o = 2.8e-6
1658 real,
parameter:: q3000_h2o = 3.0e-6
1660 integer:: isc, iec, jsc, jec, npz
1661 integer:: m, n, i,j,k, ngc, n_split_loc, days
1663 character(len=80) :: errstr
1667 write(errstr,
'(A, I4, A)')
'Performing adiabatic init',
atm(
mygrid)%flagstruct%na_init,
' times' 1668 call mpp_error(note, errstr)
1669 sphum = get_tracer_index(model_atmos,
'sphum' )
1687 allocate ( u0(isc:iec, jsc:jec+1, npz) )
1688 allocate ( v0(isc:iec+1,jsc:jec, npz) )
1689 allocate (dp0(isc:iec,jsc:jec, npz) )
1691 if (
atm(
mygrid)%flagstruct%hydrostatic ) nudge_dz = .false.
1693 if ( nudge_dz )
then 1694 allocate (dz0(isc:iec,jsc:jec, npz) )
1696 allocate ( t0(isc:iec,jsc:jec, npz) )
1713 if ( nudge_dz )
then 1734 call get_time (time,
seconds, days)
1736 n_split_loc = nint(
atm(
mygrid)%flagstruct%n_split *
atm(
mygrid)%flagstruct%fac_n_spl)
1738 n_split_loc =
atm(
mygrid)%flagstruct%n_split
1747 atm(
mygrid)%flagstruct%fill,
atm(
mygrid)%flagstruct%reproduce_sum, kappa, cp_air, zvir, &
1762 atm(
mygrid)%flagstruct%fill,
atm(
mygrid)%flagstruct%reproduce_sum, kappa, cp_air, zvir, &
1790 if(
atm(
mygrid)%flagstruct%nudge_qv )
then 1794 if ( p00 < 30.e2 )
then 1795 if ( p00 < 1. )
then 1797 elseif ( p00 <= 7. .and. p00 >= 1. )
then 1798 q00 = q1_h2o + (q7_h2o-q1_h2o)*log(
pref(k,1)/1.)/log(7.)
1799 elseif ( p00 < 100. .and. p00 >= 7. )
then 1800 q00 = q7_h2o + (q100_h2o-q7_h2o)*log(
pref(k,1)/7.)/log(100./7.)
1801 elseif ( p00 < 1000. .and. p00 >= 100. )
then 1802 q00 = q100_h2o + (q1000_h2o-q100_h2o)*log(
pref(k,1)/1.e2)/log(10.)
1803 elseif ( p00 < 2000. .and. p00 >= 1000. )
then 1804 q00 = q1000_h2o + (q2000_h2o-q1000_h2o)*log(
pref(k,1)/1.e3)/log(2.)
1806 q00 = q2000_h2o + (q3000_h2o-q2000_h2o)*log(
pref(k,1)/2.e3)/log(1.5)
1815 if ( nudge_dz )
then 1839 atm(
mygrid)%flagstruct%fill,
atm(
mygrid)%flagstruct%reproduce_sum, kappa, cp_air, zvir, &
1853 atm(
mygrid)%flagstruct%fill,
atm(
mygrid)%flagstruct%reproduce_sum, kappa, cp_air, zvir, &
1880 if ( nudge_dz )
then 1906 if (
allocated(t0) )
deallocate ( t0 )
1907 if (
allocated(dz0) )
deallocate ( dz0 )
1922 #if defined(OVERLOAD_R4) 1923 #define _DBL_(X) DBLE(X) 1924 #define _RL_(X) REAL(X,KIND=4) 1930 type(ipd_data_type),
intent(inout) :: ipd_data(:)
1931 type(block_control_type),
intent(in) :: atm_block
1932 logical,
intent(in) :: flip_vc
1936 real(kind=kind_phys),
parameter :: p00 = 1.e5
1937 real(kind=kind_phys),
parameter :: qmin = 1.0e-10
1938 real(kind=kind_phys) :: pk0inv, ptop, pktop
1939 real(kind=kind_phys) :: rTv, dm, qgrs_rad
1940 integer :: nb, blen, npz, i, j, k, ix, k1, kz, dnats, nq_adv
1942 real :: q_grs(
nq), q_min
1951 pktop = (ptop/p00)**kappa
1952 pk0inv = (1.0_kind_phys/p00)**kappa
1973 do nb = 1,atm_block%nblks
1977 blen = atm_block%blksz(nb)
1981 ipd_data(nb)%Statein%phii(:,1) = 0.0_kind_phys
1983 ipd_data(nb)%Statein%phii(:,npz+1) = 0.0_kind_phys
1985 ipd_data(nb)%Statein%prsik(:,:) = 1.e25_kind_phys
1998 i = atm_block%index(nb)%ii(ix)
1999 j = atm_block%index(nb)%jj(ix)
2001 ipd_data(nb)%Statein%tgrs(ix,k) = _dbl_(_rl_(
atm(
mygrid)%pt(i,j,k1)))
2002 ipd_data(nb)%Statein%ugrs(ix,k) = _dbl_(_rl_(
atm(
mygrid)%ua(i,j,k1)))
2003 ipd_data(nb)%Statein%vgrs(ix,k) = _dbl_(_rl_(
atm(
mygrid)%va(i,j,k1)))
2004 ipd_data(nb)%Statein%vvl(ix,k) = _dbl_(_rl_(
atm(
mygrid)%omga(i,j,k1)))
2005 ipd_data(nb)%Statein%prsl(ix,k) = _dbl_(_rl_(
atm(
mygrid)%delp(i,j,k1)))
2006 if (
atm(
mygrid)%flagstruct%do_skeb)ipd_data(nb)%Statein%diss_est(ix,k) = _dbl_(_rl_(
atm(
mygrid)%diss_est(i,j,k1)))
2009 if (.not.
atm(
mygrid)%flagstruct%hydrostatic .and. (.not.
atm(
mygrid)%flagstruct%use_hydro_pressure)) &
2010 ipd_data(nb)%Statein%phii(ix,k+1) = ipd_data(nb)%Statein%phii(ix,k) - _dbl_(_rl_(
atm(
mygrid)%delz(i,j,k1)*grav))
2012 if (.not.
atm(
mygrid)%flagstruct%hydrostatic .and. (.not.
atm(
mygrid)%flagstruct%use_hydro_pressure)) &
2013 ipd_data(nb)%Statein%phii(ix,kz) = ipd_data(nb)%Statein%phii(ix,kz+1) - _dbl_(_rl_(
atm(
mygrid)%delz(i,j,kz)*grav))
2017 ipd_data(nb)%Statein%qgrs(ix,k,1:nq_adv) = _dbl_(_rl_(
atm(
mygrid)%q(i,j,k1,1:nq_adv))) &
2018 * ipd_data(nb)%Statein%prsl(ix,k)
2020 ipd_data(nb)%Statein%qgrs(ix,k,nq_adv+1:
nq) = _dbl_(_rl_(
atm(
mygrid)%q(i,j,k1,nq_adv+1:
nq)))
2026 if (
atm(
mygrid)%flagstruct%nwat == 6 )
then 2027 ipd_data(nb)%Statein%prsl(ix,k) = ipd_data(nb)%Statein%prsl(ix,k) &
2028 - ipd_data(nb)%Statein%qgrs(ix,k,
liq_wat) &
2029 - ipd_data(nb)%Statein%qgrs(ix,k,
ice_wat) &
2030 - ipd_data(nb)%Statein%qgrs(ix,k,
rainwat) &
2031 - ipd_data(nb)%Statein%qgrs(ix,k,
snowwat) &
2032 - ipd_data(nb)%Statein%qgrs(ix,k,
graupel)
2034 ipd_data(nb)%Statein%prsl(ix,k) = ipd_data(nb)%Statein%prsl(ix,k) &
2035 - sum(ipd_data(nb)%Statein%qgrs(ix,k,2:
atm(
mygrid)%flagstruct%nwat))
2043 ipd_data(nb)%Statein%prsi(i,npz+1) = ptop
2047 ipd_data(nb)%Statein%prsi(i,k) = ipd_data(nb)%Statein%prsi(i,k+1) + ipd_data(nb)%Statein%prsl(i,k)
2048 ipd_data(nb)%Statein%prsik(i,k) = log( ipd_data(nb)%Statein%prsi(i,k) )
2050 ipd_data(nb)%Statein%qgrs(i,k,1:nq_adv) = ipd_data(nb)%Statein%qgrs(i,k,1:nq_adv) &
2051 / ipd_data(nb)%Statein%prsl(i,k)
2056 ipd_data(nb)%Statein%prsi(i, 1) = ptop
2060 ipd_data(nb)%Statein%prsi(i,k+1) = ipd_data(nb)%Statein%prsi(i,k) + ipd_data(nb)%Statein%prsl(i,k)
2061 ipd_data(nb)%Statein%prsik(i,k) = log( ipd_data(nb)%Statein%prsi(i,k) )
2063 ipd_data(nb)%Statein%qgrs(i,k,1:nq_adv) = ipd_data(nb)%Statein%qgrs(i,k,1:nq_adv) &
2064 / ipd_data(nb)%Statein%prsl(i,k)
2070 ipd_data(nb)%Statein%pgr(i) = ipd_data(nb)%Statein%prsi(i,1)
2071 ipd_data(nb)%Statein%prsik(i,npz+1) = log(ptop)
2078 q_grs(1:nq_adv) = ipd_data(nb)%Statein%qgrs(i,k,1:nq_adv)
2080 rtv = rdgas*ipd_data(nb)%Statein%tgrs(i,k)*
virq_max(q_grs(:),q_min)
2082 qgrs_rad = max(qmin,ipd_data(nb)%Statein%qgrs(i,k,
sphum))
2083 rtv = rdgas*ipd_data(nb)%Statein%tgrs(i,k)*(1.+
zvir*qgrs_rad)
2085 if (
atm(
mygrid)%flagstruct%hydrostatic .or.
atm(
mygrid)%flagstruct%use_hydro_pressure ) &
2086 ipd_data(nb)%Statein%phii(i,k+1) = ipd_data(nb)%Statein%phii(i,k) &
2087 + rtv*(ipd_data(nb)%Statein%prsik(i,k) &
2088 - ipd_data(nb)%Statein%prsik(i,k+1))
2090 dm = ipd_data(nb)%Statein%prsl(i,k)
2091 ipd_data(nb)%Statein%prsl(i,k) = dm*rtv/(ipd_data(nb)%Statein%phii(i,k+1) &
2092 - ipd_data(nb)%Statein%phii(i,k))
2095 if ( .not.
atm(
mygrid)%flagstruct%hydrostatic )
then 2097 ipd_data(nb)%Statein%prsl(i,k) = min(ipd_data(nb)%Statein%prsl(i,k), &
2098 ipd_data(nb)%Statein%prsi(i,k) - 0.01*dm)
2099 ipd_data(nb)%Statein%prsl(i,k) = max(ipd_data(nb)%Statein%prsl(i,k), &
2100 ipd_data(nb)%Statein%prsi(i,k+1) + 0.01*dm)
2108 ipd_data(nb)%Statein%prslk(i,k) = exp( kappa*log(ipd_data(nb)%Statein%prsl(i,k)/p00) )
2110 ipd_data(nb)%Statein%phil(i,k) = 0.5_kind_phys*(ipd_data(nb)%Statein%phii(i,k) &
2111 + ipd_data(nb)%Statein%phii(i,k+1))
2118 ipd_data(nb)%Statein%prsik(i, 1) = exp( kappa*ipd_data(nb)%Statein%prsik(i,1) )*pk0inv
2119 ipd_data(nb)%Statein%prsik(i,npz+1) = pktop
2122 if (
atm(
mygrid)%flagstruct%hydrostatic .or.
atm(
mygrid)%flagstruct%use_hydro_pressure )
then 2125 ipd_data(nb)%Statein%prsik(i,k) = exp( kappa*ipd_data(nb)%Statein%prsik(i,k) )*pk0inv
2135 integer,
intent(IN) :: nq
2136 real,
intent(IN) :: dt
2137 logical,
intent(IN) :: begin
2141 integer sphum, liq_wat, ice_wat
2142 integer rainwat, snowwat, graupel
2144 sphum = get_tracer_index(model_atmos,
'sphum')
2145 liq_wat = get_tracer_index(model_atmos,
'liq_wat')
2146 ice_wat = get_tracer_index(model_atmos,
'ice_wat')
2147 rainwat = get_tracer_index(model_atmos,
'rainwat')
2148 snowwat = get_tracer_index(model_atmos,
'snowwat')
2149 graupel = get_tracer_index(model_atmos,
'graupel')
2152 if (
allocated(phys_diag%phys_qv_dt)) phys_diag%phys_qv_dt = q(
isc:
iec,
jsc:
jec,:,sphum)
2153 if (
allocated(phys_diag%phys_ql_dt))
then 2154 if (liq_wat < 0)
call mpp_error(fatal,
" phys_ql_dt needs at least one liquid water tracer defined")
2157 if (
allocated(phys_diag%phys_qi_dt))
then 2158 if (ice_wat < 0)
then 2159 call mpp_error(warning,
" phys_qi_dt needs at least one ice water tracer defined")
2160 phys_diag%phys_qi_dt = 0.
2165 if (
allocated(phys_diag%phys_qv_dt)) phys_diag%phys_qv_dt = q(
isc:
iec,
jsc:
jec,:,sphum) - phys_diag%phys_qv_dt
2166 if (
allocated(phys_diag%phys_ql_dt))
then 2167 phys_diag%phys_ql_dt = q(
isc:
iec,
jsc:
jec,:,liq_wat) - phys_diag%phys_ql_dt
2169 if (
allocated(phys_diag%phys_qi_dt))
then 2170 phys_diag%phys_qi_dt = q(
isc:
iec,
jsc:
jec,:,ice_wat) - phys_diag%phys_qv_dt
2174 if (
allocated(phys_diag%phys_ql_dt))
then 2175 if (rainwat > 0) phys_diag%phys_ql_dt = q(
isc:
iec,
jsc:
jec,:,rainwat) + phys_diag%phys_ql_dt
2177 if (
allocated(phys_diag%phys_qi_dt))
then 2178 if (snowwat > 0) phys_diag%phys_qi_dt = q(
isc:
iec,
jsc:
jec,:,snowwat) + phys_diag%phys_qi_dt
2179 if (graupel > 0) phys_diag%phys_qi_dt = q(
isc:
iec,
jsc:
jec,:,graupel) + phys_diag%phys_qi_dt
2182 if (.not. begin)
then 2183 if (
allocated(phys_diag%phys_qv_dt)) phys_diag%phys_qv_dt = phys_diag%phys_qv_dt / dt
2184 if (
allocated(phys_diag%phys_ql_dt)) phys_diag%phys_ql_dt = phys_diag%phys_ql_dt / dt
2185 if (
allocated(phys_diag%phys_qi_dt)) phys_diag%phys_qi_dt = phys_diag%phys_qi_dt / dt
subroutine, public prt_height(qname, is, ie, js, je, ng, km, press, phis, delz, peln, area, lat)
subroutine, public atmosphere_dynamics(Time)
The subroutine 'atmosphere_dynamics' is an API for the main driver of the FV3 dynamical core responsi...
subroutine, public atmosphere_hgt(hgt, position, relative, flip)
The subroutine 'atmosphere_hgt' is an API to return the height coordinate. By default, the vertical dimension assumes the standard FV3 convention of TOA (k=1) to Surface (k=npz). There are options to choose location [level (interface) or layer] and absolute vs. relative height (zero-based).
logical, public do_adiabatic_init
subroutine, public twoway_nesting(Atm, ngrids, grids_on_this_pe, zvir, Time, this_grid)
The subroutine'twoway_nesting' performs a two-way update of nested-grid data onto the parent grid...
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.
subroutine, public atmosphere_get_bottom_layer(Atm_block, DYCORE_Data)
The subroutine 'atmosphere_get_bottom_layer' is an API to provide the bottom layer quantities needed ...
subroutine atmos_phys_qdt_diag(q, phys_diag, nq, dt, begin)
subroutine, public fv_nggps_tavg(Atm, Time_step_atmos, avg_max_length, zvir)
The module 'multi_gases' peforms multi constitutents computations.
subroutine, public atmosphere_end(Time, Grid_box, restart_endfcst)
The subroutine 'atmosphere_end' is an API for the termination of the FV3 dynamical core responsible f...
pure real function, public virq_max(q, qmin)
subroutine, public atmosphere_diss_est(npass)
subroutine adiabatic_init(zvir, nudge_dz, time)
The subroutine 'adiabatic_init' is an optional step during initialization to pre-condition a solution...
subroutine, public get_eta_level(npz, p_s, pf, ph, ak, bk, pscale)
The subroutine 'get_eta_level' returns the interface and layer-mean pressures for reference...
subroutine, public atmosphere_control_data(i1, i2, j1, j2, kt, p_hydro, hydro, tile_num)
subroutine, public atmos_phys_driver_statein(IPD_Data, Atm_block, flip_vc)
The subroutine 'atmos_phys_driver_statein' is an API to populate the IPD_DataStatein container with t...
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 get_bottom_mass(t_bot, tr_bot, p_bot, z_bot, p_surf, slp)
logical, dimension(:), allocatable grids_on_this_pe
subroutine, public start_regional_restart(Atm, dt_atmos, isc, iec, jsc, jec, isd, ied, jsd, jed)
The module 'fv_io' contains restart facilities for FV core.
The module 'fv_update_phys' applies physics tendencies consistent with the FV3 discretization and def...
integer, parameter, public r_grid
The module 'fv_dynamics' is the top-level routine for the dynamical core.
real, dimension(:), allocatable ri
The module 'fv_sg' performs FV sub-grid mixing.
The module fv_nwp_nudge contains routines for nudging to input analyses. note This module is currentl...
integer, dimension(:), allocatable id_tracerdt_dyn
type(time_type) time_step_atmos
real, dimension(:,:,:), allocatable u_dt
The module 'fv_timing' contains FV3 timers.
pure real function, public virq(q)
real, dimension(:), allocatable dum1d
subroutine, public fv_write_restart(Atm, timestamp)
The subroutine 'fv_write_restart' writes restart files to disk.
subroutine, public fv_diag_init(Atm, axes, Time, npx, npy, npz, p_ref)
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_nggps_diags' computes output diagnostics entirely on 3D pressure levels.
subroutine, public fv_restart(fv_domain, Atm, dt_atmos, seconds, days, cold_start, grid_type, this_grid)
The subroutine 'fv_restart' initializes the model state, including prognaostic variables and several ...
subroutine, public get_stock_pe(index, value)
incremental analysis update module
subroutine, public fv_nggps_diag(Atm, zvir, Time)
subroutine, public fv_nggps_diag_init(Atm, axes, Time)
subroutine, public atmosphere_diag_axes(axes)
The subroutine 'atmosphere_diag_axes' is an API to return the axis indices for the atmospheric (mass)...
subroutine, public fv_nwp_nudge_end
The subroutine 'fv_nwp_nudge_end' terminates the nudging module.
The module 'fv_arrays' contains the 'fv_atmos_type' and associated datatypes.
subroutine, public set_atmosphere_pelist()
real, dimension(:,:,:), allocatable v_dt
The module 'fv_eta' contains routine to set up the reference (Eulerian) pressure coordinate.
subroutine, public fv_diag(Atm, zvir, Time, print_freq)
The module 'atmosphere' provides the interface for the Cubed-Sphere FV dynamical core.
subroutine, public atmosphere_resolution(i_size, j_size, global)
The subroutine 'atmospehre_resolution' is an API to return the local extents of the current MPI-rank ...
subroutine, public fv_control_init(Atm, dt_atmos, this_grid, grids_on_this_pe, p_split)
subroutine, public atmosphere_etalvls(ak, bk, flip)
The subroutine 'atmosphere_etalvls' is an API to return the ak/bk pairs used to compute the eta or pr...
subroutine, public atmosphere_init(Time_init, Time, Time_step, Grid_box, area)
The subroutine 'atmosphere_init' is an API to initialize the FV3 dynamical core, including the grid s...
subroutine, public del2_cubed(q, cd, gridstruct, domain, npx, npy, km, nmax, bd)
The subroutine 'del2-cubed' filters the omega field for the physics.
type(fv_atmos_type), dimension(:), allocatable, target, public atm
subroutine, public fill_gfs(im, km, pe2, q, q_min)
The subroutine 'fill_gfs' is for mass-conservative filling of nonphysical negative values in the trac...
integer, dimension(:), allocatable pelist
subroutine p_adi(km, ng, ifirst, ilast, jfirst, jlast, ptop, delp, pt, ps, pe, peln, pk, pkz, hydrostatic)
The subroutine 'p_adi' computes (ps, pk, pe, peln, pkz) given (ptop, delp).
type(time_type), public fv_time
real, dimension(:), allocatable cpi
subroutine, public atmosphere_pref(p_ref)
The subroutine 'atmosphere_pref' is an API to return the reference pressure.
subroutine timing_on(blk_name)
The subroutine 'timing_on' starts a timer.
subroutine, public fv_end(Atm, this_grid, restart_endfcst)
The subroutine 'fv_end' terminates FV3, deallocates memory, saves restart files, and stops I/O...
@ The module 'fv_diagnostics' contains routines to compute diagnosic fields.
subroutine, public fv_io_register_nudge_restart(Atm)
The subroutine 'fv_io_register_nudge_restart' registers restarts for SST fields used in HiRAM...
subroutine, public atmosphere_restart(timestamp)
The subroutine 'atmosphere_restart' is an API to save restart information at a given timestamp...
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, public prt_maxmin(qname, q, is, ie, js, je, n_g, km, fac)
character(len=20) mod_name
subroutine, public fv_update_phys(dt, is, ie, js, je, isd, ied, jsd, jed, ng, nq, u, v, w, delp, pt, q, qdiag, ua, va, ps, pe, peln, pk, pkz, ak, bk, phis, u_srf, v_srf, ts, delz, hydrostatic, u_dt, v_dt, t_dt, moist_phys, Time, nudge, gridstruct, lona, lata, npx, npy, npz, flagstruct, neststruct, bd, domain, ptop, phys_diag, q_dt)
subroutine, public fv_subgrid_z(isd, ied, jsd, jed, is, ie, js, je, km, nq, dt, tau, nwat, delp, pe, peln, pkz, ta, qa, ua, va, hydrostatic, w, delz, u_dt, v_dt, t_dt, q_dt, k_bot)
real, dimension(:,:), allocatable pref
subroutine, public atmosphere_scalar_field_halo(data, halo, isize, jsize, ksize, data_p)
The subroutine 'atmosphere_scalar_field_halo' is an API to return halo information of the current MPI...
subroutine, public fv_nwp_nudge_init(time, axes, npz, zvir, ak, bk, ts, phis, gridstruct, ks, npx, neststruct, bd)
The subroutine 'fv_nwp_nudge_init' initializes the nudging module.
subroutine, public atmosphere_nggps_diag(Time, init, ltavg, avg_max_length)
The subroutine 'atmosphere_nggps_diag' is an API to trigger output of diagnostics in NCEP/EMC format...
subroutine, public atmosphere_state_update(Time, IPD_Data, IAU_Data, Atm_block, flip_vc)
The subroutine 'atmosphere_state_update' is an API to apply tendencies and compute a consistent progn...
The module 'FV3_control' is for initialization and termination of the model, and controls namelist pa...
subroutine, public atmosphere_grid_bdry(blon, blat, global)
The subroutine 'atmosphere_grid_bdry' is an API to returns the longitude and latitude finite volume e...
subroutine, public atmosphere_grid_ctr(lon, lat)
The subroutine 'atmosphere_grid_ctr' is an API that returns the longitude and latitude cell centers o...
subroutine, public read_new_bc_data(Atm, Time, Time_step_atmos, p_split, isd, ied, jsd, jed)
subroutine, public get_bottom_wind(u_bot, v_bot)
subroutine, public atmosphere_domain(fv_domain, layout, regional, nested, pelist)
The subroutine 'atmosphere_domain' is an API to return the "domain2d" variable associated with the co...
The module 'fv_nesting' is a collection of routines pertaining to grid nesting .
real, dimension(:,:,:), allocatable t_dt