From ba6e8ea442b2d0d5992a8550db6d0c720ff338d2 Mon Sep 17 00:00:00 2001 From: Jili Dong Date: Mon, 4 Dec 2023 11:36:30 -0500 Subject: [PATCH 1/8] add 5 ccpp SDFs in support of RRFS multiphysics ensemble (#721) * add 5 ccpp SDFs in support of RRFS ensemble * add one more ccpp SDF for RRFS fire weather application by removing GWD in FV3_HRRR_gf --- ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml | 84 ++++++++++++++++++++++++ ccpp/suites/suite_RRFSens_phy1.xml | 86 +++++++++++++++++++++++++ ccpp/suites/suite_RRFSens_phy2.xml | 83 ++++++++++++++++++++++++ ccpp/suites/suite_RRFSens_phy3.xml | 83 ++++++++++++++++++++++++ ccpp/suites/suite_RRFSens_phy4.xml | 84 ++++++++++++++++++++++++ ccpp/suites/suite_RRFSens_phy5.xml | 81 +++++++++++++++++++++++ 6 files changed, 501 insertions(+) create mode 100644 ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml create mode 100644 ccpp/suites/suite_RRFSens_phy1.xml create mode 100644 ccpp/suites/suite_RRFSens_phy2.xml create mode 100644 ccpp/suites/suite_RRFSens_phy3.xml create mode 100644 ccpp/suites/suite_RRFSens_phy4.xml create mode 100644 ccpp/suites/suite_RRFSens_phy5.xml diff --git a/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml b/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml new file mode 100644 index 000000000..3e4b862c9 --- /dev/null +++ b/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml @@ -0,0 +1,84 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + rrtmg_lw_post + GFS_rrtmg_post + + + + + GFS_suite_interstitial_phys_reset + GFS_suite_stateout_reset + get_prs_fv3 + GFS_suite_interstitial_1 + GFS_surface_generic_pre + GFS_surface_composites_pre + dcyc2t3 + GFS_surface_composites_inter + GFS_suite_interstitial_2 + + + + mynnsfc_wrapper + GFS_surface_loop_control_part1 + lsm_ruc + clm_lake + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + rrfs_smoke_wrapper + mynnedmf_wrapper + rrfs_smoke_postpbl + GFS_suite_stateout_update + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + cu_gf_driver_pre + cu_gf_driver + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_thompson_pre + mp_thompson + mp_thompson_post + GFS_MP_generic_post + cu_gf_driver_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_RRFSens_phy1.xml b/ccpp/suites/suite_RRFSens_phy1.xml new file mode 100644 index 000000000..0cd4c47b8 --- /dev/null +++ b/ccpp/suites/suite_RRFSens_phy1.xml @@ -0,0 +1,86 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + rrtmg_lw_post + GFS_rrtmg_post + + + + + GFS_suite_interstitial_phys_reset + GFS_suite_stateout_reset + get_prs_fv3 + GFS_suite_interstitial_1 + GFS_surface_generic_pre + GFS_surface_composites_pre + dcyc2t3 + GFS_surface_composites_inter + GFS_suite_interstitial_2 + + + + sfc_diff + GFS_surface_loop_control_part1 + sfc_ocean + lsm_ruc + clm_lake + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + GFS_PBL_generic_pre + satmedmfvdifq + GFS_PBL_generic_post + GFS_GWD_generic_pre + drag_suite + GFS_GWD_generic_post + GFS_suite_stateout_update + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + cu_gf_driver_pre + cu_gf_driver + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_thompson_pre + mp_thompson + mp_thompson_post + GFS_MP_generic_post + cu_gf_driver_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_RRFSens_phy2.xml b/ccpp/suites/suite_RRFSens_phy2.xml new file mode 100644 index 000000000..e1ecc7149 --- /dev/null +++ b/ccpp/suites/suite_RRFSens_phy2.xml @@ -0,0 +1,83 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + rrtmg_lw_post + GFS_rrtmg_post + + + + + GFS_suite_interstitial_phys_reset + GFS_suite_stateout_reset + get_prs_fv3 + GFS_suite_interstitial_1 + GFS_surface_generic_pre + GFS_surface_composites_pre + dcyc2t3 + GFS_surface_composites_inter + GFS_suite_interstitial_2 + + + + mynnsfc_wrapper + GFS_surface_loop_control_part1 + lsm_ruc + clm_lake + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + mynnedmf_wrapper + GFS_GWD_generic_pre + drag_suite + GFS_GWD_generic_post + GFS_suite_stateout_update + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + samfdeepcnv + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_thompson_pre + mp_thompson + mp_thompson_post + GFS_MP_generic_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_RRFSens_phy3.xml b/ccpp/suites/suite_RRFSens_phy3.xml new file mode 100644 index 000000000..85e7189bd --- /dev/null +++ b/ccpp/suites/suite_RRFSens_phy3.xml @@ -0,0 +1,83 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + rrtmg_lw_post + GFS_rrtmg_post + + + + + GFS_suite_interstitial_phys_reset + GFS_suite_stateout_reset + get_prs_fv3 + GFS_suite_interstitial_1 + GFS_surface_generic_pre + GFS_surface_composites_pre + dcyc2t3 + GFS_surface_composites_inter + GFS_suite_interstitial_2 + + + + mynnsfc_wrapper + GFS_surface_loop_control_part1 + lsm_ruc + clm_lake + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + mynnedmf_wrapper + GFS_GWD_generic_pre + drag_suite + GFS_GWD_generic_post + GFS_suite_stateout_update + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + cu_gf_driver_pre + cu_gf_driver + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_nssl + GFS_MP_generic_post + cu_gf_driver_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_RRFSens_phy4.xml b/ccpp/suites/suite_RRFSens_phy4.xml new file mode 100644 index 000000000..35c7b052f --- /dev/null +++ b/ccpp/suites/suite_RRFSens_phy4.xml @@ -0,0 +1,84 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + rrtmg_lw_post + GFS_rrtmg_post + + + + + GFS_suite_interstitial_phys_reset + GFS_suite_stateout_reset + get_prs_fv3 + GFS_suite_interstitial_1 + GFS_surface_generic_pre + GFS_surface_composites_pre + dcyc2t3 + GFS_surface_composites_inter + GFS_suite_interstitial_2 + + + + sfc_diff + GFS_surface_loop_control_part1 + sfc_ocean + lsm_ruc + clm_lake + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + GFS_PBL_generic_pre + satmedmfvdifq + GFS_PBL_generic_post + GFS_GWD_generic_pre + drag_suite + GFS_GWD_generic_post + GFS_suite_stateout_update + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + cu_gf_driver_pre + cu_gf_driver + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_nssl + GFS_MP_generic_post + cu_gf_driver_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_RRFSens_phy5.xml b/ccpp/suites/suite_RRFSens_phy5.xml new file mode 100644 index 000000000..26bb32584 --- /dev/null +++ b/ccpp/suites/suite_RRFSens_phy5.xml @@ -0,0 +1,81 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + rrtmg_lw_post + GFS_rrtmg_post + + + + + GFS_suite_interstitial_phys_reset + GFS_suite_stateout_reset + get_prs_fv3 + GFS_suite_interstitial_1 + GFS_surface_generic_pre + GFS_surface_composites_pre + dcyc2t3 + GFS_surface_composites_inter + GFS_suite_interstitial_2 + + + + mynnsfc_wrapper + GFS_surface_loop_control_part1 + lsm_ruc + clm_lake + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + mynnedmf_wrapper + GFS_GWD_generic_pre + drag_suite + GFS_GWD_generic_post + GFS_suite_stateout_update + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + samfdeepcnv + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_nssl + GFS_MP_generic_post + maximum_hourly_diagnostics + GFS_physics_post + + + + + GFS_stochastics + + + + From a82381c0b751a15e5343de5078ef836b2c444c89 Mon Sep 17 00:00:00 2001 From: Dusan Jovic <48258889+DusanJovic-NOAA@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:13:13 -0500 Subject: [PATCH 2/8] Create 'coupler.res' log file in write grid comp. Explicitly specify chunk sizes in restart files (#726) * Write coupler.res log files from the write grid comp if quilting_restart is .true. * Explicitly specify chunk sizes in write_restart_netcdf --- io/module_write_restart_netcdf.F90 | 9 +++++- io/module_wrt_grid_comp.F90 | 50 ++++++++++++++++++++++++++---- module_fcst_grid_comp.F90 | 14 ++++----- 3 files changed, 59 insertions(+), 14 deletions(-) diff --git a/io/module_write_restart_netcdf.F90 b/io/module_write_restart_netcdf.F90 index ec46d6f23..2fd4c7732 100644 --- a/io/module_write_restart_netcdf.F90 +++ b/io/module_write_restart_netcdf.F90 @@ -79,7 +79,7 @@ subroutine write_restart_netcdf(wrtfb, filename, & integer :: dimid, dimtype integer :: im_dimid, im_p1_dimid, jm_dimid, jm_p1_dimid, time_dimid integer :: im_varid, im_p1_varid, jm_varid, jm_p1_varid, time_varid - integer, dimension(:), allocatable :: dimids_2d, dimids_3d + integer, dimension(:), allocatable :: dimids_2d, dimids_3d, chunksizes integer, dimension(:), allocatable :: varids, zaxis_dimids logical shuffle @@ -335,6 +335,7 @@ subroutine write_restart_netcdf(wrtfb, filename, & ! define variables if (rank == 2) then dimids_2d = [im_dimid,jm_dimid, time_dimid] + chunksizes = [im, jm, 1] if (typekind == ESMF_TYPEKIND_R4) then ncerr = nf90_def_var(ncid, trim(fldName), NF90_FLOAT, dimids_2d, varids(i)); NC_ERR_STOP(ncerr) else if (typekind == ESMF_TYPEKIND_R8) then @@ -346,13 +347,17 @@ subroutine write_restart_netcdf(wrtfb, filename, & else if (rank == 3) then if ( .not.is_restart_core ) then dimids_3d = [im_dimid,jm_dimid,zaxis_dimids(i),time_dimid] + chunksizes = [im, jm, 1, 1] else if (staggerloc == ESMF_STAGGERLOC_CENTER) then dimids_3d = [im_dimid,jm_dimid,zaxis_dimids(i),time_dimid] + chunksizes = [im, jm, 1, 1] else if (staggerloc == ESMF_STAGGERLOC_EDGE1) then ! east dimids_3d = [im_p1_dimid,jm_dimid,zaxis_dimids(i),time_dimid] + chunksizes = [im+1, jm, 1, 1] else if (staggerloc == ESMF_STAGGERLOC_EDGE2) then ! south dimids_3d = [im_dimid,jm_p1_dimid,zaxis_dimids(i),time_dimid] + chunksizes = [im, jm+1, 1, 1] else if (mype==0) write(0,*)'Unsupported staggerloc ', staggerloc call ESMF_Finalize(endflag=ESMF_END_ABORT) @@ -374,6 +379,8 @@ subroutine write_restart_netcdf(wrtfb, filename, & ncerr = nf90_var_par_access(ncid, varids(i), par_access); NC_ERR_STOP(ncerr) end if + ncerr = nf90_def_var_chunking(ncid, varids(i), NF90_CHUNKED, chunksizes) ; NC_ERR_STOP(ncerr) + if (zstandard_level(1) > 0) then ncerr = nf90_def_var_zstandard(ncid, varids(i), zstandard_level(1)) if (ncerr /= nf90_noerr) then diff --git a/io/module_wrt_grid_comp.F90 b/io/module_wrt_grid_comp.F90 index bcca85ab4..b59fe5e45 100644 --- a/io/module_wrt_grid_comp.F90 +++ b/io/module_wrt_grid_comp.F90 @@ -44,7 +44,7 @@ module module_wrt_grid_comp stdlat1, stdlat2, dx, dy, iau_offset, & ideflate, zstandard_level, lflname_fulltime use module_write_netcdf, only : write_netcdf - use module_write_restart_netcdf + use module_write_restart_netcdf, only : write_restart_netcdf use physcons, only : pi => con_pi #ifdef INLINE_POST use post_fv3, only : post_run_fv3 @@ -68,10 +68,11 @@ module module_wrt_grid_comp integer,save :: ngrids integer,save :: wrt_mpi_comm !<-- the mpi communicator in the write comp - integer,save :: idate(7) + integer,save :: idate(7), start_time(7) logical,save :: write_nsflip logical,save :: change_wrtidate=.false. integer,save :: frestart(999) = -1 + integer,save :: calendar_type = 3 logical :: lprnt ! !----------------------------------------------------------------------- @@ -840,6 +841,7 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, h=idate(4), m=idate(5), s=idate(6),rc=rc) ! if (lprnt) write(0,*) 'in wrt initial, io_baseline time=',idate,'rc=',rc idate(7) = 1 + start_time = idate wrt_int_state%idate = idate wrt_int_state%fdate = idate ! update IO-BASETIME and idate on write grid comp when IAU is enabled @@ -1333,8 +1335,27 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, line=__LINE__, file=__FILE__)) return +! save calendar_type (as integer) for use in 'coupler.res' + if (index(trim(attNameList(i)),'time:calendar') > 0) then + select case( uppercase(trim(valueS)) ) + case( 'JULIAN' ) + calendar_type = JULIAN + case( 'GREGORIAN' ) + calendar_type = GREGORIAN + case( 'NOLEAP' ) + calendar_type = NOLEAP + case( 'THIRTY_DAY' ) + calendar_type = THIRTY_DAY_MONTHS + case( 'NO_CALENDAR' ) + calendar_type = NO_CALENDAR + case default + call mpp_error ( FATAL, 'fcst_initialize: calendar must be one of '// & + 'JULIAN|GREGORIAN|NOLEAP|THIRTY_DAY|NO_CALENDAR.' ) + end select + endif + ! update the time:units when idate on write grid component is changed - if ( index(trim(attNameList(i)),'time:units')>0) then + if (index(trim(attNameList(i)),'time:units') > 0) then if ( change_wrtidate ) then idx = index(trim(valueS),' since ') if(lprnt) print *,'in write grid comp, time:unit=',trim(valueS) @@ -1795,7 +1816,7 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) logical :: use_parallel_netcdf real, allocatable :: output_fh(:) - logical :: is_restart_bundle + logical :: is_restart_bundle, restart_written integer :: tileCount ! !----------------------------------------------------------------------- @@ -2151,6 +2172,8 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) ! if (lprnt) write(0,*)'wrt_run: loop over wrt_int_state%FBCount ',wrt_int_state%FBCount, ' nfhour ', nfhour, ' cdate ', cdate(1:6) two_phase_loop: do out_phase = 1, 2 + + restart_written = .false. file_loop_all: do nbdl=1, wrt_int_state%FBCount call ESMF_FieldBundleGet(wrt_int_state%wrtFB(nbdl), name=wrtFBName, rc=rc) @@ -2349,6 +2372,8 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) rc) endif ! cubed sphere vs. regional/nest write grid + restart_written = .true. + else ! history bundle if (trim(output_grid(grid_id)) == 'cubed_sphere_grid') then @@ -2413,13 +2438,26 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) enddo file_loop_all if (out_phase == 1 .and. mype == lead_write_task) then - !** write out log file - open(newunit=nolog,file='log.atm.f'//trim(cfhour),form='FORMATTED') + !** write history log file + open(newunit=nolog, file='log.atm.f'//trim(cfhour)) write(nolog,"('completed: fv3atm')") write(nolog,"('forecast hour: ',f10.3)") nfhour write(nolog,"('valid time: ',6(i4,2x))") wrt_int_state%fdate(1:6) close(nolog) endif + + if (out_phase == 2 .and. restart_written .and. mype == lead_write_task) then + !** write coupler.res log file + open(newunit=nolog, file='RESTART/'//trim(time_restart)//'.coupler.res', status='new') + write(nolog,"(i6,8x,a)") calendar_type , & + '(Calendar: no_calendar=0, thirty_day_months=1, julian=2, gregorian=3, noleap=4)' + write(nolog,"(6i6,8x,a)") start_time(1:6), & + 'Model start time: year, month, day, hour, minute, second' + write(nolog,"(6i6,8x,a)") wrt_int_state%fdate(1:6), & + 'Current model time: year, month, day, hour, minute, second' + close(nolog) + endif + enddo two_phase_loop endif ! if ( wrt_int_state%output_history ) diff --git a/module_fcst_grid_comp.F90 b/module_fcst_grid_comp.F90 index 4bc7bfe52..ea622369c 100644 --- a/module_fcst_grid_comp.F90 +++ b/module_fcst_grid_comp.F90 @@ -921,11 +921,11 @@ subroutine fcst_initialize(fcst_comp, importState, exportState, clock, rc) ! Add time Attribute to the exportState call ESMF_AttributeAdd(exportState, convention="NetCDF", purpose="FV3", & attrList=(/ "time ", & - "time:long_name ", & - "time:units ", & - "time:cartesian_axis", & - "time:calendar_type ", & - "time:calendar " /), rc=rc) + "time:long_name ", & + "time:units ", & + "time:cartesian_axis", & + "time:calendar_type ", & + "time:calendar " /), rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, line=__LINE__, file=__FILE__)) return call ESMF_AttributeSet(exportState, convention="NetCDF", purpose="FV3", & @@ -1366,8 +1366,8 @@ subroutine fcst_run_phase_2(fcst_comp, importState, exportState,clock,rc) call atmos_model_restart(Atmos, timestamp) call write_stoch_restart_atm('RESTART/'//trim(timestamp)//'.atm_stoch.res.nc') - !----- write restart file ------ - if (mpp_pe() == mpp_root_pe())then + !----- write coupler.res file ------ + if (.not. quilting_restart .and. mpp_pe() == mpp_root_pe()) then call get_date (Atmos%Time, date(1), date(2), date(3), date(4), date(5), date(6)) open( newunit=unit, file='RESTART/'//trim(timestamp)//'.coupler.res' ) write( unit, '(i6,8x,a)' )calendar_type, & From f221fc5ce66cee86160efa4bc4deb9c861959e19 Mon Sep 17 00:00:00 2001 From: "Samuel Trahan (NOAA contractor)" <39415369+SamuelTrahanNOAA@users.noreply.github.com> Date: Tue, 19 Dec 2023 13:39:28 -0500 Subject: [PATCH 3/8] bug fix: disable concurrency in GFS_phys_time_vary_init NetCDF calls (#735) * Remove nfhout, nfhout_hf, nsout * Do not open 'coupler.res' file with status 'new' * bug fix: no concurrent NetCDF calls in GFS_phys_time_vary_init --------- Co-authored-by: Dusan Jovic --- atmos_model.F90 | 4 +- ccpp/physics | 2 +- fv3_cap.F90 | 73 ++----------------------------------- io/module_fv3_io_def.F90 | 2 +- io/module_wrt_grid_comp.F90 | 5 +-- module_fv3_config.F90 | 2 +- 6 files changed, 10 insertions(+), 78 deletions(-) diff --git a/atmos_model.F90 b/atmos_model.F90 index 25cc61a88..7105f6997 100644 --- a/atmos_model.F90 +++ b/atmos_model.F90 @@ -101,7 +101,7 @@ module atmos_model_mod use fv_ufs_restart_io_mod, only: fv_dyn_restart_register, & fv_dyn_restart_output use fv_iau_mod, only: iau_external_data_type,getiauforcing,iau_initialize -use module_fv3_config, only: first_kdt, nsout, output_fh, & +use module_fv3_config, only: first_kdt, output_fh, & fcst_mpi_comm, fcst_ntasks, & quilting_restart use module_block_data, only: block_atmos_copy, block_data_copy, & @@ -976,7 +976,7 @@ subroutine update_atmos_model_state (Atmos, rc) call get_time (Atmos%Time - diag_time, isec) call get_time (Atmos%Time - Atmos%Time_init, seconds) call atmosphere_nggps_diag(Atmos%Time,ltavg=.true.,avg_max_length=avg_max_length) - if (ANY(nint(output_fh(:)*3600.0) == seconds) .or. (GFS_control%kdt == first_kdt) .or. nsout > 0) then + if (ANY(nint(output_fh(:)*3600.0) == seconds) .or. (GFS_control%kdt == first_kdt)) then if (mpp_pe() == mpp_root_pe()) write(6,*) "---isec,seconds",isec,seconds time_int = real(isec) if(Atmos%iau_offset > zero) then diff --git a/ccpp/physics b/ccpp/physics index c0aa212db..ed7e015b4 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit c0aa212dbc255ac5d77934c3cd6283c994bbfd99 +Subproject commit ed7e015b483a14fc7ae9bf9d0f0cc3d26c517f7e diff --git a/fv3_cap.F90 b/fv3_cap.F90 index ada73a861..5401e66a5 100644 --- a/fv3_cap.F90 +++ b/fv3_cap.F90 @@ -28,7 +28,7 @@ module fv3atm_cap_mod NUOPC_ModelGet ! use module_fv3_config, only: quilting, quilting_restart, output_fh, & - nfhout, nfhout_hf, nsout, dt_atmos, & + dt_atmos, & calendar, cpl_grid_id, & cplprint_flag, first_kdt @@ -36,7 +36,7 @@ module fv3atm_cap_mod num_files, filename_base, & wrttasks_per_group, n_group, & lead_wrttask, last_wrttask, & - nsout_io, iau_offset, lflname_fulltime, & + iau_offset, lflname_fulltime, & time_unlimited ! use module_fcst_grid_comp, only: fcstSS => SetServices @@ -301,7 +301,6 @@ subroutine InitializeAdvertise(gcomp, rc) if(mype == 0) print *,'af ufs config,quilting=',quilting,' calendar=', trim(calendar),' iau_offset=',iau_offset, & ' noutput_fh=',noutput_fh ! - nfhout = 0 ; nfhmax_hf = 0 ; nfhout_hf = 0 ; nsout = 0 if ( quilting ) then call ESMF_ConfigGetAttribute(config=CF,value=use_saved_routehandles, & label ='use_saved_routehandles:', & @@ -334,15 +333,6 @@ subroutine InitializeAdvertise(gcomp, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, line=__LINE__, file=__FILE__)) return enddo -! variables for output - call ESMF_ConfigGetAttribute(config=CF, value=nfhout, label ='nfhout:', default=-1,rc=rc) - call ESMF_ConfigGetAttribute(config=CF, value=nfhmax_hf,label ='nfhmax_hf:',default=-1,rc=rc) - call ESMF_ConfigGetAttribute(config=CF, value=nfhout_hf,label ='nfhout_hf:',default=-1,rc=rc) - call ESMF_ConfigGetAttribute(config=CF, value=nsout, label ='nsout:', default=-1,rc=rc) - nsout_io = nsout -! - if(mype==0) print *,'af ufs config,nfhout,nsout=',nfhout,nfhmax_hf,nfhout_hf, nsout,noutput_fh - call ESMF_ConfigGetAttribute(config=CF, value=time_unlimited, label ='time_unlimited:', default=.false., rc=rc) endif ! quilting @@ -819,64 +809,7 @@ subroutine InitializeAdvertise(gcomp, rc) if(iau_offset > 0) then output_startfh = iau_offset endif - if(mype==0) print *,'in fv3 cap init, output_startfh=',output_startfh,'nsout=',nsout, & - 'iau_offset=',iau_offset,'nfhmax_hf=',nfhmax_hf,'nfhout_hf=',nfhout_hf, & - 'nfhout=',nfhout -! -!--- set up output_fh with output forecast hours -! if the run does not have iau, it will have output after first step integration as fh00 -! if the run has iau, it will start output at fh=00 at the cycle time (usually StartTime+IAU_offsetTI) - if(nsout > 0) then -!--- use nsout for output frequency nsout*dt_atmos - nfh = 0 - if( nfhmax > output_startfh ) nfh = nint((nfhmax-output_startfh)/(nsout*dt_atmos/3600.))+1 - if(nfh >0) then - allocate(output_fh(nfh)) - if( output_startfh == 0) then - output_fh(1) = dt_atmos/3600. - else - output_fh(1) = output_startfh - endif - do i=2,nfh - output_fh(i) = (i-1)*nsout*dt_atmos/3600. + output_startfh - enddo - endif - elseif (nfhmax_hf > 0 ) then -!--- use high frequency output and low frequency for output forecast time - nfh = 0 - if( nfhout_hf>0 .and. nfhmax_hf>output_startfh) nfh = nint((nfhmax_hf-output_startfh)/nfhout_hf)+1 - nfh2 = 0 - if( nfhout>0 .and. nfhmax>nfhmax_hf) nfh2 = nint((nfhmax-nfhmax_hf)/nfhout) - if( nfh+nfh2 > 0) then - allocate(output_fh(nfh+nfh2)) - if( output_startfh == 0) then - output_fh(1) = dt_atmos/3600. - else - output_fh(1) = output_startfh - endif - do i=2,nfh - output_fh(i) = (i-1)*nfhout_hf + output_startfh - enddo - do i=1,nfh2 - output_fh(nfh+i) = nfhmax_hf + i*nfhout - enddo - endif - elseif (nfhout > 0 ) then -!--- use one output freqency - nfh = 0 - if( nfhout > 0 .and. nfhmax>output_startfh) nfh = nint((nfhmax-output_startfh)/nfhout) + 1 - if( nfh > 0 ) then - allocate(output_fh(nfh)) - if( output_startfh == 0) then - output_fh(1) = dt_atmos/3600. - else - output_fh(1) = output_startfh - endif - do i=2,nfh - output_fh(i) = (i-1)*nfhout + output_startfh - enddo - endif - endif + if(mype==0) print *,'in fv3 cap init, output_startfh=',output_startfh,' iau_offset=',iau_offset ! !----------------------------------------------------------------------- !*** SET THE FIRST WRITE GROUP AS THE FIRST ONE TO ACT. diff --git a/io/module_fv3_io_def.F90 b/io/module_fv3_io_def.F90 index 2689ef1c2..dfef37500 100644 --- a/io/module_fv3_io_def.F90 +++ b/io/module_fv3_io_def.F90 @@ -15,7 +15,7 @@ module module_fv3_io_def integer :: n_group integer :: num_files integer :: nbdlphys - integer :: nsout_io, iau_offset + integer :: iau_offset logical :: lflname_fulltime logical :: time_unlimited diff --git a/io/module_wrt_grid_comp.F90 b/io/module_wrt_grid_comp.F90 index b59fe5e45..e409788ab 100644 --- a/io/module_wrt_grid_comp.F90 +++ b/io/module_wrt_grid_comp.F90 @@ -38,7 +38,6 @@ module module_wrt_grid_comp imo,jmo,ichunk2d,jchunk2d, & ichunk3d,jchunk3d,kchunk3d, & quantize_mode,quantize_nsd, & - nsout => nsout_io, & cen_lon, cen_lat, & lon1, lat1, lon2, lat2, dlon, dlat, & stdlat1, stdlat2, dx, dy, iau_offset, & @@ -1876,7 +1875,7 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) if (nf_hours < 0) return - if (nsout > 0 .or. lflname_fulltime) then + if (lflname_fulltime) then ndig = max(log10(nf_hours+0.5)+1., 3.) write(cform, '("(I",I1,".",I1,",A1,I2.2,A1,I2.2)")') ndig, ndig write(cfhour, cform) nf_hours,'-',nf_minutes,'-',nf_seconds @@ -2448,7 +2447,7 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) if (out_phase == 2 .and. restart_written .and. mype == lead_write_task) then !** write coupler.res log file - open(newunit=nolog, file='RESTART/'//trim(time_restart)//'.coupler.res', status='new') + open(newunit=nolog, file='RESTART/'//trim(time_restart)//'.coupler.res') write(nolog,"(i6,8x,a)") calendar_type , & '(Calendar: no_calendar=0, thirty_day_months=1, julian=2, gregorian=3, noleap=4)' write(nolog,"(6i6,8x,a)") start_time(1:6), & diff --git a/module_fv3_config.F90 b/module_fv3_config.F90 index aac606a5e..7e82c8e24 100644 --- a/module_fv3_config.F90 +++ b/module_fv3_config.F90 @@ -13,7 +13,7 @@ module module_fv3_config implicit none ! - integer :: nfhout, nfhout_hf, nsout, dt_atmos + integer :: dt_atmos integer :: first_kdt integer :: fcst_mpi_comm, fcst_ntasks ! From 87a0ccae64b180d6b45d6f50fa55718d8ff26ede Mon Sep 17 00:00:00 2001 From: "Samuel Trahan (NOAA contractor)" <39415369+SamuelTrahanNOAA@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:46:46 -0500 Subject: [PATCH 4/8] pressure is not density and weasdi is not snodi + #739 and #742 (#736) * pressure is not density * wrong variable sent for snodi * explain lakedepth corruption safeguards * module_sf_ruclsm.f90: explain the snow_mosaic=0 line * add flag to track new freezing lake ice grids * change name of lake_freeze to flag_lakefreeze --------- Co-authored-by: Jili Dong --- ccpp/data/CCPP_typedefs.F90 | 3 +++ ccpp/data/CCPP_typedefs.meta | 6 ++++++ ccpp/driver/GFS_diagnostics.F90 | 4 ++-- ccpp/physics | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ccpp/data/CCPP_typedefs.F90 b/ccpp/data/CCPP_typedefs.F90 index a7da2eca9..7d9351337 100644 --- a/ccpp/data/CCPP_typedefs.F90 +++ b/ccpp/data/CCPP_typedefs.F90 @@ -140,6 +140,7 @@ module CCPP_typedefs logical, pointer :: flag_cice(:) => null() !< logical, pointer :: flag_guess(:) => null() !< logical, pointer :: flag_iter(:) => null() !< + logical, pointer :: flag_lakefreeze(:) => null() !< real (kind=kind_phys), pointer :: ffmm_ice(:) => null() !< real (kind=kind_phys), pointer :: ffmm_land(:) => null() !< real (kind=kind_phys), pointer :: ffmm_water(:) => null() !< @@ -607,6 +608,7 @@ subroutine gfs_interstitial_create (Interstitial, IM, Model) allocate (Interstitial%flag_cice (IM)) allocate (Interstitial%flag_guess (IM)) allocate (Interstitial%flag_iter (IM)) + allocate (Interstitial%flag_lakefreeze (IM)) allocate (Interstitial%ffmm_ice (IM)) allocate (Interstitial%ffmm_land (IM)) allocate (Interstitial%ffmm_water (IM)) @@ -1297,6 +1299,7 @@ subroutine gfs_interstitial_phys_reset (Interstitial, Model) Interstitial%flag_cice = .false. Interstitial%flag_guess = .false. Interstitial%flag_iter = .true. + Interstitial%flag_lakefreeze = .false. Interstitial%ffmm_ice = Model%huge Interstitial%ffmm_land = Model%huge Interstitial%ffmm_water = Model%huge diff --git a/ccpp/data/CCPP_typedefs.meta b/ccpp/data/CCPP_typedefs.meta index 3ecb69be7..428970f2d 100644 --- a/ccpp/data/CCPP_typedefs.meta +++ b/ccpp/data/CCPP_typedefs.meta @@ -890,6 +890,12 @@ units = flag dimensions = (horizontal_loop_extent) type = logical +[flag_lakefreeze] + standard_name = flag_for_lake_water_freeze + long_name = flag for lake water freeze + units = flag + dimensions = (horizontal_loop_extent) + type = logical [ffmm_water] standard_name = Monin_Obukhov_similarity_function_for_momentum_over_water long_name = Monin-Obukhov similarity function for momentum over water diff --git a/ccpp/driver/GFS_diagnostics.F90 b/ccpp/driver/GFS_diagnostics.F90 index 42b1d1d66..f7f6d0caf 100644 --- a/ccpp/driver/GFS_diagnostics.F90 +++ b/ccpp/driver/GFS_diagnostics.F90 @@ -4005,12 +4005,12 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop idx = idx + 1 ExtDiag(idx)%axes = 2 ExtDiag(idx)%name = 'snodi' - ExtDiag(idx)%desc = 'water equivalent snow depth over ice' + ExtDiag(idx)%desc = 'snow depth over ice' ExtDiag(idx)%unit = 'mm' ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => sfcprop(nb)%weasdi(:) + ExtDiag(idx)%data(nb)%var2 => sfcprop(nb)%snodi(:) enddo idx = idx + 1 diff --git a/ccpp/physics b/ccpp/physics index ed7e015b4..0cdfc9d74 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit ed7e015b483a14fc7ae9bf9d0f0cc3d26c517f7e +Subproject commit 0cdfc9d7465358debb4de292861fef970b44874a From bba399053d3939241938f19ee598895eea54fd65 Mon Sep 17 00:00:00 2001 From: haiqinli <38666296+haiqinli@users.noreply.github.com> Date: Wed, 27 Dec 2023 14:10:22 -0700 Subject: [PATCH 5/8] Smoke/Dust updates for RRFS code freeze (#728) * "update smoke/dust for RRFS code freeze" * "point to the chem3d dimension update in GF for hercules/gnu" --- ccpp/data/GFS_typedefs.F90 | 75 +++++++++++++++++++------- ccpp/data/GFS_typedefs.meta | 96 ++++++++++++++++++++++++++++----- ccpp/driver/GFS_diagnostics.F90 | 72 ++++++++++++++----------- ccpp/physics | 2 +- io/fv3atm_restart_io.F90 | 4 +- io/fv3atm_rrfs_sd_io.F90 | 79 +++++++++++++++++++++------ 6 files changed, 246 insertions(+), 82 deletions(-) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 17d6ee4a0..5a8368a40 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -253,7 +253,8 @@ module GFS_typedefs real (kind=kind_phys), pointer :: hprime (:,:) => null() !< orographic metrics real (kind=kind_phys), pointer :: dust12m_in (:,:,:) => null() !< fengsha dust input real (kind=kind_phys), pointer :: emi_in (:,:) => null() !< anthropogenic background input - real (kind=kind_phys), pointer :: smoke_RRFS(:,:,:) => null() !< RRFS fire input + real (kind=kind_phys), pointer :: smoke_RRFS(:,:,:) => null() !< RRFS fire input hourly + real (kind=kind_phys), pointer :: smoke2d_RRFS(:,:) => null() !< RRFS fire input daily real (kind=kind_phys), pointer :: z0base (:) => null() !< background or baseline surface roughness length in m real (kind=kind_phys), pointer :: semisbase(:) => null() !< background surface emissivity real (kind=kind_phys), pointer :: sfalb_lnd (:) => null() !< surface albedo over land for LSM @@ -456,10 +457,9 @@ module GFS_typedefs real (kind=kind_phys), pointer :: emseas (:) => null() !< instantaneous sea salt emission real (kind=kind_phys), pointer :: emanoc (:) => null() !< instantaneous anthro. oc emission - !--- Smoke. These 3 arrays are hourly, so their dimension is imx24 (output is hourly) - real (kind=kind_phys), pointer :: ebb_smoke_hr(:) => null() !< hourly smoke emission - real (kind=kind_phys), pointer :: frp_hr (:) => null() !< hourly FRP - real (kind=kind_phys), pointer :: frp_std_hr (:) => null() !< hourly std. FRP + !--- Smoke. These 2 arrays are input smoke emission and frp + real (kind=kind_phys), pointer :: ebb_smoke_in(:) => null() !< input smoke emission + real (kind=kind_phys), pointer :: frp_input (:) => null() !< input FRP !--- For fire diurnal cycle real (kind=kind_phys), pointer :: fhist (:) => null() !< instantaneous fire coef_bb @@ -614,7 +614,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: nifa2d (:) => null() !< instantaneous ice-friendly sfc aerosol source !--- For fire diurnal cycle - real (kind=kind_phys), pointer :: ebu_smoke (:,:) => null() !< 3D ebu array + real (kind=kind_phys), pointer :: ebu_smoke (:,:) => null() !< 3D ebu array !--- For smoke and dust optical extinction real (kind=kind_phys), pointer :: smoke_ext (:,:) => null() !< 3D aod array @@ -623,12 +623,19 @@ module GFS_typedefs !--- For MYNN PBL transport of smoke and dust real (kind=kind_phys), pointer :: chem3d (:,:,:) => null() !< 3D aod array real (kind=kind_phys), pointer :: ddvel (:,: ) => null() !< 2D dry deposition velocity + !--- For convective wet removal of smoke and dust + real (kind=kind_phys), pointer :: wetdpc_flux (:,:) => null() !< 2D wet deposition array + !--- For large-scale wet removal of smoke and dust + real (kind=kind_phys), pointer :: wetdpr_flux (:,:) => null() !< 2D wet deposition array + !--- For dry deposition of smoke and dust + real (kind=kind_phys), pointer :: drydep_flux (:,:) => null() !< 2D dry deposition flux of smoke !--- Fire plume rise diagnostics - real (kind=kind_phys), pointer :: min_fplume (:) => null() !< minimum plume rise level - real (kind=kind_phys), pointer :: max_fplume (:) => null() !< maximum plume rise level + real (kind=kind_phys), pointer :: min_fplume (:) => null() !< minimum plume rise level + real (kind=kind_phys), pointer :: max_fplume (:) => null() !< maximum plume rise level !--- hourly fire potential index - real (kind=kind_phys), pointer :: rrfs_hwp (:) => null() !< hourly fire potential index + real (kind=kind_phys), pointer :: rrfs_hwp (:) => null() !< hourly fire potential index + real (kind=kind_phys), pointer :: rrfs_hwp_ave (:) => null() !< *Average* hourly fire potential index !--- instantaneous quantities for chemistry coupling real (kind=kind_phys), pointer :: ushfsfci(:) => null() !< instantaneous upward sensible heat flux (w/m**2) @@ -1448,8 +1455,8 @@ module GFS_typedefs integer :: ntsmoke !< tracer index for smoke integer :: ntdust !< tracer index for dust integer :: ntcoarsepm !< tracer index for coarse PM - integer :: nchem = 3 !< number of prognostic chemical species (vertically mixied) - integer :: ndvel = 3 !< number of prognostic chemical species (which are deposited, usually =nchem) + integer :: nchem !< number of prognostic chemical species (vertically mixied) + integer :: ndvel !< number of prognostic chemical species (which are deposited, usually =nchem) integer :: ntchm !< number of prognostic chemical tracers (advected) integer :: ntchs !< tracer index for first prognostic chemical tracer integer :: ntche !< tracer index for last prognostic chemical tracer @@ -1510,10 +1517,13 @@ module GFS_typedefs real(kind=kind_phys) :: dust_alpha !< alpha parameter for fengsha dust scheme real(kind=kind_phys) :: dust_gamma !< gamma parameter for fengsha dust scheme real(kind=kind_phys) :: wetdep_ls_alpha !< alpha parameter for wet deposition + integer :: ebb_dcycle !< 1:retro; 2:forecast of fire emission integer :: seas_opt integer :: dust_opt integer :: drydep_opt integer :: coarsepm_settling + integer :: plume_wind_eff + logical :: extended_sd_diags integer :: wetdep_ls_opt logical :: do_plumerise integer :: addsmoke_flag @@ -1522,9 +1532,11 @@ module GFS_typedefs logical :: aero_ind_fdb ! WFA/IFA indirect logical :: aero_dir_fdb ! smoke/dust direct logical :: rrfs_smoke_debug + logical :: do_smoke_transport logical :: mix_chem logical :: enh_mix real(kind=kind_phys) :: smoke_dir_fdb_coef(7) !< smoke & dust direct feedbck coefficents + real(kind=kind_phys) :: smoke_conv_wet_coef(3) !< smoke & dust convective wet removal coefficents !--- debug flags logical :: debug @@ -2309,7 +2321,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%weasdi (IM)) allocate (Sfcprop%hprime (IM,Model%nmtvr)) allocate (Sfcprop%dust12m_in (IM,12,5)) - allocate (Sfcprop%smoke_RRFS(IM,24,3)) + allocate (Sfcprop%smoke_RRFS(IM,24,2)) + allocate (Sfcprop%smoke2d_RRFS(IM,4)) allocate (Sfcprop%emi_in (IM,1)) allocate(Sfcprop%albdirvis_lnd (IM)) allocate(Sfcprop%albdirnir_lnd (IM)) @@ -2367,6 +2380,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%dust12m_in= clear_val Sfcprop%emi_in = clear_val Sfcprop%smoke_RRFS= clear_val + Sfcprop%smoke2d_RRFS= clear_val Sfcprop%albdirvis_lnd = clear_val Sfcprop%albdirnir_lnd = clear_val Sfcprop%albdifvis_lnd = clear_val @@ -2790,9 +2804,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%emdust (IM)) allocate (Sfcprop%emseas (IM)) allocate (Sfcprop%emanoc (IM)) - allocate (Sfcprop%ebb_smoke_hr (IM)) - allocate (Sfcprop%frp_hr (IM)) - allocate (Sfcprop%frp_std_hr(IM)) + allocate (Sfcprop%ebb_smoke_in (IM)) + allocate (Sfcprop%frp_input (IM)) allocate (Sfcprop%fhist (IM)) allocate (Sfcprop%coef_bb_dc(IM)) allocate (Sfcprop%fire_in (IM,Model%fire_aux_data_levels)) @@ -2801,9 +2814,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%emdust = clear_val Sfcprop%emseas = clear_val Sfcprop%emanoc = clear_val - Sfcprop%ebb_smoke_hr = clear_val - Sfcprop%frp_hr = clear_val - Sfcprop%frp_std_hr = clear_val + Sfcprop%ebb_smoke_in = clear_val + Sfcprop%frp_input = clear_val Sfcprop%fhist = 1. Sfcprop%coef_bb_dc = clear_val Sfcprop%fire_in = clear_val @@ -3149,17 +3161,25 @@ subroutine coupling_create (Coupling, IM, Model) allocate (Coupling%dust_ext (IM,Model%levs)) allocate (Coupling%chem3d (IM,Model%levs,Model%nchem)) allocate (Coupling%ddvel (IM,Model%ndvel)) + allocate (Coupling%wetdpc_flux(IM,Model%nchem)) + allocate (Coupling%wetdpr_flux(IM,Model%nchem)) + allocate (Coupling%drydep_flux(IM,Model%ndvel)) allocate (Coupling%min_fplume(IM)) allocate (Coupling%max_fplume(IM)) allocate (Coupling%rrfs_hwp (IM)) + allocate (Coupling%rrfs_hwp_ave (IM)) Coupling%ebu_smoke = clear_val Coupling%smoke_ext = clear_val Coupling%dust_ext = clear_val Coupling%chem3d = clear_val Coupling%ddvel = clear_val + Coupling%wetdpc_flux = clear_val + Coupling%wetdpr_flux = clear_val + Coupling%drydep_flux = clear_val Coupling%min_fplume = clear_val Coupling%max_fplume = clear_val Coupling%rrfs_hwp = clear_val + Coupling%rrfs_hwp_ave = clear_val endif if (Model%imfdeepcnv == Model%imfdeepcnv_gf .or. Model%imfdeepcnv == Model%imfdeepcnv_c3) then @@ -3847,10 +3867,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & real(kind=kind_phys) :: dust_gamma = 0. real(kind=kind_phys) :: wetdep_ls_alpha = 0. integer :: dust_moist_opt = 1 ! fecan :1 else shao + integer :: ebb_dcycle = 1 ! 1:retro; 2:forecast integer :: seas_opt = 2 integer :: dust_opt = 5 integer :: drydep_opt = 1 integer :: coarsepm_settling = 1 + integer :: plume_wind_eff = 1 + logical :: extended_sd_diags = .false. integer :: wetdep_ls_opt = 1 logical :: do_plumerise = .false. integer :: addsmoke_flag = 1 @@ -3859,9 +3882,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: aero_ind_fdb = .false. ! RRFS-sd wfa/ifa emission logical :: aero_dir_fdb = .false. ! RRFS-sd smoke/dust radiation feedback logical :: rrfs_smoke_debug = .false. ! RRFS-sd plumerise debug + logical :: do_smoke_transport = .true.! RRFS-sd convective transport of smoke/dust logical :: mix_chem = .false. ! tracer mixing option by MYNN PBL logical :: enh_mix = .false. ! enhance vertmix option by MYNN PBL real(kind=kind_phys) :: smoke_dir_fdb_coef(7) =(/ 0.33, 0.67, 0.02, 0.13, 0.85, 0.05, 0.95 /) !< smoke & dust direct feedbck coefficents + real(kind=kind_phys) :: smoke_conv_wet_coef(3) =(/ 0.50, 0.50, 0.50 /) !< smoke & dust convective wet removal coefficents !-- Lightning threat index logical :: lightning_threat = .false. @@ -4020,9 +4045,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & dust_drylimit_factor, dust_moist_correction, dust_moist_opt, & dust_alpha, dust_gamma, wetdep_ls_alpha, & seas_opt, dust_opt, drydep_opt, coarsepm_settling, & + plume_wind_eff,ebb_dcycle, extended_sd_diags, & wetdep_ls_opt, smoke_forecast, aero_ind_fdb, aero_dir_fdb, & rrfs_smoke_debug, do_plumerise, plumerisefire_frq, & addsmoke_flag, enh_mix, mix_chem, smoke_dir_fdb_coef, & + do_smoke_transport,smoke_conv_wet_coef, & !--- C3/GF closures ichoice,ichoicem,ichoice_s, & !--- (DFI) time ranges with radar-prescribed microphysics tendencies @@ -4246,10 +4273,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%dust_alpha = dust_alpha Model%dust_gamma = dust_gamma Model%wetdep_ls_alpha = wetdep_ls_alpha + Model%ebb_dcycle = ebb_dcycle Model%seas_opt = seas_opt Model%dust_opt = dust_opt Model%drydep_opt = drydep_opt Model%coarsepm_settling = coarsepm_settling + Model%plume_wind_eff = plume_wind_eff + Model%extended_sd_diags = extended_sd_diags Model%wetdep_ls_opt = wetdep_ls_opt Model%do_plumerise = do_plumerise Model%plumerisefire_frq = plumerisefire_frq @@ -4258,11 +4288,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%aero_ind_fdb = aero_ind_fdb Model%aero_dir_fdb = aero_dir_fdb Model%rrfs_smoke_debug = rrfs_smoke_debug + Model%do_smoke_transport= do_smoke_transport Model%mix_chem = mix_chem Model%enh_mix = enh_mix Model%smoke_dir_fdb_coef = smoke_dir_fdb_coef + Model%smoke_conv_wet_coef = smoke_conv_wet_coef - Model%fire_aux_data_levels = 10 + Model%fire_aux_data_levels = 1 Model%ichoice_s = ichoice_s Model%ichoicem = ichoicem @@ -6375,10 +6407,13 @@ subroutine control_print(Model) print *, 'dust_alpha : ',Model%dust_alpha print *, 'dust_gamma : ',Model%dust_gamma print *, 'wetdep_ls_alpha : ',Model%wetdep_ls_alpha + print *, 'ebb_dcycle : ',Model%ebb_dcycle print *, 'seas_opt : ',Model%seas_opt print *, 'dust_opt : ',Model%dust_opt print *, 'drydep_opt : ',Model%drydep_opt print *, 'coarsepm_settling: ',Model%coarsepm_settling + print *, 'plume_wind_eff : ',Model%plume_wind_eff + print *, 'extended_sd_diags: ',Model%extended_sd_diags print *, 'wetdep_ls_opt : ',Model%wetdep_ls_opt print *, 'do_plumerise : ',Model%do_plumerise print *, 'plumerisefire_frq: ',Model%plumerisefire_frq @@ -6387,9 +6422,11 @@ subroutine control_print(Model) print *, 'aero_ind_fdb : ',Model%aero_ind_fdb print *, 'aero_dir_fdb : ',Model%aero_dir_fdb print *, 'rrfs_smoke_debug : ',Model%rrfs_smoke_debug + print *, 'do_smoke_transport : ',Model%do_smoke_transport print *, 'mix_chem : ',Model%mix_chem print *, 'enh_mix : ',Model%enh_mix print *, 'smoke_dir_fdb_coef : ',Model%smoke_dir_fdb_coef + print *, 'smoke_conv_wet_coef: ',Model%smoke_conv_wet_coef endif print *, ' ' print *, ' lsidea : ', Model%lsidea diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index deea0ad25..0c07dd093 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -921,7 +921,7 @@ standard_name = fengsha_dust12m_input long_name = fengsha dust input units = various - dimensions = (horizontal_dimension,12,5) + dimensions = (horizontal_loop_extent,12,5) type = real kind = kind_phys active = (do_smoke_coupling) @@ -929,7 +929,7 @@ standard_name = anthropogenic_background_input long_name = anthropogenic background input units = various - dimensions = (horizontal_dimension,1) + dimensions = (horizontal_loop_extent,1) type = real kind = kind_phys active = (do_smoke_coupling) @@ -937,7 +937,15 @@ standard_name = emission_smoke_RRFS long_name = emission fire RRFS units = various - dimensions = (horizontal_dimension,24,3) + dimensions = (horizontal_loop_extent,24,2) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[smoke2d_RRFS] + standard_name = emission_smoke_prvd_RRFS + long_name = emission fire RRFS daily + units = various + dimensions = (horizontal_loop_extent,4) type = real kind = kind_phys active = (do_smoke_coupling) @@ -2272,7 +2280,7 @@ type = real kind = kind_phys active = (do_smoke_coupling) -[ebb_smoke_hr] +[ebb_smoke_in] standard_name = surface_smoke_emission long_name = emission of surface smoke units = ug m-2 s-1 @@ -2280,7 +2288,7 @@ type = real kind = kind_phys active = (do_smoke_coupling) -[frp_hr] +[frp_input] standard_name = frp_hourly long_name = hourly fire radiative power units = MW @@ -2288,14 +2296,6 @@ type = real kind = kind_phys active = (do_smoke_coupling) -[frp_std_hr] - standard_name = frp_std_hourly - long_name = hourly stdandard deviation of fire radiative power - units = MW - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys - active = (do_smoke_coupling) [fhist] standard_name = fire_hist long_name = coefficient to scale the fire activity depending on the fire duration @@ -3012,6 +3012,30 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[wetdpc_flux] + standard_name = conv_wet_deposition_smoke_dust + long_name = convective wet removal of smoke and dust + units = kg kg-1 + dimensions = (horizontal_loop_extent,number_of_chemical_species_vertically_mixed) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[wetdpr_flux] + standard_name = mp_wet_deposition_smoke_dust + long_name = large scale wet deposition of smoke and dust + units = kg kg-1 + dimensions = (horizontal_loop_extent,number_of_chemical_species_vertically_mixed) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[drydep_flux] + standard_name = dry_deposition_flux + long_name = rrfs dry deposition flux + units = ug m-2 + dimensions = (horizontal_loop_extent,number_of_chemical_species_deposited) + type = real + kind = kind_phys + active = (do_smoke_coupling) [min_fplume] standard_name = minimum_fire_plume_sigma_pressure_level long_name = minimum model level of fire plumerise @@ -3036,6 +3060,14 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[rrfs_hwp_ave] + standard_name = hourly_wildfire_potential_average + long_name = rrfs hourly fire weather potential average + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) [ushfsfci] standard_name = surface_upward_sensible_heat_flux_for_chemistry_coupling long_name = instantaneous upward sensible heat flux for chemistry coupling @@ -6521,6 +6553,14 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[smoke_conv_wet_coef] + standard_name = smoke_dust_conv_wet_coef + long_name = smoke dust convetive wet scavanging coefficents + units = none + dimensions = (3) + type = real + kind = kind_phys + active = (do_smoke_coupling) [dust_moist_correction] standard_name = dust_moist_correction_fengsha_dust_scheme long_name = moisture correction term for fengsha dust emission @@ -6568,6 +6608,13 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[ebb_dcycle] + standard_name = control_for_diurnal_cycle_of_biomass_burning_emissions + long_name = rrfs smoke diurnal cycle option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) [seas_opt] standard_name = control_for_smoke_sea_salt long_name = rrfs smoke sea salt emission option @@ -6590,12 +6637,26 @@ type = integer active = (do_smoke_coupling) [coarsepm_settling] - standard_name = control_for_smoke_coarsepm_settling + standard_name = control_for_smoke_pm_settling long_name = rrfs smoke coarsepm settling option units = index dimensions = () type = integer active = (do_smoke_coupling) +[plume_wind_eff] + standard_name = option_for_wind_effects_on_smoke_plumerise + long_name = wind effect plumerise option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) +[extended_sd_diags] + standard_name = flag_for_extended_smoke_dust_diagnostics + long_name = flag for extended smoke dust diagnostics + units = flag + dimensions = () + type = logical + active = (do_smoke_coupling) [wetdep_ls_opt] standard_name = control_for_smoke_wet_deposition long_name = rrfs smoke large scale wet deposition option @@ -6652,6 +6713,13 @@ dimensions = () type = logical active = (do_smoke_coupling) +[do_smoke_transport] + standard_name = do_smoke_conv_transport + long_name = flag for rrfs smoke convective transport + units = flag + dimensions = () + type = logical + active = (do_smoke_coupling) [ncnvcld3d] standard_name = number_of_convective_cloud_variables_in_xyz_dimensioned_restart_array long_name = number of convective 3d clouds fields diff --git a/ccpp/driver/GFS_diagnostics.F90 b/ccpp/driver/GFS_diagnostics.F90 index f7f6d0caf..3bbd300d5 100644 --- a/ccpp/driver/GFS_diagnostics.F90 +++ b/ccpp/driver/GFS_diagnostics.F90 @@ -4658,82 +4658,92 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop do nb = 1,nblks ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%rrfs_hwp enddo - idx = idx + 1 ExtDiag(idx)%axes = 2 - ExtDiag(idx)%name = 'ebb_smoke_hr' - ExtDiag(idx)%desc = 'hourly smoke emission' - ExtDiag(idx)%unit = 'ug m-2 s-1' + ExtDiag(idx)%name = 'HWP_ave' + ExtDiag(idx)%desc = 'averaged fire weather potential' + ExtDiag(idx)%unit = ' ' ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%ebb_smoke_hr + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%rrfs_hwp_ave enddo idx = idx + 1 ExtDiag(idx)%axes = 2 - ExtDiag(idx)%name = 'fhist' - ExtDiag(idx)%desc = 'coefficient to scale the fire activity depending on the fire duration' + ExtDiag(idx)%name = 'wetdpc_smoke' + ExtDiag(idx)%desc = 'convective wet deposition smoke' ExtDiag(idx)%unit = ' ' ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%ebb_smoke_hr + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%wetdpc_flux(:,1) enddo idx = idx + 1 ExtDiag(idx)%axes = 2 - ExtDiag(idx)%name = 'frp_hr' - ExtDiag(idx)%desc = 'hourly frp' - ExtDiag(idx)%unit = 'mw' + ExtDiag(idx)%name = 'wetdpc_dust' + ExtDiag(idx)%desc = 'convective wet deposition dust' + ExtDiag(idx)%unit = ' ' ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%frp_hr + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%wetdpc_flux(:,2) enddo idx = idx + 1 ExtDiag(idx)%axes = 2 - ExtDiag(idx)%name = 'frp_std_hr' - ExtDiag(idx)%desc = 'hourly std frp' - ExtDiag(idx)%unit = 'mw' + ExtDiag(idx)%name = 'wetdpc_coarsepm' + ExtDiag(idx)%desc = 'convective wet deposition coarsepm' + ExtDiag(idx)%unit = ' ' ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%frp_std_hr + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%wetdpc_flux(:,3) enddo idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'ebu_smoke' - ExtDiag(idx)%desc = 'smoke emission' - ExtDiag(idx)%unit = 'ug/m2/s' - ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'ebb_smoke_in' + ExtDiag(idx)%desc = 'input smoke emission' + ExtDiag(idx)%unit = 'ug m-2 s-1' + ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%ebu_smoke(:,:) + ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%ebb_smoke_in enddo idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'smoke_ext' - ExtDiag(idx)%desc = 'smoke extinction at 550nm' + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'fhist' + ExtDiag(idx)%desc = 'coefficient to scale the fire activity depending on the fire duration' ExtDiag(idx)%unit = ' ' - ExtDiag(idx)%mod_name = 'gfs_phys' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%fhist + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'frp_input' + ExtDiag(idx)%desc = 'input frp' + ExtDiag(idx)%unit = 'mw' + ExtDiag(idx)%mod_name = 'gfs_sfc' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%smoke_ext(:,:) + ExtDiag(idx)%data(nb)%var2 => Sfcprop(nb)%frp_input enddo idx = idx + 1 ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dust_ext' - ExtDiag(idx)%desc = 'dust extinction at 550nm' - ExtDiag(idx)%unit = ' ' + ExtDiag(idx)%name = 'ebu_smoke' + ExtDiag(idx)%desc = 'smoke emission' + ExtDiag(idx)%unit = 'ug/m2/s' ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%dust_ext(:,:) + ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%ebu_smoke(:,:) enddo idx = idx + 1 diff --git a/ccpp/physics b/ccpp/physics index 0cdfc9d74..df9e1ad0f 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 0cdfc9d7465358debb4de292861fef970b44874a +Subproject commit df9e1ad0f9dcafe58eb5ccd505046f965a6042bc diff --git a/io/fv3atm_restart_io.F90 b/io/fv3atm_restart_io.F90 index 39d2131b9..d32be0586 100644 --- a/io/fv3atm_restart_io.F90 +++ b/io/fv3atm_restart_io.F90 @@ -593,7 +593,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta if (.not.amiopen) call mpp_error( FATAL, 'Error with opening file'//trim(infile) ) ! Register axes and variables, allocate memory - call rrfs_sd_emis%register_fire(rrfssd_restart, Atm_block) + call rrfs_sd_emis%register_fire(Model, rrfssd_restart, Atm_block) !--- read new GSL created rrfssd restart/data call mpp_error(NOTE,'reading rrfssd information from INPUT/SMOKE_RRFS_data.nc') @@ -601,7 +601,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta call close_file(rrfssd_restart) !--- Copy to Sfcprop and free temporary arrays: - call rrfs_sd_emis%copy_fire(Sfcprop, Atm_block) + call rrfs_sd_emis%copy_fire(Model, Sfcprop, Atm_block) endif if_smoke ! RRFS_SD diff --git a/io/fv3atm_rrfs_sd_io.F90 b/io/fv3atm_rrfs_sd_io.F90 index 780153208..93e2981c7 100644 --- a/io/fv3atm_rrfs_sd_io.F90 +++ b/io/fv3atm_rrfs_sd_io.F90 @@ -62,15 +62,18 @@ module fv3atm_rrfs_sd_io type rrfs_sd_emissions_type integer, private :: nvar_dust12m = 5 integer, private :: nvar_emi = 1 - integer, private :: nvar_fire = 3 + integer, private :: nvar_fire = 2 + integer, private :: nvar_fire2d = 4 character(len=32), pointer, dimension(:), private :: dust12m_name => null() character(len=32), pointer, dimension(:), private :: emi_name => null() character(len=32), pointer, dimension(:), private :: fire_name => null() + character(len=32), pointer, dimension(:), private :: fire_name2d => null() real(kind=kind_phys), pointer, dimension(:,:,:,:), private :: dust12m_var => null() real(kind=kind_phys), pointer, dimension(:,:,:,:), private :: emi_var => null() real(kind=kind_phys), pointer, dimension(:,:,:,:), private :: fire_var => null() + real(kind=kind_phys), pointer, dimension(:,:,: ), private :: fire_var2d => null() contains @@ -520,70 +523,116 @@ end subroutine rrfs_sd_emissions_copy_emi ! -------------------------------------------------------------------- !>@ Allocates temporary arrays and registers variables for reading the fire data file. - subroutine rrfs_sd_emissions_register_fire(data, restart, Atm_block) + subroutine rrfs_sd_emissions_register_fire(data, Model, restart, Atm_block) implicit none class(rrfs_sd_emissions_type) :: data + type(GFS_control_type), intent(in) :: Model type(FmsNetcdfDomainFile_t) :: restart type(block_control_type), intent(in) :: Atm_block + real(kind=kind_phys), pointer, dimension(:,:) :: var_p2 => NULL() real(kind=kind_phys), pointer, dimension(:,:,:) :: var3_p2 => NULL() integer :: num, nx, ny + integer :: ebb_dcycle + + ebb_dcycle=Model%ebb_dcycle if(associated(data%fire_name)) then deallocate(data%fire_name) nullify(data%fire_name) endif + if(associated(data%fire_name2d)) then + deallocate(data%fire_name2d) + nullify(data%fire_name2d) + endif + if(associated(data%fire_var)) then deallocate(data%fire_var) nullify(data%fire_var) endif + if(associated(data%fire_var2d)) then + deallocate(data%fire_var2d) + nullify(data%fire_var2d) + endif + !--- allocate the various containers needed for rrfssd fire data call get_nx_ny_from_atm(Atm_block, nx, ny) allocate(data%fire_name(data%nvar_fire)) + allocate(data%fire_name2d(data%nvar_fire2d)) allocate(data%fire_var(nx,ny,24,data%nvar_fire)) + allocate(data%fire_var2d(nx,ny,data%nvar_fire2d)) - data%fire_name(1) = 'ebb_smoke_hr' - data%fire_name(2) = 'frp_avg_hr' - data%fire_name(3) = 'frp_std_hr' + data%fire_name(1) = 'ebb_smoke_hr' ! 2d x 24 hours + data%fire_name(2) = 'frp_avg_hr' ! 2d x 24 hours + + ! For the operational system + data%fire_name2d(1) = 'ebb_rate' ! 2d + data%fire_name2d(2) = 'frp_davg' + data%fire_name2d(3) = 'fire_end_hr' + data%fire_name2d(4) = 'hwp_davg' !--- register axis call register_axis(restart, 'lon', 'X') call register_axis(restart, 'lat', 'Y') - call register_axis(restart, 't', 24) - !--- register the 3D fields - do num = 1,data%nvar_fire + if (ebb_dcycle==1) then ! -- retro mode + !--- register the 3D fields + call register_axis(restart, 't', 24) + do num = 1,data%nvar_fire var3_p2 => data%fire_var(:,:,:,num) call register_restart_field(restart, data%fire_name(num), var3_p2, & dimensions=(/'t ', 'lat', 'lon'/), is_optional=.true.) - enddo + enddo + elseif (ebb_dcycle==2) then ! -- forecast mode + !--- register the 2D fields + call register_axis(restart, 't', 1) + do num = 1,data%nvar_fire2d + var_p2 => data%fire_var2d(:,:,num) + call register_restart_field(restart, data%fire_name2d(num), var_p2, & + dimensions=(/'lat', 'lon'/), is_optional=.true.) + enddo + else + ! -- user define their own fire emission + endif end subroutine rrfs_sd_emissions_register_fire ! -------------------------------------------------------------------- !>@ Called after register_fire() to copy data from internal arrays to the model grid and deallocate arrays - subroutine rrfs_sd_emissions_copy_fire(data, Sfcprop, Atm_block) + subroutine rrfs_sd_emissions_copy_fire(data, Model, Sfcprop, Atm_block) implicit none class(rrfs_sd_emissions_type) :: data + type(GFS_control_type), intent(in) :: Model type(GFS_sfcprop_type), intent(inout) :: Sfcprop(:) type(block_control_type), intent(in) :: Atm_block integer :: nb, ix, k, i, j + integer :: ebb_dcycle + + ebb_dcycle=Model%ebb_dcycle !$omp parallel do default(shared) private(i, j, nb, ix, k) do nb = 1, Atm_block%nblks - !--- 3D variables do ix = 1, Atm_block%blksz(nb) i = Atm_block%index(nb)%ii(ix) - Atm_block%isc + 1 j = Atm_block%index(nb)%jj(ix) - Atm_block%jsc + 1 - !--- assign hprime(1:10) and hprime(15:24) with new oro stat data - do k = 1, 24 + if (ebb_dcycle==1) then ! -- retro mode + !--- 3D variables + do k = 1, 24 Sfcprop(nb)%smoke_RRFS(ix,k,1) = data%fire_var(i,j,k,1) Sfcprop(nb)%smoke_RRFS(ix,k,2) = data%fire_var(i,j,k,2) - Sfcprop(nb)%smoke_RRFS(ix,k,3) = data%fire_var(i,j,k,3) - enddo + enddo + elseif (ebb_dcycle==2) then ! -- forecast mode + !--- 2D variables + Sfcprop(nb)%smoke2d_RRFS(ix,1) = data%fire_var2d(i,j,1) + Sfcprop(nb)%smoke2d_RRFS(ix,2) = data%fire_var2d(i,j,2) + Sfcprop(nb)%smoke2d_RRFS(ix,3) = data%fire_var2d(i,j,3) + Sfcprop(nb)%smoke2d_RRFS(ix,4) = data%fire_var2d(i,j,4) + else + ! -- user define their own fire emission + endif enddo enddo end subroutine rrfs_sd_emissions_copy_fire From 997907fe89b18fcc53405cf6722942810bf09eed Mon Sep 17 00:00:00 2001 From: Dustin Swales Date: Wed, 3 Jan 2024 14:19:16 -0700 Subject: [PATCH 6/8] Reorganization of ccpp-physics repository (#733) * Metafile cleanup * Move rte-rrtmgp submodule * More metadata fixes --- ccpp/config/ccpp_prebuild_config.py | 268 +++++++++--------- ccpp/data/CCPP_typedefs.meta | 7 +- ccpp/data/GFS_typedefs.meta | 8 +- ccpp/physics | 2 +- ...suite_FV3_GFS_v15_thompson_mynn_lam3km.xml | 1 - ccpp/suites/suite_FV3_GFS_v15p2.xml | 1 - ccpp/suites/suite_FV3_GFS_v16.xml | 1 - ccpp/suites/suite_FV3_GFS_v16_csawmg.xml | 1 - ccpp/suites/suite_FV3_GFS_v16_flake.xml | 1 - ccpp/suites/suite_FV3_GFS_v16_fv3wam.xml | 1 - ccpp/suites/suite_FV3_GFS_v16_ras.xml | 1 - ccpp/suites/suite_FV3_GFS_v17_coupled_p8.xml | 1 - .../suite_FV3_GFS_v17_coupled_p8_c3.xml | 1 - .../suite_FV3_GFS_v17_coupled_p8_sfcocn.xml | 1 - .../suite_FV3_GFS_v17_coupled_p8_ugwpv1.xml | 1 - ccpp/suites/suite_FV3_GFS_v17_p8.xml | 1 - ccpp/suites/suite_FV3_GFS_v17_p8_c3.xml | 1 - ccpp/suites/suite_FV3_GFS_v17_p8_mynn.xml | 1 - ccpp/suites/suite_FV3_GFS_v17_p8_ugwpv1.xml | 1 - .../suites/suite_FV3_HAFS_v1_gfdlmp_tedmf.xml | 1 - .../suite_FV3_HAFS_v1_gfdlmp_tedmf_nonsst.xml | 1 - ...uite_FV3_HAFS_v1_thompson_tedmf_gfdlsf.xml | 1 - ccpp/suites/suite_FV3_HRRR.xml | 1 - ccpp/suites/suite_FV3_HRRR_c3.xml | 1 - ccpp/suites/suite_FV3_HRRR_gf.xml | 1 - ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml | 1 - ccpp/suites/suite_FV3_RAP.xml | 1 - ccpp/suites/suite_FV3_RAP_cires_ugwp.xml | 1 - ccpp/suites/suite_FV3_RAP_clm_lake.xml | 1 - ccpp/suites/suite_FV3_RAP_flake.xml | 1 - ccpp/suites/suite_FV3_RAP_noah.xml | 1 - .../suite_FV3_RAP_noah_sfcdiff_cires_ugwp.xml | 1 - ccpp/suites/suite_FV3_RAP_sfcdiff.xml | 1 - ccpp/suites/suite_FV3_RAP_unified_ugwp.xml | 1 - ccpp/suites/suite_FV3_RRFS_v1beta.xml | 1 - ccpp/suites/suite_FV3_RRFS_v1nssl.xml | 1 - ccpp/suites/suite_FV3_WoFS_v0.xml | 1 - ccpp/suites/suite_FV3_global_nest_v1.xml | 1 - ccpp/suites/suite_RRFSens_phy1.xml | 1 - ccpp/suites/suite_RRFSens_phy2.xml | 1 - ccpp/suites/suite_RRFSens_phy3.xml | 1 - ccpp/suites/suite_RRFSens_phy4.xml | 1 - ccpp/suites/suite_RRFSens_phy5.xml | 1 - 43 files changed, 140 insertions(+), 184 deletions(-) diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py index 268eb2166..1ed2c6245 100755 --- a/ccpp/config/ccpp_prebuild_config.py +++ b/ccpp/config/ccpp_prebuild_config.py @@ -16,12 +16,11 @@ VARIABLE_DEFINITION_FILES = [ # actual variable definition files 'framework/src/ccpp_types.F90', - 'physics/physics/machine.F', - 'physics/physics/radsw_param.f', - 'physics/physics/radlw_param.f', - 'physics/physics/h2o_def.f', - 'physics/physics/radiation_surface.f', - 'physics/physics/module_ozphys.F90', + 'physics/physics/hooks/machine.F', + 'physics/physics/Radiation/RRTMG/radsw_param.f', + 'physics/physics/Radiation/RRTMG/radlw_param.f', + 'physics/physics/photochem/h2o_def.f', + 'physics/physics/photochem/module_ozphys.F90', 'data/CCPP_typedefs.F90', 'data/GFS_typedefs.F90', 'data/CCPP_data.F90', @@ -74,138 +73,135 @@ # Relative path to source (from where ccpp_prebuild.py is called) : [ list of physics sets in which scheme may be called ]; # current restrictions are that each scheme can only belong to one physics set, and all schemes within one group in the # suite definition file have to belong to the same physics set - 'physics/physics/GFS_DCNV_generic_pre.F90', - 'physics/physics/GFS_DCNV_generic_post.F90', - 'physics/physics/GFS_GWD_generic_pre.F90', - 'physics/physics/GFS_GWD_generic_post.F90', - 'physics/physics/GFS_MP_generic_pre.F90', - 'physics/physics/GFS_MP_generic_post.F90', - 'physics/physics/GFS_PBL_generic_pre.F90', - 'physics/physics/GFS_PBL_generic_post.F90', - 'physics/physics/GFS_SCNV_generic_pre.F90', - 'physics/physics/GFS_SCNV_generic_post.F90', - 'physics/physics/GFS_debug.F90', - 'physics/physics/GFS_phys_time_vary.fv3.F90', - 'physics/physics/GFS_rad_time_vary.fv3.F90', - 'physics/physics/GFS_radiation_surface.F90', - 'physics/physics/GFS_rrtmg_post.F90', - 'physics/physics/GFS_rrtmg_pre.F90', - 'physics/physics/GFS_rrtmg_setup.F90', - 'physics/physics/GFS_stochastics.F90', - 'physics/physics/GFS_suite_interstitial_rad_reset.F90', - 'physics/physics/GFS_suite_interstitial_phys_reset.F90', - 'physics/physics/GFS_suite_interstitial_1.F90', - 'physics/physics/GFS_suite_interstitial_2.F90', - 'physics/physics/GFS_suite_stateout_reset.F90', - 'physics/physics/GFS_suite_stateout_update.F90', - 'physics/physics/GFS_suite_interstitial_3.F90', - 'physics/physics/GFS_suite_interstitial_4.F90', - 'physics/physics/GFS_suite_interstitial_5.F90', - 'physics/physics/GFS_surface_generic_pre.F90', - 'physics/physics/GFS_surface_generic_post.F90', - 'physics/physics/GFS_surface_composites_pre.F90', - 'physics/physics/GFS_surface_composites_inter.F90', - 'physics/physics/GFS_surface_composites_post.F90', - 'physics/physics/GFS_surface_loop_control_part1.F90', - 'physics/physics/GFS_surface_loop_control_part2.F90', - 'physics/physics/GFS_time_vary_pre.fv3.F90', - 'physics/physics/GFS_physics_post.F90', - 'physics/physics/cires_ugwp.F90', - 'physics/physics/cires_ugwp_post.F90', - 'physics/physics/unified_ugwp.F90', - 'physics/physics/unified_ugwp_post.F90', - 'physics/physics/ugwpv1_gsldrag.F90', - 'physics/physics/ugwpv1_gsldrag_post.F90', - 'physics/physics/cnvc90.f', - 'physics/physics/cs_conv_pre.F90', - 'physics/physics/cs_conv.F90', - 'physics/physics/cs_conv_post.F90', - 'physics/physics/cs_conv_aw_adj.F90', - 'physics/physics/cu_ntiedtke_pre.F90', - 'physics/physics/cu_ntiedtke.F90', - 'physics/physics/cu_ntiedtke_post.F90', - 'physics/physics/dcyc2t3.f', - 'physics/physics/drag_suite.F90', - 'physics/physics/shoc.F90', - 'physics/physics/get_prs_fv3.F90', - 'physics/physics/get_phi_fv3.F90', - 'physics/physics/gfdl_cloud_microphys.F90', - 'physics/physics/fv_sat_adj.F90', - 'physics/physics/gfdl_sfc_layer.F90', - 'physics/physics/zhaocarr_gscond.f', - 'physics/physics/gwdc_pre.f', - 'physics/physics/gwdc.f', - 'physics/physics/gwdc_post.f', - 'physics/physics/gwdps.f', - 'physics/physics/h2ophys.f', - 'physics/physics/samfdeepcnv.f', - 'physics/physics/samfshalcnv.f', - 'physics/physics/sascnvn.F', - 'physics/physics/shalcnv.F', - 'physics/physics/maximum_hourly_diagnostics.F90', - 'physics/physics/m_micro.F90', - 'physics/physics/m_micro_pre.F90', - 'physics/physics/m_micro_post.F90', - 'physics/physics/cu_gf_driver_pre.F90', - 'physics/physics/cu_gf_driver.F90', - 'physics/physics/cu_gf_driver_post.F90', - 'physics/physics/cu_c3_driver_pre.F90', - 'physics/physics/cu_c3_driver.F90', - 'physics/physics/cu_c3_driver_post.F90', - 'physics/physics/hedmf.f', - 'physics/physics/moninshoc.f', - 'physics/physics/satmedmfvdif.F', - 'physics/physics/satmedmfvdifq.F', - 'physics/physics/shinhongvdif.F90', - 'physics/physics/ysuvdif.F90', - 'physics/physics/mynnedmf_wrapper.F90', - 'physics/physics/mynnsfc_wrapper.F90', - 'physics/physics/sgscloud_radpre.F90', - 'physics/physics/sgscloud_radpost.F90', - 'physics/physics/myjsfc_wrapper.F90', - 'physics/physics/myjpbl_wrapper.F90', - 'physics/physics/mp_thompson_pre.F90', - 'physics/physics/mp_thompson.F90', - 'physics/physics/mp_thompson_post.F90', - 'physics/physics/mp_nssl.F90', - 'physics/physics/zhaocarr_precpd.f', - 'physics/physics/radlw_main.F90', - 'physics/physics/radsw_main.F90', - 'physics/physics/rascnv.F90', - 'physics/physics/rayleigh_damp.f', - 'physics/physics/rrtmg_lw_post.F90', - 'physics/physics/rrtmg_lw_pre.F90', - 'physics/physics/rrtmg_sw_post.F90', - 'physics/physics/rad_sw_pre.F90', - 'physics/physics/sfc_diag.f', - 'physics/physics/sfc_diag_post.F90', - 'physics/physics/lsm_ruc.F90', - 'physics/physics/sfc_cice.f', - 'physics/physics/sfc_diff.f', - 'physics/physics/lsm_noah.f', - 'physics/physics/noahmpdrv.F90', - 'physics/physics/flake_driver.F90', - 'physics/physics/clm_lake.f90', - 'physics/physics/sfc_nst_pre.f90', - 'physics/physics/sfc_nst.f90', - 'physics/physics/sfc_nst_post.f90', - 'physics/physics/sfc_ocean.F', - 'physics/physics/sfc_sice.f', - # HAFS FER_HIRES - 'physics/physics/mp_fer_hires.F90', - # SMOKE + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_DCNV_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_DCNV_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_GWD_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_GWD_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_MP_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_MP_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_PBL_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_PBL_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_SCNV_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_SCNV_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_debug.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_phys_time_vary.fv3.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rad_time_vary.fv3.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_radiation_surface.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmg_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmg_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmg_setup.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_setup.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_cloud_diagnostics.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_cloud_mp.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_cloud_overlap.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_stochastics.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_rad_reset.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_phys_reset.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_1.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_2.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_stateout_reset.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_stateout_update.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_3.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_4.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_suite_interstitial_5.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_generic_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_generic_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_composites_pre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_composites_inter.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_composites_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_loop_control_part1.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_surface_loop_control_part2.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_time_vary_pre.fv3.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/cnvc90.f', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/dcyc2t3.f', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/maximum_hourly_diagnostics.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/GFS_physics_post.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/sgscloud_radpre.F90', + 'physics/physics/Interstitials/UFS_SCM_NEPTUNE/sgscloud_radpost.F90', + 'physics/physics/CONV/Chikira_Sugiyama/cs_conv_pre.F90', + 'physics/physics/CONV/Chikira_Sugiyama/cs_conv.F90', + 'physics/physics/CONV/Chikira_Sugiyama/cs_conv_post.F90', + 'physics/physics/CONV/Chikira_Sugiyama/cs_conv_aw_adj.F90', + 'physics/physics/CONV/nTiedtke/cu_ntiedtke_pre.F90', + 'physics/physics/CONV/nTiedtke/cu_ntiedtke.F90', + 'physics/physics/CONV/nTiedtke/cu_ntiedtke_post.F90', + 'physics/physics/CONV/SAMF/samfdeepcnv.f', + 'physics/physics/CONV/SAMF/samfshalcnv.f', + 'physics/physics/CONV/SAS/sascnvn.F', + 'physics/physics/CONV/SAS/shalcnv.F', + 'physics/physics/CONV/Grell_Freitas/cu_gf_driver_pre.F90', + 'physics/physics/CONV/Grell_Freitas/cu_gf_driver.F90', + 'physics/physics/CONV/Grell_Freitas/cu_gf_driver_post.F90', + 'physics/physics/CONV/C3/cu_c3_driver_pre.F90', + 'physics/physics/CONV/C3/cu_c3_driver.F90', + 'physics/physics/CONV/C3/cu_c3_driver_post.F90', + 'physics/physics/CONV/RAS/rascnv.F90', + 'physics/physics/GWD/cires_ugwp.F90', + 'physics/physics/GWD/cires_ugwp_post.F90', + 'physics/physics/GWD/unified_ugwp.F90', + 'physics/physics/GWD/unified_ugwp_post.F90', + 'physics/physics/GWD/ugwpv1_gsldrag.F90', + 'physics/physics/GWD/ugwpv1_gsldrag_post.F90', + 'physics/physics/GWD/drag_suite.F90', + 'physics/physics/GWD/gwdc_pre.f', + 'physics/physics/GWD/gwdc.f', + 'physics/physics/GWD/gwdc_post.f', + 'physics/physics/GWD/gwdps.f', + 'physics/physics/GWD/rayleigh_damp.f', + 'physics/physics/photochem/h2ophys.f', + 'physics/physics/photochem/module_ozphys.F90', + 'physics/physics/MP/Ferrier_Aligo/mp_fer_hires.F90', + 'physics/physics/MP/GFDL/gfdl_cloud_microphys.F90', + 'physics/physics/MP/GFDL/fv_sat_adj.F90', + 'physics/physics/MP/Morrison_Gettelman/m_micro.F90', + 'physics/physics/MP/Morrison_Gettelman/m_micro_pre.F90', + 'physics/physics/MP/Morrison_Gettelman/m_micro_post.F90', + 'physics/physics/MP/NSSL/mp_nssl.F90', + 'physics/physics/MP/Thompson/mp_thompson_pre.F90', + 'physics/physics/MP/Thompson/mp_thompson.F90', + 'physics/physics/MP/Thompson/mp_thompson_post.F90', + 'physics/physics/MP/Zhao_Carr/zhaocarr_gscond.f', + 'physics/physics/MP/Zhao_Carr/zhaocarr_precpd.f', + 'physics/physics/PBL/HEDMF/hedmf.f', + 'physics/physics/PBL/SHOC/moninshoc.f', + 'physics/physics/PBL/SHOC/shoc.F90', + 'physics/physics/PBL/MYJ/myjpbl_wrapper.F90', + 'physics/physics/PBL/MYNN_EDMF/mynnedmf_wrapper.F90', + 'physics/physics/PBL/SATMEDMF/satmedmfvdif.F', + 'physics/physics/PBL/SATMEDMF/satmedmfvdifq.F', + 'physics/physics/PBL/YSU/ysuvdif.F90', + 'physics/physics/PBL/saYSU/shinhongvdif.F90', + 'physics/physics/Radiation/RRTMG/radsw_main.F90', + 'physics/physics/Radiation/RRTMG/radlw_main.F90', + 'physics/physics/Radiation/RRTMG/rrtmg_lw_post.F90', + 'physics/physics/Radiation/RRTMG/rrtmg_sw_post.F90', + 'physics/physics/Radiation/RRTMG/rad_sw_pre.F90', + 'physics/physics/Radiation/RRTMGP/rrtmgp_aerosol_optics.F90', + 'physics/physics/Radiation/RRTMGP/rrtmgp_lw_main.F90', + 'physics/physics/Radiation/RRTMGP/rrtmgp_sw_main.F90', + 'physics/physics/SFC_Layer/GFDL/gfdl_sfc_layer.F90', + 'physics/physics/SFC_Layer/MYNN/mynnsfc_wrapper.F90', + 'physics/physics/SFC_Layer/MYJ/myjsfc_wrapper.F90', + 'physics/physics/SFC_Layer/UFS/sfc_diag.f', + 'physics/physics/SFC_Layer/UFS/sfc_diag_post.F90', + 'physics/physics/SFC_Layer/UFS/sfc_diff.f', + 'physics/physics/SFC_Layer/UFS/sfc_nst_pre.f90', + 'physics/physics/SFC_Layer/UFS/sfc_nst.f90', + 'physics/physics/SFC_Layer/UFS/sfc_nst_post.f90', + 'physics/physics/SFC_Models/Land/RUC/lsm_ruc.F90', + 'physics/physics/SFC_Models/SeaIce/CICE/sfc_cice.f', + 'physics/physics/SFC_Models/Land/Noah/lsm_noah.f', + 'physics/physics/SFC_Models/Land/Noahmp/noahmpdrv.F90', + 'physics/physics/SFC_Models/Lake/Flake/flake_driver.F90', + 'physics/physics/SFC_Models/Lake/CLM/clm_lake.f90', + 'physics/physics/SFC_Models/Ocean/UFS/sfc_ocean.F', + 'physics/physics/SFC_Models/SeaIce/CICE/sfc_sice.f', 'physics/physics/smoke_dust/rrfs_smoke_wrapper.F90', 'physics/physics/smoke_dust/rrfs_smoke_postpbl.F90', - # RRTMGP - 'physics/physics/rrtmgp_aerosol_optics.F90', - 'physics/physics/rrtmgp_lw_main.F90', - 'physics/physics/rrtmgp_sw_main.F90', - 'physics/physics/GFS_rrtmgp_setup.F90', - 'physics/physics/GFS_rrtmgp_pre.F90', - 'physics/physics/GFS_cloud_diagnostics.F90', - 'physics/physics/GFS_rrtmgp_cloud_mp.F90', - 'physics/physics/GFS_rrtmgp_cloud_overlap.F90', - 'physics/physics/GFS_rrtmgp_post.F90' + 'physics/physics/tools/get_prs_fv3.F90', + 'physics/physics/tools/get_phi_fv3.F90' ] # Default build dir, relative to current working directory, diff --git a/ccpp/data/CCPP_typedefs.meta b/ccpp/data/CCPP_typedefs.meta index 428970f2d..a2d1105df 100644 --- a/ccpp/data/CCPP_typedefs.meta +++ b/ccpp/data/CCPP_typedefs.meta @@ -3193,11 +3193,8 @@ name = CCPP_typedefs type = module relative_path = ../physics/physics - dependencies = machine.F,radlw_param.f,radsw_param.f - dependencies = rte-rrtmgp/rrtmgp/mo_gas_optics_rrtmgp.F90,rte-rrtmgp/rte/mo_optical_props.F90 - dependencies = rte-rrtmgp/extensions/cloud_optics/mo_cloud_optics.F90 - dependencies = rte-rrtmgp/rrtmgp/mo_gas_concentrations.F90,rte-rrtmgp/rte/mo_rte_config.F90 - dependencies = rte-rrtmgp/rte/mo_source_functions.F90 + dependencies = hooks/machine.F,photochem/module_ozphys.F90 + dependencies = Radiation/RRTMG/radlw_param.f,Radiation/RRTMG/radsw_param.f [ccpp-arg-table] name = CCPP_typedefs diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index 0c07dd093..ebaa9af7f 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -9863,9 +9863,11 @@ [ccpp-table-properties] name = GFS_typedefs type = module - relative_path = ../physics/physics - dependencies = machine.F,physcons.F90,radlw_param.f,radsw_param.f - dependencies = GFDL_parse_tracers.F90,h2o_def.f,module_ozphys.F90 + relative_path = ../physics/physics/ + dependencies = hooks/machine.F,hooks/physcons.F90 + dependencies = Radiation/RRTMG/radlw_param.f,Radiation/RRTMG/radsw_param.f + dependencies = photochem/h2o_def.f,photochem/module_ozphys.F90 + dependencies = MP/GFDL/GFDL_parse_tracers.F90 [ccpp-arg-table] name = GFS_typedefs diff --git a/ccpp/physics b/ccpp/physics index df9e1ad0f..53062d634 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit df9e1ad0f9dcafe58eb5ccd505046f965a6042bc +Subproject commit 53062d634c77deb774ce5abc3813f1583292eec9 diff --git a/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml b/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml index 7886743e3..922f7f305 100644 --- a/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml +++ b/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_GFS_v15p2.xml b/ccpp/suites/suite_FV3_GFS_v15p2.xml index 7b2eaac1b..c164a1c7e 100644 --- a/ccpp/suites/suite_FV3_GFS_v15p2.xml +++ b/ccpp/suites/suite_FV3_GFS_v15p2.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v16.xml b/ccpp/suites/suite_FV3_GFS_v16.xml index e6ae5483f..bc5540ce1 100644 --- a/ccpp/suites/suite_FV3_GFS_v16.xml +++ b/ccpp/suites/suite_FV3_GFS_v16.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml b/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml index 3c41ef08d..3f972d784 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v16_flake.xml b/ccpp/suites/suite_FV3_GFS_v16_flake.xml index a99756c30..4f09779a2 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_flake.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_flake.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v16_fv3wam.xml b/ccpp/suites/suite_FV3_GFS_v16_fv3wam.xml index e540edc52..4de8927b1 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_fv3wam.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_fv3wam.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v16_ras.xml b/ccpp/suites/suite_FV3_GFS_v16_ras.xml index 31e1d29f3..d27a4887c 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_ras.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_ras.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8.xml b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8.xml index 00675097a..53007131f 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_c3.xml b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_c3.xml index 7daa7495a..64200955b 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_c3.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_c3.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_sfcocn.xml b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_sfcocn.xml index b137ed9a8..8b495a18f 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_sfcocn.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_sfcocn.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_ugwpv1.xml b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_ugwpv1.xml index 5b316a735..b63190e65 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_ugwpv1.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_coupled_p8_ugwpv1.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_p8.xml b/ccpp/suites/suite_FV3_GFS_v17_p8.xml index 37ce4d90c..4fa6c222d 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_p8.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_p8.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_p8_c3.xml b/ccpp/suites/suite_FV3_GFS_v17_p8_c3.xml index dd79992ce..e9257a7f3 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_p8_c3.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_p8_c3.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_p8_mynn.xml b/ccpp/suites/suite_FV3_GFS_v17_p8_mynn.xml index a5b2b3291..fb7672ac3 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_p8_mynn.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_p8_mynn.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_GFS_v17_p8_ugwpv1.xml b/ccpp/suites/suite_FV3_GFS_v17_p8_ugwpv1.xml index 0d001fc45..2a5034035 100644 --- a/ccpp/suites/suite_FV3_GFS_v17_p8_ugwpv1.xml +++ b/ccpp/suites/suite_FV3_GFS_v17_p8_ugwpv1.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf.xml b/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf.xml index e6673d7a6..0a08ee576 100644 --- a/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf.xml +++ b/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf_nonsst.xml b/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf_nonsst.xml index de25bd871..3fc78efad 100644 --- a/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf_nonsst.xml +++ b/ccpp/suites/suite_FV3_HAFS_v1_gfdlmp_tedmf_nonsst.xml @@ -23,7 +23,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_HAFS_v1_thompson_tedmf_gfdlsf.xml b/ccpp/suites/suite_FV3_HAFS_v1_thompson_tedmf_gfdlsf.xml index 7231ed9ac..70018e7cc 100644 --- a/ccpp/suites/suite_FV3_HAFS_v1_thompson_tedmf_gfdlsf.xml +++ b/ccpp/suites/suite_FV3_HAFS_v1_thompson_tedmf_gfdlsf.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_FV3_HRRR.xml b/ccpp/suites/suite_FV3_HRRR.xml index 56360ab5d..2177dc078 100644 --- a/ccpp/suites/suite_FV3_HRRR.xml +++ b/ccpp/suites/suite_FV3_HRRR.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_HRRR_c3.xml b/ccpp/suites/suite_FV3_HRRR_c3.xml index 95a426de8..e3ad50a8a 100644 --- a/ccpp/suites/suite_FV3_HRRR_c3.xml +++ b/ccpp/suites/suite_FV3_HRRR_c3.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_HRRR_gf.xml b/ccpp/suites/suite_FV3_HRRR_gf.xml index 8694976ac..48260ce9f 100644 --- a/ccpp/suites/suite_FV3_HRRR_gf.xml +++ b/ccpp/suites/suite_FV3_HRRR_gf.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml b/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml index 3e4b862c9..0f0022d1c 100644 --- a/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml +++ b/ccpp/suites/suite_FV3_HRRR_gf_nogwd.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP.xml b/ccpp/suites/suite_FV3_RAP.xml index a24476213..b5a2117f6 100644 --- a/ccpp/suites/suite_FV3_RAP.xml +++ b/ccpp/suites/suite_FV3_RAP.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_cires_ugwp.xml b/ccpp/suites/suite_FV3_RAP_cires_ugwp.xml index 6f16d0ea4..e6294028c 100644 --- a/ccpp/suites/suite_FV3_RAP_cires_ugwp.xml +++ b/ccpp/suites/suite_FV3_RAP_cires_ugwp.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_clm_lake.xml b/ccpp/suites/suite_FV3_RAP_clm_lake.xml index 2bc178eae..e7fef4461 100644 --- a/ccpp/suites/suite_FV3_RAP_clm_lake.xml +++ b/ccpp/suites/suite_FV3_RAP_clm_lake.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_flake.xml b/ccpp/suites/suite_FV3_RAP_flake.xml index c60c4324b..3239355fa 100644 --- a/ccpp/suites/suite_FV3_RAP_flake.xml +++ b/ccpp/suites/suite_FV3_RAP_flake.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_noah.xml b/ccpp/suites/suite_FV3_RAP_noah.xml index 6fd994f3c..80a515356 100644 --- a/ccpp/suites/suite_FV3_RAP_noah.xml +++ b/ccpp/suites/suite_FV3_RAP_noah.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_cires_ugwp.xml b/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_cires_ugwp.xml index a07dd850b..2d6d0377b 100644 --- a/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_cires_ugwp.xml +++ b/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_cires_ugwp.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_sfcdiff.xml b/ccpp/suites/suite_FV3_RAP_sfcdiff.xml index 8a960e02e..23bbf1f54 100644 --- a/ccpp/suites/suite_FV3_RAP_sfcdiff.xml +++ b/ccpp/suites/suite_FV3_RAP_sfcdiff.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RAP_unified_ugwp.xml b/ccpp/suites/suite_FV3_RAP_unified_ugwp.xml index efca314bb..509ffea89 100644 --- a/ccpp/suites/suite_FV3_RAP_unified_ugwp.xml +++ b/ccpp/suites/suite_FV3_RAP_unified_ugwp.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RRFS_v1beta.xml b/ccpp/suites/suite_FV3_RRFS_v1beta.xml index 42ee00565..90165d880 100644 --- a/ccpp/suites/suite_FV3_RRFS_v1beta.xml +++ b/ccpp/suites/suite_FV3_RRFS_v1beta.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_RRFS_v1nssl.xml b/ccpp/suites/suite_FV3_RRFS_v1nssl.xml index 05b1edb79..e24d2c6f2 100644 --- a/ccpp/suites/suite_FV3_RRFS_v1nssl.xml +++ b/ccpp/suites/suite_FV3_RRFS_v1nssl.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_WoFS_v0.xml b/ccpp/suites/suite_FV3_WoFS_v0.xml index 5641af472..140ba9023 100644 --- a/ccpp/suites/suite_FV3_WoFS_v0.xml +++ b/ccpp/suites/suite_FV3_WoFS_v0.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_FV3_global_nest_v1.xml b/ccpp/suites/suite_FV3_global_nest_v1.xml index 5a8dbd3e0..6f55e56f7 100644 --- a/ccpp/suites/suite_FV3_global_nest_v1.xml +++ b/ccpp/suites/suite_FV3_global_nest_v1.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_RRFSens_phy1.xml b/ccpp/suites/suite_RRFSens_phy1.xml index 0cd4c47b8..f0de1ebf4 100644 --- a/ccpp/suites/suite_RRFSens_phy1.xml +++ b/ccpp/suites/suite_RRFSens_phy1.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_RRFSens_phy2.xml b/ccpp/suites/suite_RRFSens_phy2.xml index e1ecc7149..44cafb249 100644 --- a/ccpp/suites/suite_RRFSens_phy2.xml +++ b/ccpp/suites/suite_RRFSens_phy2.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_RRFSens_phy3.xml b/ccpp/suites/suite_RRFSens_phy3.xml index 85e7189bd..da442619d 100644 --- a/ccpp/suites/suite_RRFSens_phy3.xml +++ b/ccpp/suites/suite_RRFSens_phy3.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post diff --git a/ccpp/suites/suite_RRFSens_phy4.xml b/ccpp/suites/suite_RRFSens_phy4.xml index 35c7b052f..74a1e8972 100644 --- a/ccpp/suites/suite_RRFSens_phy4.xml +++ b/ccpp/suites/suite_RRFSens_phy4.xml @@ -18,7 +18,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw rrtmg_lw_post GFS_rrtmg_post diff --git a/ccpp/suites/suite_RRFSens_phy5.xml b/ccpp/suites/suite_RRFSens_phy5.xml index 26bb32584..0321e64e9 100644 --- a/ccpp/suites/suite_RRFSens_phy5.xml +++ b/ccpp/suites/suite_RRFSens_phy5.xml @@ -19,7 +19,6 @@ rad_sw_pre rrtmg_sw rrtmg_sw_post - rrtmg_lw_pre rrtmg_lw sgscloud_radpost rrtmg_lw_post From 5e7f1961ff4ee0e4793818589a3942482ca8967e Mon Sep 17 00:00:00 2001 From: Brian Curtis <64433609+BrianCurtis-NOAA@users.noreply.github.com> Date: Sat, 6 Jan 2024 10:21:16 -0500 Subject: [PATCH 7/8] switch to use fms implementation of mpp (#732) --- io/module_wrt_grid_comp.F90 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/io/module_wrt_grid_comp.F90 b/io/module_wrt_grid_comp.F90 index e409788ab..b7e93e28f 100644 --- a/io/module_wrt_grid_comp.F90 +++ b/io/module_wrt_grid_comp.F90 @@ -29,7 +29,6 @@ module module_wrt_grid_comp use mpi use esmf use fms - use mpp_mod, only : mpp_init ! needed for fms 2023.02 use write_internal_state use module_fv3_io_def, only : num_pes_fcst, & @@ -253,7 +252,6 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, lprnt = lead_write_task == wrt_int_state%mype call fms_init(wrt_mpi_comm) - call mpp_init() ! print *,'in wrt, lead_write_task=', & ! lead_write_task,'last_write_task=',last_write_task, & @@ -1336,7 +1334,7 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, ! save calendar_type (as integer) for use in 'coupler.res' if (index(trim(attNameList(i)),'time:calendar') > 0) then - select case( uppercase(trim(valueS)) ) + select case( fms_mpp_uppercase(trim(valueS)) ) case( 'JULIAN' ) calendar_type = JULIAN case( 'GREGORIAN' ) @@ -1348,7 +1346,7 @@ subroutine wrt_initialize_p1(wrt_comp, imp_state_write, exp_state_write, clock, case( 'NO_CALENDAR' ) calendar_type = NO_CALENDAR case default - call mpp_error ( FATAL, 'fcst_initialize: calendar must be one of '// & + call fms_mpp_error ( FATAL, 'fcst_initialize: calendar must be one of '// & 'JULIAN|GREGORIAN|NOLEAP|THIRTY_DAY|NO_CALENDAR.' ) end select endif From 138aab1b4dcc98143803941301c81e3e933fecdc Mon Sep 17 00:00:00 2001 From: Alex Richert <82525672+AlexanderRichert-NOAA@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:28:31 -0500 Subject: [PATCH 8/8] Add CI build (#730) * Add GCC-based CI build --- .github/workflows/GCC.yml | 83 +++++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 6 +++ ci/CMakeLists.txt | 70 +++++++++++++++++++++++++++++++++ ci/spack.yaml | 29 ++++++++++++++ 4 files changed, 188 insertions(+) create mode 100644 .github/workflows/GCC.yml create mode 100644 ci/CMakeLists.txt create mode 100644 ci/spack.yaml diff --git a/.github/workflows/GCC.yml b/.github/workflows/GCC.yml new file mode 100644 index 000000000..3fb022bae --- /dev/null +++ b/.github/workflows/GCC.yml @@ -0,0 +1,83 @@ +# This is a CI workflow for the fv3atm project. +# +# This workflow builds and tests the fv3atm library using GCC, and it tests +# different CMake build options. +# +# Alex Richert, 6 Dec 2023 + +name: GCC +on: + push: + branches: + - develop + pull_request: + branches: + - develop + +jobs: + GCC: + runs-on: ubuntu-latest + + strategy: + matrix: + cmake_opts: ["-D32BIT=ON", "-D32BIT=OFF"] + gcc_ver: ["11"] + mpi: ["mpich"] + + steps: + + - name: checkout-fv3atm + uses: actions/checkout@v3 + with: + path: ${{ github.workspace }}/fv3atm + submodules: recursive + + - name: cache-spack + id: cache-spack + uses: actions/cache@v3 + with: + path: ${{ github.workspace }}/spack-develop + key: spack-${{ hashFiles('fv3atm/ci/spack.yaml') }}-gcc${{ matrix.gcc_ver }}-2 + + # Building dependencies takes 40+ min + - name: spack-install + if: steps.cache-spack.outputs.cache-hit != 'true' + run: | + wget --no-verbose https://github.com/spack/spack/archive/refs/heads/develop.zip + unzip develop.zip -d ${GITHUB_WORKSPACE}/ &> unzip.out + . ${GITHUB_WORKSPACE}/spack-develop/share/spack/setup-env.sh + spack env create gcc${{ matrix.gcc_ver }} ${GITHUB_WORKSPACE}/fv3atm/ci/spack.yaml + spack env activate gcc${{ matrix.gcc_ver }} + spack compiler find | grep gcc@${{ matrix.gcc_ver }} + spack external find gmake cmake git git-lfs perl python ${{ matrix.mpi }} + spack config add "packages:all:require:['%gcc@${{ matrix.gcc_ver }}']" + spack config add "packages:mpi:require:'${{ matrix.mpi }}'" + spack concretize |& tee ${SPACK_ENV}/log.concretize + spack install -j2 --fail-fast + + - name: cache-save + uses: actions/cache/save@v3 + if: ${{ always() }} + with: + path: ${{ github.workspace }}/spack-develop + key: spack-${{ hashFiles('fv3atm/ci/spack.yaml') }}-gcc${{ matrix.gcc_ver }}-2 + + - name: build-fv3atm + run: | + . ${GITHUB_WORKSPACE}/spack-develop/share/spack/setup-env.sh + spack env activate gcc${{ matrix.gcc_ver }} + spack load $(spack find --format "{name}") + cd ${GITHUB_WORKSPACE}/fv3atm + git clone https://github.com/NOAA-EMC/CMakeModules + git clone --recurse-submodules https://github.com/NOAA-PSL/stochastic_physics stochastic_physics_repo + mkdir ${GITHUB_WORKSPACE}/build + cd ${GITHUB_WORKSPACE}/build + cmake ${GITHUB_WORKSPACE}/fv3atm -DBUILD_TESTING=ON ${{ matrix.cmake_opts }} + make -j2 + + - name: debug-artifacts + uses: actions/upload-artifact@v3 + if: ${{ failure() }} + with: + name: ccpp_prebuild_logs + path: ${{ github.workspace }}/build/ccpp/ccpp_prebuild.* diff --git a/CMakeLists.txt b/CMakeLists.txt index 549738794..bd40d09df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,9 @@ +# Enable CI build & unit testing: +if(BUILD_TESTING) + cmake_minimum_required(VERSION 3.19) + project(fv3atm VERSION 1.0 LANGUAGES C CXX Fortran) + include(ci/CMakeLists.txt) +endif() ############################################################################### ### CCPP diff --git a/ci/CMakeLists.txt b/ci/CMakeLists.txt new file mode 100644 index 000000000..71412b3af --- /dev/null +++ b/ci/CMakeLists.txt @@ -0,0 +1,70 @@ +# This file is used by fv3atm's root CMakeLists.txt when BUILD_TESTING=ON. It is +# used for CI runs and is based on the ufs-weather-model root CMakeLists.txt. It +# cannot be built directly, and should not be used for compiling for general R&D +# or operations. +# +# Alex Richert, 6 Dec 2023 + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMakeModules/Modules) + +if(${CMAKE_Fortran_COMPILER_ID} MATCHES "GNU") + if(CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 9.0.0) + message(FATAL_ERROR "GNU Compiler >= 9 is required") + endif() + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -ggdb -fbacktrace -cpp -fcray-pointer -ffree-line-length-none -fno-range-check") + + if(${CMAKE_Fortran_COMPILER_VERSION} VERSION_GREATER_EQUAL 10) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-argument-mismatch -fallow-invalid-boz") + endif() + + if(NOT 32BIT) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fdefault-real-8 -fdefault-double-8") + endif() +elseif(${CMAKE_Fortran_COMPILER_ID} MATCHES "Intel") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g -traceback -fpp -fno-alias -auto -safe-cray-ptr -ftz -assume byterecl -nowarn -sox -align array64byte -qno-opt-dynamic-align") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -qno-opt-dynamic-align -sox -fp-model source") + set(CMAKE_Fortran_FLAGS_RELEASE "-O2 -debug minimal -qoverride-limits") + set(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fp-model consistent") + set(CMAKE_C_FLAGS_RELEASE "-O2 -debug minimal") + + if(NOT 32BIT) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -real-size 64") + endif() +endif() + +set(32BIT OFF CACHE BOOL "Enable 32BIT (single precision arithmetic in dycore and fast physics)") +set(CCPP_32BIT OFF CACHE BOOL "Enable CCPP_32BIT (single precision arithmetic in slow physics)") +set(INLINE_POST ON CACHE BOOL "Enable inline post") +set(MULTI_GASES OFF CACHE BOOL "Enable MULTI_GASES") +set(MOVING_NEST OFF CACHE BOOL "Enable moving nest code") +set(OPENMP ON CACHE BOOL "Enable OpenMP threading") +set(PARALLEL_NETCDF OFF CACHE BOOL "Enable parallel NetCDF") + +message("32BIT ............ ${32BIT}") +message("CCPP_32BIT ....... ${CCPP_32BIT}") +message("INLINE_POST ...... ${INLINE_POST}") +message("MULTI_GASES ...... ${MULTI_GASES}") +message("MOVING_NEST ...... ${MOVING_NEST}") +message("OPENMP ........... ${OPENMP}") +message("PARALLEL_NETCDF .. ${PARALLEL_NETCDF}") + +find_package(MPI REQUIRED) +if(OPENMP) + find_package(OpenMP REQUIRED) +endif() + +find_package(NetCDF 4.7.4 REQUIRED C Fortran) +find_package(ESMF 8.3.0 MODULE REQUIRED) +find_package(FMS 2022.04 REQUIRED COMPONENTS R4 R8) +if(32BIT) + add_library(fms ALIAS FMS::fms_r4) +else() + add_library(fms ALIAS FMS::fms_r8) +endif() +find_package(bacio 2.4.0 REQUIRED) +find_package(sp 2.3.3 REQUIRED) +find_package(w3emc 2.9.2 REQUIRED) + +find_package(Python 3.6 REQUIRED COMPONENTS Interpreter) + +add_subdirectory(stochastic_physics_repo) diff --git a/ci/spack.yaml b/ci/spack.yaml new file mode 100644 index 000000000..400b7e06b --- /dev/null +++ b/ci/spack.yaml @@ -0,0 +1,29 @@ +# This file is used in the CI to define the libraries needed to build fv3atm. It +# is used by the 'spack env create' command to generate a Spack environment. It +# is generally preferred to avoid defining settings here that are not shared +# across CI workflows, such as requiring the use of a specific compiler. Any +# such modifications should be done in the appropriate CI workflow using the +# 'spack config add' command, or with search-and-replace. +# WARNING: Changing this file will automatically cause the cached Spack builds +# in GitHub Actions to be regenerated, which takes a considerable amount of +# time. +# +# Alex Richert, 6 Dec 2023 +spack: + specs: + - w3emc@2.10.0 precision=4,d,8 + - ip@develop precision=4,d,8 + - sp@2.4.0 precision=4,d,8 + - bacio@2.4.1 + - upp@develop + - esmf@8.4.2 + - fms@2023.04 +gfs_phys +openmp +pic +quad_precision +deprecated_io constants=GFS precision=32,64 + - netcdf-c@4.9.2 ~blosc + view: false + concretizer: + unify: true + packages: + mpich: + require: ['~libxml2 ~hwloc ~pci'] # minimize unneeded dependencies + yaksa: + buildable: false # minimize unneeded dependencies