250 likes | 269 Views
Dynamics-Physics Coupling in FV3-GFS. EMC-GFDL Technical Meeting on FV3 Modeling System 17-18 October, 2016. Agenda. System Driver Phases Modifications to the GFS physics suite FV3-GFS Features Testing T ime permitting - an extra discussion. System Driver. i nitialization Phase
E N D
Dynamics-Physics Coupling in FV3-GFS EMC-GFDL Technical Meeting on FV3 Modeling System 17-18 October, 2016
Agenda • System Driver Phases • Modifications to the GFS physics suite • FV3-GFS Features • Testing • Time permitting - an extra discussion
System Driver initialization Phase call mpp_init call fms_init call coupler_init integration Phase call update_atmos_model_dynamics call update_atmos_radiation_physics call update_atmos_model_state end Phase call coupler_end call fms_end 3
Initialization Phase call atmos_model_init atmosphere_init phys_rad_driver_init [grid initialization] nuopc_phys_init gfs_diag_register get_external_ic gfuncphys surface_props_input gsmconst setindxoz adiabatic_init rad_initialize [IPD container init] set_soilveg NUOPC “cap” FV3 API GFS Physics API
get_external_ic Ingests GFS initial condition fields using FMS_IO: TSEA surface skin temperature (K) ORO_filt surface orography/topography (m) ZH GFS grid height [levels] (m) PS surface pressure (Pa) U_w D-grid west [left] face wind component (m/s) V_w D-grid west [left] face wind component (m/s) U_s D-grid south [bottom] face wind component (m/s) V_s D-grid south [bottom] face wind component (m/s) W vertical velocity 'omega' (Pa/s) Prognostic tracer fields: specific humidity O3mixing ratio cloud water mixing ratio U_w/V_w U_s/V_s
adiabatic_init Acts as a pre-conditioner for the ICs Number of pre-conditioning steps is a runtime option Each pre-conditioning step takes: forward-backward pass through dynamics nudge back to IC backward-forward pass through dynamics nudge back to IC
surface_props_input GFS initial condition surface data read in using FMS_IO: orography - filtered and unfiltered orographic GWD coefficients land surface properties vegetation fraction and type soil moisture and type soil temperatures albedos snowpack information 2-meter temperatures and winds optional data needed for clean restarts: phy_f2d phy_f3d
Prototype IPD Interface Nothing more than a variable translation layer did not include: ozone coefficient interpolation surface data cycling necessary logic inside of gloobp/gloopr required user to provide all storage new variables now added in two places Modified the container interfaces to allocate storage reduced interface argument-list allows one to recursively allocate containers allocation performed once during initialization
IPD Container Block For each MPI-rank, decomposing rank-local domain OpenMP threading naturally applicable Structure to store global extent for the rank and each block Include per-block translation from (i,j,k) -> (ix,k) Blocks not required to be uniform in size No more continual copying data to/from chunked arrays z y x
IPD Container Initialization !--- allocate/initialize the various nuopc physics containers per block (including ozone container) do nb = 1, Atm_block%nblks ibs = Atm_block%ibs(nb); ibe = Atm_block%ibe(nb) jbs = Atm_block%jbs(nb); jbe= Atm_block%jbe(nb) ngptc = (ibe - ibs + 1) * (jbe - jbs + 1) call Tbd_data(nb)%set (ngptc, Mdl_parms, xkzm_m, xkzm_h, xkzm_s,evpco, psautco, prautco, wminco, pl_pres) call Dyn_parms(nb)%setrad (ngptc, ngptc, kdt, jdate, solhr, fhlwr, fhswr,lssav, ipt, lprnt, dt_phys) callDyn_parms(nb)%setphys (ngptc, ngptc, solhr, kdt, lssav, latgfs,dt_phys, dt_phys, clstp, nnp, fhour, ncols) call Gfs_diags(nb)%setrad(ngptc, NFXR) call Gfs_diags(nb)%setphys (ngptc, Mdl_parms) call Sfc_props(nb)%setrad(ngptc, Mdl_parms, .FALSE.) ! last argument determines gsm vsatmos-only call Sfc_props(nb)%setphys (ngptc, Mdl_parms) call Cld_props(nb)%setrad(ngptc, Mdl_parms, sup) call Cld_props(nb)%setphys (ngptc, Mdl_parms, sup, flgmin) call Rad_tends(nb)%set (ngptc, Mdl_parms) call Intr_flds(nb)%setrad(ngptc, Mdl_parms, SW0, SWB, LW0, LWB) call Intr_flds(nb)%setphys (ngptc, Mdl_parms) call State_out(nb)%setphys (ngptc, Mdl_parms) ! setphys must becalled prior tosetrad call State_in(nb)%setphys(ngptc, Mdl_parms) call State_in(nb)%setrad(ngptc, Mdl_parms) enddo
System Driver initialization Phase call mpp_init call fms_init call coupler_init integration Phase call update_atmos_model_dynamics call update_atmos_radiation_physics call update_atmos_model_state end Phase call coupler_end call fms_end 12
Integration Phase update_atmos_model_dynamics fv_dynamics atmosphere_dynamics atmos_phys_driver_statein phys_rad_setup_step nuopc_rad_update update_atmos_radiation_physics nuopc_rad_run radiation_driver physics_driver nuopc_phys_run fv_update_phys update_atmos_model_state atmosphere_state_update fv_diag NUOPC “cap” FV3 API GFS Physics API
atmos_phys_driver_statein • Populate IPD State_in container(s) • uses defined blocks • transform vertical index • collapse horizontal indicesfrom (i,j,k) -> (ix,k) • A-grid quantities (including winds) • for consistency with GFS physics, redefine • total mass • mixing ratios • layer and level pressure
phys_rad_setup_step • Captures “setup phase” in gloopb/gloopr • time & date variables: phour, fhour, solhr, etc • triggers: lsswr, lslwr • random number seeds for radiation • scheme dependent cloud properties • interpolate coefficients for prognostic ozone • replace fields when surface data cycling triggered
radiation_driver Evaluate triggers to determine if a radiation step Update time varying data sets and module variables Loop through blocks computing radiation quantities !--- call the nuopc radiation loop--- !$OMP parallel do default (none) & !$OMP schedule (dynamic,1) & !$OMP shared (Atm_block, Dyn_parms, Statein, Sfc_props, & !$OMP Gfs_diags, Intr_flds, Cld_props, Rad_tends) & !$OMP firstprivate (Mdl_parms) & !$OMP private (nb) do nb = 1, Atm_block%nblks if ((Mdl_parms%me == 0) .and. (nb /= 1)) Mdl_parms%me = -99 call nuopc_rad_run (Statein(nb), Sfc_props(nb), Gfs_diags(nb), & Intr_flds(nb), Cld_props(nb), Rad_tends(nb), & Mdl_parms, Dyn_parms(nb)) enddo
physics_driver !--- call the nuopc physics loop--- !$OMP parallel do default (none) schedule(dynamic,1) & !$OMP shared (Atm_block, Dyn_parms, Statein, Sfc_props, Gfs_diags, Intr_flds, & !$OMP Cld_props, Rad_tends, Tbd_data, Stateout, fdiag, fhzero, levs) & !$OMP firstprivate (Mdl_parms, fhour, Time_diag) & !$OMP private (nb, nx, ny) donb = 1, Atm_block%nblks if ((Mdl_parms%me == 0) .and. (nb /= 1)) Mdl_parms%me = -99 Tbd_data(nb)%dpshc(:) = 0.3d0 * Statein(nb)%prsi(:,1) callnuopc_phys_run (Statein(nb), Stateout(nb), Sfc_props(nb), Gfs_diags(nb), Intr_flds(nb), & Cld_props(nb), Rad_tends(nb), Mdl_parms, Tbd_data(nb), Dyn_parms(nb)) if (mpp_pe() == mpp_root_pe()) Mdl_parms%me = mpp_pe() !--- check the diagnostics output trigger if (ANY(fdiag == fhour)) then if (mpp_pe() == mpp_root_pe().and.nb==1) write(6,*) 'DIAG STEP', fhour nx = Atm_block%ibe(nb) - Atm_block%ibs(nb) + 1 ny = Atm_block%jbe(nb) - Atm_block%jbs(nb) + 1 call gfs_diag_output (Time_diag, Gfs_diags(nb), Statein(nb), Stateout(nb), & Atm_block, nb, nx, ny, levs, Mdl_parms%ntcw, Mdl_parms%ntoz, Dyn_parms(nb)%dtp) endif enddo !----- Indicate to diag_manager to write diagnostics to file (if needed) if (ANY(fdiag == fhour)) then call diag_send_complete_extra(Time_diag) endif
atmosphere_state_update • De-populate IPD State_out container(s) • transform vertical index • expand horizontal indicesfrom (ix,k) -> (I,j,k) • compute A-grid velocity and heat tendencies • redefine tracer mixing ratios consistent for FV3 • Apply tendencies and redefine winds on the D-grid • Output diagnostic quantities defined in diag_table
System Driver initialization Phase call mpp_init call fms_init call coupler_init integration Phase call update_atmos_model_dynamics call update_atmos_radiation_physics call update_atmos_model_state end Phase call coupler_end call fms_end 20
GFS Physics Modifications • Enabled infinite top-layer option in radiation • FV3 consistent geopotential calculation prior to convective parameterization • FV3 grid-cellarea passed to gbphys to be used in length-scale calclulations
Unique FV3-GFS Features • Turn off physics only advect properties via dycore • Turn off dycore integrate physics only emulate single-column model with full domain • Turn off both to check framework
fvGFS Testing • Bitwise reproducible across • distributed decompositions • OpenMP thread counts • restarts (requires lossless data storage) • Performance • “Do No Harm” unless absolutely necessary for the science • Subset of DCMIP suite • Idealized Nest verification
Concurrent Radiation update_atmos_model_dynamics update_atmos_radiation atmosphere_dynamics atmos_rad_driver_statein fv_dynamics rad_setup_step update_atmos_physics radiation_driver atmos_phys_driver_statein nuopc_rad_update phys_setup_step nuopc_rad_run physics_driver nuopc_phys_run update_atmos_model_state atmosphere_state_update NUOPC “cap” FV3 API fv_update_phys GFS Physics API