From 24d24bba8d414b61a217e9ba9a59c9410553fb6e Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Wed, 14 Jun 2023 14:29:13 -0400 Subject: [PATCH 1/2] update the SCM to work with the ccpp/physics PR#26 in ufs/dev --- .gitmodules | 6 +- ccpp/config/ccpp_prebuild_config.py | 1 + ccpp/physics | 2 +- ccpp/suites/suite_SCM_HRRR.xml | 1 + scm/src/CCPP_typedefs.F90 | 3 - scm/src/CCPP_typedefs.meta | 6 - scm/src/GFS_typedefs.F90 | 263 ++++++++++++++++- scm/src/GFS_typedefs.meta | 428 +++++++++++++++++++++++++++- scm/src/scm_physical_constants.F90 | 2 + scm/src/scm_physical_constants.meta | 7 + 10 files changed, 689 insertions(+), 30 deletions(-) diff --git a/.gitmodules b/.gitmodules index dc0798c32..f06b22f2e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,8 +4,10 @@ branch = main [submodule "ccpp-physics"] path = ccpp/physics - url = https://github.com/NCAR/ccpp-physics - branch = main + #url = https://github.com/NCAR/ccpp-physics + #branch = main + url = https://github.com/grantfirl/ccpp-physics + branch = ufs-dev-PR26 [submodule "CMakeModules"] path = CMakeModules url = https://github.com/noaa-emc/CMakeModules diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py index 940a8a36f..4a85f2121 100755 --- a/ccpp/config/ccpp_prebuild_config.py +++ b/ccpp/config/ccpp_prebuild_config.py @@ -186,6 +186,7 @@ 'ccpp/physics/physics/lsm_noah.f' , 'ccpp/physics/physics/noahmpdrv.F90' , 'ccpp/physics/physics/flake_driver.F90' , + 'ccpp/physics/physics/clm_lake.f90' , 'ccpp/physics/physics/sfc_nst_pre.f' , 'ccpp/physics/physics/sfc_nst.f' , 'ccpp/physics/physics/sfc_nst_post.f' , diff --git a/ccpp/physics b/ccpp/physics index d8a5b1fe1..4d691081e 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit d8a5b1fe1046c818f5e50180f8c1d22d8bff69eb +Subproject commit 4d691081e46d17d5b77b6aa7714ba2a369088ae4 diff --git a/ccpp/suites/suite_SCM_HRRR.xml b/ccpp/suites/suite_SCM_HRRR.xml index 074e7ef13..bb0d28ceb 100644 --- a/ccpp/suites/suite_SCM_HRRR.xml +++ b/ccpp/suites/suite_SCM_HRRR.xml @@ -46,6 +46,7 @@ sfc_nst sfc_nst_post lsm_ruc + clm_lake GFS_surface_loop_control_part2 diff --git a/scm/src/CCPP_typedefs.F90 b/scm/src/CCPP_typedefs.F90 index 2dd3ae706..65bf1239d 100644 --- a/scm/src/CCPP_typedefs.F90 +++ b/scm/src/CCPP_typedefs.F90 @@ -181,7 +181,6 @@ module CCPP_typedefs integer, pointer :: idxday(:) => null() !< logical, pointer :: icy(:) => null() !< logical, pointer :: lake(:) => null() !< - logical, pointer :: use_flake(:) => null() !< logical, pointer :: ocean(:) => null() !< integer :: ipr !< integer, pointer :: islmsk(:) => null() !< @@ -576,7 +575,6 @@ subroutine gfs_interstitial_create (Interstitial, IM, Model) allocate (Interstitial%idxday (IM)) allocate (Interstitial%icy (IM)) allocate (Interstitial%lake (IM)) - allocate (Interstitial%use_flake (IM)) allocate (Interstitial%ocean (IM)) allocate (Interstitial%islmsk (IM)) allocate (Interstitial%islmsk_cice (IM)) @@ -1255,7 +1253,6 @@ subroutine gfs_interstitial_phys_reset (Interstitial, Model) Interstitial%dry = .false. Interstitial%icy = .false. Interstitial%lake = .false. - Interstitial%use_flake = .false. Interstitial%ocean = .false. Interstitial%islmsk = 0 Interstitial%islmsk_cice = 0 diff --git a/scm/src/CCPP_typedefs.meta b/scm/src/CCPP_typedefs.meta index b99e76943..cca5a83b7 100644 --- a/scm/src/CCPP_typedefs.meta +++ b/scm/src/CCPP_typedefs.meta @@ -1238,12 +1238,6 @@ units = flag dimensions = (horizontal_loop_extent) type = logical -[use_flake] - standard_name = flag_for_using_flake - long_name = flag indicating lake points using flake model - units = flag - dimensions = (horizontal_loop_extent) - type = logical [ocean] standard_name = flag_nonzero_ocean_surface_fraction long_name = flag indicating presence of some ocean surface area fraction diff --git a/scm/src/GFS_typedefs.F90 b/scm/src/GFS_typedefs.F90 index 3b038ff86..2049455da 100644 --- a/scm/src/GFS_typedefs.F90 +++ b/scm/src/GFS_typedefs.F90 @@ -201,8 +201,26 @@ module GFS_typedefs real (kind=kind_phys), pointer :: slmsk (:) => null() !< sea/land mask array (sea:0,land:1,sea-ice:2) real (kind=kind_phys), pointer :: oceanfrac(:) => null() !< ocean fraction [0:1] real (kind=kind_phys), pointer :: landfrac(:) => null() !< land fraction [0:1] + +!--- In (lakes) real (kind=kind_phys), pointer :: lakefrac(:) => null() !< lake fraction [0:1] real (kind=kind_phys), pointer :: lakedepth(:) => null() !< lake depth [ m ] + real (kind=kind_phys), pointer :: clm_lakedepth(:) => null() !< clm internal lake depth [ m ] + integer, pointer :: use_lake_model(:) => null()!1=run lake, 2=run lake&nsst, 0=no lake + real (kind=kind_phys), pointer :: lake_t2m (:) => null() !< 2 meter temperature from CLM Lake model + real (kind=kind_phys), pointer :: lake_q2m (:) => null() !< 2 meter humidity from CLM Lake model + + real (kind=kind_phys), pointer :: h_ML(:) => null() !Mixed Layer depth of lakes [m] + real (kind=kind_phys), pointer :: t_ML(:) => null() !Mixing layer temperature in K + real (kind=kind_phys), pointer :: t_mnw(:) => null() !Mean temperature of the water column [K] + real (kind=kind_phys), pointer :: h_talb(:) => null() !the thermally active layer depth of the bottom sediments [m] + real (kind=kind_phys), pointer :: t_talb(:) => null() !Temperature at the bottom of the sediment upper layer [K] + real (kind=kind_phys), pointer :: t_bot1(:) => null() !Temperature at the water-bottom sediment interface [K] + real (kind=kind_phys), pointer :: t_bot2(:) => null() !Temperature for bottom layer of water [K] + real (kind=kind_phys), pointer :: c_t(:) => null() !Shape factor of water temperature vertical profile + real (kind=kind_phys), pointer :: T_snow(:) => null() !temperature of snow on a lake [K] + real (kind=kind_phys), pointer :: T_ice(:) => null() !temperature of ice on a lake [K] + real (kind=kind_phys), pointer :: tsfc (:) => null() !< surface air temperature in K real (kind=kind_phys), pointer :: vegtype_frac (:,:) => null() !< fractions [0:1] of veg. categories real (kind=kind_phys), pointer :: soiltype_frac(:,:) => null() !< fractions [0:1] of soil categories @@ -401,6 +419,36 @@ module GFS_typedefs 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 + ! CLM Lake model internal variables: + real (kind=kind_phys), pointer :: lake_albedo(:) => null() ! + real (kind=kind_phys), pointer :: lake_z3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_dz3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_soil_watsat3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_csol3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_soil_tkmg3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_soil_tkdry3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_soil_tksatu3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_h2osno2d(:) => null() ! + real (kind=kind_phys), pointer :: lake_sndpth2d(:) => null() ! + real (kind=kind_phys), pointer :: lake_snl2d(:) => null() ! + real (kind=kind_phys), pointer :: lake_snow_z3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_snow_dz3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_snow_zi3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_h2osoi_vol3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_h2osoi_liq3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_h2osoi_ice3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_tsfc(:) => null() ! + real (kind=kind_phys), pointer :: lake_t_soisno3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_t_lake3d(:,:) => null() ! + real (kind=kind_phys), pointer :: lake_savedtke12d(:)=> null() ! + real (kind=kind_phys), pointer :: lake_icefrac3d(:,:)=> null() + real (kind=kind_phys), pointer :: lake_rho0(:)=> null() + real (kind=kind_phys), pointer :: lake_ht(:)=> null() + real (kind=kind_phys), pointer :: lake_clay3d(:,:) => null() + real (kind=kind_phys), pointer :: lake_sand3d(:,:) => null() + integer, pointer :: lake_is_salty(:) => null() + integer, pointer :: lake_cannot_freeze(:) => null() + real (kind=kind_phys), pointer :: clm_lake_initialized(:) => null() !< lakeini was called !--- aerosol surface emissions for Thompson microphysics & smoke dust real (kind=kind_phys), pointer :: emdust (:) => null() !< instantaneous dust emission real (kind=kind_phys), pointer :: emseas (:) => null() !< instantaneous sea salt emission @@ -1004,8 +1052,24 @@ module GFS_typedefs integer :: ntsflg !< flag for updating skin temperature in the GFDL surface layer scheme real(kind=kind_phys) :: sfenth !< enthalpy flux factor 0 zot via charnock ..>0 zot enhanced>15m/s -!--- flake model parameters - integer :: lkm !< flag for flake model +!--- lake model parameters + integer :: lkm !< =0 no lake, =1 lake, =2 lake&nsst + integer :: iopt_lake !< =1 flake, =2 clm lake + integer :: iopt_lake_flake = 1 + integer :: iopt_lake_clm = 2 + real(kind_phys) :: lakedepth_threshold !< lakedepth must be GREATER than this value to enable a lake model + real(kind_phys) :: lakefrac_threshold !< lakefrac must be GREATER than this value to enable a lake model + logical :: use_lake2m !< use 2m T & Q calculated by the lake model + +!--- clm lake model parameters + integer :: nlevlake_clm_lake !< Number of lake levels for clm lake model + integer :: nlevsoil_clm_lake !< Number of soil levels for clm lake model + integer :: nlevsnow_clm_lake !< Number of snow levels for clm lake model + integer :: nlevsnowsoil_clm_lake !< -nlevsnow:nlevsoil dimensioned variables + integer :: nlevsnowsoil1_clm_lake !< -nlevsnow+1:nlevsoil dimensioned variables + real(kind_phys) :: clm_lake_depth_default !< minimum lake elevation in clm lake model + logical :: clm_lake_use_lakedepth !< initialize lake from lakedepth + logical :: clm_lake_debug !< verbose debugging in clm_lake !--- tuning parameters for physical parameterizations logical :: ras !< flag for ras convection scheme @@ -1200,6 +1264,7 @@ module GFS_typedefs !< nstf_name(5) : zsea2 in mm !--- fractional grid logical :: frac_grid !< flag for fractional grid + logical :: frac_ice !< flag for fractional ice when fractional grid is not in use logical :: ignore_lake !< flag for ignoring lakes real(kind=kind_phys) :: min_lakeice !< minimum lake ice value real(kind=kind_phys) :: min_seaice !< minimum sea ice value @@ -2148,6 +2213,26 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%soiltype_frac(IM,Model%nsoilcat)) allocate (Sfcprop%lakefrac (IM)) allocate (Sfcprop%lakedepth(IM)) + + allocate (Sfcprop%use_lake_model(IM)) + + if(Model%lkm > 0) then + if(Model%iopt_lake==Model%iopt_lake_clm) then + allocate (Sfcprop%clm_lakedepth(IM)) + else if(Model%iopt_lake==Model%iopt_lake_flake) then + allocate (Sfcprop%h_ML (IM)) + allocate (Sfcprop%t_ML (IM)) + allocate (Sfcprop%t_mnw (IM)) + allocate (Sfcprop%h_talb (IM)) + allocate (Sfcprop%t_talb (IM)) + allocate (Sfcprop%t_bot1 (IM)) + allocate (Sfcprop%t_bot2 (IM)) + allocate (Sfcprop%c_t (IM)) + endif + allocate (Sfcprop%T_snow (IM)) + allocate (Sfcprop%T_ice (IM)) + endif + allocate (Sfcprop%tsfc (IM)) allocate (Sfcprop%tsfco (IM)) allocate (Sfcprop%tsfcl (IM)) @@ -2185,6 +2270,25 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%soiltype_frac = clear_val Sfcprop%lakefrac = clear_val Sfcprop%lakedepth = clear_val + + Sfcprop%use_lake_model = zero + if(Model%lkm > 0) then + if(Model%iopt_lake==Model%iopt_lake_clm) then + Sfcprop%clm_lakedepth = clear_val + else if(Model%iopt_lake==Model%iopt_lake_flake) then + Sfcprop%h_ML = clear_val + Sfcprop%t_ML = clear_val + Sfcprop%t_mnw = clear_val + Sfcprop%h_talb = clear_val + Sfcprop%t_talb = clear_val + Sfcprop%t_bot1 = clear_val + Sfcprop%t_bot2 = clear_val + Sfcprop%c_t = clear_val + endif + Sfcprop%T_snow = clear_val + Sfcprop%T_ice = clear_val + endif + Sfcprop%tsfc = clear_val Sfcprop%tsfco = clear_val Sfcprop%tsfcl = clear_val @@ -2376,18 +2480,21 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%xlaixy = clear_val Sfcprop%rca = clear_val end if - if (Model%lsm == Model%lsm_ruc .or. Model%lsm == Model%lsm_noahmp) then - allocate(Sfcprop%raincprv (IM)) - allocate(Sfcprop%rainncprv (IM)) + if (Model%lsm == Model%lsm_ruc .or. Model%lsm == Model%lsm_noahmp .or. & + (Model%lkm>0 .and. Model%iopt_lake==Model%iopt_lake_clm)) then + allocate(Sfcprop%raincprv (IM)) + allocate(Sfcprop%rainncprv (IM)) + Sfcprop%raincprv = clear_val + Sfcprop%rainncprv = clear_val + if (Model%lsm == Model%lsm_ruc .or. Model%lsm == Model%lsm_noahmp) then 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 end if ! Noah MP allocate and init when used ! @@ -2563,6 +2670,73 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%conv_act_m = zero end if + ! CLM Lake Model variables + if (Model%lkm/=0 .and. Model%iopt_lake==Model%iopt_lake_clm) then + allocate(Sfcprop%lake_t2m(IM)) + allocate(Sfcprop%lake_q2m(IM)) + allocate(Sfcprop%lake_albedo(IM)) + allocate(Sfcprop%lake_z3d(IM,Model%nlevlake_clm_lake)) + allocate(Sfcprop%lake_dz3d(IM,Model%nlevlake_clm_lake)) + allocate(Sfcprop%lake_soil_watsat3d(IM,Model%nlevlake_clm_lake)) + allocate(Sfcprop%lake_csol3d(IM,Model%nlevlake_clm_lake)) + allocate(Sfcprop%lake_soil_tkmg3d(IM,Model%nlevlake_clm_lake)) + allocate(Sfcprop%lake_soil_tkdry3d(IM,Model%nlevlake_clm_lake)) + allocate(Sfcprop%lake_soil_tksatu3d(IM,Model%nlevlake_clm_lake)) + allocate(Sfcprop%lake_h2osno2d(IM)) + allocate(Sfcprop%lake_sndpth2d(IM)) + allocate(Sfcprop%lake_snl2d(IM)) + allocate(Sfcprop%lake_snow_z3d(IM,Model%nlevsnowsoil1_clm_lake)) + allocate(Sfcprop%lake_snow_dz3d(IM,Model%nlevsnowsoil1_clm_lake)) + allocate(Sfcprop%lake_snow_zi3d(IM,Model%nlevsnowsoil_clm_lake)) + allocate(Sfcprop%lake_h2osoi_vol3d(IM,Model%nlevsnowsoil1_clm_lake)) + allocate(Sfcprop%lake_h2osoi_liq3d(IM,Model%nlevsnowsoil1_clm_lake)) + allocate(Sfcprop%lake_h2osoi_ice3d(IM,Model%nlevsnowsoil1_clm_lake)) + allocate(Sfcprop%lake_tsfc(IM)) + allocate(Sfcprop%lake_t_soisno3d(IM,Model%nlevsnowsoil1_clm_lake)) + allocate(Sfcprop%lake_t_lake3d(IM,Model%nlevlake_clm_lake)) + allocate(Sfcprop%lake_savedtke12d(IM)) + allocate(Sfcprop%lake_icefrac3d(IM,Model%nlevlake_clm_lake)) + allocate(Sfcprop%lake_rho0(IM)) + allocate(Sfcprop%lake_ht(IM)) + allocate(Sfcprop%lake_clay3d(IM,Model%nlevsoil_clm_lake)) + allocate(Sfcprop%lake_sand3d(IM,Model%nlevsoil_clm_lake)) + allocate(Sfcprop%lake_is_salty(IM)) + allocate(Sfcprop%lake_cannot_freeze(IM)) + allocate(Sfcprop%clm_lake_initialized(IM)) + + Sfcprop%lake_t2m = clear_val + Sfcprop%lake_q2m = clear_val + Sfcprop%lake_albedo = clear_val + Sfcprop%lake_z3d = clear_val + Sfcprop%lake_dz3d = clear_val + Sfcprop%lake_soil_watsat3d = clear_val + Sfcprop%lake_csol3d = clear_val + Sfcprop%lake_soil_tkmg3d = clear_val + Sfcprop%lake_soil_tkdry3d = clear_val + Sfcprop%lake_soil_tksatu3d = clear_val + Sfcprop%lake_h2osno2d = clear_val + Sfcprop%lake_sndpth2d = clear_val + Sfcprop%lake_snl2d = clear_val + Sfcprop%lake_snow_z3d = clear_val + Sfcprop%lake_snow_dz3d = clear_val + Sfcprop%lake_snow_zi3d = clear_val + Sfcprop%lake_h2osoi_vol3d = clear_val + Sfcprop%lake_h2osoi_liq3d = clear_val + Sfcprop%lake_h2osoi_ice3d = clear_val + Sfcprop%lake_tsfc = clear_val + Sfcprop%lake_t_soisno3d = clear_val + Sfcprop%lake_t_lake3d = clear_val + Sfcprop%lake_savedtke12d = clear_val + Sfcprop%lake_icefrac3d = clear_val + Sfcprop%lake_rho0 = -111 + Sfcprop%lake_ht = -111 + Sfcprop%lake_clay3d = clear_val + Sfcprop%lake_sand3d = clear_val + Sfcprop%lake_is_salty = zero + Sfcprop%lake_cannot_freeze = zero + Sfcprop%clm_lake_initialized = zero + endif + if(Model%rrfs_sd) then !--- needed for smoke aerosol option allocate (Sfcprop%emdust (IM)) @@ -3240,6 +3414,18 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & !--- Thompson,GFDL microphysical parameter logical :: lrefres = .false. !< flag for radar reflectivity in restart file + !--- CLM Lake Model parameters (MUST match clm_lake.F90) + integer, parameter :: nlevlake_clm_lake = 10 !< number of lake levels + integer, parameter :: nlevsoil_clm_lake = 10 !< number of soil levels + integer, parameter :: nlevsnow_clm_lake = 5 !< number of snow levels + integer, parameter :: nlevsnowsoil_clm_lake = nlevsnow_clm_lake+nlevsoil_clm_lake+1 !< -nlevsno:nlevsoil dimensioned variables + integer, parameter :: nlevsnowsoil1_clm_lake = nlevsnow_clm_lake+nlevsoil_clm_lake !< -nlevsno+1:nlevsoil dimensioned variables + + !--- CLM Lake configurables + real(kind_phys) :: clm_lake_depth_default = 50 !< default lake depth in clm lake model + logical :: clm_lake_use_lakedepth = .true. !< initialize depth from lakedepth + logical :: clm_lake_debug = .false. !< verbose debugging in clm_lake + !--- land/surface model parameters integer :: lsm = 1 !< flag for land surface model to use =0 for osu lsm; =1 for noah lsm; =2 for noah mp lsm; =3 for RUC lsm integer :: lsoil = 4 !< number of soil layers @@ -3293,7 +3479,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & real(kind=kind_phys) :: sfenth = 0.0 !< enthalpy flux factor 0 zot via charnock ..>0 zot enhanced>15m/s !--- flake model parameters - integer :: lkm = 0 !< flag for flake model - default no flake + integer :: lkm = 0 !< =1 run lake, =2 run lake&nsst =0 no lake + integer :: iopt_lake = 2 !< =1 flake, =2 clm lake (default) + real(kind_phys) :: lakedepth_threshold = 1.0 !< lakedepth must be GREATER than this value to enable a lake model + real(kind_phys) :: lakefrac_threshold = 0.0 !< lakefrac must be GREATER than this value to enable a lake model + logical :: use_lake2m = .false. !< use 2m T & Q from clm lake model !--- tuning parameters for physical parameterizations logical :: ras = .false. !< flag for ras convection scheme @@ -3479,6 +3669,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & !< nstf_name(5) : zsea2 in mm !--- fractional grid logical :: frac_grid = .false. !< flag for fractional grid + logical :: frac_ice = .false. !< flag for fractional ice when fractional grid is not in use logical :: ignore_lake = .true. !< flag for ignoring lakes real(kind=kind_phys) :: min_lakeice = 0.15d0 !< minimum lake ice value real(kind=kind_phys) :: min_seaice = 1.0d-11 !< minimum sea ice value @@ -3681,7 +3872,9 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & ! GFDL surface layer options lcurr_sf, pert_cd, ntsflg, sfenth, & !--- lake model control - lkm, & + lkm, iopt_lake, lakedepth_threshold, lakefrac_threshold, & + clm_lake_depth_default, clm_lake_use_lakedepth, & + clm_lake_debug, use_lake2m, & !--- physical parameterizations ras, trans_trac, old_monin, cnvgwd, mstrat, moist_adj, & cscnv, cal_pre, do_aw, do_shoc, shocaftcnv, shoc_cld, & @@ -3724,7 +3917,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & !--- near surface sea temperature model nst_anl, lsea, nstf_name, & frac_grid, min_lakeice, min_seaice, min_lake_height, & - ignore_lake, & + ignore_lake, frac_ice, & !--- surface layer sfc_z0_type, & !--- switch beteeen local and standard potential temperature @@ -4409,8 +4602,22 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%ntsflg = ntsflg Model%sfenth = sfenth -!--- flake model parameters +!--- lake model parameters Model%lkm = lkm + Model%iopt_lake = iopt_lake + Model%use_lake2m = use_lake2m + Model%lakedepth_threshold = lakedepth_threshold + Model%lakefrac_threshold = lakefrac_threshold + +!--- clm lake model parameters + Model%nlevlake_clm_lake = nlevlake_clm_lake + Model%nlevsoil_clm_lake = nlevsoil_clm_lake + Model%nlevsnow_clm_lake = nlevsnow_clm_lake + Model%nlevsnowsoil_clm_lake = nlevsnowsoil_clm_lake + Model%nlevsnowsoil1_clm_lake = nlevsnowsoil1_clm_lake + Model%clm_lake_depth_default = clm_lake_depth_default + Model%clm_lake_use_lakedepth = clm_lake_use_lakedepth + Model%clm_lake_debug = clm_lake_debug ! Noah MP options from namelist ! @@ -4615,6 +4822,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & !--- fractional grid Model%frac_grid = frac_grid + Model%frac_ice = frac_ice Model%ignore_lake = ignore_lake Model%min_lakeice = min_lakeice Model%min_seaice = min_seaice @@ -4843,6 +5051,18 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%ntocl = get_tracer_index(Model%tracer_names, 'oc2', Model%me, Model%master, Model%debug) end if + ! Lake & fractional grid safety checks + if(Model%me==Model%master) then + if(Model%lkm>0 .and. Model%frac_grid) then + write(0,*) 'WARNING: Lake fractional grid support is experimental. Use at your own risk!' + else if(Model%lkm>0 .and. Model%iopt_lake==Model%iopt_lake_clm .and. .not. Model%frac_ice) then + write(0,*) 'WARNING: CLM Lake Model will not work without frac_ice=.true.' + endif + if(Model%lkm==2) then + write(0,*) 'WARNING: Running both lake and nsst on lake points is experimental. Use at your own risk!' + endif + endif + if(ldiag3d) then ! Flags used to turn on or off tracer "causes" have_pbl_edmf = Model%hybedmf .or. Model%satmedmf .or. Model%do_mynnedmf @@ -5373,12 +5593,27 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & ! endif print *,' nst_anl=',Model%nst_anl,' use_ufo=',Model%use_ufo,' frac_grid=',Model%frac_grid,& - ' ignore_lake=',ignore_lake + ' ignore_lake=',ignore_lake,' frac_ice=',Model%frac_ice print *,' min_lakeice=',Model%min_lakeice,' min_seaice=',Model%min_seaice, & 'min_lake_height=',Model%min_lake_height - print *, 'flake model parameters' - print *, 'lkm : ', Model%lkm + print *, 'lake model parameters' + print *, ' lake master flag lkm : ', Model%lkm + if(Model%lkm>0) then + print *, ' lake model selection : ', Model%iopt_lake + if(Model%iopt_lake==Model%iopt_lake_clm) then + print *,' CLM Lake model configuration' + print *,' use_lake2m = ',Model%use_lake2m + print *,' clm_lake_use_lakedepth = ',Model%clm_lake_use_lakedepth + print *,' clm_lake_depth_default = ',Model%clm_lake_depth_default + print *,' clm_lake_debug = ',Model%clm_lake_debug + print *,' nlevlake_clm_lake = ',Model%nlevlake_clm_lake + print *,' nlevsoil_clm_lake = ',Model%nlevsoil_clm_lake + print *,' nlevsnow_clm_lake = ',Model%nlevsnow_clm_lake + print *,' nlevsnowsoil_clm_lake = ',Model%nlevsnowsoil_clm_lake + print *,' nlevsnowsoil1_clm_lake = ',Model%nlevsnowsoil1_clm_lake + endif + endif if (Model%nstf_name(1) > 0 ) then print *,' NSSTM is active ' diff --git a/scm/src/GFS_typedefs.meta b/scm/src/GFS_typedefs.meta index 0d589dc75..9e89646c2 100644 --- a/scm/src/GFS_typedefs.meta +++ b/scm/src/GFS_typedefs.meta @@ -641,6 +641,108 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys +[clm_lakedepth] + standard_name = clm_lake_depth + long_name = clm internal copy of lake depth with 10.0 replaced by default lake depth + units = m + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_execution_method > 0 .and. control_for_lake_model_selection == 2) +[use_lake_model] + standard_name = flag_for_using_lake_model + long_name = flag indicating lake points using a lake model + units = flag + dimensions = (horizontal_loop_extent) + type = integer +[lake_t2m] + standard_name = temperature_at_2m_from_clm_lake + long_name = temperature at 2m from clm lake + units = K + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_execution_method > 0 .and. control_for_lake_model_selection == 2) +[lake_q2m] + standard_name = specific_humidity_at_2m_from_clm_lake + long_name = specific humidity at 2m from clm lake + units = frac + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_execution_method > 0 .and. control_for_lake_model_selection == 2) +[h_ML] + standard_name = mixed_layer_depth_of_lakes + long_name = depth of lake mixing layer + units = m + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 1 .and. control_for_lake_model_execution_method > 0) +[t_ML] + standard_name = lake_mixed_layer_temperature + long_name = temperature of lake mixing layer + units = K + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 1 .and. control_for_lake_model_execution_method > 0) +[t_mnw] + standard_name = mean_temperature_of_the_water_column + long_name = thee mean temperature of the water column + units = K + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 1 .and. control_for_lake_model_execution_method > 0) +[h_talb] + standard_name = the_thermally_active_layer_depth_of_the_bottom_sediment + long_name = the depth of the thermally active layer of the bottom sediment + units = m + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 1 .and. control_for_lake_model_execution_method > 0) +[t_talb] + standard_name = temperature_at_the_bottom_of_the_sediment_upper_layer + long_name = the temperature at the bottom of the sediment upper layer + units = K + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 1 .and. control_for_lake_model_execution_method > 0) +[t_bot1] + standard_name = lake_bottom_temperature + long_name = the temperature at the water-bottom sediment interface + units = K + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 1 .and. control_for_lake_model_execution_method > 0) +[t_bot2] + standard_name = temperature_for_bottom_layer_of_water + long_name = the temperature at the lake bottom layer water + units = K + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 1 .and. control_for_lake_model_execution_method > 0) +[c_t] + standard_name = shape_factor_of_water_temperature_vertical_profile + long_name = the shape factor of water temperature vertical profile + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 1 .and. control_for_lake_model_execution_method > 0) +[T_snow] + standard_name = temperature_of_snow_on_lake + long_name = temperature of snow on a lake + units = K + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_execution_method > 0) [tsfc] standard_name = surface_skin_temperature long_name = surface skin temperature @@ -1825,7 +1927,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. control_for_land_surface_scheme == identifier_for_noahmp_land_surface_scheme) + active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. control_for_land_surface_scheme == identifier_for_noahmp_land_surface_scheme .or. ( control_for_lake_model_execution_method > 0 .and. control_for_lake_model_selection == 2) ) [rainncprv] standard_name = lwe_thickness_of_explicit_precipitation_amount_on_previous_timestep long_name = explicit rainfall from previous timestep @@ -1833,7 +1935,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. control_for_land_surface_scheme == identifier_for_noahmp_land_surface_scheme) + active = (control_for_land_surface_scheme == identifier_for_ruc_land_surface_scheme .or. control_for_land_surface_scheme == identifier_for_noahmp_land_surface_scheme .or. ( control_for_lake_model_execution_method > 0 .and. control_for_lake_model_selection == 2) ) [iceprv] standard_name = lwe_thickness_of_ice_precipitation_amount_on_previous_timestep long_name = ice amount from previous timestep @@ -1926,6 +2028,226 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys +[lake_albedo] + standard_name = mid_day_surface_albedo_over_lake + long_name = mid day surface albedo over lake + units = fraction + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_z3d] + standard_name = depth_of_lake_interface_layers + long_name = depth of lake interface layers + units = fraction + dimensions = (horizontal_loop_extent, lake_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_dz3d] + standard_name = thickness_of_lake_layers + long_name = thickness of lake layers + units = fraction + dimensions = (horizontal_loop_extent, lake_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_soil_watsat3d] + standard_name = saturated_volumetric_soil_water_in_lake_model + long_name = saturated volumetric soil water in lake model + units = m + dimensions = (horizontal_loop_extent, lake_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_csol3d] + standard_name = soil_heat_capacity_in_lake_model + long_name = soil heat capacity in lake model + units = m + dimensions = (horizontal_loop_extent, lake_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_soil_tkmg3d] + standard_name = soil_mineral_thermal_conductivity_in_lake_model + long_name = soil mineral thermal conductivity in lake model + units = m + dimensions = (horizontal_loop_extent, lake_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_soil_tkdry3d] + standard_name = dry_soil_thermal_conductivity_in_lake_model + long_name = dry soil thermal conductivity in lake model + units = m + dimensions = (horizontal_loop_extent, lake_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_soil_tksatu3d] + standard_name = saturated_soil_thermal_conductivity_in_lake_model + long_name = saturated soil thermal conductivity in lake model + units = m + dimensions = (horizontal_loop_extent, lake_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_h2osno2d] + standard_name = water_equivalent_accumulated_snow_depth_in_clm_lake_model + long_name = water equiv of acc snow depth over lake in clm lake model + units = mm + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_sndpth2d] + standard_name = actual_snow_depth_in_clm_lake_model + long_name = actual acc snow depth over lake in clm lake model + units = m + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_snl2d] + standard_name = snow_layers_in_clm_lake_model + long_name = snow layers in clm lake model (treated as integer) + units = count + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_snow_z3d] + standard_name = snow_level_depth_in_clm_lake_model + long_name = snow level depth in clm lake model + units = m + dimensions = (horizontal_loop_extent,snow_plus_soil_minus_one_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_snow_dz3d] + standard_name = snow_level_thickness_in_clm_lake_model + long_name = snow level thickness in clm lake model + units = m + dimensions = (horizontal_loop_extent,snow_plus_soil_minus_one_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_snow_zi3d] + standard_name = snow_interface_depth_in_clm_lake_model + long_name = snow interface_depth in clm lake model + units = m + dimensions = (horizontal_loop_extent,snow_plus_soil_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_h2osoi_vol3d] + standard_name = volumetric_soil_water_in_clm_lake_model + long_name = volumetric soil water in clm lake model + units = m3 m-3 + dimensions = (horizontal_loop_extent,snow_plus_soil_minus_one_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_h2osoi_liq3d] + standard_name = soil_liquid_water_content_in_clm_lake_model + long_name = soil liquid water content in clm lake model + units = kg m-3 + dimensions = (horizontal_loop_extent,snow_plus_soil_minus_one_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_h2osoi_ice3d] + standard_name = soil_ice_water_content_in_clm_lake_model + long_name = soil ice water content in clm lake model + units = kg m-3 + dimensions = (horizontal_loop_extent,snow_plus_soil_minus_one_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_tsfc] + standard_name = skin_temperature_from_lake_model + long_name = skin temperature from lake model + units = K + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_t_soisno3d] + standard_name = soil_or_snow_layer_temperature_from_clm_lake_model + long_name = soil or snow layer temperature from clm lake model + units = K + dimensions = (horizontal_loop_extent,snow_plus_soil_minus_one_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_t_lake3d] + standard_name = lake_layer_temperature_from_clm_lake_model + long_name = lake layer temperature from clm lake model + units = K + dimensions = (horizontal_loop_extent,lake_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_savedtke12d] + standard_name = top_level_eddy_conductivity_from_previous_timestep_in_clm_lake_model + long_name = top level eddy conductivity from previous timestep in clm lake model + units = kg m-3 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_icefrac3d] + standard_name = lake_fractional_ice_cover_on_clm_lake_levels + long_name = lake fractional ice cover on clm lake levels + units = kg m-3 + dimensions = (horizontal_loop_extent,lake_vertical_dimension_for_clm_lake_model) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_ht] + standard_name = test_lake_ht + long_name = test_lake_ht + dimensions = (horizontal_loop_extent) + units = unitless + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[clm_lake_initialized] + standard_name = flag_for_clm_lake_initialization + long_name = set to true in clm_lake_run after likeini is called for that gridpoint + units = flag + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_clay3d] + standard_name = clm_lake_percent_clay + long_name = percent clay in clm lake model + units = percent + dimensions = (horizontal_loop_extent,soil_vertical_dimension_for_clm_lake_model) + type = integer + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_sand3d] + standard_name = clm_lake_percent_sand + long_name = percent sand in clm lake model + units = percent + dimensions = (horizontal_loop_extent,soil_vertical_dimension_for_clm_lake_model) + type = integer + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_is_salty] + standard_name = clm_lake_is_salty + long_name = lake at this point is salty (1) or not (0) + units = 1 + dimensions = (horizontal_loop_extent) + type = integer + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) +[lake_cannot_freeze] + standard_name = clm_lake_cannot_freeze + long_name = lake at this point is so salty it cannot freeze + units = 1 + dimensions = (horizontal_loop_extent) + type = integer + active = (control_for_lake_model_selection == 2 .and. control_for_lake_model_execution_method > 0) [emdust] standard_name = emission_of_dust_for_smoke long_name = emission of dust for smoke @@ -4346,6 +4668,41 @@ units = count dimensions = () type = integer +[nlevlake_clm_lake] + standard_name = lake_vertical_dimension_for_clm_lake_model + long_name = lake vertical dimension for clm lake model + units = count + dimensions = () + type = integer + active = (control_for_lake_surface_scheme == 2) +[nlevsoil_clm_lake] + standard_name = soil_vertical_dimension_for_clm_lake_model + long_name = soil vertical dimension for clm lake model + units = count + dimensions = () + type = integer + active = (control_for_lake_surface_scheme == 2) +[nlevsnow_clm_lake] + standard_name = snow_vertical_dimension_for_clm_lake_model + long_name = snow vertical dimension for clm lake model + units = count + dimensions = () + type = integer + active = (control_for_lake_surface_scheme == 2) +[nlevsnowsoil_clm_lake] + standard_name = snow_plus_soil_vertical_dimension_for_clm_lake_model + long_name = snow plus soil vertical dimension for clm lake model + units = count + dimensions = () + type = integer + active = (control_for_lake_surface_scheme == 2) +[nlevsnowsoil1_clm_lake] + standard_name = snow_plus_soil_minus_one_vertical_dimension_for_clm_lake_model + long_name = snow plus soil minus one vertical dimension for clm lake model + units = count + dimensions = () + type = integer + active = (control_for_lake_surface_scheme == 2) [lsoil] standard_name = vertical_dimension_of_soil long_name = number of soil layers @@ -4593,9 +4950,47 @@ dimensions = () type = real kind = kind_phys +[lakefrac_threshold] + standard_name = lakefrac_threshold_for_enabling_lake_model + long_name = fraction of horizontal grid area occupied by lake must be greater than this value to enable a lake model + units = frac + dimensions = () + type = real + kind = kind_phys +[lakedepth_threshold] + standard_name = lake_depth_threshold_for_enabling_lake_model + long_name = lake depth must be greater than this value to enable a lake model + units = m + dimensions = () + type = real + kind = kind_phys +[iopt_lake] + standard_name = control_for_lake_model_selection + long_name = control for lake model selection + units = 1 + dimensions = () + type = integer +[iopt_lake_flake] + standard_name = flake_model_control_selection_value + long_name = value that indicates flake model in the control for lake model selection + units = 1 + dimensions = () + type = integer +[iopt_lake_clm] + standard_name = clm_lake_model_control_selection_value + long_name = value that indicates clm lake model in the control for lake model selection + units = 1 + dimensions = () + type = integer +[use_lake2m] + standard_name = use_2m_diagnostics_calculated_by_lake_model + long_name = model 2m diagnostics use the temperature and humidity calculated by the lake model + units = flag + dimensions = () + type = integer [lkm] - standard_name = control_for_lake_surface_scheme - long_name = flag for lake surface model + standard_name = control_for_lake_model_execution_method + long_name = control for lake model execution: 0=no lake, 1=lake, 2=lake+nsst units = flag dimensions = () type = integer @@ -5167,6 +5562,12 @@ units = flag dimensions = () type = logical +[frac_ice] + standard_name = flag_for_fractional_ice_when_fractional_landmask_is_disabled + long_name = flag for fractional ice when fractional landmask is disabled + units = flag + dimensions = () + type = logical [min_lakeice] standard_name = min_lake_ice_area_fraction long_name = minimum lake ice value @@ -6705,6 +7106,25 @@ units = flag dimensions = () type = logical +[clm_lake_depth_default] + standard_name = default_lake_depth_in_clm_lake_model + long_name = default lake depth in clm lake model + units = m + dimensions = () + type = real + kind = kind_phys +[clm_lake_use_lakedepth] + standard_name = flag_for_initializing_clm_lake_depth_from_lake_depth + long_name = flag for initializing clm lake depth from lake depth + units = flag + dimensions = () + type = logical +[clm_lake_debug] + standard_name = flag_for_verbose_debugging_in_clm_lake_model + long_name = flag for verbose debugging in clm lake model + units = flag + dimensions = () + type = logical [fire_aux_data_levels] standard_name = fire_auxiliary_data_extent long_name = number of levels of fire auxiliary data diff --git a/scm/src/scm_physical_constants.F90 b/scm/src/scm_physical_constants.F90 index da616bc82..93ac7cc91 100644 --- a/scm/src/scm_physical_constants.F90 +++ b/scm/src/scm_physical_constants.F90 @@ -48,6 +48,8 @@ module scm_physical_constants real(kind=dp),parameter:: con_tice =2.7120e+2 real(kind=dp),parameter:: rhowater =1000._dp + real(kind=dp),parameter:: rholakeice = 0.917e3_dp !< density of ice on lake (kg/m^3) + real(kind=dp),parameter:: con_c = 2.99792458e+8_dp !< speed of light (\f$m/s\f$) real(kind=dp),parameter:: con_plnk = 6.6260693e-34_dp !< planck constant (\f$J/s\f$) diff --git a/scm/src/scm_physical_constants.meta b/scm/src/scm_physical_constants.meta index ae86677af..a2642e51b 100644 --- a/scm/src/scm_physical_constants.meta +++ b/scm/src/scm_physical_constants.meta @@ -216,6 +216,13 @@ dimensions = () type = real kind = kind_phys +[rholakeice] + standard_name = density_of_ice_on_lake + long_name = density of ice on a lake + units = kg m-3 + dimensions = () + type = real + kind = kind_phys [con_omega] standard_name = angular_velocity_of_earth long_name = angular velocity of earth From 16bc850a1f447a03ad7fab4cbea0a93539930f68 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Thu, 29 Jun 2023 14:30:10 -0400 Subject: [PATCH 2/2] update ccpp/physics submodule and revert .gitmodules --- .gitmodules | 6 ++---- ccpp/physics | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.gitmodules b/.gitmodules index f06b22f2e..dc0798c32 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,10 +4,8 @@ branch = main [submodule "ccpp-physics"] path = ccpp/physics - #url = https://github.com/NCAR/ccpp-physics - #branch = main - url = https://github.com/grantfirl/ccpp-physics - branch = ufs-dev-PR26 + url = https://github.com/NCAR/ccpp-physics + branch = main [submodule "CMakeModules"] path = CMakeModules url = https://github.com/noaa-emc/CMakeModules diff --git a/ccpp/physics b/ccpp/physics index 4d691081e..92c8a9e69 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 4d691081e46d17d5b77b6aa7714ba2a369088ae4 +Subproject commit 92c8a9e6906a017b1d526d9b5a3ee095ea652662