diff --git a/.gitmodules b/.gitmodules index 69ace57fc3..7d566e63ca 100644 --- a/.gitmodules +++ b/.gitmodules @@ -68,7 +68,7 @@ fxDONOTUSEurl = https://github.com/ESCOMP/mizuRoute [submodule "ccs_config"] path = ccs_config url = https://github.com/ESMCI/ccs_config_cesm.git -fxtag = ccs_config_cesm1.0.61 +fxtag = ccs_config_cesm1.0.61_add_domain_ne3np4.pg2_1 fxrequired = ToplevelRequired # Standard Fork to compare to with "git fleximod test" to ensure personal forks aren't committed fxDONOTUSEurl = https://github.com/ESMCI/ccs_config_cesm.git diff --git a/bld/CLMBuildNamelist.pm b/bld/CLMBuildNamelist.pm index 1071ec1e72..a205dd8ef3 100755 --- a/bld/CLMBuildNamelist.pm +++ b/bld/CLMBuildNamelist.pm @@ -735,6 +735,14 @@ sub setup_cmdl_resolution { $log->verbose_message( "This is NOT a NEON site" ); } + # + # To determine CMIP era + # TODO slevis: Ideally this line would occupy a new subroutine, e.g. + # subr. process_envxml_flags that would get called from + # process_namelist_user_input. This would allow other such + # XML variables to be set in the same place in the future (issue #3547). + $nl_flags->{'cmip_era'} = $envxml_ref->{'CLM_CMIP_ERA'}; + } #------------------------------------------------------------------------------- @@ -2367,6 +2375,7 @@ sub setup_logic_urban { add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'urban_hac'); add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'urban_explicit_ac'); add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'urban_traffic'); + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'init_interp_fill_missing_urban_with_HD'); } #------------------------------------------------------------------------------- @@ -2513,11 +2522,13 @@ sub setup_logic_demand { # For landuse.timeseries try with crop on first eise try with exact settings # Logic for this is identical for fsurdat if ( $item eq "flanduse_timeseries" ) { + $settings{'cmip_era'} = $nl_flags->{'cmip_era'}; $settings{'use_crop'} = ".true."; $settings{'nofail'} = 1; } add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, $item, %settings ); if ( $item eq "flanduse_timeseries" ) { + $settings{'cmip_era'} = $nl_flags->{'cmip_era'}; $settings{'nofail'} = 0; $settings{'use_crop'} = $nl_flags->{'use_crop'}; if ( ! defined($nl->get_value( $item )) ) { @@ -2567,6 +2578,7 @@ sub setup_logic_surface_dataset { add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, $var, 'hgrid'=>$nl_flags->{'res'}, 'ssp_rcp'=>$nl_flags->{'ssp_rcp'}, 'neon'=>$nl_flags->{'neon'}, 'neonsite'=>$nl_flags->{'neonsite'}, + 'cmip_era'=>$nl_flags->{'cmip_era'}, 'sim_year'=>$nl_flags->{'sim_year'}, 'use_vichydro'=>$nl_flags->{'use_vichydro'}, 'use_crop'=>".true.", 'use_fates'=>$nl_flags->{'use_fates'}, 'nofail'=>1); } @@ -2580,6 +2592,7 @@ sub setup_logic_surface_dataset { 'hgrid'=>$nl_flags->{'res'}, 'ssp_rcp'=>$nl_flags->{'ssp_rcp'}, 'use_vichydro'=>$nl_flags->{'use_vichydro'}, 'sim_year'=>$nl_flags->{'sim_year'}, 'use_fates'=>$nl_flags->{'use_fates'}, 'neon'=>$nl_flags->{'neon'}, 'neonsite'=>$nl_flags->{'neonsite'}, + 'cmip_era'=>$nl_flags->{'cmip_era'}, 'use_crop'=>$nl_flags->{'use_crop'} ); } # @@ -3746,6 +3759,8 @@ sub setup_logic_c_isotope { add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_c14', 'bgc_mode'=>$nl_flags->{'bgc_mode'}, 'phys'=>$nl_flags->{'phys'}, 'lnd_tuning_mode'=>$nl_flags->{'lnd_tuning_mode'}, ssp_rcp=>$nl_flags->{'ssp_rcp'} ); + &add_logical_to_nl_flags( $nl_flags, $nl, "use_c13" ); + &add_logical_to_nl_flags( $nl_flags, $nl, "use_c14" ); my $use_c13 = $nl->get_value('use_c13'); my $use_c14 = $nl->get_value('use_c14'); if ( $nl_flags->{'bgc_mode'} ne "sp" && $nl_flags->{'bgc_mode'} ne "fates" ) { @@ -3764,14 +3779,14 @@ sub setup_logic_c_isotope { add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_c14_bombspike', 'use_c14'=>$use_c14 ); $use_c14_bombspike = $nl->get_value('use_c14_bombspike'); if ( &value_is_true($use_c14_bombspike) ) { - if ( defined($stream_fldfilename_atm_c14) ) { - setup_logic_c14_streams($opts, $nl_flags, $definition, $defaults, $nl); - } else { + &add_logical_to_nl_flags( $nl_flags, $nl, "use_c14_bombspike" ); + setup_logic_c14_streams($opts, $nl_flags, $definition, $defaults, $nl); + $stream_fldfilename_atm_c14 = $nl->get_value('stream_fldfilename_atm_c14'); + if ( ! defined($stream_fldfilename_atm_c14) ) { add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'atm_c14_filename', 'use_c14'=>$use_c14, 'use_cn'=>$nl_flags->{'use_cn'}, 'use_c14_bombspike'=>$nl->get_value('use_c14_bombspike'), - 'ssp_rcp'=>$nl_flags->{'ssp_rcp'} ); + 'ssp_rcp'=>$nl_flags->{'ssp_rcp'}, 'cmip_era'=>$nl_flags->{'cmip_era'} ); } - $stream_fldfilename_atm_c14 = $nl->get_value('stream_fldfilename_atm_c14'); $atm_c14_filename = $nl->get_value('atm_c14_filename'); if ( defined($stream_fldfilename_atm_c14) && defined($atm_c14_filename) ) { $log->fatal_error("Both stream_fldfilename_atm_c14 and atm_c14_filename set, only one should be set"); @@ -3784,6 +3799,8 @@ sub setup_logic_c_isotope { $log->fatal_error("use_c14 is FALSE and use_c14_bombspike, stream_fldfilename_atm_c14 or atm_c14_filename set"); } } + &add_logical_to_nl_flags( $nl_flags, $nl, "use_c14_bombspike" ); + my $use_c13_timeseries = $nl->get_value('use_c13_timeseries'); my $stream_fldfilename_atm_c13 = $nl->get_value('stream_fldfilename_atm_c13'); my $atm_c13_filename = $nl->get_value('atm_c13_filename'); @@ -3791,14 +3808,14 @@ sub setup_logic_c_isotope { add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'use_c13_timeseries', 'use_c13'=>$use_c13 ); $use_c13_timeseries = $nl->get_value('use_c13_timeseries'); if ( &value_is_true($use_c13_timeseries) ) { - if ( defined($stream_fldfilename_atm_c13) ) { - setup_logic_c13_streams($opts, $nl_flags, $definition, $defaults, $nl); - } else { + &add_logical_to_nl_flags( $nl_flags, $nl, "use_c13_timeseries" ); + setup_logic_c13_streams($opts, $nl_flags, $definition, $defaults, $nl); + $stream_fldfilename_atm_c13 = $nl->get_value('stream_fldfilename_atm_c13'); + if ( ! defined($nl->get_value('stream_fldfilename_atm_c13')) ) { add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'atm_c13_filename', 'use_c13'=>$use_c13, 'use_cn'=>$nl_flags->{'use_cn'}, 'use_c13_timeseries'=>$nl->get_value('use_c13_timeseries'), 'ssp_rcp'=>$nl_flags->{'ssp_rcp'} ); } - $stream_fldfilename_atm_c13 = $nl->get_value('stream_fldfilename_atm_c13'); $atm_c13_filename = $nl->get_value('atm_c13_filename'); if ( defined($stream_fldfilename_atm_c13) && defined($atm_c13_filename) ) { $log->fatal_error("Both stream_fldfilename_atm_c13 and atm_c13_filename set, only one should be set"); @@ -3823,6 +3840,8 @@ sub setup_logic_c_isotope { $log->fatal_error("bgc=sp and C isotope namelist variables were set, both can't be used at the same time"); } } + &add_logical_to_nl_flags( $nl_flags, $nl, "use_c13_timeseries" ); + &add_logical_to_nl_flags( $nl_flags, $nl, "use_c13_bombspike" ); } #------------------------------------------------------------------------------- @@ -3832,6 +3851,27 @@ sub setup_logic_c13_streams { # # C13 stream file settings # + # Just return if use_c13 and use_c13_timeseries aren't both TRUE + if ( ! &value_is_true($nl_flags->{'use_c13'}) ) { return; } + if ( ! &value_is_true($nl_flags->{'use_c13_timeseries'}) ) { return; } + + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldfilename_atm_c13', + 'use_c13'=>$nl_flags->{'use_c13'}, 'use_c13_timeseries'=>$nl_flags->{'use_c13_timeseries'}, + 'ssp_rcp'=>$nl_flags->{'ssp_rcp'}, 'cmip_era'=>$nl_flags->{'cmip_era'}, 'nofail'=>1); + # If stream_fldfilename_atm_c13 is not defined then return and get the cmip6 file format version + if ( ! defined( $nl->get_value( "stream_fldfilename_atm_c13") ) ) { + return; + } + + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_year_first_atm_c13', + 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'}); + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_year_last_atm_c13', + 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'}); + # Set align year, if first and last years are different + if ( $nl->get_value('stream_year_first_atm_c13') != $nl->get_value('stream_year_last_atm_c13') ) { + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_model_year_align_atm_c13', + 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'}); + } } #------------------------------------------------------------------------------- @@ -3841,6 +3881,33 @@ sub setup_logic_c14_streams { # # C14 stream file settings # + # Just return if use_c14 and use_c14_bombspike aren't both TRUE + if ( ! &value_is_true($nl_flags->{'use_c14'}) ) { return; } + if ( ! &value_is_true($nl_flags->{'use_c14_bombspike'}) ) { return; } + + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldfilename_atm_c14', + 'use_c14'=>$nl_flags->{'use_c14'}, 'use_c14_bombspike'=>$nl_flags->{'use_c14_bombspike'}, + 'ssp_rcp'=>$nl_flags->{'ssp_rcp'}, 'nofail'=>1); + # If stream_fldfilename_atm_c14 is not defined then return and get the cmip6 file format version + if ( ! defined( $nl->get_value( "stream_fldfilename_atm_c14") ) ) { + return; + } + + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_meshfile_atm_c14', + 'use_c14'=>$nl_flags->{'use_c14'}, 'use_c14_bombspike'=>$nl_flags->{'use_c14_bombspike'}); + if ( &remove_leading_and_trailing_quotes( $nl->get_value( "stream_meshfile_atm_c14") ) eq "none" ) { + $log->fatal_error( "stream_meshfile_atm_c14 is set to 'none' which will only copy the first latitude to the globe") + } + + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_year_first_atm_c14', + 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'}); + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_year_last_atm_c14', + 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'}); + # Set align year, if first and last years are different + if ( $nl->get_value('stream_year_first_atm_c14') != $nl->get_value('stream_year_last_atm_c14') ) { + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_model_year_align_atm_c14', + 'sim_year'=>$nl_flags->{'sim_year'}, 'sim_year_range'=>$nl_flags->{'sim_year_range'}); + } } #------------------------------------------------------------------------------- @@ -4430,7 +4497,9 @@ sub setup_logic_cropcal_streams { if ( &value_is_true($cropcals_rx) or &value_is_true($cropcals_rx_adapt) ) { add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldFileName_swindow_start'); add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldFileName_swindow_end'); - add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldfilename_cultivar_gdds'); + add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldfilename_cultivar_gdds', + 'lnd_tuning_mode'=>$nl_flags->{'lnd_tuning_mode'} + ); if ( &value_is_true($cropcals_rx_adapt) ) { add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldFileName_gdd20_baseline', 'stream_gdd20_seasons'=>$stream_gdd20_seasons); } @@ -5495,7 +5564,7 @@ sub add_default { " Are defaults provided for this resolution and land mask?" ); } else { $log->fatal_error("No default value found for $var.\n" . - " Are defaults provided for this resolution and land mask?"); + " Are defaults provided in namelist_defaults for this resolution, land mask, and CLM_CMIP_ERA (set in env_run.xml)?"); } } else { @@ -5937,6 +6006,27 @@ sub logical_to_fortran { #------------------------------------------------------------------------------- +sub add_logical_to_nl_flags { + # Add a logical setting to the $nl_flsgs hash, so can be used in attribute checking + # This is important to do to make sure that the attribute is matched exactly as + # either: .true. or .false. + # Also sets nl_flags to .false. when the namelist variable is NOT set + my ($nl_flags, $nl, $var) = @_; + + my $val = $nl->get_value($var); + if ( defined($val) ) { + if ( &value_is_true($val)) { + $nl_flags->{$var} = ".true."; + } else { + $nl_flags->{$var} = ".false."; + } + } else { + $nl_flags->{$var} = ".false."; + } +} + +#------------------------------------------------------------------------------- + sub string_is_undef_or_empty { # Return true if the given string is undefined or only spaces, false otherwise. # A quoted empty string (' ' or " ") is treated as being empty. diff --git a/bld/namelist_files/namelist_defaults_ctsm.xml b/bld/namelist_files/namelist_defaults_ctsm.xml index 1bb029844c..20b197a4a7 100644 --- a/bld/namelist_files/namelist_defaults_ctsm.xml +++ b/bld/namelist_files/namelist_defaults_ctsm.xml @@ -133,21 +133,73 @@ attributes from the config_cache.xml file (with keys converted to upper-case). .true. -lnd/clm2/isotopes/atm_delta_C13_CMIP6_1850-2015_yearly_v2.0_c190528.nc -lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP119_1850-2100_yearly_c181209.nc -lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP126_1850-2100_yearly_c181209.nc -lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP245_1850-2100_yearly_c181209.nc -lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP3B_1850-2100_yearly_c181209.nc -lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP534os_1850-2100_yearly_c181209.nc -lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP5B_1850-2100_yearly_c181209.nc - -lnd/clm2/isotopes/atm_delta_C14_CMIP6_3x1_global_1850-2015_yearly_v2.0_c190528.nc -lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP119_3x1_global_1850-2100_yearly_c181209.nc -lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP126_3x1_global_1850-2100_yearly_c181209.nc -lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP245_3x1_global_1850-2100_yearly_c181209.nc -lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP3B_3x1_global_1850-2100_yearly_c181209.nc -lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP534os_3x1_global_1850-2100_yearly_c181209.nc -lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP5B_3x1_global_1850-2100_yearly_c181209.nc +lnd/clm2/isotopes/atm_delta_C13_CMIP6_1850-2015_yearly_v2.0_c190528.nc +lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP119_1850-2100_yearly_c181209.nc +lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP126_1850-2100_yearly_c181209.nc +lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP245_1850-2100_yearly_c181209.nc +lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP3B_1850-2100_yearly_c181209.nc +lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP534os_1850-2100_yearly_c181209.nc +lnd/clm2/isotopes/atm_delta_C13_CMIP6_SSP5B_1850-2100_yearly_c181209.nc + +lnd/clm2/isotopes/atm_delta_C14_CMIP6_3x1_global_1850-2015_yearly_v2.0_c190528.nc +lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP119_3x1_global_1850-2100_yearly_c181209.nc +lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP126_3x1_global_1850-2100_yearly_c181209.nc +lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP245_3x1_global_1850-2100_yearly_c181209.nc +lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP3B_3x1_global_1850-2100_yearly_c181209.nc +lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP534os_3x1_global_1850-2100_yearly_c181209.nc +lnd/clm2/isotopes/atm_delta_C14_CMIP6_SSP5B_3x1_global_1850-2100_yearly_c181209.nc + + +lnd/clm2/isotopes/ctsmforc.Graven.atm_delta_C14_CMIP7_360x720_1700-2023_yearly_v3.0_c251117.nc +share/meshes/360x720_120830_ESMFmesh_c20210507.nc + + +2018 +2018 + +2010 +2010 + +2000 +2000 + +1850 +1850 + +1850 +1850 + +1700 +1700 + +1700 +2023 +1700 + +lnd/clm2/isotopes/ctsmforc.Graven.atm_delta_C13_CMIP7_global_1700-2023_yearly_v3.0_c251013.nc + + +2018 +2018 + +2010 +2010 + +2000 +2000 + +1850 +1850 + +1850 +1850 + +1700 +1700 + +1700 +2023 +1700 .false. @@ -280,11 +332,13 @@ attributes from the config_cache.xml file (with keys converted to upper-case). li2014qianfrc 90.d00 -4.0d00 1.8d00 0.3d00 1.0d00 +4.0d00 +3.0d00 + 30.0d00 80.0d00 0.3d00 @@ -383,7 +437,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case). 80.0d00 0.85d00 0.98d00 -0.01d00 +0.04d00 0.28d-4 0.010d00 0.71d-4 @@ -402,11 +456,11 @@ attributes from the config_cache.xml file (with keys converted to upper-case). 85.0d00 0.85d00 0.98d00 -0.01d00 +0.03d00 0.28d-4 0.010d00 0.71d-4 -0.3d00 +0.34d00 0.33d00 75.d00 825.d00 @@ -570,7 +624,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case). -lnd/clm2/paramdata/ctsm60_params_cal115_c250813.nc +lnd/clm2/paramdata/clm60_params.ctsm6_li2024.c250822.nc lnd/clm2/paramdata/clm50_params.c250311.nc lnd/clm2/paramdata/clm45_params.c250311.nc @@ -783,6 +837,8 @@ attributes from the config_cache.xml file (with keys converted to upper-case). maxpft="17" use_cn=".false." use_crop=".false." hgrid="ne0np4.ARCTIC.ne30x4" >.true. .true. +.true. hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false. +hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false. + hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false. -hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false. @@ -1199,21 +1259,22 @@ attributes from the config_cache.xml file (with keys converted to upper-case). >hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false. -hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false. - - hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false. - + hgrid=ne120np4.pg3 maxpft=79 mask=tx0.1v3 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false. +hgrid=ne120np4.pg3 maxpft=79 mask=tx0.1v3 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false. + +hgrid=ne120np4.pg3 maxpft=79 mask=tx0.1v3 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false. + @@ -1314,9 +1375,15 @@ attributes from the config_cache.xml file (with keys converted to upper-case). lnd/clm2/initdata_esmf/ctsm5.3/clmi.interp_from.I1850Clm50BgcCrop-ciso.1366-01-01.0.9x1.25_gx1v7_simyr1850_c240223.nc +lnd/clm2/initdata_esmf/ctsm5.4/clmi.f09_interp_from.ctsm5.4.CMIP7_ciso_ctsm5.3.075_f09_124_pSASU.clm2.r.0161_c251118.nc + lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_SP_f09_121_1850.clm2.r.0041-01-01-00000.nc + phys="clm6_0" +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_SP_f09_127_1850.clm2.r.0102-01-01-00000.nc lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_SP_ne30_120_1850.clm2.r.0041-01-01-00000.nc +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_SP_ne30_126_1850.clm2.r.0102-01-01-00000.nc lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_SP_f09_121_HIST.clm2.r.2000-01-01-00000.nc +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_SP_f09_127_HIST.clm2.r.2000-01-01-00000.nc lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_SP_ne30_120_HIST.clm2.r.2000-01-01-00000.nc +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_SP_ne30_126_HIST.clm2.r.2000-01-01-00000.nc lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115f09_118_pSASU.clm2.r.0161-01-01-00000.nc + phys="clm6_0" +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_f09_124_pSASU.clm2.r.0161-01-01-00000.nc lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_116_pSASU.clm2.r.0161-01-01-00000.nc + phys="clm6_0" +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_ne30_123_pSASU.clm2.r.0161-01-01-00000.nc lnd/clm2/initdata_esmf/ctsm5.4/ctsm53065_54surfdata_PPEcal115_115_pSASU.clm2.r.0161-01-01-00000.nc +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_f19_125_pSASU.clm2.r.0161-01-01-00000.nc lnd/clm2/initdata_map/clmi.FHISTSp.1979-01-01.ARCTICGRIS_ne30x8_mt12_simyr1979_c200806.nc - + +lnd/clm2/initdata_map/clmi.F2000.2000-01-01.ne120pg3_mt13_simyr2000_c200728.nc + lnd/clm2/initdata_map/clmi.F2000.2000-01-01.ne120pg3_mt13_simyr2000_c200728.nc @@ -1522,14 +1589,14 @@ attributes from the config_cache.xml file (with keys converted to upper-case). lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115f09_118_HIST.clm2.r.2000-01-01-00000.nc + phys="clm6_0" use_init_interp=".true." +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_f09_124_HIST.clm2.r.2000-01-01-00000.nc lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_116_HIST.clm2.r.2000-01-01-00000.nc +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_ne30_123_HIST_popDens.clm2.r.2000-01-01-00000.nc @@ -1537,13 +1604,13 @@ attributes from the config_cache.xml file (with keys converted to upper-case). ic_ymd="20100101" sim_year="2010" use_excess_ice=".true." ic_tod="0" glc_nec="10" use_crop=".true." phys="clm6_0" ->lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115f09_118_HIST.clm2.r.2010-01-01-00000.nc +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_f09_124_HIST.clm2.r.2010-01-01-00000.nc lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_116_HIST.clm2.r.2010-01-01-00000.nc +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_ne30_123_HIST_popDens.clm2.r.2010-01-01-00000.nc @@ -1571,14 +1638,14 @@ attributes from the config_cache.xml file (with keys converted to upper-case). ic_ymd="19790101" sim_year="1979" use_excess_ice=".true." ic_tod="0" glc_nec="10" use_crop=".true." phys="clm6_0" ->lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115f09_118_HIST.clm2.r.1979-01-01-00000.nc +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_f09_124_HIST.clm2.r.1979-01-01-00000.nc lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4_5.3.068_PPEcal115_116_HIST.clm2.r.1979-01-01-00000.nc +>lnd/clm2/initdata_esmf/ctsm5.4/ctsm5.4.CMIP7_ciso_ctsm5.3.075_ne30_123_HIST_popDens.clm2.r.1979-01-01-00000.nc @@ -1725,158 +1792,190 @@ attributes from the config_cache.xml file (with keys converted to upper-case). -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_0.9x1.25_hist_2000_16pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_0.9x1.25_hist_2000_16pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1.9x2.5_hist_2000_16pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_hist_2000_16pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_10x15_hist_2000_16pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_10x15_hist_2000_16pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_4x5_hist_2000_16pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_4x5_hist_2000_16pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg3_hist_2000_16pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa60_hist_2000_16pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa60_hist_2000_16pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa30_hist_2000_16pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa15_hist_2000_16pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa15_hist_2000_16pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa3p75_hist_2000_16pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa3p75_hist_2000_16pfts_c251022.nc - + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_0.9x1.25_hist_2000_78pfts_c251022.nc + lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_0.9x1.25_hist_2000_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1.9x2.5_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_10x15_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_10x15_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_4x5_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_4x5_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1x1_brazil_hist_2000_78pfts_c240912.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1x1_brazil_hist_2000_78pfts_c251023.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_5x5_amazon_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_5x5_amazon_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4.pg2_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg2_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4.pg3_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg3_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne16np4.pg3_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne16np4.pg3_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_0.125nldas2_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_0.125nldas2_hist_2000_78pfts_c251022.nc - -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_T42_hist_2000_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_360x720cru_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_360x720cru_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_C96_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_C96_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1x1_numaIA_hist_2000_78pfts_c240912.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1x1_numaIA_hist_2000_78pfts_c251023.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa480_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa480_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa120_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa120_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4_hist_2000_78pfts_c240925.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4_hist_2000_78pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4.pg2_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4.pg3_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4.pg3_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne120np4.pg3_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne120np4.pg3_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.ARCTICGRIS.ne30x8_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.ARCTICGRIS.ne30x8_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.ARCTIC.ne30x4_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.ARCTIC.ne30x4_hist_2000_78pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.NATL.ne30x8_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.POLARCAP.ne30x4_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.POLARCAP.ne30x4_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4CONUS.ne30x8_hist_2000_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4CONUS.ne30x8_hist_2000_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1x1_vancouverCAN_hist_2000_78pfts_c240912.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1x1_vancouverCAN_hist_2000_78pfts_c251023.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1x1_mexicocityMEX_hist_2000_78pfts_c240912.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1x1_mexicocityMEX_hist_2000_78pfts_c251023.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/synthetic/surfdata_1x1_urbanc_alpha_synth_hist_2000_78pfts_c240912.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/synthetic/surfdata_1x1_urbanc_alpha_synth_hist_2000_78pfts_c251023.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1.9x2.5_hist_1850_16pfts_c240926.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_hist_1850_16pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_4x5_hist_1850_16pfts_c241007.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_4x5_hist_1850_16pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_hist_1850_16pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_10x15_hist_1850_16pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg3_hist_1850_16pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_360x720cru_hist_1850_78pfts_c240908.nc - +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_360x720cru_hist_1850_78pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_0.9x1.25_hist_1850_78pfts_c251022.nc + lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_0.9x1.25_hist_1850_78pfts_c240908.nc - + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_hist_1850_78pfts_c251022.nc + lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1.9x2.5_hist_1850_78pfts_c240908.nc - + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_10x15_hist_1850_78pfts_c251022.nc + lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_10x15_hist_1850_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_4x5_hist_1850_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_4x5_hist_1850_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa480_hist_1850_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa480_hist_1850_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa120_hist_1850_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_mpasa120_hist_1850_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4_hist_1850_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4_hist_1850_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4.pg2_hist_1850_78pfts_c240908.nc - +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg2_hist_1850_78pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg3_hist_1850_78pfts_c251022.nc + lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4.pg3_hist_1850_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4.pg3_hist_1850_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4.pg3_hist_1850_78pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4.pg2_hist_1850_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4_hist_1850_78pfts_c240925.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne3np4_hist_1850_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_C96_hist_1850_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_C96_hist_1850_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/synthetic/surfdata_1x1_smallvilleIA_synth_hist_1850_78pfts_c240912.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/synthetic/surfdata_1x1_smallvilleIA_synth_hist_1850_78pfts_c251023.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/synthetic/surfdata_1x1_cidadinhoBR_synth_hist_2000_78pfts_c240912.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/synthetic/surfdata_1x1_cidadinhoBR_synth_hist_2000_78pfts_c251023.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1x1_brazil_hist_1850_78pfts_c240912.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1x1_brazil_hist_1850_78pfts_c251023.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne16np4.pg3_hist_1850_78pfts_c240908.nc - -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne120np4.pg3_hist_1850_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne16np4.pg3_hist_1850_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.ARCTICGRIS.ne30x8_hist_1979_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.ARCTICGRIS.ne30x8_hist_1979_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.ARCTIC.ne30x4_hist_1979_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.ARCTIC.ne30x4_hist_1979_78pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.NATL.ne30x8_hist_1979_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4.POLARCAP.ne30x4_hist_1979_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4.POLARCAP.ne30x4_hist_1979_78pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne0np4CONUS.ne30x8_hist_1979_78pfts_c240908.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne0np4CONUS.ne30x8_hist_1979_78pfts_c251022.nc + +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne120np4.pg3_hist_1979_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_0.9x1.25_PtVeg_nourb_1850_16pfts_c240908.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_0.9x1.25_PtVeg_nourb_1850_16pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_1.9x2.5_PtVeg_nourb_1850_16pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne16np4.pg3_PtVeg_nourb_1850_16pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/surfdata_ne30np4.pg3_PtVeg_nourb_1850_16pfts_c251022.nc -lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/16PFT_mixed/surfdata_1x1_NEON_${NEONSITE}_hist_2000_16pfts_c240912.nc +lnd/clm2/surfdata_esmf/NEON/ctsm5.4.0/16PFT_mixed/surfdata_1x1_NEON_${NEONSITE}_hist_2000_16pfts_c251023.nc -lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_${NEONSITE}_hist_2000_78pfts_c240912.nc +lnd/clm2/surfdata_esmf/NEON/ctsm5.4.0/surfdata_1x1_NEON_${NEONSITE}_hist_2000_78pfts_c251023.nc @@ -1884,60 +1983,82 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2 lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_1.9x2.5_hist_1850-2023_16pfts_c240926.nc + >lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_1.9x2.5_hist_1850-2023_16pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_4x5_hist_1850-2023_16pfts_c241007.nc + >lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_4x5_hist_1850-2023_16pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_1.9x2.5_hist_1850-2023_16pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_10x15_hist_1850-2023_16pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne30np4.pg3_hist_1850-2023_16pfts_c251022.nc -lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_0.9x1.25_hist_1850-2023_78pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_1.9x2.5_hist_1850-2023_78pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_1.9x2.5_SSP2-4.5_1850-2100_78pfts_c240908.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.ARCTICGRIS.ne30x8_SSP2-4.5_1979-2026_78pfts_c240908.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne0np4.ARCTICGRIS.ne30x8_hist_1979-2023_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.ARCTIC.ne30x4_SSP2-4.5_1979-2026_78pfts_c240908.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne0np4.ARCTIC.ne30x4_hist_1979-2023_78pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne0np4.NATL.ne30x8_hist_1979-2023_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.POLARCAP.ne30x4_SSP2-4.5_1979-2026_78pfts_c240908.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne0np4.POLARCAP.ne30x4_hist_1979-2023_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4CONUS.ne30x8_SSP2-4.5_1979-2026_78pfts_c240908.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne0np4CONUS.ne30x8_hist_1979-2023_78pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne120np4.pg3_hist_1979-2023_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_4x5_SSP2-4.5_1850-2100_78pfts_c240908.nc + >lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_4x5_hist_1850-2023_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_10x15_SSP2-4.5_1850-2100_78pfts_c240908.nc + >lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_10x15_hist_1850-2023_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_360x720cru_SSP2-4.5_1850-2100_78pfts_c240908.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_360x720cru_hist_1850-2023_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_1x1_brazil_SSP2-4.5_1850-2100_78pfts_c240912.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_1x1_brazil_hist_1850-2023_78pfts_c251023.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_mpasa120_SSP2-4.5_1850-2100_78pfts_c240908.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_mpasa120_hist_1850-2023_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4_SSP2-4.5_1850-2100_78pfts_c240926.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne3np4_hist_1850-2023_78pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne3np4.pg2_hist_1850-2023_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne3np4.pg3_hist_1850-2023_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne16np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne16np4.pg3_hist_1850-2023_78pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne30np4_hist_1850-2023_78pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne30np4.pg2_hist_1850-2023_78pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_ne30np4.pg3_hist_1850-2023_78pfts_c251022.nc +lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne30np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_C96_SSP2-4.5_1850-2100_78pfts_c240908.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/landuse.timeseries_C96_hist_1850-2023_78pfts_c251022.nc lnd/clm2/surfdata_esmf/ctsm5.3.0/synthetic/landuse.timeseries_1x1_smallvilleIA_synth_1850-1855_78pfts_c240908.nc +>lnd/clm2/surfdata_esmf/ctsm5.4.0/synthetic/landuse.timeseries_1x1_smallvilleIA_synth_1850-1855_78pfts_c251023.nc @@ -1945,61 +2066,52 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2 -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP1-2.6_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_1.9x2.5_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_4x5_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_10x15_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_360x720cru_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_1x1_brazil_SSP2-4.5_1850-2100_78pfts_c240912.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_mpasa120_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4_SSP2-4.5_1850-2100_78pfts_c240926.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne16np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne30np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_C96_SSP2-4.5_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.ARCTICGRIS.ne30x8_SSP2-4.5_1979-2026_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.ARCTIC.ne30x4_SSP2-4.5_1979-2026_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4.POLARCAP.ne30x4_SSP2-4.5_1979-2026_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne0np4CONUS.ne30x8_SSP2-4.5_1979-2026_78pfts_c240908.nc - -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP3-7.0_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP4-6.0_1850-2100_78pfts_c240908.nc -lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_0.9x1.25_SSP5-8.5_1850-2100_78pfts_c240908.nc @@ -2169,20 +2281,29 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2 2000 2000 + +lnd/clm2/cropdata/calendars/processed/gdds_20250809_025305.tweaked_latlons.nc +lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc +lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc +lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc +lnd/clm2/cropdata/calendars/processed/gdds_20250809_025305.tweaked_latlons.nc +lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc +lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc +lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc + lnd/clm2/cropdata/calendars/processed/swindow_starts_ggcmi_crop_calendar_phase3_v1.01.2000-2000.20231005_145103.tweaked_latlons.nc lnd/clm2/cropdata/calendars/processed/swindow_ends_ggcmi_crop_calendar_phase3_v1.01.2000-2000.20231005_145103.tweaked_latlons.nc -lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc lnd/clm2/cropdata/calendars/processed/360x720_120830_ESMFmesh_c20210507_cdf5.tweaked_latlons.nc lnd/clm2/cropdata/calendars/processed/swindow_starts_ggcmi_crop_calendar_phase3_v1.01.2000-2000.20231005_145103.tweaked_latlons.nc lnd/clm2/cropdata/calendars/processed/swindow_ends_ggcmi_crop_calendar_phase3_v1.01.2000-2000.20231005_145103.tweaked_latlons.nc -lnd/clm2/cropdata/calendars/processed/gdds_20230829_161011.tweaked_latlons.nc lnd/clm2/cropdata/calendars/processed/20230714_cropcals_pr2_1deg.actually2deg.1980-2009.from_GDDB20.interpd_halfdeg.tweaked_latlons.nc lnd/clm2/cropdata/calendars/processed/gdd20bl.copied_from.gdds_20230829_161011.v2.tweaked_latlons.nc lnd/clm2/cropdata/calendars/processed/sdates_ggcmi_crop_calendar_phase3_v1.01_nninterp-hcru_hcru_mt13.2000-2000.20230728_165845.tweaked_latlons.nc lnd/clm2/cropdata/calendars/processed/hdates_ggcmi_crop_calendar_phase3_v1.01_nninterp-hcru_hcru_mt13.2000-2000.20230728_165845.tweaked_latlons.nc lnd/clm2/cropdata/calendars/processed/360x720_120830_ESMFmesh_c20210507_cdf5.tweaked_latlons.nc + none @@ -2276,8 +2397,8 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2 lnd/clm2/firedata/clmforc.Li_2018_SSP2_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc -lnd/clm2/firedata/clmforc.Li_2018_SSP3_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc - +lnd/clm2/firedata/clmforc.Li_2025_CMIP7_SSP3CMIP6_hdm_0.5x0.5_simyr1850-2100_c250717.nc +lnd/clm2/firedata/clmforc.Li_2018_SSP3_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc lnd/clm2/firedata/clmforc.Li_2018_SSP4_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc lnd/clm2/firedata/clmforc.Li_2018_SSP4_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc @@ -2294,8 +2415,8 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2 lnd/clm2/firedata/clmforc.Li_2018_SSP2_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc -lnd/clm2/firedata/clmforc.Li_2018_SSP3_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc - +lnd/clm2/firedata/clmforc.Li_2025_CMIP7_SSP3CMIP6_hdm_0.5x0.5_simyr1850-2100_c250717.nc +lnd/clm2/firedata/clmforc.Li_2018_SSP3_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc lnd/clm2/firedata/clmforc.Li_2018_SSP4_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc lnd/clm2/firedata/clmforc.Li_2018_SSP4_CMIP6_hdm_0.5x0.5_AVHRR_simyr1850-2100_c181205.nc @@ -2596,6 +2717,10 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2 general + +.true. + diff --git a/bld/namelist_files/namelist_definition_ctsm.xml b/bld/namelist_files/namelist_definition_ctsm.xml index 7a032b901f..75d43fb80a 100644 --- a/bld/namelist_files/namelist_definition_ctsm.xml +++ b/bld/namelist_files/namelist_definition_ctsm.xml @@ -1818,7 +1818,7 @@ First year to loop over for atmospheric C14 isotope delta data -Last year to loop over for data atmospheric C14 isotope delta data +Last year to loop over for atmospheric C14 isotope delta data + +Time interpolation method to use for atmospheric C14 delta data + + + +Time interpolation mode for atmospheric C14 delta data to determine how to handle data before and after the times in the file + cycle = Always cycle over the data + extend = Use the first time before the available data, and use the last time after the available data + limit = Only use the data within the times available -- abort if the model tries to go outside it + + Filename of input stream data for atmospheric C14 isotope delta data + +Filename of input stream mesh for atmospheric C14 isotope delta data + + First year to loop over for atmospheric C13 isotope delta data @@ -1846,6 +1864,19 @@ Last year to loop over for data atmospheric C13 isotope delta data Simulation year that aligns with stream_year_first_atm_c13 value + +Time interpolation method to use for atmospheric C13 delta data + + + +Time interpolation mode for atmospheric C13 delta data to determine how to handle data before and after the times in the file + cycle = Always cycle over the data + extend = Use the first time before the available data, and use the last time after the available data + limit = Only use the data within the times available -- abort if the model tries to go outside it + + Filename of input stream data for atmospheric C13 isotope delta data diff --git a/bld/unit_testers/build-namelist_test.pl b/bld/unit_testers/build-namelist_test.pl index cc747cdc5f..8028b8d8ff 100755 --- a/bld/unit_testers/build-namelist_test.pl +++ b/bld/unit_testers/build-namelist_test.pl @@ -42,7 +42,7 @@ sub make_env_run { my %settings = @_; # Set default settings - my %env_vars = ( DIN_LOC_ROOT=>"MYDINLOCROOT", GLC_TWO_WAY_COUPLING=>"FALSE", LND_SETS_DUST_EMIS_DRV_FLDS=>"TRUE", NEONSITE=>"", PLUMBER2SITE=>"" ); + my %env_vars = ( DIN_LOC_ROOT=>"MYDINLOCROOT", GLC_TWO_WAY_COUPLING=>"FALSE", LND_SETS_DUST_EMIS_DRV_FLDS=>"TRUE", NEONSITE=>"", PLUMBER2SITE=>"", CLM_CMIP_ERA=>"cmip7" ); # Set any settings that came in from function call foreach my $item ( keys(%settings) ) { $env_vars{$item} = $settings{$item}; @@ -163,7 +163,7 @@ sub cat_and_create_namelistinfile { # # Figure out number of tests that will run # -my $ntests = 3400; +my $ntests = 3405; if ( defined($opts{'compare'}) ) { $ntests += 2061; @@ -261,7 +261,7 @@ sub cat_and_create_namelistinfile { my $options = "-co2_ppmv 250 "; $options .= " -res 10x15 -ssp_rcp SSP2-4.5 -envxml_dir ."; - &make_env_run(); + &make_env_run( 'CLM_CMIP_ERA'=>"cmip6" ); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "options: $options" ); $cfiles->checkfilesexist( "default", $mode ); @@ -567,14 +567,35 @@ sub cat_and_create_namelistinfile { $phys = "clm5_0"; $mode = "-phys $phys"; &make_config_cache($phys); +# Four tests that require CLM_CMIP_ERA set to cmip6 foreach my $options ( "--res 0.9x1.25 --bgc sp --use_case 1850-2100_SSP2-4.5_transient --namelist '&a start_ymd=18501223/'", + "--res 1.9x2.5 --bgc bgc --use_case 1850-2100_SSP2-4.5_transient --namelist '&a start_ymd=19101023/'", + "--res 1.9x2.5 --bgc bgc --use_case 1850_control --namelist '&a start_ymd=18500101/'", + "--res 1.9x2.5 --bgc bgc --use_case 20thC_transient --namelist '&a start_ymd=18500101/'", + ) { + my $file = $startfile; + &make_env_run( 'CLM_CMIP_ERA'=>"cmip6" ); + eval{ system( "$bldnml -envxml_dir . $options > $tempfile 2>&1 " ); }; + is( $@, '', "options: $options" ); + $cfiles->checkfilesexist( "$options", $mode ); + $cfiles->shownmldiff( "default", $mode ); + if ( defined($opts{'compare'}) ) { + $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); + $cfiles->dodiffonfile( "lnd_in", "$options", $mode ); + $cfiles->comparefiles( "$options", $mode, $opts{'compare'} ); + } + if ( defined($opts{'generate'}) ) { + $cfiles->copyfiles( "$options", $mode ); + } + &cleanup(); +} +foreach my $options ( "-bgc fates -use_case 2000_control -no-megan", "-bgc fates -use_case 20thC_transient -no-megan", "-bgc fates -use_case 20thC_transient -no-megan -no-crop --res 4x5", "-bgc fates -use_case 1850_control -no-megan -namelist \"&a use_fates_sp=T, soil_decomp_method='None'/\"", "-bgc sp -use_case 2000_control -res 0.9x1.25 -namelist '&a use_soil_moisture_streams = T/'", - "--res 1.9x2.5 --bgc bgc --use_case 1850-2100_SSP2-4.5_transient --namelist '&a start_ymd=19101023/'", "-namelist \"&a dust_emis_method='Zender_2003', zender_soil_erod_source='lnd' /'\"", "-bgc bgc -use_case 2000_control -namelist \"&a fire_method='nofire'/\" -crop", "-res 0.9x1.25 -bgc sp -use_case 1850_noanthro_control -drydep", @@ -611,6 +632,11 @@ sub cat_and_create_namelistinfile { system( "touch $finidat" ); my %failtest = ( + "cmip7_w_issp" =>{ options=>"-envxml_dir . -use_case 1850-2100_SSP2-4.5_transient", + namelst=>"", + CLM_CMIP_ERA=>"cmip7", + phys=>"clm6_0", + }, "coldstart but with IC file"=>{ options=>"-clm_start_type cold -envxml_dir .", namelst=>"finidat='$finidat'", phys=>"clm5_0", @@ -1170,7 +1196,7 @@ sub cat_and_create_namelistinfile { namelst=>"use_fates_lupft=.true.", phys=>"clm4_5", }, - "inventoryfileDNE" =>{ options=>"-bgc fates -envxml_dir . -no-megan", + "useFATESLUH2fileDNE" =>{ options=>"-bgc fates -envxml_dir . -no-megan", namelst=>"use_fates_luh=.true., fluh_timeseries='zztop'", phys=>"clm4_5", }, @@ -1385,7 +1411,7 @@ sub cat_and_create_namelistinfile { my $options = $failtest{$key}{"options"}; my $namelist = $failtest{$key}{"namelst"}; my %settings; - foreach my $xmlvar ( "GLC_TWO_WAY_COUPLING", "LND_SETS_DUST_EMIS_DRV_FLDS") { + foreach my $xmlvar ( "GLC_TWO_WAY_COUPLING", "LND_SETS_DUST_EMIS_DRV_FLDS", "CLM_CMIP_ERA") { if ( defined($failtest{$key}{$xmlvar}) ) { $settings{$xmlvar} = $failtest{$key}{$xmlvar}; } @@ -1421,6 +1447,11 @@ sub cat_and_create_namelistinfile { namelst=>"use_soil_moisture_streams=T,soilm_tintalgo='linear'", phys=>"clm5_0", }, + "c14_meshfile_none" =>{ options=>"-envxml_dir . -bgc bgc", + namelst=>"stream_fldfilename_atm_c14='/dev/null', " . + "stream_meshfile_atm_c14='none'", + phys=>"clm6_0", + }, "missing_ndep_file" =>{ options=>"-envxml_dir . -bgc bgc -ssp_rcp SSP5-3.4", namelst=>"", phys=>"clm5_0", @@ -1611,9 +1642,9 @@ sub cat_and_create_namelistinfile { &cleanup(); print "\n"; } -print "\n==================================================\n"; -print " Test all use-cases over all physics options\n"; -print "==================================================\n"; +print "\n=============================================================\n"; +print " Test all use-cases over all physics options for f09 and SP \n"; +print "=============================================================\n"; # Run over all use-cases for f09 and all physics... my $list = `$bldnml -use_case list 2>&1 | grep "use case"`; @@ -1634,8 +1665,9 @@ sub cat_and_create_namelistinfile { &make_config_cache($phys); foreach my $usecase ( @usecases ) { print "usecase = $usecase\n"; - $options = "-res 0.9x1.25 -use_case $usecase -envxml_dir ."; - &make_env_run(); + # Just do SP here as some use-cases can't do crop (nonanthro), and some not BGC (stdurbpt) + $options = "-res 0.9x1.25 -use_case $usecase --bgc bgc -envxml_dir ."; + &make_env_run( 'CLM_CMIP_ERA'=>"cmip6" ); my $expect_fail = undef; foreach my $failusecase ( @expect_fails ) { if ( $failusecase eq $usecase ) { @@ -1856,15 +1888,21 @@ sub cat_and_create_namelistinfile { my $startymd = undef; if ( ($usecase eq "1850_control") || ($usecase eq "20thC_transient") ) { $startymd = 18500101; + &make_env_run(); } elsif ( $usecase eq "2000_control") { $startymd = 20000101; + &make_env_run(); } elsif ( $usecase eq "2010_control") { $startymd = 20100101; + &make_env_run(); + } elsif ( $usecase =~ "2100_SSP") { + $startymd = 20150101; + &make_env_run( 'CLM_CMIP_ERA'=>"cmip6" ); } else { $startymd = 20150101; + &make_env_run(); } $options = "-bgc bgc -res $res -use_case $usecase -envxml_dir . -namelist '&a start_ymd=$startymd/'"; - &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "$options" ); $cfiles->checkfilesexist( "$options", $mode ); @@ -1901,11 +1939,11 @@ sub cat_and_create_namelistinfile { } # Transient ssp_rcp scenarios that work my @tran_res = ( "4x5", "0.9x1.25", "1.9x2.5", "10x15", "360x720cru", "ne3np4", "ne3np4.pg3", "ne16np4.pg3", "ne30np4.pg3", "C96", "mpasa120" ); +my $startymd = 20150101; +&make_env_run( 'CLM_CMIP_ERA'=>"cmip6" ); foreach my $usecase ( "1850-2100_SSP2-4.5_transient" ) { - my $startymd = 20150101; foreach my $res ( @tran_res ) { $options = "-res $res -bgc bgc -crop -use_case $usecase -envxml_dir . -namelist '&a start_ymd=$startymd/'"; - &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "$options" ); $cfiles->checkfilesexist( "$options", $mode ); @@ -1940,6 +1978,12 @@ sub cat_and_create_namelistinfile { my @clmres = ( "10x15", "4x5", "360x720cru", "0.9x1.25", "1.9x2.5", "ne3np4", "ne3np4.pg3", "ne16np4.pg3", "ne30np4.pg3", "C96", "mpasa120" ); foreach my $res ( @clmres ) { $options = "-res $res -envxml_dir . "; + # For clm6_0 and BGC use Carbon isotope streams + if ( ($phys eq "clm6_0") && ($clmopts =~ /bgc bgc/) ) { + $options = "$options --namelist \"&a stream_fldfilename_atm_c14 = '/dev/null'," . + "stream_meshfile_atm_c14 = '/dev/null', " . + "stream_fldfilename_atm_c13 = '/dev/null' /\""; + } &make_env_run( ); eval{ system( "$bldnml $options $clmopts > $tempfile 2>&1 " ); }; is( $@, '', "$options $clmopts" ); @@ -2038,7 +2082,8 @@ sub cat_and_create_namelistinfile { foreach my $bgc ( "sp", "bgc" ) { my $lndtuningmode = "${phys}_${forc}"; if ( $lndtuningmode eq "clm6_0_CRUv7" or - $lndtuningmode eq "clm4_5_CRUJRA2024") { + $lndtuningmode eq "clm4_5_CRUJRA2024" or + $lndtuningmode eq "clm5_0_CRUJRA2024") { next; } my $clmoptions = "-res $res -mask $mask -sim_year $simyr -envxml_dir . -lnd_tuning_mod $lndtuningmode -bgc $bgc"; diff --git a/ccs_config b/ccs_config index b20a207bc9..d686615fac 160000 --- a/ccs_config +++ b/ccs_config @@ -1 +1 @@ -Subproject commit b20a207bc918b956b8dad44c14c4471aff9331ee +Subproject commit d686615faceac30705b199f592808e3558ac176b diff --git a/cime_config/config_component.xml b/cime_config/config_component.xml index f869d0e362..e991288cc5 100644 --- a/cime_config/config_component.xml +++ b/cime_config/config_component.xml @@ -156,6 +156,25 @@ This is typically set by the compset. + + char + cmip6,cmip7 + cmip7 + + cmip6 + + run_component_ctsm + env_run.xml + Whether to use CMIP6 or CMIP7 fsurdat/landuse files. + As of ctsm5.4 we do not have CMIP7 PFT raw datasets for SSPs, so default to CMIP6 for these. For other compsets default to CMIP7. User may modify to a non-default value in env_run.xml. +Caveats: +1) We supply only CMIP7 C13/C14 isotope datasets, so these get used regardless. +2) We supply only CMIP7 population density with ctsm6 in non-SSP cases, because the fire model is calibrated to that; conversely, for pre-ctsm6 and for SSP we supply only CMIP6 population density. +3) We supply only CMIP6 nitrogen deposition (ndep), so this gets used regardless. +4) For DATM we supply only CMIP6 aerosols. +5) For DATM we supply only CMIP6 CO2 + + logical @@ -219,7 +238,6 @@ 1850-2100_SSP3-7.0_transient 1850-2100_SSP5-3.4_transient 1850-2100_SSP2-4.5_transient - 1850-2100_SSP2-4.5_transient 1850-2100_SSP1-1.9_transient 1850-2100_SSP4-3.4_transient 1850-2100_SSP4-6.0_transient diff --git a/cime_config/testdefs/ExpectedTestFails.xml b/cime_config/testdefs/ExpectedTestFails.xml index 1acc725738..d21fc39c42 100644 --- a/cime_config/testdefs/ExpectedTestFails.xml +++ b/cime_config/testdefs/ExpectedTestFails.xml @@ -29,42 +29,13 @@ - + FAIL - #3311 - Requires finidat with c13/c14 to PASS + #3529 + We will generate new fsurdat files with the new raw lai file to resolve this issue. - - - FAIL - #3311 - Requires finidat with c13/c14 to PASS - - - - - FAIL - #3311 - Requires finidat with c13/c14 to PASS - - - - - FAIL - #3311 - Requires finidat with c13/c14 to PASS - - - - - FAIL - #3311 - Requires finidat with c13/c14 to PASS - - - FAIL @@ -98,6 +69,12 @@ + + + FAIL + #3495 + + FAIL @@ -116,20 +93,6 @@ #3454 - - - FAIL - #3252 - Works with finidat = 'ctsm53041_54surfdata_snowTherm_100_pSASU.clm2.r.0161-01-01-00000.nc' and fails with finidat = 'ctsm53041_54surfdata_snowTherm_100_pSASU.clm2.r.0161-01-01-00000_64bitoffset.nc'. - - - - - FAIL - #3252 - Works with finidat = 'ctsm53041_54surfdata_snowTherm_100_pSASU.clm2.r.0161-01-01-00000.nc' and fails with finidat = 'ctsm53041_54surfdata_snowTherm_100_pSASU.clm2.r.0161-01-01-00000_64bitoffset.nc'. - - FAIL @@ -207,10 +170,6 @@ - - FAIL - #3182 - FAIL #3182 @@ -379,6 +338,22 @@ + + + FAIL + #3252 + This should be resolved for the 5.4 release. + + + + + + FAIL + #3252 + This should be resolved for the 5.4 release. + + + diff --git a/cime_config/testdefs/testlist_clm.xml b/cime_config/testdefs/testlist_clm.xml index 64c9274b3e..15e395fe6d 100644 --- a/cime_config/testdefs/testlist_clm.xml +++ b/cime_config/testdefs/testlist_clm.xml @@ -430,6 +430,15 @@ + + + + + + + + + @@ -950,6 +959,24 @@ + + + + + + + + + + + + + + + + + + @@ -1121,6 +1148,15 @@ + + + + + + + + + @@ -2532,6 +2568,16 @@ + + + + + + + + + + diff --git a/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/README b/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/README new file mode 100644 index 0000000000..9ad9b7e1a1 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/README @@ -0,0 +1 @@ +This tests with the new CMIP7 Carbon isotope datasets as streams. diff --git a/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/user_nl_clm b/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/user_nl_clm index df0189c2e6..abfad740be 100644 --- a/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/user_nl_clm +++ b/cime_config/testdefs/testmods_dirs/clm/ciso_cmip7_monthly_2013Start/user_nl_clm @@ -1,5 +1,4 @@ - stream_fldfilename_atm_c13 = '$DIN_LOC_ROOT/lnd/clm2/isotopes/ctsmforc.Graven.atm_delta_C13_CMIP7_global_1700-2023_yearly_v3.0_c251013.nc' - stream_fldfilename_atm_c14 = '$DIN_LOC_ROOT/lnd/clm2/isotopes/ctsmforc.Graven.atm_delta_C14_CMIP7_4x1_global_1700-2023_yearly_v3.0_c251013.nc' + hist_dov2xy = .true.,.true. ! Set both history output files to 2D grid, so can be evaluated stream_year_first_atm_c14 = 2013 stream_model_year_align_atm_c14 = 2013 stream_year_first_atm_c13 = 2013 diff --git a/python/ctsm/test/test_unit_subset_data.py b/python/ctsm/test/test_unit_subset_data.py index a127a282e0..81b4fb3281 100755 --- a/python/ctsm/test/test_unit_subset_data.py +++ b/python/ctsm/test/test_unit_subset_data.py @@ -107,7 +107,7 @@ def test_inputdata_setup_files_basic(self): files = setup_files(self.args, self.defaults, self.cesmroot, testing=True) self.assertEqual( files["fsurf_in"], - "surfdata_0.9x1.25_hist_2000_16pfts_c240908.nc", + "surfdata_0.9x1.25_hist_2000_16pfts_c251022.nc", "fsurf_in filename not whats expected", ) self.assertEqual( @@ -117,7 +117,7 @@ def test_inputdata_setup_files_basic(self): ) self.assertEqual( files["main_dir"], - "/glade/campaign/cesm/cesmdata/cseg/inputdata", + "/glade/campaign/cesm/cesmdata/inputdata", "main_dir directory not whats expected", ) diff --git a/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py b/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py index 5a5425dc60..f0fd65862f 100755 --- a/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py +++ b/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py @@ -24,35 +24,41 @@ "global-present", "global-present-low-res", "global-present-ultra-hi-res", - "global-hist-1850-f19", - "global-hist-1850-f45", + "global-hist-1850-1and2deg", + "global-hist-1850-low-res", "crop-tropics-present", "crop", "crop-global-present", "crop-global-present-low-res", + "crop-global-present-ne3", "crop-global-present-ne16", "crop-global-present-ne30", - "crop-global-present-ne120", + "crop-global-present-vrandne120", "crop-global-present-mpasa480", "crop-global-present-nldas", "crop-global-1850", "crop-global-1850-low-res", + "crop-global-1850-ne3", "crop-global-1850-ne16", "crop-global-1850-ne30", "crop-global-1850-ne120", "crop-global-1850-mpasa480", "crop-global-hist", "crop-global-hist-low-res", + "crop-global-hist-ne3-1", + "crop-global-hist-ne3-2", + "crop-global-hist-ne3-3", "crop-global-hist-ne16", "crop-global-hist-ne30", - "crop-global-hist-f09", + "crop-global-hist-1700", + "crop-global-hist-mpasa480", "crop-global-SSP1-1.9-f09", "crop-global-SSP1-2.6-f09", "crop-global-SSP2-4.5-f09", "crop-global-SSP2-4.5-f19", "crop-global-SSP2-4.5-f10", "crop-global-SSP2-4.5-f45", - "crop-global-SSP2-4.5-ne0np4", + "crop-global-hist-vrandne120", "crop-global-SSP2-4.5-ne3", "crop-global-SSP2-4.5-ne16", "crop-global-SSP2-4.5-ne30", @@ -145,7 +151,9 @@ def write_runscript( runfile.write(f"{output} \n") check = f"if [ $? != 0 ]; then echo 'Error running resolution {res}'; exit -4; fi" runfile.write(f"{check} \n") - runfile.write(f"echo Successfully ran resolution {res}\n") + runfile.write( + f"echo Confirm completion of fsurdat/landuse generation in the .log file {res}\n" + ) runfile.write(f"echo Successfully ran {jobscript_file}\n") @@ -191,7 +199,10 @@ def main(): # ], # -------------------------- resolution_dict = { - "standard_res_no_crop": ["0.9x1.25", "1.9x2.5", "mpasa60"], + "potveg_res": ["0.9x1.25", "1.9x2.5", "ne16np4.pg3", "ne30np4.pg3"], + "standard_res_no_crop": ["0.9x1.25", "1.9x2.5", "mpasa60", "mpasa30", "ne30np4.pg3"], + "1700_res": ["0.9x1.25", "360x720cru"], + "1and2deg_no_crop": ["1.9x2.5", "0.9x1.25", "ne30np4.pg3"], "f09": ["0.9x1.25"], "f19": ["1.9x2.5"], "hcru": ["360x720cru"], @@ -199,28 +210,25 @@ def main(): "mpasa120": ["mpasa120"], "f10": ["10x15"], "f45": ["4x5"], - "low_res_no_crop": ["4x5", "10x15"], + "low_res": ["4x5", "10x15"], "ultra_hi_res_no_crop": ["mpasa15", "mpasa3p75"], "standard_res": ["360x720cru", "0.9x1.25", "1.9x2.5", "C96", "mpasa120"], - "standard_res_no_f09": ["360x720cru", "1.9x2.5", "C96", "mpasa120"], - "low_res": ["4x5", "10x15", "ne3np4.pg3", "ne3np4"], "mpasa480": ["mpasa480"], "nldas_res": ["0.125nldas2"], "5x5_amazon": ["5x5_amazon"], - "ne3": ["ne3np4", "ne3np4.pg3"], + "ne3": ["ne3np4.pg2", "ne3np4.pg3", "ne3np4"], + "ne3_1": ["ne3np4"], + "ne3_2": ["ne3np4.pg2"], + "ne3_3": ["ne3np4.pg3"], "ne16": ["ne16np4.pg3"], "ne30": ["ne30np4.pg3", "ne30np4.pg2", "ne30np4"], - "ne0np4": [ - "ne0np4.ARCTICGRIS.ne30x8", - "ne0np4.ARCTIC.ne30x4", - "ne0np4CONUS.ne30x8", - "ne0np4.POLARCAP.ne30x4", - ], - "ne120": [ + "ne120": ["ne120np4.pg3"], + "vr_and_ne120": [ "ne0np4.ARCTICGRIS.ne30x8", "ne0np4.ARCTIC.ne30x4", "ne0np4CONUS.ne30x8", "ne0np4.POLARCAP.ne30x4", + "ne0np4.NATL.ne30x8", "ne120np4.pg3", ], } @@ -231,7 +239,7 @@ def main(): dataset_dict = { "global-potveg": ( "--start-year 1850 --end-year 1850 --nocrop --potveg --res", - "f09", + "potveg_res", ), "global-present": ( "--start-year 2000 --end-year 2000 --nocrop --res", @@ -239,19 +247,19 @@ def main(): ), "global-present-low-res": ( "--start-year 2000 --end-year 2000 --nocrop --res", - "low_res_no_crop", + "low_res", ), "global-present-ultra-hi-res": ( "--start-year 2000 --end-year 2000 --nocrop --res", "ultra_hi_res_no_crop", ), - "global-hist-1850-f19": ( + "global-hist-1850-1and2deg": ( "--start-year 1850 --end-year 2023 --nocrop --res", - "f19", + "1and2deg_no_crop", ), - "global-hist-1850-f45": ( + "global-hist-1850-low-res": ( "--start-year 1850 --end-year 2023 --nocrop --res", - "f45", + "low_res", ), "crop-tropics-present": ( "--start-year 2000 --end-year 2000 --res", @@ -265,6 +273,10 @@ def main(): "--start-year 2000 --end-year 2000 --res", "low_res", ), + "crop-global-present-ne3": ( + "--start-year 2000 --end-year 2000 --res", + "ne3", + ), "crop-global-present-ne16": ( "--start-year 2000 --end-year 2000 --res", "ne16", @@ -273,9 +285,9 @@ def main(): "--start-year 2000 --end-year 2000 --res", "ne30", ), - "crop-global-present-ne120": ( + "crop-global-present-vrandne120": ( "--start-year 2000 --end-year 2000 --res", - "ne120", + "vr_and_ne120", ), "crop-global-present-mpasa480": ( "--start-year 2000 --end-year 2000 --res", @@ -293,6 +305,10 @@ def main(): "--start-year 1850 --end-year 1850 --res", "low_res", ), + "crop-global-1850-ne3": ( + "--start-year 1850 --end-year 1850 --res", + "ne3", + ), "crop-global-1850-ne16": ( "--start-year 1850 --end-year 1850 --res", "ne16", @@ -309,14 +325,30 @@ def main(): "--start-year 1850 --end-year 1850 --res", "mpasa480", ), + "crop-global-hist-mpasa480": ( + "--start-year 1850 --end-year 2023 --nosurfdata --res", + "mpasa480", + ), "crop-global-hist": ( "--start-year 1850 --end-year 2023 --nosurfdata --res", - "standard_res_no_f09", + "standard_res", ), "crop-global-hist-low-res": ( "--start-year 1850 --end-year 2023 --nosurfdata --res", "low_res", ), + "crop-global-hist-ne3-1": ( + "--start-year 1850 --end-year 2023 --nosurfdata --res", + "ne3_1", + ), + "crop-global-hist-ne3-2": ( + "--start-year 1850 --end-year 2023 --nosurfdata --res", + "ne3_2", + ), + "crop-global-hist-ne3-3": ( + "--start-year 1850 --end-year 2023 --nosurfdata --res", + "ne3_3", + ), "crop-global-hist-ne16": ( "--start-year 1850 --end-year 2023 --nosurfdata --res", "ne16", @@ -325,9 +357,9 @@ def main(): "--start-year 1850 --end-year 2023 --nosurfdata --res", "ne30", ), - "crop-global-hist-f09": ( + "crop-global-hist-1700": ( "--start-year 1700 --end-year 2023 --res", - "f09", + "1700_res", ), "crop-global-SSP1-1.9-f09": ( "--start-year 1850 --end-year 2100 --nosurfdata --ssp-rcp SSP1-1.9 --res", @@ -357,9 +389,13 @@ def main(): "--start-year 1850 --end-year 2100 --nosurfdata --ssp-rcp SSP2-4.5 --res", "f45", ), - "crop-global-SSP2-4.5-ne0np4": ( - "--start-year 1979 --end-year 2026 --ssp-rcp SSP2-4.5 --res", - "ne0np4", + # NOTE 2025/10/21: When CMIP7 future scenarios become available, + # change 2023 to 2030 for a so-called "midpoint" future scenario. + # This future-proofs these cases, so that as time moves on, these + # simulations will still include the most recent historical year. + "crop-global-hist-vrandne120": ( + "--start-year 1979 --end-year 2023 --res", + "vr_and_ne120", ), "crop-global-SSP2-4.5-ne3": ( "--start-year 1850 --end-year 2100 --nosurfdata --ssp-rcp SSP2-4.5 --res", diff --git a/python/ctsm/toolchain/gen_mksurfdata_jobscript_single.py b/python/ctsm/toolchain/gen_mksurfdata_jobscript_single.py index c3f762380e..1413e49158 100755 --- a/python/ctsm/toolchain/gen_mksurfdata_jobscript_single.py +++ b/python/ctsm/toolchain/gen_mksurfdata_jobscript_single.py @@ -266,7 +266,7 @@ def write_runscript_part2(namelist_file, runfile, executable, mksurfdata_path, e check = f'if [ $? != 0 ]; then echo "Error running for namelist {namelist_file}"; exit -4; fi' runfile.write(f"{check} \n") - runfile.write("echo Successfully ran resolution\n") + runfile.write("echo Confirm completion of fsurdat/landuse generation in the .log file\n") def main(): diff --git a/src/biogeochem/AtmCarbonIsotopeStreamType.F90 b/src/biogeochem/AtmCarbonIsotopeStreamType.F90 index 0a49ac8061..e3317ea609 100644 --- a/src/biogeochem/AtmCarbonIsotopeStreamType.F90 +++ b/src/biogeochem/AtmCarbonIsotopeStreamType.F90 @@ -1,4 +1,7 @@ module AtmCarbonIsotopeStreamType + + +#include "shr_assert.h" ! ! Description: ! @@ -9,6 +12,7 @@ module AtmCarbonIsotopeStreamType use clm_varctl , only : iulog use abortutils , only : endrun use decompMod , only : bounds_type + use shr_log_mod, only : errMsg => shr_log_errMsg use CTSMForce2DStreamBaseType, only : ctsm_force_2DStream_base_type implicit none @@ -84,10 +88,15 @@ subroutine C13Init( this, bounds, fldfilename, meshfile, mapalgo, tintalgo, taxm integer, intent(in) :: year_last ! last year to use integer, intent(in) :: model_year_align ! align yearFirst with this model year + ! Since C13 data is a single global value mapalgo and meshfile must both be none + call shr_assert( trim(mapalgo) == "none", "mapalgo MUST be none for C13 streams"//errMsg( file=sourcefile, line=__LINE__) ) + call shr_assert( trim(meshfile) == "none", "meshfile MUST be none for C13 streams"//errMsg( file=sourcefile, line=__LINE__) ) call this%InitBase( bounds, varnames = (/ varname_c13 /), fldfilename=fldfilename, meshfile=meshfile, & mapalgo=mapalgo, tintalgo=tintalgo, taxmode=taxmode, name=varname_c13, & year_first=year_first, year_last=year_last, model_year_align=model_year_align ) call this%C13InitAllocate( bounds ) + call this%Advance( ) + call this%Check1DPtrSize( bounds ) end subroutine C13Init @@ -168,10 +177,26 @@ subroutine C14Init( this, bounds, fldfilename, meshfile, mapalgo, tintalgo, taxm integer, intent(in) :: year_last ! last year to use integer, intent(in) :: model_year_align ! align yearFirst with this model year + character(len=len(mapalgo)) :: str_mapalgo ! Temporary copy of mapalgo so can change input if meshfile is none + + ! Since C14 data has latitude bands mapalgo and meshfile can neither be set to none + call shr_assert( trim(mapalgo) /= "none", "mapalgo MUST NOT be none for C14 streams"//errMsg( file=sourcefile, line=__LINE__) ) + ! TODO: Uncomment this error check when we are ready for the test for this to change answers + !call shr_assert( trim(meshfile) /= "none", "meshfile MUST NOT be none for C14 streams"//errMsg( file=sourcefile, line=__LINE__) ) + ! TOD: Remove this tempoary bit at the same time + if ( trim(meshfile) == "none" )then + str_mapalgo = "none" + else + str_mapalgo = mapalgo + end if + ! TODO: End of temporary bit + call this%InitBase( bounds, varnames = (/ varname_c14 /), fldfilename=fldfilename, meshfile=meshfile, & - mapalgo=mapalgo, tintalgo=tintalgo, taxmode=taxmode, name=varname_c14, & + mapalgo=str_mapalgo, tintalgo=tintalgo, taxmode=taxmode, name=varname_c14, & year_first=year_first, year_last=year_last, model_year_align=model_year_align ) call this%C14InitAllocate( bounds ) + call this%Advance( ) + call this%Check1DPtrSize( bounds ) end subroutine C14Init diff --git a/src/biogeochem/CNCIsoAtmTimeSeriesReadMod.F90 b/src/biogeochem/CNCIsoAtmTimeSeriesReadMod.F90 index 736924fd4f..dce6f489c2 100644 --- a/src/biogeochem/CNCIsoAtmTimeSeriesReadMod.F90 +++ b/src/biogeochem/CNCIsoAtmTimeSeriesReadMod.F90 @@ -64,6 +64,7 @@ module CIsoAtmTimeseriesMod ! Private data for the control namelist: character(len=CL), private :: stream_fldfilename_atm_c14 = ' ' character(len=CL), private :: stream_fldfilename_atm_c13 = ' ' + character(len=CL), private :: stream_meshfile_atm_c14 = 'none' integer, private :: stream_year_first_atm_c14 = 1850 integer, private :: stream_year_last_atm_c14 = 2023 integer, private :: stream_model_year_align_atm_c14 = 1850 @@ -73,7 +74,7 @@ module CIsoAtmTimeseriesMod character(len=CL), private :: stream_mapalgo_atm_c14 = 'nn' character(len=CL), private :: stream_tintalgo_atm_c14 = 'linear' character(len=CL), private :: stream_taxmode_atm_c14 = 'extend' - character(len=CL), private :: stream_mapalgo_atm_c13 = 'nn' + character(len=CL), private :: stream_mapalgo_atm_c13 = 'none' character(len=CL), private :: stream_tintalgo_atm_c13 = 'linear' character(len=CL), private :: stream_taxmode_atm_c13 = 'extend' @@ -105,8 +106,11 @@ subroutine CIsoAtmReadNML( NLFilename ) namelist /carbon_isotope_streams/ stream_fldfilename_atm_c14, & stream_fldfilename_atm_c13, stream_year_first_atm_c14, & stream_year_last_atm_c14, stream_model_year_align_atm_c14, & + stream_meshfile_atm_c14, & stream_year_first_atm_c13, stream_year_last_atm_c13, & - stream_model_year_align_atm_c13 + stream_model_year_align_atm_c13, stream_tintalgo_atm_c14, & + stream_taxmode_atm_c14, stream_tintalgo_atm_c13, & + stream_taxmode_atm_c13 ! Read in the namelist on the main task if (masterproc) then @@ -127,13 +131,18 @@ subroutine CIsoAtmReadNML( NLFilename ) end if ! Broadcast namelist values to all tasks call shr_mpi_bcast( stream_fldfilename_atm_c14, mpicom ) + call shr_mpi_bcast( stream_meshfile_atm_c14, mpicom ) call shr_mpi_bcast( stream_year_first_atm_c14, mpicom ) call shr_mpi_bcast( stream_year_last_atm_c14, mpicom ) call shr_mpi_bcast( stream_model_year_align_atm_c14, mpicom ) + call shr_mpi_bcast( stream_tintalgo_atm_c14, mpicom ) + call shr_mpi_bcast( stream_taxmode_atm_c14, mpicom ) call shr_mpi_bcast( stream_fldfilename_atm_c13, mpicom ) call shr_mpi_bcast( stream_year_first_atm_c13, mpicom ) call shr_mpi_bcast( stream_year_last_atm_c13, mpicom ) call shr_mpi_bcast( stream_model_year_align_atm_c13, mpicom ) + call shr_mpi_bcast( stream_tintalgo_atm_c13, mpicom ) + call shr_mpi_bcast( stream_taxmode_atm_c13, mpicom ) ! Do some error checking of input namelist items, set control flags, and write to the log call CIsoCheckNMLInputs() @@ -558,10 +567,13 @@ subroutine C14StreamsInit( bounds ) write(iulog, *) 'C14StreamsInit: Initializing C14 streams with file:' write(iulog, *) trim(stream_fldfilename_atm_c14) end if + ! Any error checking + call shr_assert( trim(stream_mapalgo_atm_c14) == "nn", "stream_mapalgo_atm_c14 MUST be nn because the file " // & + "is lattitude bands copied to a half degree grid: "//errMsg( file=sourcefile, line=__LINE__) ) ! Streams method call atm_c14_stream%Init( bounds, & fldfilename=stream_fldfilename_atm_c14, & - meshfile= 'none', & + meshfile= stream_meshfile_atm_c14, & mapalgo=stream_mapalgo_atm_c14, & tintalgo=stream_tintalgo_atm_c14, & taxmode=stream_taxmode_atm_c14, & @@ -795,6 +807,7 @@ subroutine C13StreamsInit( bounds ) ! Streams method call atm_c13_stream%Init( bounds, & fldfilename=stream_fldfilename_atm_c13, & + ! meshfile MUST be none for C13 streams since its a single global value meshfile= 'none', & mapalgo=stream_mapalgo_atm_c13, & tintalgo=stream_tintalgo_atm_c13, & diff --git a/src/biogeochem/CNFireLi2024Mod.F90 b/src/biogeochem/CNFireLi2024Mod.F90 index dbad9a773d..d4c05f63bc 100644 --- a/src/biogeochem/CNFireLi2024Mod.F90 +++ b/src/biogeochem/CNFireLi2024Mod.F90 @@ -7,11 +7,8 @@ module CNFireLi2024Mod ! module for fire dynamics ! created in Nov, 2012 and revised in Apr, 2013 by F. Li and S. Levis ! based on Li et al. (2012a,b; 2013) - ! revised in Apr, 2014 according to Li et al.(2014) - ! revised in May, 2015, according to Li et al. (2015, in prep.) - ! Fire-related parameters were calibrated or tuned in May, 2015 based on the - ! 20th Century transient simulations at f19_g16 with a CLM4.5 version - ! (clm50fire), CRUNCEPv5, and climatological lightning data. + ! revised in Apr, 2014 according to Li and Lawrance (2017) + ! revised in Jun, 2024 and modified in May, 2025, according to Li et al. (2025, in prep.) ! ! !USES: use shr_kind_mod , only : r8 => shr_kind_r8 @@ -147,6 +144,10 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_ real(r8) :: fs ! hd-dependent fires suppression (0-1) real(r8) :: ig ! total ignitions (count/km2/hr) real(r8) :: hdmlf ! human density + real(r8) :: topoi ! influence of topography on fires (0-1), where 1 indicates no impact. + ! can be removed if CLM consider Arctic C3 grass in plateau-> + ! intense light-> much more C allocated to fine roots than leaf, + ! and roots decreasing infiltration real(r8) :: arh, arh30 !combustability of fuel related to RH and RH30 real(r8) :: afuel !weight for arh and arh30 real(r8) :: btran_col(bounds%begc:bounds%endc) @@ -180,7 +181,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_ defo_fire_precip_thresh_bdt => cnfire_const%defo_fire_precip_thresh_bdt, & ! Input: [real(r8) ] (mm/day) Max running mean daily precip allowing deforestation fire for broadleaf deciduous trees borpeat_fire_soilmoist_denom => cnfire_const%borpeat_fire_soilmoist_denom, & ! Input: [real(r8) ] (unitless) Denominator of exponential in soil moisture term of equation relating that and temperature to boreal peat fire (unitless) nonborpeat_fire_precip_denom => cnfire_const%nonborpeat_fire_precip_denom, & ! Input: [real(r8) ] (unitless) Denominator of precipitation in equation relating that to non-boreal peat fire (unitless) - + forc_topo_g => atm2lnd_inst%forc_topo_grc , & ! Input: [real(r8) (:) ] atmospheric surface height, a.k.a. elevation (m) fsr_pft => pftcon%fsr_pft , & ! Input: fd_pft => pftcon%fd_pft , & ! Input: rswf_min => pftcon%rswf_min , & ! Input: @@ -197,8 +198,8 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_ forc_t => atm2lnd_inst%forc_t_downscaled_col , & ! Input: [real(r8) (:) ] downscaled atmospheric temperature (Kelvin) forc_rain => wateratm2lndbulk_inst%forc_rain_downscaled_col , & ! Input: [real(r8) (:) ] downscaled rain forc_snow => wateratm2lndbulk_inst%forc_snow_downscaled_col , & ! Input: [real(r8) (:) ] downscaled snow - prec30 => wateratm2lndbulk_inst%prec30_patch , & ! Input: [real(r8) (:) ] 10-day running mean of tot. precipitation - rh30 => wateratm2lndbulk_inst%rh30_patch , & ! Input: [real(r8) (:) ] 10-day running mean of tot. relative humidity + prec30 => wateratm2lndbulk_inst%prec30_patch , & ! Input: [real(r8) (:) ] 30-day running mean of tot. precipitation + rh30 => wateratm2lndbulk_inst%rh30_patch , & ! Input: [real(r8) (:) ] 30-day running mean of tot. relative humidity dwt_smoothed => cnveg_state_inst%dwt_smoothed_patch , & ! Input: [real(r8) (:) ] change in patch weight (-1 to 1) on the gridcell, smoothed over the year cropf_col => cnveg_state_inst%cropf_col , & ! Input: [real(r8) (:) ] cropland fraction in veg column gdp_lf => this%gdp_lf_col , & ! Input: [real(r8) (:) ] gdp data @@ -302,8 +303,8 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_ if( patch%itype(p) > nc4_grass )then cropf_col(c) = cropf_col(c) + patch%wtcol(p) end if - ! For natural vegetation - if (patch%itype(p) <= nc4_grass ) then + ! Exclude crops and bare soil + if (patch%itype(p) <= nc4_grass .and. patch%itype(p) >= ndllf_evr_tmp_tree) then lfwt(c) = lfwt(c) + patch%wtgcell(p) end if end do @@ -516,6 +517,10 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_ g = col%gridcell(c) ! For crop + ! cropf_col(c) * col%wtgcell(c) > 0.1_r8 is added because fires are rare in + ! gridcells with limited cropland coverage based on GFED5. Also, this helps to + ! avoid abm (crop fire peak month) regridding error from 0.05 degree to lower resolution + ! The condition could be removed if CLM supports the use of mode in abm inputs regridding if( forc_t(c) >= SHR_CONST_TKFRZ .and. patch%itype(p) > nc4_grass .and. & kmo == abm_lf(c) .and. & burndate(p) >= 999 .and. patch%wtcol(p) > 0._r8 )then ! catch crop burn time @@ -616,7 +621,15 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_ cnfire_params%ignition_efficiency*(1._r8-fs)* & (lfwt(c)**0.5) end if - nfire(c) = ig/secsphr*fb*fire_m*lgdp_col(c) !fire counts/km2/sec + + ! Reduce burnability at high elevations + if(forc_topo_g(g) <= 2500._r8)then !influence of topography on fires + topoi = 1._r8 + else + topoi = 0.004_r8 + end if + + nfire(c) = ig/secsphr*fb*fire_m*lgdp_col(c) * topoi !fire counts/km2/sec Lb_lf = 1._r8+10._r8*(1._r8-EXP(-0.06_r8*forc_wind(g))) spread_m = fire_m**0.5_r8 fd_col(c) = (lfwt(c)*lgdp1_col(c)*lpop_col(c))**0.5_r8 * fd_col(c) @@ -639,7 +652,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_ / (trotr1_col(c) + trotr2_col(c)) cli = max(0._r8,min(1._r8,1._r8-prec30_col(c)*secspday/cri))* & - (15._r8*min(0.0016_r8,dtrotr_col(c)/dt*dayspyr*secspday)+0.009_r8)* & + (0.67_r8*min(0.01_r8,dtrotr_col(c)/dt*dayspyr*secspday)+0.001_r8) * & max(0._r8,min(1._r8,(0.25_r8-(forc_rain(c)+forc_snow(c))*secsphr)/0.25_r8)) farea_burned(c) = farea_burned(c)+fb*cli*(cli_scale/secspday) diff --git a/src/biogeophys/CanopyStateType.F90 b/src/biogeophys/CanopyStateType.F90 index 81dc3947b1..66804e1549 100644 --- a/src/biogeophys/CanopyStateType.F90 +++ b/src/biogeophys/CanopyStateType.F90 @@ -296,11 +296,11 @@ subroutine InitHistory(this, bounds) this%vegwp_ln_patch(begp:endp,:) = spval call hist_addfld2d (fname='VEGWPLN', units='mm', type2d='nvegwcs', & avgflag='A', long_name='vegetation water matric potential for sun/sha canopy,xyl,root at local noon', & - ptr_patch=this%vegwp_ln_patch, default='active') + ptr_patch=this%vegwp_ln_patch, default='inactive') this%vegwp_pd_patch(begp:endp,:) = spval call hist_addfld2d (fname='VEGWPPD', units='mm', type2d='nvegwcs', avgflag='A', & long_name='predawn vegetation water matric potential for sun/sha canopy,xyl,root', & - ptr_patch=this%vegwp_pd_patch, default='active') + ptr_patch=this%vegwp_pd_patch, default='inactive') end if end subroutine InitHistory diff --git a/src/cpl/share_esmf/CTSMForce2DStreamBaseType.F90 b/src/cpl/share_esmf/CTSMForce2DStreamBaseType.F90 index 174fa3554e..ba10de207e 100644 --- a/src/cpl/share_esmf/CTSMForce2DStreamBaseType.F90 +++ b/src/cpl/share_esmf/CTSMForce2DStreamBaseType.F90 @@ -15,7 +15,7 @@ module CTSMForce2DStreamBaseType #include "shr_assert.h" use ESMF, only : ESMF_LogFoundError, ESMF_LOGERR_PASSTHRU - use dshr_strdata_mod , only : shr_strdata_type + use dshr_strdata_mod , only : shr_strdata_type use shr_kind_mod , only : r8 => shr_kind_r8, CL => shr_kind_CL use clm_varctl , only : iulog use spmdMod , only : masterproc, mpicom, iam @@ -43,6 +43,7 @@ module CTSMForce2DStreamBaseType procedure, public, non_overridable :: CleanBase ! Clean method for the base type procedure, public, non_overridable :: Advance ! Advance the streams data to the current model date procedure, public :: GetPtr1D ! Get pointer to the 1D data array + procedure, public :: Check1DPtrSize ! Check that the data pointers are the expected size procedure(Interp_interface), public, deferred :: Interp ! method in extensions to turn stream data into CTSM data end type ctsm_force_2DStream_base_type @@ -67,7 +68,7 @@ subroutine Init_interface( this, bounds, fldfilename, meshfile, mapalgo, tintalg import :: ctsm_force_2DStream_base_type ! Arguments: - class(ctsm_force_2DStream_base_type), intent(inout) :: this + class(ctsm_force_2DStream_base_type), intent(inout) :: this type(bounds_type), intent(in) :: bounds character(*), intent(in) :: fldfilename ! stream data filename (full pathname) (single file) ! NOTE: fldfilename could be expanded to an array if needed, but currently we only have one file @@ -91,7 +92,7 @@ subroutine Clean_interface(this) ! ! Arguments: class(ctsm_force_2DStream_base_type), intent(inout) :: this - end subroutine Clean_interface + end subroutine Clean_interface !----------------------------------------------------------------------- @@ -134,7 +135,7 @@ subroutine InitBase( this, bounds, varnames, fldfilename, meshfile, mapalgo, tin use decompMod , only : bounds_level_proc use shr_log_mod , only : errMsg => shr_log_errMsg ! Arguments: - class(ctsm_force_2DStream_base_type), intent(inout) :: this + class(ctsm_force_2DStream_base_type), intent(inout) :: this type(bounds_type), intent(in) :: bounds character(*), intent(in) :: varnames(:) ! variable names to read from stream file character(*), intent(in) :: fldfilename ! stream data filename (full pathname) (single file) @@ -158,6 +159,14 @@ subroutine InitBase( this, bounds, varnames, fldfilename, meshfile, mapalgo, tin if ( len(fldfilename) >= FL )then call endrun( 'stream field filename is too long:'//trim(fldfilename), file=sourcefile, line=__LINE__ ) end if + if( trim(meshfile) == "none" .and. trim(mapalgo) /= "none" ) then + write(iulog,*) 'mapalgo = ', trim(mapalgo), ' meshfile = ', trim(meshfile) + call endrun( "if meshfile is none so must be mapalgo", file=sourcefile, line=__LINE__ ) + end if + if( trim(meshfile) /= "none" .and. trim(mapalgo) == "none" ) then + write(iulog,*) 'mapalgo = ', trim(mapalgo), ' meshfile = ', trim(meshfile) + call endrun( "if mapalgo is none so must be meshfile", file=sourcefile, line=__LINE__ ) + end if this%stream_filename = fldfilename this%stream_name = name call shr_strdata_init_from_inline(this%sdat, & @@ -185,17 +194,61 @@ subroutine InitBase( this, bounds, varnames, fldfilename, meshfile, mapalgo, tin write(iulog,*) ' Streams initialization failing for ', trim(name), ' stream file = ', trim(fldfilename) call endrun( 'CTSM forcing Streams initialization failing', file=sourcefile, line=__LINE__ ) end if + end subroutine InitBase !----------------------------------------------------------------------- + subroutine Check1DPtrSize( this, bounds ) + ! + ! Description: + ! + ! Check that the stream data pointer size is as expected + ! + use shr_kind_mod , only : CS => shr_kind_CS + use dshr_stream_mod, only : shr_stream_streamType, shr_stream_getStreamFieldList + use dshr_stream_mod, only : shr_stream_getMeshFileName + use shr_log_mod , only : errMsg => shr_log_errMsg + ! Arguments: + class(ctsm_force_2DStream_base_type), intent(inout) :: this + type(bounds_type), intent(in) :: bounds + ! Local variables + integer :: n ! Indices + integer :: nvars ! Number of variables + real(r8), pointer :: dataptr1d(:) ! Pointer to the 1D data + character(len=CS), allocatable :: varnames(:) + type(shr_stream_streamType), pointer :: stream => NULL() + character(len=CL) :: meshname + + ! Loop through the list of varnames + + stream => this%sdat%stream(1) + nvars = stream%nvars + allocate( varnames(nvars) ) + call shr_stream_getStreamFieldList( stream, varnames ) + call shr_stream_getMeshFileName( stream, meshname ) + do n = 1, nvars + call this%GetPtr1D( varnames(n), dataptr1d ) + call shr_assert( size(dataptr1d) >= bounds%endg-bounds%begg + 1, "Expect stream data to be >= size of grid bounds (includes ocean)"//errMsg( file=sourcefile, line=__LINE__) ) + if ( trim(meshname) == 'none' ) then + call shr_assert( all(dataptr1d(:) == dataptr1d(1)), "Expect stream data to duplicate a single value when no mesh given"//errMsg( file=sourcefile, line=__LINE__) ) + end if + end do + nullify( dataptr1d ) + nullify( stream ) + deallocate( varnames ) + + end subroutine Check1DPtrSize + + !----------------------------------------------------------------------- + subroutine CleanBase( this ) ! Description: ! Clean up any memory in the base type as needed. ! Normally types that extend this base type will call this as part of their clean operation ! ! Arguments: - class(ctsm_force_2DStream_base_type) , intent(inout) :: this + class(ctsm_force_2DStream_base_type) , intent(inout) :: this integer :: ierr ! error code @@ -243,7 +296,7 @@ subroutine GetPtr1D(this, fldname, dataptr1d) ! Description: ! ! Get the pointer to the 1D data array for the given field name - ! Normally stream extensions will use this in the Interp method to + ! Normally stream extensions will use this in the Interp method to ! save the stream data locally. ! ! Uses: @@ -251,12 +304,13 @@ subroutine GetPtr1D(this, fldname, dataptr1d) ! Arguments: class(ctsm_force_2DStream_base_type), intent(inout) :: this character(*), intent(in) :: fldname ! field name to get pointer for - real(r8), pointer :: dataptr1d(:) ! Pointer to the 1D data + real(r8), intent(inout), pointer :: dataptr1d(:) ! Pointer to the 1D data ! Local variables integer :: rc ! error return code ! Get pointer for stream data that is time and spatially interpolated to model time and grid + nullify( dataptr1d ) call dshr_fldbun_getFldPtr(this%sdat%pstrm(1)%fldbun_model, fldname=fldname, fldptr1=dataptr1d, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, line=__LINE__, file=sourcefile)) then call endrun( 'Error getting field pointer for '//trim(fldname)//' from stream data', file=sourcefile, line=__LINE__ ) diff --git a/src/unit_test_stubs/share_esmf/CTSMForce2DStreamBaseType.F90 b/src/unit_test_stubs/share_esmf/CTSMForce2DStreamBaseType.F90 index 59e6a4d551..0d284a7d54 100644 --- a/src/unit_test_stubs/share_esmf/CTSMForce2DStreamBaseType.F90 +++ b/src/unit_test_stubs/share_esmf/CTSMForce2DStreamBaseType.F90 @@ -21,6 +21,7 @@ module CTSMForce2DStreamBaseType procedure, public, non_overridable :: CleanBase ! Clean method for the base type procedure, public, non_overridable :: Advance ! Advance the streams data to the current model date procedure, public :: GetPtr1D ! Get pointer to the 1D data array + procedure, public :: Check1DPtrSize ! Check the size of the 1D stream data array procedure(Interp_interface), public, deferred :: Interp ! method in extensions to turn stream data into output data end type ctsm_force_2DStream_base_type @@ -117,4 +118,14 @@ subroutine GetPtr1D(this, fldname, dataptr1d) end subroutine GetPtr1D + !----------------------------------------------------------------------- + + subroutine Check1DPtrSize( this, bounds ) + ! Check that the stream data pointer size is as expected + ! Arguments: + class(ctsm_force_2DStream_base_type), intent(inout) :: this + type(bounds_type), intent(in) :: bounds + + end subroutine Check1DPtrSize + end module CTSMForce2DStreamBaseType diff --git a/tools/mksurfdata_esmf/Makefile b/tools/mksurfdata_esmf/Makefile index 835f732a02..1a6badd0c7 100644 --- a/tools/mksurfdata_esmf/Makefile +++ b/tools/mksurfdata_esmf/Makefile @@ -14,7 +14,7 @@ # To generate a single dataset, run make with the name of the rule you # want to build. For example, to generate the crop data set for 1x1_numaIA: # -# make crop-numa +# make 1x1-numa-present # # NOTE: The default behavior is to parallelize data set creation using # the batch system by submitting jobs to the batch queue (on Derecho). @@ -81,36 +81,51 @@ URBALPHA_TMP2_FNAME := surfdata_1x1_urbanc_alpha_hist_2000_78pfts_tmp.nc URBALPHA_FNAME := surfdata_1x1_urbanc_alpha_hist_2000_78pfts_c$(CDATE).nc SUBSETDATA_1X1_MEXICOCITY := --lat 19.5 --lon 260.5 --site 1x1_mexicocityMEX --out-surface $(MEXICOCITY_TMP_FNAME) SUBSETDATA_1X1_VANCOUVER := --lat 49.5 --lon 236.5 --site 1x1_vancouverCAN --out-surface $(VANCOUVER_TMP_FNAME) -SUBSETDATA_1X1_URBALPHA := --lat -37.7308 --lon 0 --site 1x1_urbanc_alpha --out-surface $(URBALPHA_TMP_FNAME) +SUBSETDATA_1X1_URBALPHA := --lat -37.7308 --lon 360 --site 1x1_urbanc_alpha --out-surface $(URBALPHA_TMP_FNAME) # ne120np4 and hi-res are for high resolution, ne16np4 is for mid-resolution testing # low-res is for low resolutions for testing # nldas is for NWP working with WRF # STANDARD means no crop, so 16 pfts -# global-hist-1850-f45 is used by FATES and we expect it to be phased out +# global-hist-1850-low-res is used by FATES; we expected to phase it out, but to f45 we added f10 in ctsm5.4 STANDARD = \ global-potveg \ global-present \ global-present-low-res \ - global-hist-1850-f19 \ - global-hist-1850-f45 \ - + global-hist-1850-1and2deg \ + global-hist-1850-low-res \ + +# NOTE slevis 2025/9/10: For CTSM5.4, I removed from CROP: +# crop-global-future +# Here I added this because it spans 1979-2023. When CMIP7 future scenarios become available, this will span 1979-2030: +# crop-global-hist-vrandne120 +# Also I split ne3 into ne3-1, ne3-2, ne3-3 for historical because the combined ne3 job took >12 hours in the queue CROP = \ - crop-global-future \ - crop-global-hist-f09 \ + crop-global-hist \ + crop-global-hist-low-res \ + crop-global-hist-ne3-1 \ + crop-global-hist-ne3-2 \ + crop-global-hist-ne3-3 \ + crop-global-hist-ne16 \ + crop-global-hist-ne30 \ + crop-global-hist-mpasa480 \ + crop-global-hist-1700 \ crop-global-1850-ne120 \ - crop-global-present-ne120 \ + crop-global-present-vrandne120 \ crop-global-present-nldas \ crop-global-present-ne30 \ crop-global-present \ crop-global-present-low-res \ + crop-global-present-ne3 \ crop-global-present-ne16 \ crop-global-present-mpasa480 \ crop-global-1850 \ crop-global-1850-low-res \ + crop-global-1850-ne3 \ crop-global-1850-ne16 \ crop-global-1850-ne30 \ crop-global-1850-mpasa480 \ + crop-global-hist-vrandne120 \ # Build the executable if it doesn't exist and any target depends on it $(MKSURFDATA_EXE): @@ -127,11 +142,12 @@ all : all-subset global-present-ultra-hi-res crop standard crop-tropics-present # These are all the surface datasets generated by subset_data # This runs interactively and does not send jobs to the batch queue +# NOTE slevis 2025/9/10: For CTSM5.4, I removed from all-subset: +# 1x1-smallville-present all-subset : \ 1x1_brazil-present \ 1x1_brazil-transient \ 1x1-numa-present \ - 1x1-smallville-present \ 1x1-smallville-1850 \ 1x1-smallville-transient \ 1x1-cidadinho-present \ @@ -168,10 +184,10 @@ global-present-low-res : FORCE $(MKSURFDATA) --number-of-nodes 1 --tasks-per-node 64 --scenario $@ --jobscript-file $@.sh --walltime 01:00:00 $(BATCHJOBS) $@.sh -global-hist-1850-f19 : FORCE +global-hist-1850-1and2deg : FORCE $(MKSURFDATA) --number-of-nodes 8 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 $(BATCHJOBS) $@.sh -global-hist-1850-f45 : FORCE +global-hist-1850-low-res : FORCE $(MKSURFDATA) --number-of-nodes 2 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 $(BATCHJOBS) $@.sh # @@ -205,7 +221,11 @@ crop-global-present : FORCE $(BATCHJOBS) $@.sh crop-global-present-low-res : FORCE - $(MKSURFDATA) --number-of-nodes 1 --tasks-per-node 64 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 + $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 + $(BATCHJOBS) $@.sh + +crop-global-present-ne3 : FORCE + $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 $(BATCHJOBS) $@.sh crop-global-present-ne16 : FORCE @@ -216,7 +236,7 @@ crop-global-present-ne30 : FORCE $(MKSURFDATA) --number-of-nodes 4 --scenario $@ --jobscript-file $@.sh --walltime 01:00:00 $(BATCHJOBS) $@.sh -crop-global-present-ne120 : FORCE +crop-global-present-vrandne120 : FORCE $(MKSURFDATA) --number-of-nodes 4 --scenario $@ --jobscript-file $@.sh --walltime 01:00:00 $(BATCHJOBS) $@.sh @@ -233,7 +253,11 @@ crop-global-1850 : FORCE $(BATCHJOBS) $@.sh crop-global-1850-low-res : FORCE - $(MKSURFDATA) --number-of-nodes 1 --tasks-per-node 64 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 + $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 + $(BATCHJOBS) $@.sh + +crop-global-1850-ne3 : FORCE + $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 $(BATCHJOBS) $@.sh crop-global-1850-ne16 : FORCE @@ -256,12 +280,24 @@ crop-global-hist : FORCE $(MKSURFDATA) --number-of-nodes 72 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 $(BATCHJOBS) $@.sh -crop-global-hist-f09 : FORCE +crop-global-hist-1700 : FORCE $(MKSURFDATA) --number-of-nodes 9 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 $(BATCHJOBS) $@.sh crop-global-hist-low-res : FORCE - $(MKSURFDATA) --number-of-nodes 14 --tasks-per-node 32 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 + $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 + $(BATCHJOBS) $@.sh + +crop-global-hist-ne3-1: FORCE + $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 + $(BATCHJOBS) $@.sh + +crop-global-hist-ne3-2: FORCE + $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 + $(BATCHJOBS) $@.sh + +crop-global-hist-ne3-3: FORCE + $(MKSURFDATA) --number-of-nodes 1 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 $(BATCHJOBS) $@.sh crop-global-hist-ne16 : FORCE @@ -272,6 +308,10 @@ crop-global-hist-ne30 : FORCE $(MKSURFDATA) --number-of-nodes 9 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 $(BATCHJOBS) $@.sh +crop-global-hist-mpasa480 : FORCE + $(MKSURFDATA) --number-of-nodes 4 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 + $(BATCHJOBS) $@.sh + 1x1-numa-present : FORCE $(SUBSETDATA_POINT_ALLLU) --create-surface $(SUBSETDATA_1X1_NUMAIA) @@ -296,7 +336,11 @@ crop-global-hist-ne30 : FORCE # # Crop with future scenarios -# +# NOTE 2025/10/21: Time periods extending beyond 2023 combine CMIP7 data +# for the historical period and CMIP6 data beyond 2023. +# This introduces a discontinuity in 2024. +# TODO: Add crop-global-future back when the CMIP7 data become available. +# See other corresponding crop-global-future comment elsewhere in this Makefile. crop-global-future : crop-global-SSP1-1.9-f09 \ crop-global-SSP1-2.6-f09 \ @@ -310,12 +354,14 @@ crop-global-future : crop-global-SSP1-1.9-f09 \ crop-global-SSP2-4.5-low-res : crop-global-SSP2-4.5-f10 \ crop-global-SSP2-4.5-f45 \ crop-global-SSP2-4.5-ne3 +# NOTE slevis 2025/9/10: For CTSM5.4, I moved to CROP because it spans 1979-2023: +# crop-global-hist-vrandne120 +# When CMIP7 future scenario data become available, this will span 1979-2030. crop-global-SSP2-4.5 : crop-global-SSP2-4.5-f09 \ crop-global-SSP2-4.5-f19 \ crop-global-SSP2-4.5-hcru \ crop-global-SSP2-4.5-ne16 \ crop-global-SSP2-4.5-ne30 \ - crop-global-SSP2-4.5-ne0np4 \ crop-global-SSP2-4.5-C96 \ crop-global-SSP2-4.5-mpasa120 @@ -359,7 +405,7 @@ crop-global-SSP2-4.5-ne30 : FORCE $(MKSURFDATA) --number-of-nodes 9 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 $(BATCHJOBS) $@.sh -crop-global-SSP2-4.5-ne0np4 : FORCE +crop-global-hist-vrandne120 : FORCE $(MKSURFDATA) --number-of-nodes 2 --scenario $@ --jobscript-file $@.sh --walltime 12:00:00 $(BATCHJOBS) $@.sh diff --git a/tools/mksurfdata_esmf/README.md b/tools/mksurfdata_esmf/README.md index f49d23fb61..95064a9839 100644 --- a/tools/mksurfdata_esmf/README.md +++ b/tools/mksurfdata_esmf/README.md @@ -100,6 +100,7 @@ This will bring in CIME and ccs_config which are required for building. ``` shell # Assuming pwd is the tools/mksurfdata_esmf directory +setenv DEBUG TRUE # only if debugging and your shell is tcsh (in bash use: export DEBUG=TRUE) ./gen_mksurfdata_build # For machines with a cime build ``` diff --git a/tools/mksurfdata_esmf/gen_mksurfdata_namelist.xml b/tools/mksurfdata_esmf/gen_mksurfdata_namelist.xml index a2266bf0a0..1d242a11c5 100644 --- a/tools/mksurfdata_esmf/gen_mksurfdata_namelist.xml +++ b/tools/mksurfdata_esmf/gen_mksurfdata_namelist.xml @@ -10,7 +10,7 @@ - lnd/clm2/rawdata/CTSM53RawData/globalctsm53histMKSRFDeg025_240709/mksrf_landuse_ctsm53_pftlai_CLIM.c240709.nc + lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_pftlai_clm6_histLUH3_2005_c251012.nc lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc @@ -21,7 +21,7 @@ - lnd/clm2/rawdata/CTSM53RawData/globalctsm53histMKSRFDeg025_240709/mksrf_landuse_ctsm53_soilcolor_CLIM.c240709.nc + lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_soilcolor_clm6_histLUH3_2005_c251012.nc lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc @@ -93,7 +93,7 @@ - lnd/clm2/mappingdata/grids/UNSTRUCTgrid_3x3min_nomask_cdf5_c200129.nc + lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc @@ -168,7 +168,7 @@ version of the raw dataset will probably go away. - lnd/clm2/rawdata/mksrf_abm_0.5x0.5_simyr2000.c240821.nc + lnd/clm2/rawdata/mksrf_abm_0.5x0.5_simyr2000.c250715.nc lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.5x0.5_nomask_cdf5_c200129.nc @@ -204,40 +204,40 @@ version of the raw dataset will probably go away. - + - lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRNOANTHRODeg025_240831/mksrf_landuse_ctsm53_histTRNOANTHRO_1.c240831.nc + lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_NOANTHRO_CMIP7/mksrf_landuse_clm6_noanthroLUH3_1.c251012.nc lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_1850.cdf5.c20220325.nc lnd/clm2/rawdata/mksrf_urban_0.05x0.05_zerourbanpct.cdf5.c181014.nc - lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRENDY2024Deg025_240728/mksrf_landuse_ctsm53_histTRENDY2024_1700.c240728.nc + lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_landuse_clm6_histLUH3_1700.c251012.nc lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_1850.cdf5.c20220325.nc - lnd/clm2/rawdata/gao_oneill_urban/historical/urban_properties_GaoOneil_05deg_ThreeClass_1850_cdf5_c20220910.nc + lnd/clm2/rawdata/CTSM54RawData/urban_properties/urban_properties_CMIP7_ThreeClass_1700_c250423.nc - lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRENDY2024Deg025_240728/mksrf_landuse_ctsm53_histTRENDY2024_1850.c240728.nc + lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_landuse_clm6_histLUH3_1850.c251012.nc lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_1850.cdf5.c20220325.nc - lnd/clm2/rawdata/gao_oneill_urban/historical/urban_properties_GaoOneil_05deg_ThreeClass_1850_cdf5_c20220910.nc + lnd/clm2/rawdata/CTSM54RawData/urban_properties/urban_properties_CMIP7_ThreeClass_1850_c250423.nc - lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRENDY2024Deg025_240728/mksrf_landuse_ctsm53_histTRENDY2024_2000.c240728.nc + lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_landuse_clm6_histLUH3_2000.c251012.nc lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_2000.cdf5.c20220325.nc - lnd/clm2/rawdata/gao_oneill_urban/historical/urban_properties_GaoOneil_05deg_ThreeClass_2000_cdf5_c20220910.nc + lnd/clm2/rawdata/CTSM54RawData/urban_properties/urban_properties_CMIP7_ThreeClass_2000_c250423.nc - lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRENDY2024Deg025_240728/mksrf_landuse_ctsm53_histTRENDY2024_2005.c240728.nc + lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_landuse_clm6_histLUH3_2005.c251012.nc lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_2005.cdf5.c20220325.nc - lnd/clm2/rawdata/gao_oneill_urban/historical/urban_properties_GaoOneil_05deg_ThreeClass_2005_cdf5_c20220910.nc + lnd/clm2/rawdata/CTSM54RawData/urban_properties/urban_properties_CMIP7_ThreeClass_2005_c250423.nc @@ -251,12 +251,11 @@ version of the raw dataset will probably go away. - - lnd/clm2/rawdata/CTSM53RawData/globalctsm53histTRENDY2024Deg025_240728/mksrf_landuse_ctsm53_histTRENDY2024_%y.c240728.nc + lnd/clm2/rawdata/CTSM54RawData/CLM6_LUH3_HIST_CMIP7/mksrf_landuse_clm6_histLUH3_%y.c251012.nc lnd/clm2/mappingdata/grids/UNSTRUCTgrid_0.25x0.25_nomask_cdf5_c200129.nc lnd/clm2/rawdata/lake_area/mksurf_lake_0.05x0.05_hist_clm5_hydrolakes_%y.cdf5.c20220325.nc - lnd/clm2/rawdata/gao_oneill_urban/historical/urban_properties_GaoOneil_05deg_ThreeClass_%y_cdf5_c20220910.nc + lnd/clm2/rawdata/CTSM54RawData/urban_properties/urban_properties_CMIP7_ThreeClass_%y_c250423.nc diff --git a/tools/mksurfdata_esmf/modify_1x1_urbanc_alpha.cfg b/tools/mksurfdata_esmf/modify_1x1_urbanc_alpha.cfg index bdb27ac43d..1e509ccb8f 100644 --- a/tools/mksurfdata_esmf/modify_1x1_urbanc_alpha.cfg +++ b/tools/mksurfdata_esmf/modify_1x1_urbanc_alpha.cfg @@ -32,6 +32,8 @@ lnd_lat_2 = 90 lnd_lon_1 = 0 # easternmost longitude for rectangle lnd_lon_2 = 360 +# Upper limit of longitudes, from format being either [-180, 180] or [0, 360] +lon_type = 360 # user-defined mask in a file, as alternative to setting lat/lon values landmask_file = UNSET diff --git a/tools/mksurfdata_esmf/src/mkagfirepkmonthMod.F90 b/tools/mksurfdata_esmf/src/mkagfirepkmonthMod.F90 index 6115e813f9..417658245c 100644 --- a/tools/mksurfdata_esmf/src/mkagfirepkmonthMod.F90 +++ b/tools/mksurfdata_esmf/src/mkagfirepkmonthMod.F90 @@ -20,9 +20,9 @@ module mkagfirepkmonthMod public :: mkagfirepkmon ! Set agricultural fire peak month - integer , parameter :: min_valid = 1 - integer , parameter :: max_valid = 12 - integer , parameter :: unsetmon = 13 + integer , parameter :: min_valid = 1 ! month value for January + integer , parameter :: max_valid = 13 ! value for no agricultural fire + integer , parameter :: unsetmon = 14 ! value for no data type(ESMF_DynamicMask) :: dynamicMask @@ -36,6 +36,10 @@ module mkagfirepkmonthMod subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc) ! ! Make agricultural fire peak month data from higher resolution data + ! by selecting the dominant value from values 1 through 13 + ! where 13 means no agricultural fire. + ! + ! The relevant subroutine is get_dominant_indices. ! ! input/output variables character(len=*) , intent(in) :: file_mesh_i ! input mesh file name @@ -54,9 +58,9 @@ subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc) integer :: k integer :: ni,no integer :: ns_i, ns_o - integer , allocatable :: mask_i(:) - real(r4), allocatable :: rmask_i(:) - real(r8), allocatable :: frac_o(:) + integer , allocatable :: mask_i(:) ! input grid: mesh file landmask + real(r4), allocatable :: rmask_i(:) ! input grid: raw dataset landmask + real(r8), allocatable :: frac_o(:) ! output grid: agricultural fire peak month integer , allocatable :: idata_i(:) ! input grid: agricultural fire peak month integer , allocatable :: agfirepkmon_o(:) ! agricultural fire peak month real(r4), pointer :: dataptr(:) @@ -116,6 +120,10 @@ subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc) call mkpio_get_rawdata(pioid_i, 'abm', mesh_i, idata_i, rc=rc) if (chkerr(rc,__LINE__,u_FILE_u)) return call ESMF_VMLogMemInfo("After mkpio_getrawdata in "//trim(subname)) + ! Update idata_i to unsetmon where mask_i == 0, i.e. over ocean + do ni = 1, ns_i + if (mask_i(ni) == 0) idata_i(ni) = unsetmon + end do ! Create ESMF fields that will be used below field_i = ESMF_FieldCreate(mesh_i, ESMF_TYPEKIND_R4, meshloc=ESMF_MESHLOC_ELEMENT, rc=rc) @@ -142,6 +150,7 @@ subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc) ! Create a dynamic mask object ! The dynamic mask object further holds a pointer to the routine that will be called in order to ! handle dynamically masked elements - in this case its DynMaskProc (see below) + ! This calls subroutine get_dominant_indices call ESMF_DynamicMaskSetR4R8R4(dynamicMask, dynamicMaskRoutine=get_dominant_indices, & handleAllElements=.true., rc=rc) if (chkerr(rc,__LINE__,u_FILE_u)) return @@ -164,6 +173,7 @@ subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc) ! Check validity of output data if (min_bad(agfirepkmon_o, min_valid, 'agfirepkmon') .or. & max_bad(agfirepkmon_o, unsetmon , 'agfirepkmon')) then + if (root_task) write(ndiag, '(a)') trim(subname)//" error in agfirepkmon_o value range: expect min_valid to unsetmon which equal ", min_valid, unsetmon call shr_sys_abort() end if @@ -178,7 +188,7 @@ subroutine mkagfirepkmon(file_mesh_i, file_data_i, mesh_o, pioid_o, rc) ! Output diagnostics comparing global area of each peak month on input and output grids call output_diagnostics_index(mesh_i, mesh_o, mask_i, frac_o, & - 1, 13, idata_i, agfirepkmon_o, 'peak fire month', ndiag, rc) + min_valid, unsetmon, idata_i, agfirepkmon_o, 'peak fire month', ndiag, rc) if (chkerr(rc,__LINE__,u_FILE_u)) call shr_sys_abort() ! Release memory @@ -206,15 +216,16 @@ subroutine get_dominant_indices(dynamicMaskList, dynamicSrcMaskValue, dynamicDst ! input/output arguments type(ESMF_DynamicMaskElementR4R8R4) , pointer :: dynamicMaskList(:) - real(ESMF_KIND_R4) , intent(in), optional :: dynamicSrcMaskValue - real(ESMF_KIND_R4) , intent(in), optional :: dynamicDstMaskValue - integer , intent(out) :: rc + real(ESMF_KIND_R4) , intent(in), optional :: dynamicSrcMaskValue ! Source (i.e. input) grid mask + real(ESMF_KIND_R4) , intent(in), optional :: dynamicDstMaskValue ! Destination (i.e. output) grid mask + integer , intent(out) :: rc ! error status ! local variables integer :: ni, no, n real(ESMF_KIND_R4) :: wts_o(min_valid:max_valid) integer :: maxindex(1) logical :: hasdata + character(len=*), parameter :: subname = 'get_dominant_indices' !--------------------------------------------------------------- rc = ESMF_SUCCESS diff --git a/tools/mksurfdata_esmf/src/mksurfdata.F90 b/tools/mksurfdata_esmf/src/mksurfdata.F90 index 35ff1807cd..c2ecc9c308 100644 --- a/tools/mksurfdata_esmf/src/mksurfdata.F90 +++ b/tools/mksurfdata_esmf/src/mksurfdata.F90 @@ -968,8 +968,8 @@ program mksurfdata rcode = pio_put_var(pioid, pio_varid, (/ntim/), year) rcode = pio_inq_varid(pioid, 'time', pio_varid) rcode = pio_put_var(pioid, pio_varid, (/ntim/), year) - !rcode = pio_inq_varid(pioid, 'input_pftdata_filename', pio_varid) - !rcode = pio_put_var(pioid, pio_varid, (/1,ntim/), (/len_trim(string),1/), trim(string)) + rcode = pio_inq_varid(pioid, 'input_pftdata_filename', pio_varid) + rcode = pio_put_var(pioid, pio_varid, (/1,ntim/), trim(string)) call pio_syncfile(pioid) ! Create pctpft data at model resolution from file fname diff --git a/tools/mksurfdata_esmf/validate_fsurdat_files.sh b/tools/mksurfdata_esmf/validate_fsurdat_files.sh new file mode 100755 index 0000000000..2158a30435 --- /dev/null +++ b/tools/mksurfdata_esmf/validate_fsurdat_files.sh @@ -0,0 +1,126 @@ +#!/bin/bash + +# Validation/verification of new fsurdat files +# -------------------------------------------- +# WRITTEN by slevis after discussions with ekluzek. +# +# LOCATION: slevis first used this script in the directory +# .../inputdata/lnd/clm2/surfdata_esmf/ctsm5.4.0/validation +# +# CAVEAT: For new CTSM versions, use this script as a template with the +# understanding that aspects of the code will need to change. Search +# the string "current" for items that may need to change in the future. +# +# PURPOSE and DETAILS +# ------------------- +# This script +# 1) uses cprnc to compare NEW_VERSION versus OLD_VERSION files by generating +# cprnc.out files. +# 2) greps for fields with differences (RMS or NORMALIZED) that are >=1. +# The strictest grep threshold that I found isolates potentially +# unexpected changes is E-03. I determined this empirically using two +# types of problematic fsurdat files from the recent past: +# - No LAI, SAI, and heights for pfts 15 and 16. +# - No soil textures in parts of the world in unstructured grids. +# These "unexpected" fields appear alongside expected diffs (discussed +# below) when grepping for E+. Grepping for less than E-03 starts to +# capture fields with smaller differences and is likely to miss +# unexpected problematic fields. +# +# Step after running the script +# ----------------------------- +# Interactively and iteratively build this grep command to confirm that +# all fields in the script's grep output are expected. This list of +# fields here is ctsm5.4-specific: +# >>> grep NORM grep_E+_surfdata_cprnc.out | grep -v ROOF | grep -v WALL | grep -v URBAN | grep -v BUILDING | grep -v abm | grep -v CANYON | grep -v CONST_HARVEST | grep -v ROAD | grep -v UNREPRESENTED_PFT | grep -v PCT_NATVEG +# +# If the grep command reveals unexpected fields, investigate. +# The list of fields to check depends on which fields you expect to have +# answer changes. The magnitude of the differences will depend on the +# specifics of what changed. Ensure you only see the answer changes that +# you expect. +# +# ----------------------------- +# +# Separate subjective comparison +# ------------------------------ +# >>> ncdiff surfdata_new.nc surfdata_old.nc surfdata_new_vs_old.nc +# >>> ncview surfdata_new_vs_old.nc +# - Focus on fields with larger RMS diffs in the cprnc output. +# - ncvis works like ncview for unstructured grids (e.g. ne30), though +# slevis found ncvis to crash when reading a "diff" file generated by ncdiff. +# +# Another validation step +# ----------------------- +# Run mksurfdata_esmf with a different number of processors and confirm +# bit-for-bit same results. + +# Settings to be used in the comparisons below. +# Paths are hardwired to derecho currently. +newdatestamp=c251022 # USER DEFINED +newdir=ctsm5.4.0 # USER DEFINED +olddir=ctsm5.3.0 # USER DEFINED +olddatestamp=c240908 # USER DEFINED +olddatestamp_ne3np4=c240925 # USER DEFINED +cimetoolspath=/glade/campaign/cesm/cesmdata/cseg/tools/cime/tools +CPRNC=$cimetoolspath/cprnc/cprnc + +echo "starting grids loop" + +# The first loop of grids (unlike the other loops) uses olddatestamp_ne3np4 currently. +# Skip ne3np4.pg2 as present only in NEW_VERSION currently so may wish to add in future versions. +grids=("ne3np4") + +for grid in "${grids[@]}" + + # 1850_78pft files + do $CPRNC ../surfdata_$grid\_hist_1850_78pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_1850_78pfts_$olddatestamp_ne3np4.nc >& surfdata_$grid\_hist_1850_78pfts_$newdir\_vs_$olddir.cprnc.out + # 2000_78pft files + $CPRNC ../surfdata_$grid\_hist_2000_78pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_2000_78pfts_$olddatestamp_ne3np4.nc >& surfdata_$grid\_hist_2000_78pfts_$newdir\_vs_$olddir.cprnc.out + echo "done $grid" + +done + +# Second loop of grids. +grids=("C96" "360x720cru" "4x5" "10x15" "0.9x1.25" "1.9x2.5" "mpasa120" "mpasa480" "ne16np4.pg3" "ne120np4.pg3" "ne3np4.pg3" "ne30np4" "ne30np4.pg2" "ne30np4.pg3") +for grid in "${grids[@]}" + + # 1850_78pft files + do $CPRNC ../surfdata_$grid\_hist_1850_78pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_1850_78pfts_$olddatestamp.nc >& surfdata_$grid\_hist_1850_78pfts_$newdir\_vs_$olddir.cprnc.out + # 2000_78pft files + $CPRNC ../surfdata_$grid\_hist_2000_78pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_2000_78pfts_$olddatestamp.nc >& surfdata_$grid\_hist_2000_78pfts_$newdir\_vs_$olddir.cprnc.out + echo "done $grid" + +done + +# Third loop of grids. +# Skip 1850 as only 2000 is present currently. +# Skip mpasa30 as present only in NEW_VERSION currently so may wish to add in future versions. +# Skip mpasa3p75 because cprnc runs out of memory at that resolution currently. +grids=("mpasa60" "mpasa15") +for grid in "${grids[@]}" + + # 2000_16pft files + do $CPRNC ../surfdata_$grid\_hist_2000_16pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_2000_16pfts_$olddatestamp.nc >& surfdata_$grid\_hist_2000_16pfts_$newdir\_vs_$olddir.cprnc.out + echo "done $grid" + +done + +# Fourth loop of grids: for 1979 files. +# Skip ne0np4.NATL.ne30x8 and ne120np4.pg3 as present only in NEW_VERSION currently so may wish to add in future versions. +grids=("ne0np4.ARCTICGRIS.ne30x8" "ne0np4.ARCTIC.ne30x4" "ne0np4CONUS.ne30x8" "ne0np4.POLARCAP.ne30x4") + +for grid in "${grids[@]}" + + # 1979_78pft files + do $CPRNC ../surfdata_$grid\_hist_1979_78pfts_$newdatestamp.nc ../../$olddir/surfdata_$grid\_hist_1979_78pfts_$olddatestamp.nc >& surfdata_$grid\_hist_1979_78pfts_$newdir\_vs_$olddir.cprnc.out + echo "done $grid" + +done + +# grep for E+ to catch larger diffs. +for file in surfdata_*cprnc.out + do grep -H NORM $file | grep 'E+' >> grep_E+_surfdata_cprnc.out +done + +exit diff --git a/tools/modify_input_files/modify_smallville.sh b/tools/modify_input_files/modify_smallville.sh index 4dc7c58e9b..f4694e95c2 100755 --- a/tools/modify_input_files/modify_smallville.sh +++ b/tools/modify_input_files/modify_smallville.sh @@ -7,14 +7,14 @@ module load nco # This script runs from the mksurfdata_esmf/Makefile. # When running standalone, it may need "subset_data_single_point/" in front # of each landuse.timeseries file name. - file_to_2100="landuse.timeseries_1x1_smallvilleIA_SSP2-4.5_1850-2100_78pfts_c$(date +%y%m%d).nc" - file_to_1855="landuse.timeseries_1x1_smallvilleIA_SSP2-4.5_1850-1855_78pfts_c$(date +%y%m%d).nc" - file_lake="landuse.timeseries_1x1_smallvilleIA_SSP2-4.5_1850-1855_78pfts_dynLakes_c$(date +%y%m%d).nc" - file_urban="landuse.timeseries_1x1_smallvilleIA_SSP2-4.5_1850-1855_78pfts_dynUrban_c$(date +%y%m%d).nc" - file_pft="landuse.timeseries_1x1_smallvilleIA_SSP2-4.5_1850-1855_78pfts_dynPft_c$(date +%y%m%d).nc" + file_whole="landuse.timeseries_1x1_smallvilleIA_hist_1850-2023_78pfts_c$(date +%y%m%d).nc" + file_to_1855="landuse.timeseries_1x1_smallvilleIA_synth_hist_1850-1855_78pfts_c$(date +%y%m%d).nc" + file_lake="landuse.timeseries_1x1_smallvilleIA_synth_hist_1850-1855_78pfts_dynLakes_c$(date +%y%m%d).nc" + file_urban="landuse.timeseries_1x1_smallvilleIA_synth_hist_1850-1855_78pfts_dynUrban_c$(date +%y%m%d).nc" + file_pft="landuse.timeseries_1x1_smallvilleIA_synth_hist_1850-1855_78pfts_dynPft_c$(date +%y%m%d).nc" # Trim the file to just the years 1850-1855 -ncks -d time,0,5 $file_to_2100 $file_to_1855 +ncks -d time,0,5 $file_whole $file_to_1855 # Replace all values in the LAKE and CROP variables ncap2 -s "PCT_LAKE=array(0.,0.,PCT_CROP); PCT_LAKE={0.,50.,25.,25.,25.,25.} ; PCT_LAKE_MAX=array(50.,50.,PCT_CROP_MAX); PCT_CROP=array(0.,0.,PCT_LAKE); PCT_CROP={0.,25.,12.,12.,12.,12.}; PCT_CROP_MAX=array(25.,25.,PCT_LAKE_MAX)" $file_to_1855 $file_lake diff --git a/tools/site_and_regional/default_data_1850.cfg b/tools/site_and_regional/default_data_1850.cfg index ce68b1debf..a86176acd8 100644 --- a/tools/site_and_regional/default_data_1850.cfg +++ b/tools/site_and_regional/default_data_1850.cfg @@ -15,12 +15,12 @@ precname = CLMCRUJRA2024.Precip tpqwname = CLMCRUJRA2024.TPQW [surfdat] -dir = lnd/clm2/surfdata_esmf/ctsm5.3.0 -surfdat_78pft = surfdata_0.9x1.25_hist_1850_78pfts_c240908.nc +dir = lnd/clm2/surfdata_esmf/ctsm5.4.0 +surfdat_78pft = surfdata_0.9x1.25_hist_1850_78pfts_c251022.nc [landuse] -dir = lnd/clm2/surfdata_esmf/ctsm5.3.0 -landuse_78pft = landuse.timeseries_0.9x1.25_SSP2-4.5_1850-2100_78pfts_c240908.nc +dir = lnd/clm2/surfdata_esmf/ctsm5.4.0 +landuse_78pft = landuse.timeseries_0.9x1.25_hist_1850-2023_78pfts_c251022.nc [domain] file = share/domains/domain.lnd.fv0.9x1.25_gx1v7.151020.nc diff --git a/tools/site_and_regional/default_data_2000.cfg b/tools/site_and_regional/default_data_2000.cfg index 60c012561c..e43af3f7e3 100644 --- a/tools/site_and_regional/default_data_2000.cfg +++ b/tools/site_and_regional/default_data_2000.cfg @@ -1,5 +1,5 @@ [main] -clmforcingindir = /glade/campaign/cesm/cesmdata/cseg/inputdata +clmforcingindir = /glade/campaign/cesm/cesmdata/inputdata [datm] dir = atm/datm7/atm_forcing.datm7.CRUJRA.0.5d.c20241231/three_stream @@ -15,16 +15,16 @@ precname = CLMCRUJRA2024.Precip tpqwname = CLMCRUJRA2024.TPQW [surfdat] -dir = lnd/clm2/surfdata_esmf/ctsm5.3.0 -surfdat_16pft = surfdata_0.9x1.25_hist_2000_16pfts_c240908.nc -surfdat_78pft = surfdata_0.9x1.25_hist_2000_78pfts_c240908.nc +dir = lnd/clm2/surfdata_esmf/ctsm5.4.0 +surfdat_16pft = surfdata_0.9x1.25_hist_2000_16pfts_c251022.nc +surfdat_78pft = surfdata_0.9x1.25_hist_2000_78pfts_c251022.nc mesh_dir = share/meshes/ mesh_surf = fv0.9x1.25_141008_ESMFmesh.nc [landuse] -dir = lnd/clm2/surfdata_esmf/ctsm5.3.0 -landuse_16pft = landuse.timeseries_0.9x1.25_SSP2-4.5_1850-2100_78pfts_c240908.nc -landuse_78pft = landuse.timeseries_0.9x1.25_SSP2-4.5_1850-2100_78pfts_c240908.nc +dir = lnd/clm2/surfdata_esmf/ctsm5.4.0 +landuse_16pft = landuse.timeseries_0.9x1.25_hist_1850-2023_78pfts_c251022.nc +landuse_78pft = landuse.timeseries_0.9x1.25_hist_1850-2023_78pfts_c251022.nc [domain] file = share/domains/domain.lnd.fv0.9x1.25_gx1v7.151020.nc