Skip to content

Commit

Permalink
Merge pull request ESCOMP#2348 from olyson/deadveg
Browse files Browse the repository at this point in the history
Changes to improve vegetation health at high latitudes
  • Loading branch information
slevis-lmwg authored Mar 14, 2024
2 parents 55f2cf3 + 0886f3e commit f448885
Show file tree
Hide file tree
Showing 10 changed files with 225 additions and 21 deletions.
8 changes: 4 additions & 4 deletions bld/CLMBuildNamelist.pm
Original file line number Diff line number Diff line change
Expand Up @@ -2038,7 +2038,7 @@ sub setup_logic_snicar_methods {
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'do_sno_oc' );

# Error checking in loop
my %supportedSettings = ( 'snicar_solarspec' => "'mid_latitude_winter'", 'snicar_dust_optics' => "'sahara'", 'snicar_numrad_snw' => '5', 'snicar_snobc_intmix' => '.false.', 'snicar_snodst_intmix' => '.false.', 'snicar_use_aerosol' => '.true.', 'do_sno_oc' => '.false.' );
my %supportedSettings = ( 'snicar_solarspec' => "'mid_latitude_winter'", 'snicar_dust_optics' => "'sahara'", 'snicar_numrad_snw' => '5', 'snicar_snodst_intmix' => '.false.', 'snicar_use_aerosol' => '.true.', 'do_sno_oc' => '.false.' );
keys %supportedSettings;
while ( my ($key, $val) = each %supportedSettings ) {
my $var = $nl->get_value($key);
Expand All @@ -2056,13 +2056,13 @@ sub setup_logic_snicar_methods {
$log->warning("$key1=$val1a and $val1b are supported; $var1 is EXPERIMENTAL, UNSUPPORTED, and UNTESTED!");
}

# snicar_snobc_intmix and snicar_snodst_intmix cannot both be true
# snicar_snobc_intmix and snicar_snodst_intmix cannot both be true, however, they can both be false
my $key1 = 'snicar_snobc_intmix';
my $key2 = 'snicar_snodst_intmix';
my $var1 = $nl->get_value($key1);
my $var2 = $nl->get_value($key2);
my $val1 = $supportedSettings{$key1}; # supported value for this option
if (($var1 eq $var2) && ($var1 ne $val1)) {
my $val2 = $supportedSettings{$key2}; # supported value for this option
if (($var1 eq $var2) && ($var2 ne $val2)) {
$log->warning("$key1 = $var1 and $key2 = $var2 do not work together!");
}
}
Expand Down
11 changes: 7 additions & 4 deletions bld/namelist_files/namelist_defaults_ctsm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,9 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
<reset_snow_glc_ela>1.e9</reset_snow_glc_ela>

<snow_cover_fraction_method>SwensonLawrence2012</snow_cover_fraction_method>

<snow_thermal_cond_method>Jordan1991</snow_thermal_cond_method>
<snow_thermal_cond_method phys="clm5_1">Sturm1997</snow_thermal_cond_method>

<!-- Default glacier behavior is:
Mountain glaciers: single_at_atm_topo
Expand Down Expand Up @@ -484,9 +486,9 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
<!-- The default filenames are given relative to the root directory
for the CLM2 data in the CESM distribution -->
<!-- Plant function types (relative to {csmdata}) -->
<paramfile phys="clm5_1" >lnd/clm2/paramdata/ctsm51_params.c240207b.nc</paramfile>
<paramfile phys="clm5_0" >lnd/clm2/paramdata/clm50_params.c240207b.nc</paramfile>
<paramfile phys="clm4_5" >lnd/clm2/paramdata/clm45_params.c240207b.nc</paramfile>
<paramfile phys="clm5_1" >lnd/clm2/paramdata/ctsm51_params.c240208.nc</paramfile>
<paramfile phys="clm5_0" >lnd/clm2/paramdata/clm50_params.c240208.nc</paramfile>
<paramfile phys="clm4_5" >lnd/clm2/paramdata/clm45_params.c240208.nc</paramfile>

<!-- ================================================================== -->
<!-- FATES default parameter file -->
Expand Down Expand Up @@ -1637,7 +1639,8 @@ use_crop=".true.">lnd/clm2/surfdata_map/ctsm5.1.dev052/landuse.timeseries_mpasa1
<snicar_solarspec >mid_latitude_winter</snicar_solarspec>
<snicar_dust_optics >sahara</snicar_dust_optics>
<snicar_snodst_intmix>.false.</snicar_snodst_intmix>
<snicar_snobc_intmix >.false.</snicar_snobc_intmix>
<snicar_snobc_intmix>.false.</snicar_snobc_intmix>
<snicar_snobc_intmix phys="clm5_1">.true.</snicar_snobc_intmix>
<snicar_use_aerosol >.true.</snicar_use_aerosol>
<do_sno_oc >.false.</do_sno_oc>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
paramfile = '$DIN_LOC_ROOT/lnd/clm2/paramdata/ctsm51_ciso_cwd_hr_params.c240207b.nc'
paramfile = '$DIN_LOC_ROOT/lnd/clm2/paramdata/ctsm51_ciso_cwd_hr_params.c240208.nc'
hist_fincl1 = 'CWDC_HR','C13_CWDC_HR','C14_CWDC_HR','CWD_HR_L2','CWD_HR_L2_vr','CWD_HR_L3','CWD_HR_L3_vr'
96 changes: 96 additions & 0 deletions doc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,4 +1,100 @@
===============================================================
Tag name: ctsm5.1.dev174
Originator(s): olyson (Keith Oleson,UCAR/TSS)
Date: Thu 14 Mar 2024 04:56:37 PM MDT
One-line Summary: Improve vegetation health at high latitudes

Purpose and description of changes
----------------------------------

The corresponding changes:

Remove snicar_snobc_intmix from EXPERIMENTAL endrun (allow it to be true)
Remove flg_snoage_scl in SNICAR such that xdrdt can have an effect (fixes #2298 )
New parameter file and namelist values for clm5_1:

- snow_thermal_cond_method = Sturm1997 (default for clm5_1)
- snicar_snobc_intmix = .true. (default for clm5_1)
- ctsm51_params.c240208.nc is the new CTSM parameter file (changes: froot_leaf(11:12)=1.2, FUN_fracfixers(11:12)=1, xdrdt=5, scvng_fct_mlt_sf=0.5, snw_rds_refrz=1500, fresh_snw_rds_max=400)
- New history fields for coupler history verification (default off)
- Add snow5d_thresh_for_onset to parameter file, set to 0.2 for clm51 and 0.1 (unchanged) for clm50 and clm45.


Significant changes to scientifically-supported configurations
--------------------------------------------------------------

Does this tag change answers significantly for any of the following physics configurations?
(Details of any changes will be given in the "Answer changes" section below.)

[Put an [X] in the box for any configuration with significant answer changes.]

[X] clm5_1

[ ] clm5_0

[ ] ctsm5_0-nwp

[ ] clm4_5


Bugs fixed
----------
CTSM issues fixed (include CTSM Issue #):
Fixes #2298
Fixes LMWG_dev discussion #3

New bug discovered or introduced:
Relevant post appears in #2348 on 2024/3/14

Notes of particular relevance for users
---------------------------------------
Changes to CTSM's user interface (e.g., new/renamed XML or namelist variables):
New namelist defaults including new parameter files:
ctsm51_params.c240208.nc
clm50_params.c240208.nc
clm45_params.c240208.nc
ctsm51_ciso_cwd_hr_params.c240208.nc


Testing summary:
----------------

[PASS means all tests PASS; OK means tests PASS other than expected fails.]

regular tests (aux_clm: https://github.com/ESCOMP/CTSM/wiki/System-Testing-Guide#pre-merge-system-testing):

derecho ----- OK
izumi ------- OK

any other testing (give details below):
Keith Oleson replicated simulation in LMWG_dev issue #51 as bfb when
snow5d_thresh_for_onset on ctsm51_ciso_cwd_hr_params.c240208.nc was set
to original value of 0.1.

Answer changes
--------------

Changes answers relative to baseline: YES

Summarize any changes to answers, i.e.,
- what code configurations: clm51
- what platforms/compilers: all
- nature of change: new climate at high latitudes

See LMWG_dev discussion #3 and simulations discussed therein,
including (though possibly not limited to) LMWG_dev issues #51, 52, 54, 57.

slevis will add this tag with the label "SIGNIFICANT" to the
Answer-changing-tags wiki:
https://github.com/ESCOMP/CTSM/wiki/Answer-changing-tags

Other details
-------------
Pull Requests that document the changes (include PR ids):
https://github.com/ESCOMP/ctsm/pull/2348

===============================================================
===============================================================
Tag name: ctsm5.1.dev173
Originator(s): rgknox (Ryan Knox,LAWRENCE BERKELEY NATIONAL LABORATORY)
Date: Wed 13 Mar 2024 04:46:37 PM MDT
Expand Down
3 changes: 2 additions & 1 deletion doc/ChangeSum
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
Tag Who Date Summary
============================================================================================================================
ctsm5.1.dev174 olyson 03/14/2024 Improve vegetation health at high latitudes
ctsm5.1.dev173 rgknox 03/13/2024 New FATES namelist variable: fates_history_dimlevel
ctsm5.1.dev172 erik 03/12/2024 Merge b4b-dev
ctsm5.1.dev171 slevis 03/01/2024 Set initial t_soisno=272 for soils and 274K for urban road
ctsm5.1.dev171 olyson 03/01/2024 Set initial t_soisno=272 for soils and 274K for urban road
ctsm5.1.dev170 samrabin 02/28/2024 Add hillslope hydrology
ctsm5.1.dev169 samrabin 02/22/2024 Merge b4b-dev
ctsm5.1.dev168 slevis 02/16/2024 Remove a source of negative snocan in CanopyFluxesMod
Expand Down
7 changes: 5 additions & 2 deletions src/biogeochem/CNPhenologyMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ module CNPhenologyMod
real(r8) :: soilpsi_off ! critical soil water potential for leaf offset
real(r8) :: lwtop ! live wood turnover proportion (annual fraction)
real(r8) :: phenology_soil_depth ! soil depth used for measuring states for phenology triggers
real(r8) :: snow5d_thresh_for_onset ! 5-day snow depth threshold for leaf onset
end type params_type

type(params_type) :: params_inst
Expand Down Expand Up @@ -280,6 +281,7 @@ subroutine CNPhenologySetParams( )
params_inst%soilpsi_off = -0.8 ! MPa
params_inst%lwtop = 0.7_r8 ! Fraction
params_inst%phenology_soil_depth = 0.08_r8 ! m
params_inst%snow5d_thresh_for_onset = 0.2_r8 ! m
end subroutine CNPhenologySetParams

!-----------------------------------------------------------------------
Expand Down Expand Up @@ -313,6 +315,7 @@ subroutine readParams ( ncid )
call readNcdioScalar(ncid, 'soilpsi_off', subname, params_inst%soilpsi_off)
call readNcdioScalar(ncid, 'lwtop_ann', subname, params_inst%lwtop)
call readNcdioScalar(ncid, 'phenology_soil_depth', subname, params_inst%phenology_soil_depth)
call readNcdioScalar(ncid, 'snow5d_thresh_for_onset', subname, params_inst%snow5d_thresh_for_onset)


end subroutine readParams
Expand Down Expand Up @@ -1136,7 +1139,6 @@ function SeasonalDecidOnset( onset_gdd, onset_gddflag, soilt, soila10, t_a5min,
logical :: do_onset ! Flag if onset should happen (return value)
!
! !LOCAL VARIABLES:
real(r8), parameter :: snow5d_thresh_for_onset = 0.1_r8 ! 5-day snow depth threshold for leaf onset
real(r8), parameter :: min_critical_daylength_onset = 39300._r8/2._r8 ! Minimum daylength for onset to happen
! NOTE above: The 39300/2(19650) value is what we've
! tested with, we are concerned that changing
Expand Down Expand Up @@ -1192,7 +1194,8 @@ function SeasonalDecidOnset( onset_gdd, onset_gddflag, soilt, soila10, t_a5min,
else if (season_decid_temperate == 0 .and. onset_gddflag == 1.0_r8 .and. &
soila10 > SHR_CONST_TKFRZ .and. &
t_a5min > SHR_CONST_TKFRZ .and. ws_flag==1.0_r8 .and. &
dayl>min_critical_daylength_onset .and. snow_5day<snow5d_thresh_for_onset) then
dayl>min_critical_daylength_onset .and. &
snow_5day<params_inst%snow5d_thresh_for_onset) then
do_onset = .true.
end if
else
Expand Down
10 changes: 2 additions & 8 deletions src/biogeophys/SnowSnicarMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,6 @@ module SnowSnicarMod
real(r8), parameter :: tim_cns_dst_rmv = 2.2E-8_r8 ! time constant for removal of dust in snow on sea-ice
! [s-1] (50% mass removal/year)

! scaling of the snow aging rate (tuning option):
logical :: flg_snoage_scl = .false. ! flag for scaling the snow aging rate by some arbitrary factor

! snow and aerosol Mie parameters:
! (arrays declared here, but are set in iniTimeConst)
! (idx_Mie_snw_mx is number of snow radii with defined parameters (i.e. from 30um to 1500um))
Expand Down Expand Up @@ -1656,13 +1653,10 @@ subroutine SnowAge_grain(bounds, &
dr = dr + dr_wet

!
!********** 3. SNOWAGE SCALING (TURNED OFF BY DEFAULT) *************
!********** 3. SNOWAGE SCALING *************
!
! Multiply rate of change of effective radius by some constant, xdrdt
if (flg_snoage_scl) then
dr = dr*params_inst%xdrdt
endif

dr = dr*params_inst%xdrdt

!
!********** 4. INCREMENT EFFECTIVE RADIUS, ACCOUNTING FOR: ***********
Expand Down
5 changes: 5 additions & 0 deletions src/biogeophys/Wateratm2lndType.F90
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,11 @@ subroutine InitHistory(this, bounds)
avgflag='A', long_name=this%info%lname('atmospheric specific humidity (downscaled to columns in glacier regions)'), &
ptr_col=this%forc_q_downscaled_col, default='inactive')

this%forc_q_not_downscaled_grc(begg:endg) = spval
call hist_addfld1d (fname=this%info%fname('QBOT_NOT_DOWNSCALED'), units='kg/kg', &
avgflag='A', long_name=this%info%lname('atmospheric specific humidity (pre-downscaling)'), &
ptr_lnd=this%forc_q_not_downscaled_grc, default='inactive')

this%forc_flood_grc(begg:endg) = spval
call hist_addfld1d (fname=this%info%fname('QFLOOD'), units='mm/s', &
avgflag='A', long_name=this%info%lname('runoff from river flooding'), &
Expand Down
102 changes: 102 additions & 0 deletions src/main/atm2lndType.F90
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,7 @@ subroutine InitHistory(this, bounds)
integer :: begg, endg
integer :: begc, endc
integer :: begp, endp
real(r8), pointer :: data1dptr(:) ! temp. pointer for slicing larger arrays
!---------------------------------------------------------------------

begg = bounds%begg; endg= bounds%endg
Expand All @@ -548,6 +549,16 @@ subroutine InitHistory(this, bounds)
avgflag='A', long_name='atmospheric wind velocity magnitude', &
ptr_gcell=this%forc_wind_grc, default = 'inactive')

this%forc_u_grc(begg:endg) = spval
call hist_addfld1d (fname='UWIND', units='m/s', &
avgflag='A', long_name='atmospheric U wind velocity magnitude', &
ptr_lnd=this%forc_u_grc, default = 'inactive')

this%forc_v_grc(begg:endg) = spval
call hist_addfld1d (fname='VWIND', units='m/s', &
avgflag='A', long_name='atmospheric V wind velocity magnitude', &
ptr_lnd=this%forc_v_grc, default = 'inactive')

this%forc_hgt_grc(begg:endg) = spval
call hist_addfld1d (fname='ZBOT', units='m', &
avgflag='A', long_name='atmospheric reference height', &
Expand Down Expand Up @@ -611,6 +622,11 @@ subroutine InitHistory(this, bounds)
avgflag='A', long_name='atmospheric pressure at surface (downscaled for glacier and hillslope columns)', &
ptr_col=this%forc_pbot_downscaled_col, default='inactive')

this%forc_pbot_not_downscaled_grc(begg:endg) = spval
call hist_addfld1d (fname='PBOT_NOT_DOWNSCALED', units='Pa', &
avgflag='A', long_name='atmospheric pressure at surface (pre-downscaling)', &
ptr_gcell=this%forc_pbot_not_downscaled_grc, default = 'inactive')

this%forc_lwrad_downscaled_col(begc:endc) = spval
call hist_addfld1d (fname='FLDS', units='W/m^2', &
avgflag='A', long_name='atmospheric longwave radiation (downscaled for glacier and hillslope columns)', &
Expand All @@ -619,6 +635,11 @@ subroutine InitHistory(this, bounds)
avgflag='A', long_name='atmospheric longwave radiation (downscaled for glacier and hillslope columns)', &
ptr_col=this%forc_lwrad_downscaled_col, default='inactive')

this%forc_lwrad_not_downscaled_grc(begg:endg) = spval
call hist_addfld1d (fname='FLDS_NOT_DOWNSCALED', units='W/m^2', &
avgflag='A', long_name='atmospheric longwave radiation (pre-downscaling)', &
ptr_gcell=this%forc_lwrad_not_downscaled_grc, default = 'inactive')

call hist_addfld1d (fname='FLDS_ICE', units='W/m^2', &
avgflag='A', &
long_name='atmospheric longwave radiation (downscaled for glacier and hillslope columns) (ice landunits only)', &
Expand All @@ -630,6 +651,87 @@ subroutine InitHistory(this, bounds)
avgflag='A', long_name='atmospheric air potential temperature (downscaled for glacier and hillslope columns)', &
ptr_col=this%forc_th_downscaled_col)

this%forc_th_not_downscaled_grc(begg:endg) = spval
call hist_addfld1d (fname='Thair_from_atm', units='K', &
avgflag='A', long_name='atmospheric air potential temperature (pre-downscaling)', &
ptr_gcell=this%forc_th_not_downscaled_grc, default = 'inactive')

this%forc_rho_not_downscaled_grc(begg:endg) = spval
call hist_addfld1d (fname='Rho_from_atm', units='kg/m^3', &
avgflag='A', long_name='atmospheric density (pre-downscaling)', &
ptr_gcell=this%forc_rho_not_downscaled_grc, default = 'inactive')

this%forc_aer_grc(begg:endg,:) = spval
data1dptr => this%forc_aer_grc(begg:endg,1)
call hist_addfld1d (fname='BCPHIDRY', units='kg/m^2/s', &
avgflag='A', long_name='black carbon deposition (phidry) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,2)
call hist_addfld1d (fname='BCPHODRY', units='kg/m^2/s', &
avgflag='A', long_name='black carbon deposition (phodry) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,3)
call hist_addfld1d (fname='BCPHIWET', units='kg/m^2/s', &
avgflag='A', long_name='black carbon deposition (phiwet) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,4)
call hist_addfld1d (fname='OCPHIDRY', units='kg/m^2/s', &
avgflag='A', long_name='organic carbon deposition (phidry) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,5)
call hist_addfld1d (fname='OCPHODRY', units='kg/m^2/s', &
avgflag='A', long_name='black carbon deposition (phodry) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,6)
call hist_addfld1d (fname='OCPHIWET', units='kg/m^2/s', &
avgflag='A', long_name='organic carbon deposition (phiwet) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,7)
call hist_addfld1d (fname='DSTWET1', units='kg/m^2/s', &
avgflag='A', long_name='dust deposition (wet1) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,8)
call hist_addfld1d (fname='DSTDRY1', units='kg/m^2/s', &
avgflag='A', long_name='dust deposition (dry1) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,9)
call hist_addfld1d (fname='DSTWET2', units='kg/m^2/s', &
avgflag='A', long_name='dust deposition (wet2) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,10)
call hist_addfld1d (fname='DSTDRY2', units='kg/m^2/s', &
avgflag='A', long_name='dust deposition (dry2) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,11)
call hist_addfld1d (fname='DSTWET3', units='kg/m^2/s', &
avgflag='A', long_name='dust deposition (wet3) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,12)
call hist_addfld1d (fname='DSTDRY3', units='kg/m^2/s', &
avgflag='A', long_name='dust deposition (dry3) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,13)
call hist_addfld1d (fname='DSTWET4', units='kg/m^2/s', &
avgflag='A', long_name='dust deposition (wet4) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

data1dptr => this%forc_aer_grc(begg:endg,14)
call hist_addfld1d (fname='DSTDRY4', units='kg/m^2/s', &
avgflag='A', long_name='dust deposition (dry4) from atmosphere', &
ptr_gcell=data1dptr, default = 'inactive')

! Time averaged quantities
this%fsi24_patch(begp:endp) = spval
call hist_addfld1d (fname='FSI24', units='K', &
Expand Down
Loading

0 comments on commit f448885

Please sign in to comment.