diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py index ea5557f0f..54b49d726 100755 --- a/ccpp/config/ccpp_prebuild_config.py +++ b/ccpp/config/ccpp_prebuild_config.py @@ -231,7 +231,6 @@ 'FV3/ccpp/physics/physics/sfc_cice.f' : [ 'slow_physics' ], 'FV3/ccpp/physics/physics/sfc_diff.f' : [ 'slow_physics' ], 'FV3/ccpp/physics/physics/sfc_drv.f' : [ 'slow_physics' ], - 'FV3/ccpp/physics/physics/sfc_noahmp_pre.F90' : [ 'slow_physics' ], 'FV3/ccpp/physics/physics/sfc_noahmp_drv.f' : [ 'slow_physics' ], 'FV3/ccpp/physics/physics/sfc_nst.f' : [ 'slow_physics' ], 'FV3/ccpp/physics/physics/sfc_ocean.F' : [ 'slow_physics' ], diff --git a/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_noahmp.xml b/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_noahmp.xml index 2868c8250..55dedad57 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_noahmp.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_noahmp.xml @@ -47,7 +47,6 @@ sfc_nst_pre sfc_nst sfc_nst_post - sfc_noahmp_pre noahmpdrv sfc_sice GFS_surface_loop_control_part2 diff --git a/gfsphysics/GFS_layer/GFS_physics_driver.F90 b/gfsphysics/GFS_layer/GFS_physics_driver.F90 index a18422c43..4220baa10 100644 --- a/gfsphysics/GFS_layer/GFS_physics_driver.F90 +++ b/gfsphysics/GFS_layer/GFS_physics_driver.F90 @@ -576,10 +576,6 @@ subroutine GFS_physics_driver & real(kind=kind_phys), allocatable, dimension(:,:) :: & savet, saveq, saveu, savev -!--- pass precip type from MP to Noah MP - real(kind=kind_phys), dimension(size(Grid%xlon,1)) :: & - rainn_mp, rainc_mp, snow_mp, graupel_mp, ice_mp - !--- GFDL modification for FV3 real(kind=kind_phys), dimension(size(Grid%xlon,1),Model%levs+1) ::& @@ -905,36 +901,6 @@ subroutine GFS_physics_driver & !CCPP: num3 = Model%ncnvc endif !*## CCPP ## -! -!## CCPP ##* initialization in GFS_typedefs.F90/tbd_create; calculation in sfc_noahmp_pre.F90/sfc_noahmp_pre_run, -! although similar variables are calculated in GFS_MP_generic_post_run using up-to-date values of Diag%X, -! which arguably makes more sense (the way it is done probably erroneously causes NoahMP to use 0 for -! these values after diagnostics are zeroed.) -! --- initization for those precip type used in Noah MP -! - if (Model%lsm == Model%lsm_noahmp) then - do i=1,im - rainn_mp(i) = zero - rainc_mp(i) = zero - snow_mp(i) = zero - graupel_mp(i) = zero - ice_mp(i) = zero - enddo -! --- get the amount of different precip type for Noah MP -! --- convert from m/dtp to mm/s - if (Model%imp_physics == Model%imp_physics_mg .or. & - Model%imp_physics == Model%imp_physics_gfdl) then - tem = one / (dtp*con_p001) - do i=1,im - rainn_mp(i) = tem * (Diag%rain(i)-Diag%rainc(i)) - rainc_mp(i) = tem * Diag%rainc(i) - snow_mp(i) = tem * Diag%snow(i) - graupel_mp(i) = tem * Diag%graupel(i) - ice_mp(i) = tem * Diag%ice(i) - enddo - endif - endif ! if (Model%lsm == Model%lsm_noahmp) -!*## CCPP ## !## CCPP ##* GFS_surface_generic.F90/GFS_surface_generic_pre_run ! --- set initial quantities for stochastic physics deltas @@ -1906,8 +1872,8 @@ subroutine GFS_physics_driver & Model%iopt_inf, Model%iopt_rad, Model%iopt_alb, & Model%iopt_snf, Model%iopt_tbot, Model%iopt_stc, & grid%xlat, xcosz, Model%yearlen, Model%julian, Model%imn,& - rainn_mp, rainc_mp, snow_mp, graupel_mp, ice_mp, & - + Sfcprop%drainncprv, Sfcprop%draincprv, Sfcprop%dsnowprv, & + Sfcprop%dgraupelprv, Sfcprop%diceprv, & ! --- in/outs: weasd3(:,1), snowd3(:,1), tsfc3(:,1), tprcp3(:,1), & Sfcprop%srflag, smsoil, stsoil, slsoil, Sfcprop%canopy, & @@ -5262,7 +5228,31 @@ subroutine GFS_physics_driver & !*## CCPP ## !## CCPP ##* GFS_MP_generic.F90/GFS_MP_generic_post_run Diag%rain(:) = Diag%rainc(:) + frain * rain1(:) - + +! --- get the amount of different precip type for Noah MP +! --- convert from m/dtp to mm/s + if (lsm==lsm_noahmp) then + if (Model%imp_physics == Model%imp_physics_mg .or. & + Model%imp_physics == Model%imp_physics_gfdl) then + !GJF: Should all precipitation rates have the same denominator below? + ! It appears that Diag%rain and Diag%rainc are on the dynamics time step, + ! but Diag%snow,graupel,ice are on the physics time step? This doesn't + ! matter as long as dtp=dtf (frain=1). + tem = 1.0 / (dtp*con_p001) + Sfcprop%draincprv(:) = tem * Diag%rainc(:) + Sfcprop%drainncprv(:) = tem * (frain * rain1(:)) + Sfcprop%dsnowprv(:) = tem * Diag%snow(:) + Sfcprop%dgraupelprv(:) = tem * Diag%graupel(:) + Sfcprop%diceprv(:) = tem * Diag%ice(:) + else + Sfcprop%draincprv(:) = 0.0 + Sfcprop%drainncprv(:) = 0.0 + Sfcprop%dsnowprv(:) = 0.0 + Sfcprop%dgraupelprv(:) = 0.0 + Sfcprop%diceprv(:) = 0.0 + endif + end if ! if (Model%lsm == Model%lsm_noahmp) + if (Model%cal_pre) then ! hchuang: add dominant precipitation type algorithm ! call calpreciptype (kdt, Model%nrcm, im, ix, levs, levs+1, & diff --git a/gfsphysics/GFS_layer/GFS_restart.F90 b/gfsphysics/GFS_layer/GFS_restart.F90 index a24cc0fc6..8e80f6f99 100644 --- a/gfsphysics/GFS_layer/GFS_restart.F90 +++ b/gfsphysics/GFS_layer/GFS_restart.F90 @@ -200,27 +200,27 @@ subroutine GFS_restart_populate (Restart, Model, Statein, Stateout, Sfcprop, & num = num + 1 Restart%name2d(num) = 'ruc_2d_raincprv' do nb = 1,nblks - Restart%data(nb,num)%var2p => Tbd(nb)%raincprv(:) + Restart%data(nb,num)%var2p => Sfcprop(nb)%raincprv(:) enddo num = num + 1 Restart%name2d(num) = 'ruc_2d_rainncprv' do nb = 1,nblks - Restart%data(nb,num)%var2p => Tbd(nb)%rainncprv(:) + Restart%data(nb,num)%var2p => Sfcprop(nb)%rainncprv(:) enddo num = num + 1 Restart%name2d(num) = 'ruc_2d_iceprv' do nb = 1,nblks - Restart%data(nb,num)%var2p => Tbd(nb)%iceprv(:) + Restart%data(nb,num)%var2p => Sfcprop(nb)%iceprv(:) enddo num = num + 1 Restart%name2d(num) = 'ruc_2d_snowprv' do nb = 1,nblks - Restart%data(nb,num)%var2p => Tbd(nb)%snowprv(:) + Restart%data(nb,num)%var2p => Sfcprop(nb)%snowprv(:) enddo num = num + 1 Restart%name2d(num) = 'ruc_2d_graupelprv' do nb = 1,nblks - Restart%data(nb,num)%var2p => Tbd(nb)%graupelprv(:) + Restart%data(nb,num)%var2p => Sfcprop(nb)%graupelprv(:) enddo endif ! MYNN SFC diff --git a/gfsphysics/GFS_layer/GFS_typedefs.F90 b/gfsphysics/GFS_layer/GFS_typedefs.F90 index 6b2402039..09bb52fa5 100644 --- a/gfsphysics/GFS_layer/GFS_typedefs.F90 +++ b/gfsphysics/GFS_layer/GFS_typedefs.F90 @@ -370,6 +370,21 @@ module GFS_typedefs real (kind=kind_phys), pointer :: chs2(:) => null() !exch coeff for heat at 2m real (kind=kind_phys), pointer :: cqs2(:) => null() !exch coeff for moisture at 2m real (kind=kind_phys), pointer :: lh(:) => null() !latent heating at the surface + + !---- precipitation amounts from previous time step for RUC LSM + real (kind=kind_phys), pointer :: raincprv (:) => null() !< explicit rainfall from previous timestep + real (kind=kind_phys), pointer :: rainncprv (:) => null() !< convective_precipitation_amount from previous timestep + real (kind=kind_phys), pointer :: iceprv (:) => null() !< ice amount from previous timestep + real (kind=kind_phys), pointer :: snowprv (:) => null() !< snow amount from previous timestep + real (kind=kind_phys), pointer :: graupelprv(:) => null() !< graupel amount from previous timestep + + !---- precipitation rates from previous time step for NoahMP LSM + real (kind=kind_phys), pointer :: draincprv (:) => null() !< convective precipitation rate from previous timestep + real (kind=kind_phys), pointer :: drainncprv (:) => null() !< explicit rainfall rate from previous timestep + real (kind=kind_phys), pointer :: diceprv (:) => null() !< ice precipitation rate from previous timestep + real (kind=kind_phys), pointer :: dsnowprv (:) => null() !< snow precipitation rate from previous timestep + real (kind=kind_phys), pointer :: dgraupelprv(:) => null() !< graupel precipitation rate from previous timestep + #endif contains @@ -1192,20 +1207,6 @@ module GFS_typedefs real (kind=kind_phys), pointer :: prevst (:,:) => null() !< real (kind=kind_phys), pointer :: prevsq (:,:) => null() !< integer, pointer :: cactiv (:) => null() !< convective activity memory contour - - !---- precipitation amounts from previous time step for RUC LSM - real (kind=kind_phys), pointer :: raincprv (:) => null() !< explicit rainfall from previous timestep - real (kind=kind_phys), pointer :: rainncprv (:) => null() !< convective_precipitation_amount from previous timestep - real (kind=kind_phys), pointer :: iceprv (:) => null() !< ice amount from previous timestep - real (kind=kind_phys), pointer :: snowprv (:) => null() !< snow amount from previous timestep - real (kind=kind_phys), pointer :: graupelprv(:) => null() !< graupel amount from previous timestep - - !---- precipitation rates from previous time step for NoahMP LSM - real (kind=kind_phys), pointer :: draincprv (:) => null() !< convective precipitation rate from previous timestep - real (kind=kind_phys), pointer :: drainncprv (:) => null() !< explicit rainfall rate from previous timestep - real (kind=kind_phys), pointer :: diceprv (:) => null() !< ice precipitation rate from previous timestep - real (kind=kind_phys), pointer :: dsnowprv (:) => null() !< snow precipitation rate from previous timestep - real (kind=kind_phys), pointer :: dgraupelprv(:) => null() !< graupel precipitation rate from previous timestep !--- MYNN prognostic variables that can't be in the Intdiag or Interstitial DDTs real (kind=kind_phys), pointer :: CLDFRA_BL (:,:) => null() ! @@ -2207,7 +2208,18 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%dt_cool = zero Sfcprop%qrain = zero endif - + if (Model%lsm == Model%lsm_ruc .or. Model%lsm == Model%lsm_noahmp) then + allocate(Sfcprop%raincprv (IM)) + allocate(Sfcprop%rainncprv (IM)) + allocate(Sfcprop%iceprv (IM)) + allocate(Sfcprop%snowprv (IM)) + allocate(Sfcprop%graupelprv(IM)) + Sfcprop%raincprv = clear_val + Sfcprop%rainncprv = clear_val + Sfcprop%iceprv = clear_val + Sfcprop%snowprv = clear_val + Sfcprop%graupelprv = clear_val + end if ! Noah MP allocate and init when used ! if (Model%lsm == Model%lsm_noahmp ) then @@ -2290,7 +2302,19 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%tsnoxy = clear_val Sfcprop%smoiseq = clear_val Sfcprop%zsnsoxy = clear_val - + + allocate(Sfcprop%draincprv (IM)) + allocate(Sfcprop%drainncprv (IM)) + allocate(Sfcprop%diceprv (IM)) + allocate(Sfcprop%dsnowprv (IM)) + allocate(Sfcprop%dgraupelprv(IM)) + + Sfcprop%draincprv = clear_val + Sfcprop%drainncprv = clear_val + Sfcprop%diceprv = clear_val + Sfcprop%dsnowprv = clear_val + Sfcprop%dgraupelprv = clear_val + endif #ifdef CCPP @@ -2330,6 +2354,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%xlaixy (IM)) Sfcprop%xlaixy = clear_val end if + end if if (Model%do_mynnsfclay) then ! For MYNN surface layer scheme @@ -2359,6 +2384,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%conv_act(IM)) Sfcprop%conv_act = zero end if + #endif end subroutine sfcprop_create @@ -4880,32 +4906,6 @@ subroutine tbd_create (Tbd, IM, Model) Tbd%cactiv = zero end if - if (Model%lsm == Model%lsm_ruc) then - allocate(Tbd%raincprv (IM)) - allocate(Tbd%rainncprv (IM)) - allocate(Tbd%iceprv (IM)) - allocate(Tbd%snowprv (IM)) - allocate(Tbd%graupelprv(IM)) - Tbd%raincprv = clear_val - Tbd%rainncprv = clear_val - Tbd%iceprv = clear_val - Tbd%snowprv = clear_val - Tbd%graupelprv = clear_val - end if - - if (Model%lsm == Model%lsm_noahmp) then - allocate(Tbd%draincprv (IM)) - allocate(Tbd%drainncprv (IM)) - allocate(Tbd%diceprv (IM)) - allocate(Tbd%dsnowprv (IM)) - allocate(Tbd%dgraupelprv(IM)) - Tbd%draincprv = clear_val - Tbd%drainncprv = clear_val - Tbd%diceprv = clear_val - Tbd%dsnowprv = clear_val - Tbd%dgraupelprv = clear_val - end if - !--- MYNN variables: if (Model%do_mynnedmf) then !print*,"Allocating all MYNN-EDMF variables:" diff --git a/gfsphysics/GFS_layer/GFS_typedefs.meta b/gfsphysics/GFS_layer/GFS_typedefs.meta index b6c5cead2..f84e6d095 100644 --- a/gfsphysics/GFS_layer/GFS_typedefs.meta +++ b/gfsphysics/GFS_layer/GFS_typedefs.meta @@ -1269,6 +1269,76 @@ dimensions = (horizontal_dimension) type = real kind = kind_phys +[raincprv] + standard_name = lwe_thickness_of_convective_precipitation_amount_from_previous_timestep + long_name = convective_precipitation_amount from previous timestep + units = m + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[rainncprv] + standard_name = lwe_thickness_of_explicit_rainfall_amount_from_previous_timestep + long_name = explicit rainfall from previous timestep + units = m + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[iceprv] + standard_name = lwe_thickness_of_ice_amount_from_previous_timestep + long_name = ice amount from previous timestep + units = m + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[snowprv] + standard_name = lwe_thickness_of_snow_amount_from_previous_timestep + long_name = snow amount from previous timestep + units = m + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[graupelprv] + standard_name = lwe_thickness_of_graupel_amount_from_previous_timestep + long_name = graupel amount from previous timestep + units = m + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[draincprv] + standard_name = convective_precipitation_rate_from_previous_timestep + long_name = convective precipitation rate from previous timestep + units = mm s-1 + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[drainncprv] + standard_name = explicit_rainfall_rate_from_previous_timestep + long_name = explicit rainfall rate previous timestep + units = mm s-1 + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[diceprv] + standard_name = ice_precipitation_rate_from_previous_timestep + long_name = ice precipitation rate from previous timestep + units = mm s-1 + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[dsnowprv] + standard_name = snow_precipitation_rate_from_previous_timestep + long_name = snow precipitation rate from previous timestep + units = mm s-1 + dimensions = (horizontal_dimension) + type = real + kind = kind_phys +[dgraupelprv] + standard_name = graupel_precipitation_rate_from_previous_timestep + long_name = graupel precipitation rate from previous timestep + units = mm s-1 + dimensions = (horizontal_dimension) + type = real + kind = kind_phys ######################################################################## [ccpp-arg-table] @@ -4292,76 +4362,6 @@ units = none dimensions = (horizontal_dimension) type = integer -[raincprv] - standard_name = lwe_thickness_of_convective_precipitation_amount_from_previous_timestep - long_name = convective_precipitation_amount from previous timestep - units = m - dimensions = (horizontal_dimension) - type = real - kind = kind_phys -[rainncprv] - standard_name = lwe_thickness_of_explicit_rainfall_amount_from_previous_timestep - long_name = explicit rainfall from previous timestep - units = m - dimensions = (horizontal_dimension) - type = real - kind = kind_phys -[iceprv] - standard_name = lwe_thickness_of_ice_amount_from_previous_timestep - long_name = ice amount from previous timestep - units = m - dimensions = (horizontal_dimension) - type = real - kind = kind_phys -[snowprv] - standard_name = lwe_thickness_of_snow_amount_from_previous_timestep - long_name = snow amount from previous timestep - units = m - dimensions = (horizontal_dimension) - type = real - kind = kind_phys -[graupelprv] - standard_name = lwe_thickness_of_graupel_amount_from_previous_timestep - long_name = graupel amount from previous timestep - units = m - dimensions = (horizontal_dimension) - type = real - kind = kind_phys -[draincprv] - standard_name = convective_precipitation_rate_from_previous_timestep - long_name = convective precipitation rate from previous timestep - units = mm s-1 - dimensions = (horizontal_dimension) - type = real - kind = kind_phys -[drainncprv] - standard_name = explicit_rainfall_rate_from_previous_timestep - long_name = explicit rainfall rate previous timestep - units = mm s-1 - dimensions = (horizontal_dimension) - type = real - kind = kind_phys -[diceprv] - standard_name = ice_precipitation_rate_from_previous_timestep - long_name = ice precipitation rate from previous timestep - units = mm s-1 - dimensions = (horizontal_dimension) - type = real - kind = kind_phys -[dsnowprv] - standard_name = snow_precipitation_rate_from_previous_timestep - long_name = snow precipitation rate from previous timestep - units = mm s-1 - dimensions = (horizontal_dimension) - type = real - kind = kind_phys -[dgraupelprv] - standard_name = graupel_precipitation_rate_from_previous_timestep - long_name = graupel precipitation rate from previous timestep - units = mm s-1 - dimensions = (horizontal_dimension) - type = real - kind = kind_phys [CLDFRA_BL] standard_name = subgrid_cloud_fraction_pbl long_name = subgrid cloud fraction from PBL scheme