From 43c098216493289ab064a6707bbb7fb801dd5914 Mon Sep 17 00:00:00 2001 From: SMoorthi-emc <47667426+SMoorthi-emc@users.noreply.github.com> Date: Fri, 22 Oct 2021 09:04:05 -0400 Subject: [PATCH] Remove interstitial variables for land and ice emissivity and update the land and ice emissivity in the routine setemis in CCPP (#393) --- atmos_model.F90 | 24 +- ccpp/data/GFS_typedefs.F90 | 208 +++++++++--------- ccpp/data/GFS_typedefs.meta | 75 +++---- ccpp/physics | 2 +- .../suite_FV3_GFSv17alp_cpldnsstrasnoahmp.xml | 95 ++++++++ ...te_FV3_GFSv17alp_cpldnsstrasugwpnoahmp.xml | 95 ++++++++ ...te_FV3_GFSv17alp_cpldnsstrasugwprrtmgp.xml | 105 +++++++++ ...te_FV3_GFSv17alp_cpldnsstsasugwpnoahmp.xml | 95 ++++++++ ...suite_FV3_GFSv17alpha_cpldnsstsas_ugwp.xml | 95 ++++++++ io/FV3GFS_io.F90 | 180 ++++++++------- 10 files changed, 730 insertions(+), 244 deletions(-) create mode 100644 ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasnoahmp.xml create mode 100644 ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasugwpnoahmp.xml create mode 100644 ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasugwprrtmgp.xml create mode 100644 ccpp/suites/suite_FV3_GFSv17alp_cpldnsstsasugwpnoahmp.xml create mode 100644 ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstsas_ugwp.xml diff --git a/atmos_model.F90 b/atmos_model.F90 index f092da8c5..6f89625c9 100644 --- a/atmos_model.F90 +++ b/atmos_model.F90 @@ -423,9 +423,9 @@ subroutine atmos_timestep_diagnostics(Atmos) if(.not. GFS_control%first_time_step) then pmaxloc = 0.0d0 recvbuf = 0.0d0 - psum = 0.0d0 - pcount = 0.0d0 - maxabs = 0.0d0 + psum = 0.0d0 + pcount = 0.0d0 + maxabs = 0.0d0 ! Put pgr stats in pmaxloc, psum, and pcount: pmaxloc(1) = GFS_Control%tile_num @@ -434,11 +434,11 @@ subroutine atmos_timestep_diagnostics(Atmos) do i=1,count pdiff = GFS_data(nb)%Statein%pgr(i)-GFS_data(nb)%Intdiag%old_pgr(i) adiff = abs(pdiff) - psum = psum+adiff + psum = psum + adiff if(adiff>=maxabs) then maxabs=adiff - pmaxloc(2:3)=(/ ATM_block%index(nb)%ii(i), ATM_block%index(nb)%jj(i) /) - pmaxloc(4:7)=(/ pdiff, GFS_data(nb)%Statein%pgr(i), & + pmaxloc(2:3) = (/ ATM_block%index(nb)%ii(i), ATM_block%index(nb)%jj(i) /) + pmaxloc(4:7) = (/ pdiff, GFS_data(nb)%Statein%pgr(i), & GFS_data(nb)%Grid%xlat(i), GFS_data(nb)%Grid%xlon(i) /) endif enddo @@ -1642,6 +1642,7 @@ subroutine assign_importdata(jdat, rc) ! real(kind=GFS_kind_phys), parameter :: hsmax = 100.0 !< maximum snow depth (m) allowed real(kind=GFS_kind_phys), parameter :: himax = 1.0e12 !< maximum ice thickness allowed real(kind=GFS_kind_phys), parameter :: hsmax = 1.0e12 !< maximum snow depth (m) allowed + real(kind=GFS_kind_phys), parameter :: con_sbc = 5.670400e-8_GFS_kind_phys !< stefan-boltzmann ! !------------------------------------------------------------------------------ ! @@ -2479,7 +2480,7 @@ subroutine assign_importdata(jdat, rc) ! update sea ice related fields: if( lcpl_fice ) then -!$omp parallel do default(shared) private(i,j,nb,ix) +!$omp parallel do default(shared) private(i,j,nb,ix,tem) do j=jsc,jec do i=isc,iec nb = Atm_block%blkno(i,j) @@ -2490,6 +2491,15 @@ subroutine assign_importdata(jdat, rc) GFS_data(nb)%Coupling%hsnoin_cpl(ix) = min(hsmax, GFS_data(nb)%Coupling%hsnoin_cpl(ix) & / (GFS_data(nb)%Sfcprop%fice(ix)*GFS_data(nb)%Sfcprop%oceanfrac(ix))) GFS_data(nb)%Sfcprop%zorli(ix) = z0ice + tem = GFS_data(nb)%Sfcprop%tisfc(ix) * GFS_data(nb)%Sfcprop%tisfc(ix) + tem = con_sbc * tem * tem + if (GFS_data(nb)%Coupling%ulwsfcin_cpl(ix) > zero) then + GFS_data(nb)%Sfcprop%emis_ice(ix) = GFS_data(nb)%Coupling%ulwsfcin_cpl(ix) / tem + GFS_data(nb)%Sfcprop%emis_ice(ix) = max(0.9, min(one, GFS_data(nb)%Sfcprop%emis_ice(ix))) + else + GFS_data(nb)%Sfcprop%emis_ice(ix) = 0.96 + endif + GFS_data(nb)%Coupling%ulwsfcin_cpl(ix) = tem * GFS_data(nb)%Sfcprop%emis_ice(ix) else GFS_data(nb)%Sfcprop%tisfc(ix) = GFS_data(nb)%Sfcprop%tsfco(ix) GFS_data(nb)%Sfcprop%fice(ix) = zero diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 04004eeec..4d8bfed3b 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -58,7 +58,7 @@ module GFS_typedefs !--- parameter constants used for default initializations real(kind=kind_phys), parameter :: zero = 0.0_kind_phys - real(kind=kind_phys), parameter :: huge = 9.9692099683868690E36 ! NetCDF float FillValue +! real(kind=kind_phys), parameter :: huge = 9.9692099683868690E36 ! NetCDF float FillValue real(kind=kind_phys), parameter :: clear_val = zero !real(kind=kind_phys), parameter :: clear_val = -9.9999e80 real(kind=kind_phys), parameter :: rann_init = 0.6_kind_phys @@ -241,6 +241,8 @@ module GFS_typedefs real (kind=kind_phys), pointer :: fice (:) => null() !< ice fraction over open water grid real (kind=kind_phys), pointer :: snodl (:) => null() !< snow depth over land real (kind=kind_phys), pointer :: weasdl (:) => null() !< weasd over land + real (kind=kind_phys), pointer :: snodi (:) => null() !< snow depth over ice + real (kind=kind_phys), pointer :: weasdi (:) => null() !< weasd over ice ! real (kind=kind_phys), pointer :: hprim (:) => null() !< topographic standard deviation in m real (kind=kind_phys), pointer :: hprime (:,:) => null() !< orographic metrics real (kind=kind_phys), pointer :: z0base (:) => null() !< background or baseline surface roughness length in m @@ -633,7 +635,7 @@ module GFS_typedefs !--- coupling parameters logical :: cplflx !< default no cplflx collection - logical :: cplice !< default yes cplice collection (used together with cplflx) + logical :: cplice !< default no cplice collection (used together with cplflx) logical :: cplocn2atm !< default yes ocn->atm coupling logical :: cplwav !< default no cplwav collection logical :: cplwav2atm !< default no wav->atm coupling @@ -1298,6 +1300,7 @@ module GFS_typedefs real(kind=kind_phys) :: dxmax ! maximum scaling factor for critical relative humidity, replaces dxmax in physcons.F90 real(kind=kind_phys) :: dxmin ! minimum scaling factor for critical relative humidity, replaces dxmin in physcons.F90 real(kind=kind_phys) :: rhcmax ! maximum critical relative humidity, replaces rhc_max in physcons.F90 + real(kind=kind_phys) :: huge !< huge fill value contains procedure :: init => control_initialize @@ -2022,8 +2025,6 @@ module GFS_typedefs real (kind=kind_phys), pointer :: save_v(:,:) => null() !< real (kind=kind_phys), pointer :: sbsno(:) => null() !< type (cmpfsw_type), pointer :: scmpsw(:) => null() !< - real (kind=kind_phys), pointer :: semis_ice(:) => null() !< - real (kind=kind_phys), pointer :: semis_land(:) => null() !< real (kind=kind_phys), pointer :: semis_water(:) => null() !< real (kind=kind_phys), pointer :: sfcalb(:,:) => null() !< real (kind=kind_phys), pointer :: sigma(:) => null() !< @@ -2035,10 +2036,8 @@ module GFS_typedefs real (kind=kind_phys), pointer :: smcmax(:) => null() !< real (kind=kind_phys), pointer :: smc_save(:,:) => null() !< real (kind=kind_phys), pointer :: snowc(:) => null() !< - real (kind=kind_phys), pointer :: snowd_ice(:) => null() !< -! real (kind=kind_phys), pointer :: snowd_land(:) => null() !< +! real (kind=kind_phys), pointer :: snowd_ice(:) => null() !< real (kind=kind_phys), pointer :: snowd_land_save(:) => null() !< -! real (kind=kind_phys), pointer :: snowd_water(:) => null() !< real (kind=kind_phys), pointer :: snow_depth(:) => null() !< real (kind=kind_phys), pointer :: snohf(:) => null() !< real (kind=kind_phys), pointer :: snohf_snow(:) => null() !< @@ -2068,7 +2067,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: trans(:) => null() !< real (kind=kind_phys), pointer :: tseal(:) => null() !< real (kind=kind_phys), pointer :: tsfa(:) => null() !< - real (kind=kind_phys), pointer :: tsfc_ice(:) => null() !< +! real (kind=kind_phys), pointer :: tsfc_ice(:) => null() !< real (kind=kind_phys), pointer :: tsfc_land_save(:) => null() !< real (kind=kind_phys), pointer :: tsfc_water(:) => null() !< real (kind=kind_phys), pointer :: tsfg(:) => null() !< @@ -2088,7 +2087,7 @@ module GFS_typedefs ! real (kind=kind_phys), pointer :: weasd_water(:) => null() !< ! real (kind=kind_phys), pointer :: weasd_land(:) => null() !< real (kind=kind_phys), pointer :: weasd_land_save(:) => null() !< - real (kind=kind_phys), pointer :: weasd_ice(:) => null() !< +! real (kind=kind_phys), pointer :: weasd_ice(:) => null() !< real (kind=kind_phys), pointer :: wind(:) => null() !< real (kind=kind_phys), pointer :: work1(:) => null() !< real (kind=kind_phys), pointer :: work2(:) => null() !< @@ -2366,6 +2365,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%fice (IM)) allocate (Sfcprop%snodl (IM)) allocate (Sfcprop%weasdl (IM)) + allocate (Sfcprop%snodi (IM)) + allocate (Sfcprop%weasdi (IM)) ! allocate (Sfcprop%hprim (IM)) allocate (Sfcprop%hprime (IM,Model%nmtvr)) allocate(Sfcprop%albdirvis_lnd (IM)) @@ -2373,6 +2374,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate(Sfcprop%albdifvis_lnd (IM)) allocate(Sfcprop%albdifnir_lnd (IM)) allocate (Sfcprop%emis_lnd (IM)) + allocate (Sfcprop%emis_ice (IM)) Sfcprop%slmsk = clear_val Sfcprop%oceanfrac = clear_val @@ -2393,6 +2395,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%fice = clear_val Sfcprop%snodl = clear_val Sfcprop%weasdl = clear_val + Sfcprop%snodi = clear_val + Sfcprop%weasdi = clear_val ! Sfcprop%hprim = clear_val Sfcprop%hprime = clear_val Sfcprop%albdirvis_lnd = clear_val @@ -2400,6 +2404,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%albdifvis_lnd = clear_val Sfcprop%albdifnir_lnd = clear_val Sfcprop%emis_lnd = clear_val + Sfcprop%emis_ice = clear_val !--- In (radiation only) allocate (Sfcprop%snoalb (IM)) @@ -2460,6 +2465,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%hice (IM)) allocate (Sfcprop%weasd (IM)) allocate (Sfcprop%sncovr (IM)) + allocate (Sfcprop%sncovr_ice (IM)) if (Model%use_cice_alb .or. Model%lsm == Model%lsm_ruc) then allocate (Sfcprop%albdirvis_ice (IM)) allocate (Sfcprop%albdifvis_ice (IM)) @@ -2468,12 +2474,6 @@ subroutine sfcprop_create (Sfcprop, IM, Model) ! allocate (Sfcprop%sfalb_ice (IM)) endif if (Model%lsm == Model%lsm_ruc) then - allocate (Sfcprop%sncovr_ice (IM)) - allocate (Sfcprop%emis_ice (IM)) -! allocate (Sfcprop%albdirvis_ice (IM)) -! allocate (Sfcprop%albdirnir_ice (IM)) -! allocate (Sfcprop%albdifvis_ice (IM)) -! allocate (Sfcprop%albdifnir_ice (IM)) allocate (Sfcprop%sfalb_lnd (IM)) allocate (Sfcprop%sfalb_ice (IM)) allocate (Sfcprop%sfalb_lnd_bck (IM)) @@ -2491,6 +2491,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%hice = clear_val Sfcprop%weasd = clear_val Sfcprop%sncovr = clear_val + Sfcprop%sncovr_ice = clear_val if (Model%use_cice_alb .or. Model%lsm == Model%lsm_ruc) then Sfcprop%albdirvis_ice = clear_val Sfcprop%albdifvis_ice = clear_val @@ -2499,14 +2500,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) ! Sfcprop%sfalb_ice = clear_val endif if (Model%lsm == Model%lsm_ruc) then - Sfcprop%sncovr_ice = clear_val - Sfcprop%emis_ice = clear_val -! Sfcprop%albdirvis_ice = clear_val -! Sfcprop%albdirnir_ice = clear_val -! Sfcprop%albdifvis_ice = clear_val -! Sfcprop%albdifnir_ice = clear_val - Sfcprop%sfalb_lnd = clear_val - Sfcprop%sfalb_ice = clear_val + Sfcprop%sfalb_lnd = clear_val + Sfcprop%sfalb_ice = clear_val Sfcprop%sfalb_lnd_bck = clear_val endif Sfcprop%canopy = clear_val @@ -3118,7 +3113,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & !--- coupling parameters logical :: cplflx = .false. !< default no cplflx collection - logical :: cplice = .true. !< default yes cplice collection (used together with cplflx) + logical :: cplice = .false. !< default no cplice collection (used together with cplflx) logical :: cplocn2atm = .true. !< default yes cplocn2atm coupling (turn on the feedback from ocn to atm) logical :: cplwav = .false. !< default no cplwav collection logical :: cplwav2atm = .false. !< default no cplwav2atm coupling @@ -3562,6 +3557,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & ! max and min lon and lat for critical relative humidity integer :: max_lon=5000, max_lat=2000, min_lon=192, min_lat=94 real(kind=kind_phys) :: rhcmax = 0.9999999 !< max critical rel. hum. + real(kind=kind_phys) :: huge = 9.9692099683868690E36 ! NetCDF float FillValue + !--- stochastic physics control parameters logical :: do_sppt = .false. @@ -3680,7 +3677,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & h0facu, h0facs, & !--- cellular automata nca, scells, tlives, nca_g, ncells_g, nlives_g, nfracseed, & - nseed, nseed_g, rcell, do_ca, & + nseed, nseed_g, rcell, do_ca, & ca_sgs, ca_global,iseed_ca,ca_smooth, & nspinup,ca_amplitude,nsmooth,ca_closure,ca_entr,ca_trigger, & !--- IAU @@ -3689,7 +3686,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & !--- debug options debug, pre_rad, print_diff_pgr, & !--- parameter range for critical relative humidity - max_lon, max_lat, min_lon, min_lat, rhcmax, & + max_lon, max_lat, min_lon, min_lat, rhcmax, huge, & phys_version, & !--- aerosol scavenging factors ('name:value' string array) fscav_aero @@ -3868,6 +3865,14 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & !--- coupling parameters Model%cplflx = cplflx Model%cplice = cplice + ! Consistency check, currently allowed combinations are + ! Model%cplflx == .false. and Model%cplice == .false. (uncoupled runs) + ! Model%cplflx == .true. and Model%cplice == .true. (coupled S2S runs) + ! Model%cplflx == .true. and Model%cplice == .false. (HAFS FV3ATM-HYCOM) + if (Model%cplice .and. .not. Model%cplflx) then + print *,' Logic error: Model%cplflx==.false. and Model%cplice==.true. is currently not supported - shutting down' + stop + endif Model%cplocn2atm = cplocn2atm Model%cplwav = cplwav Model%cplwav2atm = cplwav2atm @@ -4809,9 +4814,10 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%dxmin = log(tem/(min_lon*min_lat)) Model%dxinv = 1.0d0 / (Model%dxmax-Model%dxmin) Model%rhcmax = rhcmax + Model%huge = huge if (Model%me == Model%master) write(*,*)' dxmax=',Model%dxmax,' dxmin=',Model%dxmin,' dxinv=',Model%dxinv, & 'max_lon=',max_lon,' max_lat=',max_lat,' min_lon=',min_lon,' min_lat=',min_lat, & - ' rhc_max=',Model%rhcmax + ' rhc_max=',Model%rhcmax,' huge=',huge !--- set nrcm if (Model%ras) then @@ -6715,7 +6721,7 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center) Diag%sbsnoa = zero Diag%snowca = zero Diag%soilm = zero - Diag%tmpmin = huge + Diag%tmpmin = Model%huge Diag%tmpmax = zero Diag%dusfc = zero Diag%dvsfc = zero @@ -6731,7 +6737,7 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center) Diag%dugwd = zero Diag%dvgwd = zero Diag%psmean = zero - Diag%spfhmin = huge + Diag%spfhmin = Model%huge Diag%spfhmax = zero Diag%u10mmax = zero Diag%v10mmax = zero @@ -7098,8 +7104,6 @@ subroutine interstitial_create (Interstitial, IM, Model) allocate (Interstitial%save_v (IM,Model%levs)) allocate (Interstitial%sbsno (IM)) allocate (Interstitial%scmpsw (IM)) - allocate (Interstitial%semis_ice (IM)) - allocate (Interstitial%semis_land (IM)) allocate (Interstitial%semis_water (IM)) allocate (Interstitial%sfcalb (IM,NF_ALBD)) allocate (Interstitial%sigma (IM)) @@ -7107,9 +7111,7 @@ subroutine interstitial_create (Interstitial, IM, Model) allocate (Interstitial%sigmafrac (IM,Model%levs)) allocate (Interstitial%sigmatot (IM,Model%levs)) allocate (Interstitial%snowc (IM)) - allocate (Interstitial%snowd_ice (IM)) -! allocate (Interstitial%snowd_land (IM)) -! allocate (Interstitial%snowd_water (IM)) +! allocate (Interstitial%snowd_ice (IM)) allocate (Interstitial%snohf (IM)) allocate (Interstitial%snowmt (IM)) allocate (Interstitial%stress (IM)) @@ -7125,7 +7127,7 @@ subroutine interstitial_create (Interstitial, IM, Model) allocate (Interstitial%trans (IM)) allocate (Interstitial%tseal (IM)) allocate (Interstitial%tsfa (IM)) - allocate (Interstitial%tsfc_ice (IM)) +! allocate (Interstitial%tsfc_ice (IM)) allocate (Interstitial%tsfc_water (IM)) allocate (Interstitial%tsfg (IM)) allocate (Interstitial%tsurf_ice (IM)) @@ -7138,7 +7140,7 @@ subroutine interstitial_create (Interstitial, IM, Model) allocate (Interstitial%vdftra (IM,Model%levs,Interstitial%nvdiff)) !GJF first dimension was set as 'IX' in GFS_physics_driver allocate (Interstitial%vegf1d (IM)) allocate (Interstitial%wcbmax (IM)) - allocate (Interstitial%weasd_ice (IM)) +! allocate (Interstitial%weasd_ice (IM)) ! allocate (Interstitial%weasd_land (IM)) ! allocate (Interstitial%weasd_water (IM)) allocate (Interstitial%wind (IM)) @@ -7706,24 +7708,24 @@ subroutine interstitial_phys_reset (Interstitial, Model) Interstitial%adjvisdfd = clear_val Interstitial%bexp1d = clear_val Interstitial%cd = clear_val - Interstitial%cd_ice = huge - Interstitial%cd_land = huge - Interstitial%cd_water = huge + Interstitial%cd_ice = Model%huge + Interstitial%cd_land = Model%huge + Interstitial%cd_water = Model%huge Interstitial%cdq = clear_val - Interstitial%cdq_ice = huge - Interstitial%cdq_land = huge - Interstitial%cdq_water = huge - Interstitial%chh_ice = huge - Interstitial%chh_land = huge - Interstitial%chh_water = huge + Interstitial%cdq_ice = Model%huge + Interstitial%cdq_land = Model%huge + Interstitial%cdq_water = Model%huge + Interstitial%chh_ice = Model%huge + Interstitial%chh_land = Model%huge + Interstitial%chh_water = Model%huge Interstitial%cld1d = clear_val Interstitial%cldf = clear_val Interstitial%clw = clear_val Interstitial%clw(:,:,2) = -999.9 Interstitial%clx = clear_val - Interstitial%cmm_ice = huge - Interstitial%cmm_land = huge - Interstitial%cmm_water = huge + Interstitial%cmm_ice = Model%huge + Interstitial%cmm_land = Model%huge + Interstitial%cmm_water = Model%huge Interstitial%cnvc = clear_val Interstitial%cnvw = clear_val Interstitial%ctei_r = clear_val @@ -7749,31 +7751,31 @@ subroutine interstitial_phys_reset (Interstitial, Model) Interstitial%dvsfc1 = clear_val Interstitial%elvmax = clear_val Interstitial%ep1d = clear_val - Interstitial%ep1d_ice = huge - Interstitial%ep1d_land = huge - Interstitial%ep1d_water = huge - Interstitial%evap_ice = huge - Interstitial%evap_land = huge - Interstitial%evap_water = huge + Interstitial%ep1d_ice = Model%huge + Interstitial%ep1d_land = Model%huge + Interstitial%ep1d_water = Model%huge + Interstitial%evap_ice = Model%huge + Interstitial%evap_land = Model%huge + Interstitial%evap_water = Model%huge Interstitial%evbs = clear_val Interstitial%evcw = clear_val - Interstitial%ffhh_ice = huge - Interstitial%ffhh_land = huge - Interstitial%ffhh_water = huge + Interstitial%ffhh_ice = Model%huge + Interstitial%ffhh_land = Model%huge + Interstitial%ffhh_water = Model%huge Interstitial%fh2 = clear_val - Interstitial%fh2_ice = huge - Interstitial%fh2_land = huge - Interstitial%fh2_water = huge + Interstitial%fh2_ice = Model%huge + Interstitial%fh2_land = Model%huge + Interstitial%fh2_water = Model%huge Interstitial%flag_cice = .false. Interstitial%flag_guess = .false. Interstitial%flag_iter = .true. - Interstitial%ffmm_ice = huge - Interstitial%ffmm_land = huge - Interstitial%ffmm_water = huge + Interstitial%ffmm_ice = Model%huge + Interstitial%ffmm_land = Model%huge + Interstitial%ffmm_water = Model%huge Interstitial%fm10 = clear_val - Interstitial%fm10_ice = huge - Interstitial%fm10_land = huge - Interstitial%fm10_water = huge + Interstitial%fm10_ice = Model%huge + Interstitial%fm10_land = Model%huge + Interstitial%fm10_water = Model%huge Interstitial%frland = clear_val Interstitial%fscav = clear_val Interstitial%fswtr = clear_val @@ -7793,9 +7795,9 @@ subroutine interstitial_phys_reset (Interstitial, Model) Interstitial%zvfun = clear_val Interstitial%hffac = clear_val Interstitial%hflxq = clear_val - Interstitial%hflx_ice = huge - Interstitial%hflx_land = huge - Interstitial%hflx_water = huge + Interstitial%hflx_ice = Model%huge + Interstitial%hflx_land = Model%huge + Interstitial%hflx_water = Model%huge Interstitial%dry = .false. Interstitial%icy = .false. Interstitial%lake = .false. @@ -7813,17 +7815,17 @@ subroutine interstitial_phys_reset (Interstitial, Model) Interstitial%oc = clear_val Interstitial%prcpmp = clear_val Interstitial%prnum = clear_val - Interstitial%qss_ice = huge - Interstitial%qss_land = huge - Interstitial%qss_water = huge + Interstitial%qss_ice = Model%huge + Interstitial%qss_land = Model%huge + Interstitial%qss_water = Model%huge Interstitial%raincd = clear_val Interstitial%raincs = clear_val Interstitial%rainmcadj = clear_val Interstitial%rainp = clear_val Interstitial%rb = clear_val - Interstitial%rb_ice = huge - Interstitial%rb_land = huge - Interstitial%rb_water = huge + Interstitial%rb_ice = Model%huge + Interstitial%rb_land = Model%huge + Interstitial%rb_water = Model%huge Interstitial%rhc = clear_val Interstitial%runoff = clear_val Interstitial%save_q = clear_val @@ -7832,46 +7834,42 @@ subroutine interstitial_phys_reset (Interstitial, Model) Interstitial%save_u = clear_val Interstitial%save_v = clear_val Interstitial%sbsno = clear_val - Interstitial%semis_ice = clear_val - Interstitial%semis_land = clear_val Interstitial%semis_water = clear_val Interstitial%sigma = clear_val Interstitial%sigmaf = clear_val Interstitial%sigmafrac = clear_val Interstitial%sigmatot = clear_val Interstitial%snowc = clear_val - Interstitial%snowd_ice = huge -! Interstitial%snowd_land = huge -! Interstitial%snowd_water = huge +! Interstitial%snowd_ice = Model%huge Interstitial%snohf = clear_val Interstitial%snowmt = clear_val Interstitial%stress = clear_val - Interstitial%stress_ice = huge - Interstitial%stress_land = huge - Interstitial%stress_water = huge + Interstitial%stress_ice = Model%huge + Interstitial%stress_land = Model%huge + Interstitial%stress_water = Model%huge Interstitial%theta = clear_val - Interstitial%tprcp_ice = huge - Interstitial%tprcp_land = huge - Interstitial%tprcp_water = huge + Interstitial%tprcp_ice = Model%huge + Interstitial%tprcp_land = Model%huge + Interstitial%tprcp_water = Model%huge Interstitial%trans = clear_val Interstitial%tseal = clear_val - Interstitial%tsfc_ice = huge - Interstitial%tsfc_water = huge - Interstitial%tsurf_ice = huge - Interstitial%tsurf_land = huge - Interstitial%tsurf_water = huge +! Interstitial%tsfc_ice = Model%huge + Interstitial%tsfc_water = Model%huge + Interstitial%tsurf_ice = Model%huge + Interstitial%tsurf_land = Model%huge + Interstitial%tsurf_water = Model%huge Interstitial%ud_mf = clear_val - Interstitial%uustar_ice = huge - Interstitial%uustar_land = huge - Interstitial%uustar_water = huge + Interstitial%uustar_ice = Model%huge + Interstitial%uustar_land = Model%huge + Interstitial%uustar_water = Model%huge Interstitial%vdftra = clear_val Interstitial%vegf1d = clear_val Interstitial%lndp_vgf = clear_val Interstitial%wcbmax = clear_val - Interstitial%weasd_ice = huge -! Interstitial%weasd_land = huge -! Interstitial%weasd_water = huge - Interstitial%wind = huge +! Interstitial%weasd_ice = Model%huge +! Interstitial%weasd_land = Model%huge +! Interstitial%weasd_water = Model%huge + Interstitial%wind = Model%huge Interstitial%work1 = clear_val Interstitial%work2 = clear_val Interstitial%work3 = clear_val @@ -7959,20 +7957,20 @@ subroutine interstitial_phys_reset (Interstitial, Model) end if if (Model%lsm == Model%lsm_noah_wrfv4) then Interstitial%canopy_save = clear_val - Interstitial%chk_land = huge + Interstitial%chk_land = Model%huge Interstitial%cmc = clear_val Interstitial%dqsdt2 = clear_val Interstitial%drain_in_m_sm1 = clear_val Interstitial%flag_lsm = .false. Interstitial%flag_lsm_glacier= .false. - Interstitial%qs1 = huge - Interstitial%qv1 = huge + Interstitial%qs1 = Model%huge + Interstitial%qv1 = Model%huge Interstitial%rho1 = clear_val Interstitial%runoff_in_m_sm1 = clear_val Interstitial%slc_save = clear_val Interstitial%smcmax = clear_val Interstitial%smc_save = clear_val - Interstitial%snowd_land_save = huge + Interstitial%snowd_land_save = Model%huge Interstitial%snow_depth = clear_val Interstitial%snohf_snow = clear_val Interstitial%snohf_frzgra = clear_val @@ -7980,9 +7978,9 @@ subroutine interstitial_phys_reset (Interstitial, Model) Interstitial%soilm_in_m = clear_val Interstitial%stc_save = clear_val Interstitial%th1 = clear_val - Interstitial%tprcp_rate_land = huge - Interstitial%tsfc_land_save = huge - Interstitial%weasd_land_save = huge + Interstitial%tprcp_rate_land = Model%huge + Interstitial%tsfc_land_save = Model%huge + Interstitial%weasd_land_save = Model%huge end if ! ! Set flag for resetting maximum hourly output fields diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index 47b124b3b..40ea9cb7f 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -516,8 +516,8 @@ type = real kind = kind_phys [tisfc] - standard_name = sea_ice_temperature - long_name = sea ice surface skin temperature + standard_name = surface_skin_temperature_over_ice + long_name = surface skin temperature over ice units = K dimensions = (horizontal_loop_extent) type = real @@ -592,6 +592,20 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys +[snodi] + standard_name = surface_snow_thickness_water_equivalent_over_ice + long_name = water equivalent snow depth over ice + units = mm + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys +[weasdi] + standard_name = water_equivalent_accumulated_snow_depth_over_ice + long_name = water equiv of acc snow depth over land + units = mm + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys [hprime] standard_name = statistical_measures_of_subgrid_orography_collection_array long_name = orographic metrics @@ -1346,7 +1360,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. flag_for_cice_albedo .eqv. .true.) + active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. flag_for_cice_albedo) [albdifvis_ice] standard_name = surface_albedo_diffuse_visible_over_ice long_name = diffuse surface albedo visible band over ice @@ -1354,7 +1368,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. flag_for_cice_albedo .eqv. .true.) + active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. flag_for_cice_albedo) [albdirnir_ice] standard_name = surface_albedo_direct_NIR_over_ice long_name = direct surface albedo NIR band over ice @@ -1362,7 +1376,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. flag_for_cice_albedo .eqv. .true.) + active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. flag_for_cice_albedo) [albdifnir_ice] standard_name = surface_albedo_diffuse_NIR_over_ice long_name = diffuse surface albedo NIR band over ice @@ -1370,7 +1384,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. flag_for_cice_albedo .eqv. .true.) + active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. flag_for_cice_albedo) [wetness] standard_name = normalized_soil_wetness_for_land_surface_model long_name = normalized soil wetness for lsm @@ -5203,6 +5217,13 @@ dimensions = () type = real kind = kind_phys +[huge] + standard_name = netcdf_float_fillvalue + long_name = definition of NetCDF float FillValue + units = none + dimensions = () + type = real + kind = kind_phys [icloud] standard_name = control_for_cloud_area_fraction_option long_name = cloud effect to the optical depth and cloud fraction in radiation @@ -8215,20 +8236,6 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys -[semis_land] - standard_name = surface_longwave_emissivity_over_land_interstitial - long_name = surface lw emissivity in fraction over land (temporary use as interstitial) - units = frac - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys -[semis_ice] - standard_name = surface_longwave_emissivity_over_ice_interstitial - long_name = surface lw emissivity in fraction over ice (temporary use as interstitial) - units = frac - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys [ep1d] standard_name = surface_upward_potential_latent_heat_flux long_name = surface upward potential latent heat flux @@ -9537,13 +9544,6 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys -[snowd_ice] - standard_name = surface_snow_thickness_water_equivalent_over_ice - long_name = water equivalent snow depth over ice - units = mm - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys [snowd_land_save] standard_name = surface_snow_thickness_water_equivalent_over_land_save long_name = water equivalent snow depth over land before entering a physics scheme @@ -9770,13 +9770,6 @@ type = real kind = kind_phys active = (control_for_land_surface_scheme == identifier_for_noah_wrfv4_land_surface_scheme) -[tsfc_ice] - standard_name = surface_skin_temperature_over_ice - long_name = surface skin temperature over ice - units = K - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys [tsfg] standard_name = surface_ground_temperature_for_radiation long_name = surface ground temperature for radiation @@ -9883,13 +9876,6 @@ type = real kind = kind_phys active = (control_for_land_surface_scheme == identifier_for_noah_wrfv4_land_surface_scheme) -[weasd_ice] - standard_name = water_equivalent_accumulated_snow_depth_over_ice - long_name = water equiv of acc snow depth over ice - units = mm - dimensions = (horizontal_loop_extent) - type = real - kind = kind_phys [wind] standard_name = wind_speed_at_lowest_model_layer long_name = wind speed at lowest model level @@ -10666,13 +10652,6 @@ units = none dimensions = () type = integer -[huge] - standard_name = netcdf_float_fillvalue - long_name = definition of NetCDF float FillValue - units = none - dimensions = () - type = real - kind = kind_phys [con_cliq] standard_name = specific_heat_of_liquid_water_at_constant_pressure long_name = specific heat of liquid water at constant pressure diff --git a/ccpp/physics b/ccpp/physics index 3423a1370..b12e6c328 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 3423a13700f9b8d4a7329ac155f3923a45c392ec +Subproject commit b12e6c3280804fe04e4256654c35602cc930d5cd diff --git a/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasnoahmp.xml b/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasnoahmp.xml new file mode 100644 index 000000000..0f9268de2 --- /dev/null +++ b/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasnoahmp.xml @@ -0,0 +1,95 @@ + + + + + + + fv_sat_adj + + + + + 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 + rrtmg_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_nst_pre + sfc_nst + sfc_nst_post + noahmpdrv + sfc_cice + sfc_sice + 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 + cires_ugwp + cires_ugwp_post + GFS_GWD_generic_post + GFS_suite_stateout_update + ozphys_2015 + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + rascnv + GFS_DCNV_generic_post + GFS_SCNV_generic_pre + samfshalcnv + GFS_SCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + gfdl_cloud_microphys + GFS_MP_generic_post + maximum_hourly_diagnostics + phys_tend + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasugwpnoahmp.xml b/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasugwpnoahmp.xml new file mode 100644 index 000000000..8b1a37662 --- /dev/null +++ b/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasugwpnoahmp.xml @@ -0,0 +1,95 @@ + + + + + + + fv_sat_adj + + + + + 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 + rrtmg_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 + noahmpdrv + sfc_cice + sfc_sice + sfc_nst_pre + sfc_nst + sfc_nst_post + 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 + ugwpv1_gsldrag + ugwpv1_gsldrag_post + GFS_GWD_generic_post + GFS_suite_stateout_update + ozphys_2015 + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + rascnv + GFS_DCNV_generic_post + GFS_SCNV_generic_pre + samfshalcnv + GFS_SCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + gfdl_cloud_microphys + GFS_MP_generic_post + maximum_hourly_diagnostics + phys_tend + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasugwprrtmgp.xml b/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasugwprrtmgp.xml new file mode 100644 index 000000000..ab494c52a --- /dev/null +++ b/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstrasugwprrtmgp.xml @@ -0,0 +1,105 @@ + + + + + + + fv_sat_adj + + + + + GFS_time_vary_pre + GFS_rrtmgp_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + GFS_rrtmgp_pre + GFS_radiation_surface + GFS_rrtmgp_gfdlmp_pre + GFS_rrtmgp_cloud_overlap_pre + GFS_cloud_diagnostics + GFS_rrtmgp_sw_pre + rrtmgp_sw_gas_optics + rrtmgp_sw_aerosol_optics + rrtmgp_sw_cloud_optics + rrtmgp_sw_cloud_sampling + rrtmgp_sw_rte + GFS_rrtmgp_sw_post + rrtmgp_lw_pre + rrtmgp_lw_gas_optics + rrtmgp_lw_aerosol_optics + rrtmgp_lw_cloud_optics + rrtmgp_lw_cloud_sampling + rrtmgp_lw_rte + GFS_rrtmgp_lw_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 + lsm_noah + sfc_cice + sfc_sice + sfc_nst_pre + sfc_nst + sfc_nst_post + 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 + ugwpv1_gsldrag + ugwpv1_gsldrag_post + GFS_GWD_generic_post + GFS_suite_stateout_update + ozphys_2015 + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + rascnv + GFS_DCNV_generic_post + GFS_SCNV_generic_pre + samfshalcnv + GFS_SCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + gfdl_cloud_microphys + GFS_MP_generic_post + maximum_hourly_diagnostics + phys_tend + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstsasugwpnoahmp.xml b/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstsasugwpnoahmp.xml new file mode 100644 index 000000000..10d0043aa --- /dev/null +++ b/ccpp/suites/suite_FV3_GFSv17alp_cpldnsstsasugwpnoahmp.xml @@ -0,0 +1,95 @@ + + + + + + + fv_sat_adj + + + + + 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 + rrtmg_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 + noahmpdrv + sfc_cice + sfc_sice + sfc_nst_pre + sfc_nst + sfc_nst_post + 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 + ugwpv1_gsldrag + ugwpv1_gsldrag_post + GFS_GWD_generic_post + GFS_suite_stateout_update + ozphys_2015 + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + samfdeepcnv + GFS_DCNV_generic_post + GFS_SCNV_generic_pre + samfshalcnv + GFS_SCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + gfdl_cloud_microphys + GFS_MP_generic_post + maximum_hourly_diagnostics + phys_tend + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstsas_ugwp.xml b/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstsas_ugwp.xml new file mode 100644 index 000000000..6b6dd9c2d --- /dev/null +++ b/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstsas_ugwp.xml @@ -0,0 +1,95 @@ + + + + + + + fv_sat_adj + + + + + 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 + rrtmg_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 + lsm_noah + sfc_nst_pre + sfc_nst + sfc_nst_post + sfc_cice + sfc_sice + 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 + ugwpv1_gsldrag + ugwpv1_gsldrag_post + GFS_GWD_generic_post + GFS_suite_stateout_update + ozphys_2015 + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + samfdeepcnv + GFS_DCNV_generic_post + GFS_SCNV_generic_pre + samfshalcnv + GFS_SCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + gfdl_cloud_microphys + GFS_MP_generic_post + maximum_hourly_diagnostics + phys_tend + + + + + GFS_stochastics + + + + diff --git a/io/FV3GFS_io.F90 b/io/FV3GFS_io.F90 index 7d5a84f4e..f0f82d264 100644 --- a/io/FV3GFS_io.F90 +++ b/io/FV3GFS_io.F90 @@ -313,8 +313,10 @@ subroutine FV3GFS_GFS_checksum (Model, GFS_Data, Atm_block) temp2d(i,j,89) = GFS_Data(nb)%Sfcprop%albdifvis_lnd(ix) temp2d(i,j,90) = GFS_Data(nb)%Sfcprop%albdifnir_lnd(ix) temp2d(i,j,91) = GFS_Data(nb)%Sfcprop%emis_lnd(ix) + temp2d(i,j,92) = GFS_Data(nb)%Sfcprop%emis_ice(ix) + temp2d(i,j,93) = GFS_Data(nb)%Sfcprop%sncovr_ice(ix) - idx_opt = 92 + idx_opt = 93 if (Model%use_cice_alb .or. Model%lsm == Model%lsm_ruc) then temp2d(i,j,idx_opt+1) = GFS_Data(nb)%Sfcprop%albdirvis_ice(ix) temp2d(i,j,idx_opt+2) = GFS_Data(nb)%Sfcprop%albdirnir_ice(ix) @@ -385,18 +387,12 @@ subroutine FV3GFS_GFS_checksum (Model, GFS_Data, Atm_block) temp2d(i,j,idx_opt+6) = GFS_Data(nb)%Sfcprop%tsnow_ice(ix) temp2d(i,j,idx_opt+7) = GFS_Data(nb)%Sfcprop%snowfallac_land(ix) temp2d(i,j,idx_opt+8) = GFS_Data(nb)%Sfcprop%snowfallac_ice(ix) - temp2d(i,j,idx_opt+9) = GFS_Data(nb)%Sfcprop%sncovr_ice(ix) - temp2d(i,j,idx_opt+10) = GFS_Data(nb)%Sfcprop%sfalb_lnd(ix) - temp2d(i,j,idx_opt+11) = GFS_Data(nb)%Sfcprop%sfalb_lnd_bck(ix) -! temp2d(i,j,idx_opt+16) = GFS_Data(nb)%Sfcprop%albdirvis_ice(ix) -! temp2d(i,j,idx_opt+17) = GFS_Data(nb)%Sfcprop%albdirnir_ice(ix) -! temp2d(i,j,idx_opt+18) = GFS_Data(nb)%Sfcprop%albdifvis_ice(ix) -! temp2d(i,j,idx_opt+19) = GFS_Data(nb)%Sfcprop%albdifnir_ice(ix) - temp2d(i,j,idx_opt+12) = GFS_Data(nb)%Sfcprop%sfalb_ice(ix) - temp2d(i,j,idx_opt+13) = GFS_Data(nb)%Sfcprop%emis_ice(ix) - idx_opt = idx_opt + 14 + temp2d(i,j,idx_opt+9) = GFS_Data(nb)%Sfcprop%sfalb_lnd(ix) + temp2d(i,j,idx_opt+10) = GFS_Data(nb)%Sfcprop%sfalb_lnd_bck(ix) + temp2d(i,j,idx_opt+11) = GFS_Data(nb)%Sfcprop%sfalb_ice(ix) + idx_opt = idx_opt + 11 if (Model%rdlai) then - temp2d(i,j,idx_opt+23) = GFS_Data(nb)%Sfcprop%xlaixy(ix) + temp2d(i,j,idx_opt+1) = GFS_Data(nb)%Sfcprop%xlaixy(ix) idx_opt = idx_opt + 1 endif endif @@ -531,9 +527,9 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta if (Model%lsm == Model%lsm_ruc .and. warm_start) then if(Model%rdlai) then - nvar_s2r = 15 + nvar_s2r = 13 else - nvar_s2r = 14 + nvar_s2r = 12 end if nvar_s3 = 5 else @@ -657,7 +653,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta enddo enddo - nvar_s2m = 44 + nvar_s2m = 48 if (Model%use_cice_alb .or. Model%lsm == Model%lsm_ruc) then nvar_s2m = nvar_s2m + 4 ! nvar_s2m = nvar_s2m + 5 @@ -844,13 +840,17 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta sfc_name2(42) = 'albdifvis_lnd' sfc_name2(43) = 'albdifnir_lnd' sfc_name2(44) = 'emis_lnd' + sfc_name2(45) = 'emis_ice' + sfc_name2(46) = 'sncovr_ice' + sfc_name2(47) = 'snodi' ! snowd on ice portion of a cell + sfc_name2(48) = 'weasdi'! weasd on ice portion of a cell if (Model%use_cice_alb .or. Model%lsm == Model%lsm_ruc) then - sfc_name2(45) = 'albdirvis_ice' - sfc_name2(46) = 'albdifvis_ice' - sfc_name2(47) = 'albdirnir_ice' - sfc_name2(48) = 'albdifnir_ice' -! sfc_name2(49) = 'sfalb_ice' + sfc_name2(49) = 'albdirvis_ice' + sfc_name2(50) = 'albdifvis_ice' + sfc_name2(51) = 'albdirnir_ice' + sfc_name2(52) = 'albdifnir_ice' +! sfc_name2(53) = 'sfalb_ice' endif if(Model%cplwav) then @@ -919,17 +919,11 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta sfc_name2(nvar_s2m+25) = 'tsnow_ice' sfc_name2(nvar_s2m+26) = 'snowfall_acc_land' sfc_name2(nvar_s2m+27) = 'snowfall_acc_ice' - sfc_name2(nvar_s2m+28) = 'sncovr_ice' - sfc_name2(nvar_s2m+29) = 'sfalb_lnd' - sfc_name2(nvar_s2m+30) = 'sfalb_lnd_bck' -! sfc_name2(nvar_s2m+31) = 'albdirvis_ice' -! sfc_name2(nvar_s2m+32) = 'albdirnir_ice' -! sfc_name2(nvar_s2m+33) = 'albdifvis_ice' -! sfc_name2(nvar_s2m+34) = 'albdifnir_ice' - sfc_name2(nvar_s2m+31) = 'sfalb_ice' - sfc_name2(nvar_s2m+32) = 'emis_ice' + sfc_name2(nvar_s2m+28) = 'sfalb_lnd' + sfc_name2(nvar_s2m+29) = 'sfalb_lnd_bck' + sfc_name2(nvar_s2m+30) = 'sfalb_ice' if (Model%rdlai) then - sfc_name2(nvar_s2m+33) = 'lai' + sfc_name2(nvar_s2m+31) = 'lai' endif else if (Model%lsm == Model%lsm_ruc .and. Model%rdlai) then sfc_name2(nvar_s2m+19) = 'lai' @@ -971,12 +965,14 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta if (trim(sfc_name2(num)) == 'sncovr'.or. trim(sfc_name2(num)) == 'tsfcl' .or. trim(sfc_name2(num)) == 'zorll' & .or. trim(sfc_name2(num)) == 'zorli' .or. trim(sfc_name2(num)) == 'zorlwav' & .or. trim(sfc_name2(num)) == 'snodl' .or. trim(sfc_name2(num)) == 'weasdl' & + .or. trim(sfc_name2(num)) == 'snodi' .or. trim(sfc_name2(num)) == 'weasdi' & .or. trim(sfc_name2(num)) == 'tsfc' .or. trim(sfc_name2(num)) == 'zorlw' & .or. trim(sfc_name2(num)) == 'albdirvis_lnd' .or. trim(sfc_name2(num)) == 'albdirnir_lnd' & .or. trim(sfc_name2(num)) == 'albdifvis_lnd' .or. trim(sfc_name2(num)) == 'albdifnir_lnd' & .or. trim(sfc_name2(num)) == 'albdirvis_ice' .or. trim(sfc_name2(num)) == 'albdirnir_ice' & .or. trim(sfc_name2(num)) == 'albdifvis_ice' .or. trim(sfc_name2(num)) == 'albdifnir_ice' & - .or. trim(sfc_name2(num)) == 'emis_lnd' ) then + .or. trim(sfc_name2(num)) == 'emis_lnd' .or. trim(sfc_name2(num)) == 'emis_ice' & + .or. trim(sfc_name2(num)) == 'sncovr_ice') then if(is_lsoil) then call register_restart_field(Sfc_restart, sfc_name2(num), var2_p, dimensions=(/'lat','lon'/), is_optional=.true.) else @@ -1169,13 +1165,17 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta Sfcprop(nb)%albdirnir_lnd(ix) = sfc_var2(i,j,41) Sfcprop(nb)%albdifvis_lnd(ix) = sfc_var2(i,j,42) Sfcprop(nb)%albdifnir_lnd(ix) = sfc_var2(i,j,43) - Sfcprop(nb)%emis_lnd(ix) = sfc_var2(i,j,44) + Sfcprop(nb)%emis_lnd(ix) = sfc_var2(i,j,44) + Sfcprop(nb)%emis_ice(ix) = sfc_var2(i,j,45) + Sfcprop(nb)%sncovr_ice(ix) = sfc_var2(i,j,46) + Sfcprop(nb)%snodi(ix) = sfc_var2(i,j,47) !--- snodi (snowd on ice portion of a cell) + Sfcprop(nb)%weasdi(ix) = sfc_var2(i,j,48) !--- weasdi (weasd on ice portion of a cell) if (Model%use_cice_alb .or. Model%lsm == Model%lsm_ruc) then - Sfcprop(nb)%albdirvis_ice(ix) = sfc_var2(i,j,45) - Sfcprop(nb)%albdifvis_ice(ix) = sfc_var2(i,j,46) - Sfcprop(nb)%albdirnir_ice(ix) = sfc_var2(i,j,47) - Sfcprop(nb)%albdifnir_ice(ix) = sfc_var2(i,j,48) -! Sfcprop(nb)%sfalb_ice(ix) = sfc_var2(i,j,49) + Sfcprop(nb)%albdirvis_ice(ix) = sfc_var2(i,j,49) + Sfcprop(nb)%albdifvis_ice(ix) = sfc_var2(i,j,50) + Sfcprop(nb)%albdirnir_ice(ix) = sfc_var2(i,j,51) + Sfcprop(nb)%albdifnir_ice(ix) = sfc_var2(i,j,52) +! Sfcprop(nb)%sfalb_ice(ix) = sfc_var2(i,j,53) endif if(Model%cplwav) then Sfcprop(nb)%zorlwav(ix) = sfc_var2(i,j,nvar_s2m) !--- (zorl from wave model) @@ -1280,7 +1280,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta endif endif - if (warm_start) then + if (warm_start .and. Model%kdt > 1) then Sfcprop(nb)%slmsk(ix) = sfc_var2(i,j,1) !--- slmsk endif @@ -1340,17 +1340,11 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta Sfcprop(nb)%tsnow_ice(ix) = sfc_var2(i,j,nvar_s2m+25) Sfcprop(nb)%snowfallac_land(ix) = sfc_var2(i,j,nvar_s2m+26) Sfcprop(nb)%snowfallac_ice(ix) = sfc_var2(i,j,nvar_s2m+27) - Sfcprop(nb)%sncovr_ice(ix) = sfc_var2(i,j,nvar_s2m+28) - Sfcprop(nb)%sfalb_lnd(ix) = sfc_var2(i,j,nvar_s2m+29) - Sfcprop(nb)%sfalb_lnd_bck(ix) = sfc_var2(i,j,nvar_s2m+30) -! Sfcprop(nb)%albdirvis_ice(ix) = sfc_var2(i,j,nvar_s2m+31) -! Sfcprop(nb)%albdirnir_ice(ix) = sfc_var2(i,j,nvar_s2m+32) -! Sfcprop(nb)%albdifvis_ice(ix) = sfc_var2(i,j,nvar_s2m+33) -! Sfcprop(nb)%albdifnir_ice(ix) = sfc_var2(i,j,nvar_s2m+34) - Sfcprop(nb)%sfalb_ice(ix) = sfc_var2(i,j,nvar_s2m+31) - Sfcprop(nb)%emis_ice(ix) = sfc_var2(i,j,nvar_s2m+32) + Sfcprop(nb)%sfalb_lnd(ix) = sfc_var2(i,j,nvar_s2m+28) + Sfcprop(nb)%sfalb_lnd_bck(ix) = sfc_var2(i,j,nvar_s2m+29) + Sfcprop(nb)%sfalb_ice(ix) = sfc_var2(i,j,nvar_s2m+30) if (Model%rdlai) then - Sfcprop(nb)%xlaixy(ix) = sfc_var2(i,j,nvar_s2m+33) + Sfcprop(nb)%xlaixy(ix) = sfc_var2(i,j,nvar_s2m+31) endif else if (Model%lsm == Model%lsm_ruc) then ! Initialize RUC snow cover on ice from snow cover @@ -1518,8 +1512,29 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta enddo endif + if (sfc_var2(i,j,45) < -9990.0_r8) then + if (Model%me == Model%master ) call mpp_error(NOTE, 'gfs_driver::surface_props_input - computing emis_ice') +!$omp parallel do default(shared) private(nb, ix) + do nb = 1, Atm_block%nblks + do ix = 1, Atm_block%blksz(nb) + Sfcprop(nb)%emis_ice(ix) = 0.96 + enddo + enddo + endif + + if (sfc_var2(i,j,46) < -9990.0_r8 .and. Model%lsm /= Model%lsm_ruc) then + if (Model%me == Model%master ) call mpp_error(NOTE, 'gfs_driver::surface_props_input - computing sncovr_ice') +!$omp parallel do default(shared) private(nb, ix) + do nb = 1, Atm_block%nblks + do ix = 1, Atm_block%blksz(nb) +! Sfcprop(nb)%sncovr_ice(ix) = Sfcprop(nb)%sncovr(ix) + Sfcprop(nb)%sncovr_ice(ix) = zero + enddo + enddo + endif + if (Model%use_cice_alb) then - if (sfc_var2(i,j,45) < -9990.0_r8) then + if (sfc_var2(i,j,49) < -9990.0_r8) then !$omp parallel do default(shared) private(nb, ix) do nb = 1, Atm_block%nblks do ix = 1, Atm_block%blksz(nb) @@ -1629,7 +1644,7 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta integer :: is, ie integer, allocatable, dimension(:) :: buffer - nvar2m = 44 + nvar2m = 48 if (Model%use_cice_alb .or. Model%lsm == Model%lsm_ruc) then nvar2m = nvar2m + 4 ! nvar2m = nvar2m + 5 @@ -1638,9 +1653,9 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta nvar2o = 18 if (Model%lsm == Model%lsm_ruc) then if (Model%rdlai) then - nvar2r = 15 + nvar2r = 13 else - nvar2r = 14 + nvar2r = 12 endif nvar3 = 5 else @@ -1819,13 +1834,17 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta sfc_name2(42) = 'albdifvis_lnd' sfc_name2(43) = 'albdifnir_lnd' sfc_name2(44) = 'emis_lnd' + sfc_name2(45) = 'emis_ice' + sfc_name2(46) = 'sncovr_ice' + sfc_name2(47) = 'snodi' !snowd on ice portion of a cell + sfc_name2(48) = 'weasdi'!weasd on ice portion of a cell if (Model%use_cice_alb .or. Model%lsm == Model%lsm_ruc) then - sfc_name2(45) = 'albdirvis_ice' - sfc_name2(46) = 'albdifvis_ice' - sfc_name2(47) = 'albdirnir_ice' - sfc_name2(48) = 'albdifnir_ice' -! sfc_name2(49) = 'sfalb_ice' + sfc_name2(49) = 'albdirvis_ice' + sfc_name2(50) = 'albdifvis_ice' + sfc_name2(51) = 'albdirnir_ice' + sfc_name2(52) = 'albdifnir_ice' +! sfc_name2(53) = 'sfalb_ice' endif if (Model%cplwav) then @@ -1860,17 +1879,11 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta sfc_name2(nvar2m+25) = 'tsnow_ice' sfc_name2(nvar2m+26) = 'snowfall_acc_land' sfc_name2(nvar2m+27) = 'snowfall_acc_ice' - sfc_name2(nvar2m+28) = 'sncovr_ice' - sfc_name2(nvar2m+29) = 'sfalb_lnd' - sfc_name2(nvar2m+30) = 'sfalb_lnd_bck' -! sfc_name2(nvar2m+31) = 'albdirvis_ice' -! sfc_name2(nvar2m+32) = 'albdirnir_ice' -! sfc_name2(nvar2m+33) = 'albdifvis_ice' -! sfc_name2(nvar2m+34) = 'albdifnir_ice' - sfc_name2(nvar2m+31) = 'sfalb_ice' - sfc_name2(nvar2m+32) = 'emis_ice' + sfc_name2(nvar2m+28) = 'sfalb_lnd' + sfc_name2(nvar2m+29) = 'sfalb_lnd_bck' + sfc_name2(nvar2m+30) = 'sfalb_ice' if (Model%rdlai) then - sfc_name2(nvar2m+33) = 'lai' + sfc_name2(nvar2m+31) = 'lai' endif else if(Model%lsm == Model%lsm_noahmp) then ! Only needed when Noah MP LSM is used - 29 2D @@ -1912,12 +1925,14 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta if (trim(sfc_name2(num)) == 'sncovr' .or. trim(sfc_name2(num)) == 'tsfcl' .or.trim(sfc_name2(num)) == 'zorll' & .or. trim(sfc_name2(num)) == 'zorli' .or.trim(sfc_name2(num)) == 'zorlwav' & .or. trim(sfc_name2(num)) == 'snodl' .or. trim(sfc_name2(num)) == 'weasdl' & + .or. trim(sfc_name2(num)) == 'snodi' .or. trim(sfc_name2(num)) == 'weasdi' & .or. trim(sfc_name2(num)) == 'tsfc' .or. trim(sfc_name2(num)) == 'zorlw' & .or. trim(sfc_name2(num)) == 'albdirvis_lnd' .or. trim(sfc_name2(num)) == 'albdirnir_lnd' & .or. trim(sfc_name2(num)) == 'albdifvis_lnd' .or. trim(sfc_name2(num)) == 'albdifnir_lnd' & .or. trim(sfc_name2(num)) == 'albdirvis_ice' .or. trim(sfc_name2(num)) == 'albdirnir_ice' & .or. trim(sfc_name2(num)) == 'albdifvis_ice' .or. trim(sfc_name2(num)) == 'albdifnir_ice' & - .or. trim(sfc_name2(num)) == 'emis_lnd' ) then + .or. trim(sfc_name2(num)) == 'emis_lnd' .or. trim(sfc_name2(num)) == 'emis_ice' & + .or. trim(sfc_name2(num)) == 'sncovr_ice' ) then call register_restart_field(Sfc_restart, sfc_name2(num), var2_p, dimensions=(/'xaxis_1','yaxis_1','Time '/), is_optional=.true.) else call register_restart_field(Sfc_restart, sfc_name2(num), var2_p, dimensions=(/'xaxis_1', 'yaxis_1', 'Time '/) ) @@ -2062,12 +2077,16 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta sfc_var2(i,j,42) = Sfcprop(nb)%albdifvis_lnd(ix) sfc_var2(i,j,43) = Sfcprop(nb)%albdifnir_lnd(ix) sfc_var2(i,j,44) = Sfcprop(nb)%emis_lnd(ix) + sfc_var2(i,j,45) = Sfcprop(nb)%emis_ice(ix) + sfc_var2(i,j,46) = Sfcprop(nb)%sncovr_ice(ix) + sfc_var2(i,j,47) = Sfcprop(nb)%snodi(ix) !--- snodi (snowd on ice) + sfc_var2(i,j,48) = Sfcprop(nb)%weasdi(ix) !--- weasdi (weasd on ice) if (Model%use_cice_alb .or. Model%lsm == Model%lsm_ruc) then - sfc_var2(i,j,45) = Sfcprop(nb)%albdirvis_ice(ix) - sfc_var2(i,j,46) = Sfcprop(nb)%albdifvis_ice(ix) - sfc_var2(i,j,47) = Sfcprop(nb)%albdirnir_ice(ix) - sfc_var2(i,j,48) = Sfcprop(nb)%albdifnir_ice(ix) -! sfc_var2(i,j,49) = Sfcprop(nb)%sfalb_ice(ix) + sfc_var2(i,j,49) = Sfcprop(nb)%albdirvis_ice(ix) + sfc_var2(i,j,50) = Sfcprop(nb)%albdifvis_ice(ix) + sfc_var2(i,j,51) = Sfcprop(nb)%albdirnir_ice(ix) + sfc_var2(i,j,52) = Sfcprop(nb)%albdifnir_ice(ix) +! sfc_var2(i,j,53) = Sfcprop(nb)%sfalb_ice(ix) endif if (Model%cplwav) then sfc_var2(i,j,nvar2m) = Sfcprop(nb)%zorlwav(ix) !--- zorlwav (zorl from wav) @@ -2105,17 +2124,11 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta sfc_var2(i,j,nvar2m+25) = Sfcprop(nb)%tsnow_ice(ix) sfc_var2(i,j,nvar2m+26) = Sfcprop(nb)%snowfallac_land(ix) sfc_var2(i,j,nvar2m+27) = Sfcprop(nb)%snowfallac_ice(ix) - sfc_var2(i,j,nvar2m+28) = Sfcprop(nb)%sncovr_ice(ix) - sfc_var2(i,j,nvar2m+29) = Sfcprop(nb)%sfalb_lnd(ix) - sfc_var2(i,j,nvar2m+30) = Sfcprop(nb)%sfalb_lnd_bck(ix) -! sfc_var2(i,j,nvar2m+31) = Sfcprop(nb)%albdirvis_ice(ix) -! sfc_var2(i,j,nvar2m+32) = Sfcprop(nb)%albdirnir_ice(ix) -! sfc_var2(i,j,nvar2m+33) = Sfcprop(nb)%albdifvis_ice(ix) -! sfc_var2(i,j,nvar2m+34) = Sfcprop(nb)%albdifnir_ice(ix) - sfc_var2(i,j,nvar2m+31) = Sfcprop(nb)%sfalb_ice(ix) - sfc_var2(i,j,nvar2m+32) = Sfcprop(nb)%emis_ice(ix) + sfc_var2(i,j,nvar2m+28) = Sfcprop(nb)%sfalb_lnd(ix) + sfc_var2(i,j,nvar2m+29) = Sfcprop(nb)%sfalb_lnd_bck(ix) + sfc_var2(i,j,nvar2m+30) = Sfcprop(nb)%sfalb_ice(ix) if (Model%rdlai) then - sfc_var2(i,j,nvar2m+33) = Sfcprop(nb)%xlaixy(ix) + sfc_var2(i,j,nvar2m+31) = Sfcprop(nb)%xlaixy(ix) endif else if (Model%lsm == Model%lsm_noahmp) then !--- Extra Noah MP variables @@ -2152,6 +2165,7 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta do k = 1,Model%kice sfc_var3ice(i,j,k) = Sfcprop(nb)%tiice(ix,k) !--- internal ice temperature + if (sfc_var3ice(i,j,k) < one) sfc_var3ice(i,j,k) = zero enddo if (Model%lsm == Model%lsm_noah .or. Model%lsm == Model%lsm_noahmp .or. Model%lsm == Model%lsm_noah_wrfv4) then