118 use constants_mod
, only: pi=>pi_8, kappa, radius, grav, rdgas
119 use field_manager_mod
, only: model_atmos
120 use fms_mod
, only: write_version_number, open_namelist_file, &
121 check_nml_error, close_file, file_exist
122 use mpp_mod
, only: fatal, mpp_error, mpp_pe, stdlog, &
123 mpp_npes, mpp_get_current_pelist, &
124 input_nml_file, get_unit, warning, &
125 read_ascii_file, input_str_length
126 use mpp_domains_mod
, only: mpp_get_data_domain, mpp_get_compute_domain
127 use tracer_manager_mod
, only: tm_get_number_tracers => get_number_tracers, &
128 tm_get_tracer_index => get_tracer_index, &
129 tm_get_tracer_indices => get_tracer_indices, &
130 tm_set_tracer_profile => set_tracer_profile, &
131 tm_get_tracer_names => get_tracer_names, &
132 tm_check_if_prognostic=> check_if_prognostic,&
133 tm_register_tracers => register_tracers
142 use fv_mp_mod, only: mp_start, mp_assign_gid, domain_decomp
144 use fv_mp_mod, only: broadcast_domains, mp_barrier, is_master, setup_master
148 use mpp_domains_mod
, only: domain2d
149 use mpp_domains_mod
, only: mpp_define_nest_domains, nest_domain_type, mpp_get_global_domain
150 use mpp_domains_mod
, only: mpp_get_c2f_index, mpp_get_f2c_index, mpp_broadcast_domain
151 use mpp_domains_mod
, only: center, corner, north, east, west, south
152 use mpp_mod
, only: mpp_send, mpp_sync, mpp_transmit, mpp_set_current_pelist, mpp_declare_pelist, mpp_root_pe, mpp_recv, mpp_sync_self, mpp_broadcast, read_input_nml
156 use constants_mod
, only: rvgas, cp_air
364 #include<file_version.h> 372 subroutine fv_init(Atm, dt_atmos, grids_on_this_pe, p_split)
374 type(
fv_atmos_type),
allocatable,
intent(inout),
target :: Atm(:)
375 real,
intent(in) :: dt_atmos
376 logical,
allocatable,
intent(INOUT) :: grids_on_this_pe(:)
377 integer,
intent(INOUT) :: p_split
379 integer :: i, j, k, n, p
383 integer :: num_family
385 integer :: isc_p, iec_p, jsc_p, jec_p, isg, ieg, jsg, jeg, upoff, jind
406 call run_setup(atm,dt_atmos, grids_on_this_pe, p_split)
411 call switch_current_atm(atm(n))
424 write(*,*)
'ncnst=',
ncnst,
' num_prog=',
nt_prog,
' pnats=',
pnats,
' dnats=',
dnats,
' num_family=',num_family
428 if (grids_on_this_pe(n))
then 430 atm(n)%bd%isc, atm(n)%bd%iec, atm(n)%bd%jsc, atm(n)%bd%jec, &
433 if (grids_on_this_pe(n))
then 435 call switch_current_atm(atm(n))
438 if ( (atm(n)%bd%iec-atm(n)%bd%isc+1).lt.4 .or. (atm(n)%bd%jec-atm(n)%bd%jsc+1).lt.4 )
then 439 if (is_master())
write(*,
'(6I6)') atm(n)%bd%isc, atm(n)%bd%iec, atm(n)%bd%jsc, atm(n)%bd%jec, n
440 call mpp_error(fatal,
'Domain Decomposition: Cubed Sphere compute domain has a & 441 &minium requirement of 4 points in X and Y, respectively')
447 atm(n)%gridstruct%nested => atm(n)%neststruct%nested
448 atm(n)%gridstruct%grid_type => atm(n)%flagstruct%grid_type
449 atm(n)%flagstruct%grid_number => atm(n)%grid_number
450 atm(n)%gridstruct%regional => atm(n)%flagstruct%regional
459 if ( is_master() )
then 462 write(*,*)
'Divergence damping Coefficients' 463 write(*,*)
'For small dt=', sdt
464 write(*,*)
'External mode del-2 (m**2/s)=',
d_ext*atm(n)%gridstruct%da_min_c/sdt
465 write(*,*)
'Internal mode del-2 SMAG dimensionless coeff=',
dddmp 466 write(*,*)
'Internal mode del-2 background diff=',
d2_bg*atm(n)%gridstruct%da_min_c/sdt
469 write(*,*)
'Internal mode del-4 background diff=',
d4_bg 470 write(*,*)
'Vorticity del-4 (m**4/s)=', (
vtdm4*atm(n)%gridstruct%da_min)**2/sdt*1.e-6
472 if (
nord==2)
write(*,*)
'Internal mode del-6 background diff=',
d4_bg 473 if (
nord==3)
write(*,*)
'Internal mode del-8 background diff=',
d4_bg 474 write(*,*)
'tracer del-2 diff=',
trdm2 476 write(*,*)
'Vorticity del-4 (m**4/s)=', (
vtdm4*atm(n)%gridstruct%da_min)**2/sdt*1.e-6
477 write(*,*)
'beta=',
beta 495 atm(n)%bd%isc, atm(n)%bd%iec, atm(n)%bd%jsc, atm(n)%bd%jec, &
499 if (atm(n)%neststruct%nested)
then 501 call mpp_get_global_domain( atm(n)%parent_grid%domain, &
506 if (
gid == atm(n)%parent_grid%pelist(1))
then 507 call mpp_send(atm(n)%parent_grid%grid_global(isg-ng:ieg+1+ng,jsg-ng:jeg+1+ng,1:2,
parent_tile), &
508 size(atm(n)%parent_grid%grid_global(isg-ng:ieg+1+ng,jsg-ng:jeg+1+ng,1:2,
parent_tile)), &
513 if (atm(n)%neststruct%twowaynest)
then 521 atm(n)%neststruct%ind_update_h = -99999
523 if (atm(n)%parent_grid%tile == atm(n)%neststruct%parent_tile)
then 525 isc_p = atm(n)%parent_grid%bd%isc
526 iec_p = atm(n)%parent_grid%bd%iec
527 jsc_p = atm(n)%parent_grid%bd%jsc
528 jec_p = atm(n)%parent_grid%bd%jec
529 upoff = atm(n)%neststruct%upoff
531 atm(n)%neststruct%jsu = jsc_p
532 atm(n)%neststruct%jeu = jsc_p-1
536 atm(n)%neststruct%ind_update_h(i,j,2) = -9999
538 atm(n)%neststruct%jsu = atm(n)%neststruct%jsu + 1
541 atm(n)%neststruct%ind_update_h(i,j,2) = -9999
546 atm(n)%neststruct%ind_update_h(i,j,2) = jind
553 atm(n)%neststruct%isu = isc_p
554 atm(n)%neststruct%ieu = isc_p-1
557 atm(n)%neststruct%ind_update_h(i,:,1) = -9999
558 atm(n)%neststruct%isu = atm(n)%neststruct%isu + 1
560 atm(n)%neststruct%ind_update_h(i,:,1) = -9999
587 if (
ntilesme > 1)
call switch_current_atm(atm(1))
595 subroutine fv_end(Atm, grids_on_this_pe)
598 logical,
intent(INOUT) :: grids_on_this_pe(:)
622 subroutine run_setup(Atm, dt_atmos, grids_on_this_pe, p_split)
624 real,
intent(in) :: dt_atmos
625 logical,
intent(INOUT) :: grids_on_this_pe(:)
626 integer,
intent(INOUT) :: p_split
628 character(len=80) :: tracerName, errString
629 character(len=32) :: nested_grid_filename
630 integer :: ios, ierr, f_unit, unit
638 real :: dimx, dl, dp, dxmin, dymin, d_fac
643 integer :: pe_counter
646 character(len=128) :: res_latlon_dynamics =
'' 647 character(len=128) :: res_latlon_tracers =
'' 648 character(len=80) :: grid_name =
'' 649 character(len=120) :: grid_file =
'' 982 namelist /fv_grid_nml/ grid_name, grid_file
984 use_logp,
p_fac,
a_imp,
k_split,
n_split,
m_split,
q_split,
print_freq,
write_3d_diags,
do_schmidt, &
989 dddmp,
d2_bg,
d4_bg,
vtdm4,
trdm2,
d_ext,
delt_max,
beta,
non_ortho,
n_sponge, &
1007 namelist /multi_gases_nml/ rilist,cpilist
1011 pe_counter = mpp_root_pe()
1018 #ifdef INTERNAL_FILE_NML 1020 read (input_nml_file,fv_grid_nml,iostat=ios)
1021 ierr = check_nml_error(ios,
'fv_grid_nml')
1023 f_unit=open_namelist_file()
1026 read (f_unit,fv_grid_nml,iostat=ios)
1027 ierr = check_nml_error(ios,
'fv_grid_nml')
1028 call close_file(f_unit)
1031 call write_version_number (
'FV_CONTROL_MOD', version )
1033 write(unit, nml=fv_grid_nml)
1037 call switch_current_atm(atm(n), .false.)
1039 atm(n)%grid_number = n
1040 if (grids_on_this_pe(n))
then 1044 #ifdef INTERNAL_FILE_NML 1047 write(nested_grid_filename,
'(A4, I2.2)')
'nest', n
1048 call read_input_nml(nested_grid_filename)
1051 read (input_nml_file,fv_core_nml,iostat=ios)
1052 ierr = check_nml_error(ios,
'fv_core_nml')
1054 if( is_master() ) print *,
' enter multi_gases: ncnst = ',
ncnst 1055 allocate (rilist(0:
ncnst))
1056 allocate (cpilist(0:
ncnst))
1062 cpilist(1) = 4*cp_air
1064 read (input_nml_file,multi_gases_nml,iostat=ios)
1065 ierr = check_nml_error(ios,
'multi_gases_nml')
1068 read (input_nml_file,test_case_nml,iostat=ios)
1069 ierr = check_nml_error(ios,
'test_case_nml')
1074 if (
size(atm) == 1)
then 1075 f_unit = open_namelist_file()
1076 else if (n == 1)
then 1077 f_unit = open_namelist_file(
'input.nml')
1079 write(nested_grid_filename,
'(A10, I2.2, A4)')
'input_nest', n,
'.nml' 1080 f_unit = open_namelist_file(nested_grid_filename)
1084 read (f_unit,fv_core_nml,iostat=ios)
1085 ierr = check_nml_error(ios,
'fv_core_nml')
1088 if( is_master() ) print *,
' enter multi_gases: ncnst = ',
ncnst 1089 allocate (rilist(0:
ncnst))
1090 allocate (cpilist(0:
ncnst))
1096 cpilist(1) = 4*cp_air
1099 read (f_unit,multi_gases_nml,iostat=ios)
1100 ierr = check_nml_error(ios,
'multi_gases_nml')
1104 read (f_unit,test_case_nml,iostat=ios)
1105 ierr = check_nml_error(ios,
'test_case_nml')
1106 call close_file(f_unit)
1108 write(unit, nml=fv_core_nml)
1109 write(unit, nml=test_case_nml)
1111 write(unit, nml=multi_gases_nml)
1115 if (len_trim(grid_file) /= 0) atm(n)%flagstruct%grid_file = grid_file
1116 if (len_trim(grid_name) /= 0) atm(n)%flagstruct%grid_name = grid_name
1117 if (len_trim(res_latlon_dynamics) /= 0) atm(n)%flagstruct%res_latlon_dynamics = res_latlon_dynamics
1118 if (len_trim(res_latlon_tracers) /= 0) atm(n)%flagstruct%res_latlon_tracers = res_latlon_tracers
1133 if (
npx >= 120 ) ns0 = 6
1135 if (
npx <= 45 )
then 1137 elseif (
npx <= 90 )
then 1144 dimx = max(
npx, 2*(
npy-1) )
1148 n0split = nint( ns0*abs(dt_atmos)*dimx/(dt0*dim0) + 0.49 )
1161 n0split = nint( 2.*
umax*dt_atmos/sqrt(dxmin**2 + dymin**2) + 0.49 )
1163 n0split = max( 1, n0split )
1166 n_split = nint(
real(n0split)/
real(k_split*abs(p_split)) * stretch_fac + 0.5 )
1167 if(is_master())
write(*,*)
'For k_split (remapping)=',
k_split 1168 if(is_master())
write(*,198)
'n_split is set to ',
n_split,
' for resolution-dt=',
npx,
npy,
ntiles,dt_atmos
1170 if(is_master())
write(*,199)
'Using n_split from the namelist: ',
n_split 1172 if (is_master() .and. n == 1 .and. abs(p_split) > 1)
then 1173 write(*,199)
'Using p_split = ', p_split
1176 if (atm(n)%neststruct%nested)
then 1179 atm(n)%parent_grid => atm(i)
1183 if (.not.
associated(atm(n)%parent_grid))
then 1184 write(errstring,
'(2(A,I3))')
"Could not find parent grid #",
parent_grid_num,
' for grid #', n
1185 call mpp_error(fatal, errstring)
1189 if ( atm(n)%parent_grid%flagstruct%grid_type < 3 .and. &
1190 .not.
associated(atm(n)%parent_grid%parent_grid))
then 1192 call mpp_error(fatal,
'parent tile must be between 1 and 6 if the parent is a cubed-sphere grid')
1196 call mpp_error(fatal,
'parent tile must be 1 if the parent is not a cubed-sphere grid')
1200 if (
refinement < 1 )
call mpp_error(fatal,
'grid refinement must be positive')
1205 call mpp_error(warning,
'npx-1 or npy-1 is not evenly divisible by the refinement ratio; averaging update cannot be mass-conservative.')
1211 call mpp_error(fatal,
'The global energy fixer cannot be used on a nested grid. consv_te must be set to 0.')
1214 atm(n)%neststruct%refinement_of_global = atm(n)%neststruct%refinement * atm(n)%parent_grid%neststruct%refinement_of_global
1216 atm(n)%neststruct%npx_global = atm(n)%neststruct%refinement * atm(n)%parent_grid%neststruct%npx_global
1219 atm(n)%neststruct%ioffset = -999
1220 atm(n)%neststruct%joffset = -999
1221 atm(n)%neststruct%parent_tile = -1
1222 atm(n)%neststruct%refinement = -1
1225 if (atm(n)%neststruct%nested)
then 1226 if (atm(n)%flagstruct%grid_type >= 4 .and. atm(n)%parent_grid%flagstruct%grid_type >= 4)
then 1227 atm(n)%flagstruct%dx_const = atm(n)%parent_grid%flagstruct%dx_const /
real(atm(n)%neststruct%
refinement)
1228 atm(n)%flagstruct%dy_const = atm(n)%parent_grid%flagstruct%dy_const /
real(atm(n)%neststruct%
refinement)
1243 if (is_master())
write(*,*)
" fv_control: using original values for divergence damping " 1260 if (abs(
a_imp) < 0.5)
then 1261 if(is_master())
write(*,199)
'm_split is set to ',
m_split 1264 if(is_master())
then 1265 write(*,*)
'Off center implicit scheme param=',
a_imp 1266 write(*,*)
' p_fac=',
p_fac 1270 if(is_master())
then 1272 write(*,197)
'Using non_ortho : ',
non_ortho 1276 198
format(a,i2.2,a,i4.4,
'x',i4.4,
'x',i1.1,
'-',f9.3)
1282 allocate(atm(n)%neststruct%child_grids(
size(atm)))
1283 atm(n)%neststruct%child_grids = .false.
1293 if (any(atm(n)%pelist ==
gid))
then 1294 call mpp_set_current_pelist(atm(n)%pelist)
1295 call mpp_get_current_pelist(atm(n)%pelist,
commid=
commid)
1299 if (atm(n)%neststruct%nested)
then 1300 atm(n)%neststruct%parent_proc = any(atm(n)%parent_grid%pelist ==
gid)
1301 atm(n)%neststruct%child_proc = any(atm(n)%pelist ==
gid)
1307 call switch_current_atm(atm(n),.false.)
1316 call broadcast_domains(atm)
1319 call switch_current_atm(atm(n))
1324 call mpp_error(fatal,
'npx or npy not an even refinement of its coarse grid.')
1328 call mpp_define_nest_domains(atm(n)%neststruct%nest_domain, atm(n)%domain, atm(
parent_grid_num)%domain, &
1333 (/ (i,i=0,mpp_npes()-1) /), extra_halo = 0, name=
"nest_domain")
1334 call mpp_define_nest_domains(atm(n)%neststruct%nest_domain, atm(n)%domain, atm(
parent_grid_num)%domain, &
1339 (/ (i,i=0,mpp_npes()-1) /), extra_halo = 0, name=
"nest_domain")
1344 if (atm(n)%neststruct%nestbctype > 1)
then 1346 call mpp_error(fatal,
'nestbctype > 1 not yet implemented')
1360 atm(n)%neststruct%upoff = 0
1366 if (n == 1)
allocate(atm(nn)%neststruct%nest_domain_all(
size(atm)))
1367 atm(nn)%neststruct%nest_domain_all(n) = atm(n)%neststruct%nest_domain
1373 if (any(atm(n)%pelist ==
gid))
then 1374 call mpp_set_current_pelist(atm(n)%pelist)
1378 end subroutine run_setup
1379 subroutine init_nesting(Atm, grids_on_this_pe, p_split)
1382 logical,
allocatable,
intent(INOUT) :: grids_on_this_pe(:)
1383 integer,
intent(INOUT) :: p_split
1384 character(100) :: pe_list_name
1385 integer :: nest_pes(100)
1386 integer :: n, npes, ntiles, pecounter, i
1387 integer,
allocatable :: pelist(:)
1388 integer :: f_unit, ios, ierr
1391 namelist /nest_nml/
ngrids, ntiles, nest_pes, p_split
1398 #ifdef INTERNAL_FILE_NML 1399 read (input_nml_file,nest_nml,iostat=ios)
1400 ierr = check_nml_error(ios,
'nest_nml')
1402 f_unit=open_namelist_file()
1404 read (f_unit,nest_nml,iostat=ios)
1405 ierr = check_nml_error(ios,
'nest_nml')
1406 call close_file(f_unit)
1409 if (ntiles /= -999)
ngrids = ntiles
1410 if (
ngrids > 10)
call mpp_error(fatal,
"More than 10 nested grids not supported")
1414 allocate(grids_on_this_pe(
ngrids))
1415 grids_on_this_pe = .false.
1427 allocate(atm(1)%pelist(npes))
1428 atm(1)%pelist = (/(i, i=0, npes-1)/)
1429 atm(1)%pelist = atm(1)%pelist + mpp_root_pe()
1430 call mpp_declare_pelist(atm(1)%pelist)
1431 call mpp_set_current_pelist(atm(1)%pelist)
1434 call setup_master(atm(1)%pelist)
1435 grids_on_this_pe(1) = .true.
1436 atm(1)%npes_this_grid = npes
1440 pecounter = mpp_root_pe()
1445 write(pe_list_name,
'(A4, I2.2)')
'nest', n
1448 if (nest_pes(n) == 0)
then 1449 if (n <
ngrids)
call mpp_error(fatal,
'Only nest_pes(ngrids) in nest_nml can be zero; preceeding values must be nonzero.')
1450 allocate(atm(n)%pelist(npes-pecounter))
1451 atm(n)%pelist = (/(i, i=pecounter, npes-1)/)
1453 call mpp_declare_pelist(atm(n)%pelist, trim(pe_list_name))
1455 if (.not. file_exist(
'input_'//trim(pe_list_name)//
'.nml'))
then 1456 call mpp_error(fatal,
"Could not find nested grid namelist input_"//trim(pe_list_name)//
".nml")
1461 allocate(atm(n)%pelist(nest_pes(n)))
1462 atm(n)%pelist = (/ (i, i=pecounter, pecounter+nest_pes(n)-1) /)
1463 if (atm(n)%pelist(nest_pes(n)) >= npes)
then 1464 call mpp_error(fatal,
'PEs assigned by nest_pes in nest_nml exceeds number of available PEs.')
1467 call mpp_declare_pelist(atm(n)%pelist, trim(pe_list_name))
1470 if (.not. file_exist(
'input_'//trim(pe_list_name)//
'.nml'))
then 1471 call mpp_error(fatal,
"Could not find nested grid namelist input_"//trim(pe_list_name)//
".nml")
1474 pecounter = pecounter+nest_pes(n)
1480 atm(n)%npes_this_grid =
size(atm(n)%pelist)
1481 if (any(
gid == atm(n)%pelist))
then 1482 call mpp_set_current_pelist(atm(n)%pelist)
1485 call setup_master(atm(n)%pelist)
1486 grids_on_this_pe(n) = .true.
1491 if (pecounter /= npes)
then 1492 call mpp_error(fatal,
'nest_pes in nest_nml does not assign all of the available PEs.')
1515 hord_mt => atm%flagstruct%hord_mt
1516 kord_mt => atm%flagstruct%kord_mt
1517 kord_wz => atm%flagstruct%kord_wz
1518 hord_vt => atm%flagstruct%hord_vt
1519 hord_tm => atm%flagstruct%hord_tm
1520 hord_dp => atm%flagstruct%hord_dp
1521 kord_tm => atm%flagstruct%kord_tm
1522 hord_tr => atm%flagstruct%hord_tr
1523 kord_tr => atm%flagstruct%kord_tr
1524 scale_z => atm%flagstruct%scale_z
1525 w_max => atm%flagstruct%w_max
1526 z_min => atm%flagstruct%z_min
1527 lim_fac => atm%flagstruct%lim_fac
1528 nord => atm%flagstruct%nord
1529 nord_tr => atm%flagstruct%nord_tr
1530 dddmp => atm%flagstruct%dddmp
1531 d2_bg => atm%flagstruct%d2_bg
1532 d4_bg => atm%flagstruct%d4_bg
1533 vtdm4 => atm%flagstruct%vtdm4
1534 trdm2 => atm%flagstruct%trdm2
1535 d2_bg_k1 => atm%flagstruct%d2_bg_k1
1536 d2_bg_k2 => atm%flagstruct%d2_bg_k2
1544 rf_fast => atm%flagstruct%RF_fast
1545 consv_am => atm%flagstruct%consv_am
1547 do_f3d => atm%flagstruct%do_f3d
1552 beta => atm%flagstruct%beta
1553 n_sponge => atm%flagstruct%n_sponge
1554 d_ext => atm%flagstruct%d_ext
1555 nwat => atm%flagstruct%nwat
1556 use_logp => atm%flagstruct%use_logp
1558 inline_q => atm%flagstruct%inline_q
1564 regional => atm%flagstruct%regional
1567 p_fac => atm%flagstruct%p_fac
1568 a_imp => atm%flagstruct%a_imp
1569 n_split => atm%flagstruct%n_split
1571 fhouri => atm%flagstruct%fhouri
1572 m_split => atm%flagstruct%m_split
1573 k_split => atm%flagstruct%k_split
1574 use_logp => atm%flagstruct%use_logp
1575 q_split => atm%flagstruct%q_split
1578 npx => atm%flagstruct%npx
1579 npy => atm%flagstruct%npy
1580 npz => atm%flagstruct%npz
1581 npz_rst => atm%flagstruct%npz_rst
1582 ncnst => atm%flagstruct%ncnst
1583 pnats => atm%flagstruct%pnats
1584 dnats => atm%flagstruct%dnats
1585 ntiles => atm%flagstruct%ntiles
1586 nf_omega => atm%flagstruct%nf_omega
1588 na_init => atm%flagstruct%na_init
1589 nudge_dz => atm%flagstruct%nudge_dz
1590 p_ref => atm%flagstruct%p_ref
1591 dry_mass => atm%flagstruct%dry_mass
1592 nt_prog => atm%flagstruct%nt_prog
1593 nt_phys => atm%flagstruct%nt_phys
1594 tau_h2o => atm%flagstruct%tau_h2o
1595 delt_max => atm%flagstruct%delt_max
1596 d_con => atm%flagstruct%d_con
1597 ke_bg => atm%flagstruct%ke_bg
1598 consv_te => atm%flagstruct%consv_te
1599 tau => atm%flagstruct%tau
1602 dwind_2d => atm%flagstruct%dwind_2d
1605 fill => atm%flagstruct%fill
1606 fill_dp => atm%flagstruct%fill_dp
1607 fill_wz => atm%flagstruct%fill_wz
1617 fv_debug => atm%flagstruct%fv_debug
1618 srf_init => atm%flagstruct%srf_init
1619 mountain => atm%flagstruct%mountain
1620 remap_t => atm%flagstruct%remap_t
1621 z_tracer => atm%flagstruct%z_tracer
1623 fv_land => atm%flagstruct%fv_land
1624 nudge => atm%flagstruct%nudge
1625 nudge_ic => atm%flagstruct%nudge_ic
1626 ncep_ic => atm%flagstruct%ncep_ic
1627 nggps_ic => atm%flagstruct%nggps_ic
1628 ecmwf_ic => atm%flagstruct%ecmwf_ic
1629 gfs_phil => atm%flagstruct%gfs_phil
1643 hybrid_z => atm%flagstruct%hybrid_z
1644 make_nh => atm%flagstruct%Make_NH
1646 nudge_qv => atm%flagstruct%nudge_qv
1648 a2b_ord => atm%flagstruct%a2b_ord
1649 c2l_ord => atm%flagstruct%c2l_ord
1650 ndims => atm%flagstruct%ndims
1652 dx_const => atm%flagstruct%dx_const
1653 dy_const => atm%flagstruct%dy_const
1659 deglat => atm%flagstruct%deglat
1661 nested => atm%neststruct%nested
1667 nsponge => atm%neststruct%nsponge
1668 s_weight => atm%neststruct%s_weight
1669 ioffset => atm%neststruct%ioffset
1670 joffset => atm%neststruct%joffset
logical, pointer check_negative
logical, pointer reset_eta
logical, pointer do_schmidt
logical, pointer nggps_ic
logical, pointer warm_start
logical, public bubble_do
logical, pointer non_ortho
real(kind=r_grid), pointer deglat
integer, dimension(:), pointer io_layout
integer, pointer bc_update_interval
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.
logical, pointer adj_mass_vmr
integer, dimension(:), pointer layout
subroutine, public fv_init(Atm, dt_atmos, grids_on_this_pe, p_split)
The subroutine 'fv_init' initializes FV3.
subroutine, public fv_restart_end(Atm, grids_on_this_pe)
The subroutine 'fv_restart_end' writes ending restart files, terminates I/O, and prints out diagnosti...
logical, pointer dwind_2d
real umax
max wave speed for grid_type>3
logical, pointer write_3d_diags
integer, pointer grid_type
integer, dimension(:), allocatable, public pelist_all
logical, pointer ecmwf_ic
subroutine, public set_eta(km, ks, ptop, ak, bk)
This is the version of set_eta used in fvGFS and AM4.
The module 'multi_gases' peforms multi constitutents computations.
logical, pointer adiabatic
logical, pointer agrid_vel_rst
integer, pointer fv_sg_adj
integer, public test_case
integer max_refinement_of_global
logical, pointer nudge_ic
The module 'fv_io' contains restart facilities for FV core.
real(kind=r_grid), pointer deglon_start
logical, pointer nudge_dz
logical, pointer use_logp
integer, parameter, public r_grid
real, dimension(:), allocatable ri
subroutine, public fv_diag_init_gn(Atm)
real(kind=r_grid), pointer target_lat
subroutine init_nesting(Atm, grids_on_this_pe, p_split)
integer, pointer parent_tile
logical, pointer external_ic
subroutine setup_pointers(Atm)
The subroutine 'setup_pointers' associates the MODULE flag pointers with the ARRAY flag variables for...
logical, pointer do_vort_damp
logical, pointer mountain
logical, pointer no_dycore
integer, pointer nestupdate
The module 'fv_timing' contains FV3 timers.
subroutine, public fv_restart_init()
real(kind=r_grid), pointer deglon_stop
character(len=128), pointer res_latlon_tracers
real, pointer d2_divg_max_k2
logical, pointer moist_phys
real, parameter, public ptop_min
integer, pointer nf_omega
real(kind=r_grid), pointer dx_const
logical, pointer twowaynest
logical, pointer filter_phys
logical, pointer hydrostatic
logical, pointer convert_ke
logical, pointer make_hybrid_z
logical, pointer read_increment
logical, pointer use_old_omega
The module 'fv_arrays' contains the 'fv_atmos_type' and associated datatypes.
logical, pointer use_new_ncep
logical, pointer do_reed_physics
integer, pointer print_freq
real, public soliton_umax
logical, pointer external_eta
The module 'fv_eta' contains routine to set up the reference (Eulerian) pressure coordinate.
integer, pointer nord_zs_filter
logical, pointer fv_debug
logical, pointer phys_hydrostatic
integer, pointer n_zs_filter
logical, pointer breed_vortex_inline
subroutine, public fv_io_exit
Close the fv core restart facilities.
real, public soliton_size
integer, public nsolitons
integer, pointer n_sponge
subroutine, public multi_gases_init(ngas, nwat)
logical, pointer do_uni_zfull
subroutine, public grid_utils_init(Atm, npx, npy, npz, non_ortho, grid_type, c2l_order)
real, dimension(:), allocatable cpi
logical, pointer fv_diag_ic
character(len=120), pointer grid_file
character(len=128), pointer res_latlon_dynamics
real(kind=r_grid), pointer deglat_start
logical, pointer reed_cond_only
subroutine timing_on(blk_name)
The subroutine 'timing_on' starts a timer.
logical, pointer hybrid_z
logical, pointer regional
integer, parameter, public ng
subroutine timing_prt(gid)
The subroutine 'timing_prt' prints all timers.
logical, pointer adjust_dry_mass
logical, pointer inline_q
@ The module 'fv_diagnostics' contains routines to compute diagnosic fields.
logical, pointer gfs_phil
The module 'fv_grid_utils' contains routines for setting up and computing grid-related quantities...
logical, pointer range_warn
real, pointer update_blend
real(kind=r_grid), pointer target_lon
logical, pointer do_sat_adj
character(len=80), pointer grid_name
real(kind=r_grid), pointer deglat_stop
logical, pointer nudge_qv
integer, pointer refinement
real(kind=r_grid), pointer dy_const
real(kind=r_grid), pointer stretch_fac
logical, pointer reproduce_sum
logical, pointer old_divg_damp
logical, pointer consv_am
subroutine timing_init
The subroutine 'timing_init' initializes timers.
subroutine allocate_fv_atmos_type(Atm, isd_in, ied_in, jsd_in, jed_in, is_in, ie_in, js_in, je_in, npx_in, npy_in, npz_in, ndims_in, ncnst_in, nq_in, ng_in, dummy, alloc_2d, ngrids_in)
The subroutine 'allocate_fv_atmos_type' allocates the fv_atmos_type.
logical, pointer use_ncep_phy
logical, pointer srf_init
subroutine, public grid_utils_end
logical, pointer use_hydro_pressure
The module 'FV3_control' is for initialization and termination of the model, and controls namelist pa...
logical, pointer full_zs_filter
logical, pointer z_tracer
real, pointer d2_divg_max_k1
integer halo_update_type
1 for two-interfaces non-block 2 for block 3 for four-interfaces non-block
subroutine, public fv_end(Atm, grids_on_this_pe)
The subroutine 'fv_end' terminates FV3, deallocates memory, saves restart files, and stops I/O...
integer, pointer nestbctype
subroutine deallocate_fv_atmos_type(Atm)
The subroutine 'deallocate_fv_atmos_type' deallocates the fv_atmos_type.
logical, pointer do_held_suarez