diff --git a/Externals.cfg b/Externals.cfg
index 090732ee79..a3db5bd76d 100644
--- a/Externals.cfg
+++ b/Externals.cfg
@@ -8,7 +8,7 @@ required = True
local_path = components/cism
protocol = git
repo_url = https://github.com/ESCOMP/CISM-wrapper
-tag = cism-release-cesm2.1.2_01
+tag = cism-release-cesm2.1.2_02
externals = Externals_CISM.cfg
required = True
@@ -30,7 +30,7 @@ required = True
local_path = cime
protocol = git
repo_url = https://github.com/ESMCI/cime
-tag = cime5.6.28
+tag = cime5.6.32
required = True
[externals_description]
diff --git a/bld/CLMBuildNamelist.pm b/bld/CLMBuildNamelist.pm
index 4a587971ea..5d0bf5f000 100755
--- a/bld/CLMBuildNamelist.pm
+++ b/bld/CLMBuildNamelist.pm
@@ -1893,7 +1893,8 @@ sub setup_logic_co2_type {
my $group = $definition->get_group_name($var);
$nl->set_variable_value($group, $var, $opts->{$var});
} else {
- add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, $var, 'sim_year'=>$nl_flags->{'sim_year'} );
+ add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, $var, 'sim_year'=>$nl_flags->{'sim_year'},
+ 'ssp_rcp'=>$nl_flags->{'ssp_rcp'} );
}
}
}
@@ -3272,9 +3273,17 @@ sub setup_logic_nitrogen_deposition {
'use_cn'=>$nl_flags->{'use_cn'}, 'lnd_tuning_mode'=>$nl_flags->{'lnd_tuning_mode'},
'hgrid'=>"0.9x1.25", 'ssp_rcp'=>$nl_flags->{'ssp_rcp'}, 'nofail'=>1 );
if ( ! defined($nl->get_value('stream_fldfilename_ndep') ) ) {
+ # Also check at f19 resolution
add_default($opts, $nl_flags->{'inputdata_rootdir'}, $definition, $defaults, $nl, 'stream_fldfilename_ndep', 'phys'=>$nl_flags->{'phys'},
'use_cn'=>$nl_flags->{'use_cn'}, 'lnd_tuning_mode'=>$nl_flags->{'lnd_tuning_mode'},
- 'hgrid'=>"1.9x2.5", 'ssp_rcp'=>$nl_flags->{'ssp_rcp'} );
+ 'hgrid'=>"1.9x2.5", 'ssp_rcp'=>$nl_flags->{'ssp_rcp'}, 'nofail'=>1 );
+ # If not found report an error
+ if ( ! defined($nl->get_value('stream_fldfilename_ndep') ) ) {
+ $log->warning("Did NOT find the Nitrogen-deposition forcing file (stream_fldfilename_ndep) for this ssp_rcp\n" .
+ "One way to get around this is to point to a file for another existing ssp_rcp in your user_nl_clm file.\n" .
+ "If you are running with CAM and WACCM chemistry Nitrogen deposition will come through the coupler.\n" .
+ "This file won't be used, so it doesn't matter what it points to -- but it's required to point to something.\n" )
+ }
}
} else {
# If bgc is NOT CN/CNDV then make sure none of the ndep settings are set!
diff --git a/bld/namelist_files/createMkSrfEntry.py b/bld/namelist_files/createMkSrfEntry.py
index b76e83af4d..004db4a6ca 100755
--- a/bld/namelist_files/createMkSrfEntry.py
+++ b/bld/namelist_files/createMkSrfEntry.py
@@ -5,12 +5,12 @@
class mksrfDataEntry_prog:
# Class data
- year_start = 850
- year_end = 1849
- ssp_rcp = "hist"
- subdir = "pftcftdynharv.0.25x0.25.LUH2.histsimyr0850-1849.c171012"
- cdate = 171012
- desc = "histclm50_LUH2"
+ year_start = 2101
+ year_end = 2300
+ ssp_rcp = "SSP1-2.6"
+ subdir = "pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320"
+ cdate = "200320"
+ desc = "SSP1RCP26x_clm5"
def parse_cmdline_args( self ):
"Parse the command line arguments for create data entry list"
diff --git a/bld/namelist_files/namelist_defaults_clm4_5.xml b/bld/namelist_files/namelist_defaults_clm4_5.xml
index 63816ced70..cc99601bb5 100644
--- a/bld/namelist_files/namelist_defaults_clm4_5.xml
+++ b/bld/namelist_files/namelist_defaults_clm4_5.xml
@@ -23,12 +23,13 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
1800
-379.0
-379.0
-388.8
-397.5
-284.7
-284.7
+379.0
+379.0
+388.8
+397.5
+1141.9
+284.7
+284.7
constant
@@ -817,6 +818,11 @@ lnd/clm2/surfdata_map/landuse.timeseries_ne30np4_hist_16pfts_Irrig_CMIP6_simyr18
lnd/clm2/surfdata_map/surfdata_0.9x1.25_hist_16pfts_nourb_CMIP6_simyrPtVg_c181114.nc
+
+
+
+lnd/clm2/surfdata_map/release-clm5.0.18/surfdata_0.9x1.25_hist_78pfts_CMIP6_simyr2000_c190214.nc
+
lnd/clm2/surfdata_map/release-clm5.0.18/landuse.timeseries_10x15_SSP5-3.4_78pfts_CMIP6_simyr1850-2100_c190228.nc
+
+
+
+lnd/clm2/surfdata_map/release-clm5.0.18/landuse.timeseries_0.9x1.25_SSP5-8.5_78pfts_CMIP6_simyr1850-2100_c190214.nc
+
@@ -1033,6 +1045,14 @@ lnd/clm2/surfdata_map/landuse.timeseries_ne30np4_hist_16pfts_Irrig_CMIP6_simyr18
2101
2015
+2101
+2101
+2101
+
+2101
+2101
+2101
+
2010
2010
@@ -1160,6 +1180,14 @@ lnd/clm2/surfdata_map/landuse.timeseries_ne30np4_hist_16pfts_Irrig_CMIP6_simyr18
2100
2015
+2100
+2100
+2100
+
+2100
+2100
+2100
+
2010
2010
@@ -1215,6 +1243,14 @@ lnd/clm2/surfdata_map/landuse.timeseries_ne30np4_hist_16pfts_Irrig_CMIP6_simyr18
2106
2015
+2100
+2106
+2100
+
+2100
+2106
+2100
+
2000
2000
diff --git a/bld/namelist_files/namelist_defaults_clm4_5_tools.xml b/bld/namelist_files/namelist_defaults_clm4_5_tools.xml
index a1598f3bf1..3c35256d01 100644
--- a/bld/namelist_files/namelist_defaults_clm4_5_tools.xml
+++ b/bld/namelist_files/namelist_defaults_clm4_5_tools.xml
@@ -4658,7 +4658,7 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
@@ -7396,6 +7396,2415 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
>lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2016-2100.c171005/mksrf_landuse_SSP5RCP85_clm5_2100.c171005.nc
+
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2101.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2102.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2103.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2104.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2105.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2106.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2107.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2108.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2109.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2110.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2111.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2112.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2113.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2114.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2115.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2116.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2117.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2118.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2119.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2120.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2121.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2122.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2123.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2124.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2125.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2126.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2127.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2128.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2129.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2130.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2131.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2132.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2133.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2134.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2135.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2136.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2137.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2138.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2139.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2140.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2141.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2142.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2143.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2144.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2145.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2146.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2147.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2148.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2149.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2150.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2151.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2152.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2153.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2154.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2155.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2156.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2157.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2158.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2159.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2160.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2161.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2162.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2163.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2164.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2165.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2166.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2167.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2168.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2169.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2170.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2171.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2172.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2173.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2174.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2175.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2176.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2177.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2178.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2179.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2180.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2181.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2182.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2183.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2184.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2185.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2186.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2187.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2188.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2189.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2190.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2191.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2192.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2193.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2194.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2195.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2196.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2197.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2198.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2199.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2200.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2201.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2202.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2203.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2204.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2205.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2206.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2207.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2208.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2209.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2210.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2211.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2212.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2213.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2214.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2215.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2216.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2217.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2218.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2219.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2220.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2221.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2222.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2223.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2224.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2225.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2226.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2227.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2228.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2229.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2230.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2231.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2232.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2233.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2234.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2235.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2236.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2237.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2238.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2239.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2240.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2241.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2242.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2243.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2244.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2245.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2246.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2247.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2248.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2249.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2250.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2251.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2252.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2253.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2254.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2255.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2256.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2257.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2258.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2259.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2260.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2261.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2262.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2263.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2264.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2265.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2266.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2267.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2268.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2269.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2270.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2271.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2272.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2273.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2274.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2275.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2276.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2277.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2278.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2279.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2280.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2281.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2282.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2283.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2284.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2285.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2286.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2287.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2288.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2289.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2290.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2291.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2292.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2293.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2294.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2295.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2296.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2297.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2298.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2299.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-8.5.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP85x_clm5_2300.c200320.nc
+
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2101.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2102.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2103.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2104.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2105.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2106.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2107.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2108.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2109.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2110.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2111.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2112.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2113.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2114.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2115.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2116.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2117.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2118.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2119.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2120.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2121.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2122.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2123.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2124.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2125.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2126.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2127.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2128.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2129.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2130.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2131.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2132.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2133.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2134.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2135.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2136.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2137.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2138.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2139.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2140.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2141.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2142.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2143.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2144.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2145.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2146.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2147.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2148.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2149.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2150.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2151.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2152.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2153.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2154.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2155.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2156.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2157.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2158.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2159.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2160.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2161.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2162.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2163.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2164.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2165.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2166.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2167.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2168.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2169.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2170.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2171.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2172.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2173.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2174.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2175.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2176.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2177.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2178.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2179.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2180.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2181.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2182.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2183.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2184.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2185.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2186.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2187.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2188.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2189.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2190.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2191.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2192.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2193.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2194.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2195.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2196.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2197.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2198.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2199.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2200.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2201.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2202.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2203.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2204.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2205.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2206.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2207.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2208.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2209.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2210.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2211.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2212.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2213.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2214.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2215.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2216.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2217.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2218.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2219.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2220.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2221.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2222.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2223.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2224.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2225.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2226.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2227.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2228.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2229.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2230.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2231.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2232.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2233.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2234.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2235.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2236.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2237.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2238.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2239.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2240.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2241.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2242.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2243.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2244.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2245.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2246.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2247.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2248.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2249.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2250.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2251.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2252.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2253.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2254.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2255.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2256.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2257.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2258.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2259.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2260.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2261.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2262.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2263.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2264.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2265.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2266.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2267.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2268.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2269.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2270.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2271.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2272.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2273.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2274.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2275.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2276.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2277.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2278.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2279.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2280.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2281.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2282.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2283.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2284.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2285.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2286.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2287.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2288.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2289.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2290.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2291.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2292.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2293.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2294.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2295.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2296.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2297.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2298.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2299.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP1-2.6.simyr2101-2300.c20200320/mksrf_landuse_SSP1RCP26x_clm5_2300.c200320.nc
+
+
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2101.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2102.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2103.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2104.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2105.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2106.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2107.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2108.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2109.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2110.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2111.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2112.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2113.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2114.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2115.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2116.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2117.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2118.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2119.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2120.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2121.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2122.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2123.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2124.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2125.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2126.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2127.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2128.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2129.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2130.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2131.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2132.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2133.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2134.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2135.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2136.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2137.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2138.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2139.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2140.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2141.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2142.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2143.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2144.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2145.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2146.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2147.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2148.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2149.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2150.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2151.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2152.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2153.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2154.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2155.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2156.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2157.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2158.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2159.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2160.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2161.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2162.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2163.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2164.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2165.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2166.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2167.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2168.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2169.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2170.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2171.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2172.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2173.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2174.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2175.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2176.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2177.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2178.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2179.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2180.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2181.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2182.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2183.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2184.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2185.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2186.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2187.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2188.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2189.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2190.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2191.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2192.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2193.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2194.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2195.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2196.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2197.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2198.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2199.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2200.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2201.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2202.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2203.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2204.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2205.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2206.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2207.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2208.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2209.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2210.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2211.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2212.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2213.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2214.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2215.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2216.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2217.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2218.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2219.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2220.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2221.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2222.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2223.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2224.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2225.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2226.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2227.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2228.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2229.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2230.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2231.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2232.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2233.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2234.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2235.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2236.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2237.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2238.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2239.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2240.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2241.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2242.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2243.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2244.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2245.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2246.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2247.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2248.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2249.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2250.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2251.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2252.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2253.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2254.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2255.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2256.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2257.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2258.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2259.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2260.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2261.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2262.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2263.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2264.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2265.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2266.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2267.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2268.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2269.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2270.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2271.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2272.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2273.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2274.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2275.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2276.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2277.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2278.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2279.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2280.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2281.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2282.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2283.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2284.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2285.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2286.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2287.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2288.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2289.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2290.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2291.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2292.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2293.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2294.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2295.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2296.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2297.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2298.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2299.c200320.nc
+
+
+lnd/clm2/rawdata/pftcftdynharv.0.25x0.25.SSP5-3.4.simyr2101-2300.c20200320/mksrf_landuse_SSP5RCP34x_clm5_2300.c200320.nc
+
+
+
atm/waccm/lb/LBC_17500116-20150116_CMIP6_0p5degLat_c180905.nc
diff --git a/bld/namelist_files/namelist_definition_clm4_5.xml b/bld/namelist_files/namelist_definition_clm4_5.xml
index 92508c7d06..68167a2165 100644
--- a/bld/namelist_files/namelist_definition_clm4_5.xml
+++ b/bld/namelist_files/namelist_definition_clm4_5.xml
@@ -1887,7 +1887,7 @@ If 1, turn on the MEGAN model for BVOC's (Biogenic Volitile Organic Compounds)
+"PtVg,1000,850,1100,1350,1600,1850,1855,1865,1875,1885,1895,1905,1915,1925,1935,1945,1955,1965,1975,1980,1985,1995,2000,2005,2010,2015,2025,2035,2045,2055,2065,2075,2085,2095,2100,2105">
Year to simulate and to provide datasets for (such as surface datasets, initial conditions, aerosol-deposition, Nitrogen deposition rates etc.)
A sim_year of 1000 corresponds to data used for testing only, NOT corresponding to any real datasets.
A sim_year greater than 2015 corresponds to ssp_rcp scenario data
@@ -1898,7 +1898,7 @@ CLM datasets exist for years: 1000 (for testing), 1850, and 2000
+"constant,1000-1002,1000-1004,850-1850,1850-1855,1850-2000,1850-2005,1850-2100,1980-2015,2000-2100,2100-2300">
Range of years to simulate transitory datasets for (such as dynamic: land-use datasets, aerosol-deposition, Nitrogen deposition rates etc.)
Constant means simulation will be held at a constant year given in sim_year.
A sim_year_range of 1000-1002 or 1000-1004 corresponds to data used for testing only, NOT corresponding to any real datasets.
diff --git a/bld/namelist_files/use_cases/2100-2300_SSP5-8.5_transient.xml b/bld/namelist_files/use_cases/2100-2300_SSP5-8.5_transient.xml
new file mode 100644
index 0000000000..47702026bc
--- /dev/null
+++ b/bld/namelist_files/use_cases/2100-2300_SSP5-8.5_transient.xml
@@ -0,0 +1,17 @@
+
+
+
+
+Simulate transient land-use, and aerosol deposition changes from 2100 to 2300 with the CMIP6 SSP5-8.5 scenario
+Simulate transient land-use, aerosol deposition, and Nitrogen deposition changes from 2100 to 2300 with the CMIP6 SSP5-8.5 scenario
+
+
+
+2100
+
+2100-2300
+
+SSP5-8.5
+
+
diff --git a/bld/unit_testers/build-namelist_test.pl b/bld/unit_testers/build-namelist_test.pl
index 63407442f6..962f8a2931 100755
--- a/bld/unit_testers/build-namelist_test.pl
+++ b/bld/unit_testers/build-namelist_test.pl
@@ -123,7 +123,7 @@ sub make_env_run {
#
# Figure out number of tests that will run
#
-my $ntests = 838;
+my $ntests = 841;
if ( defined($opts{'compare'}) ) {
$ntests += 504;
}
@@ -1032,6 +1032,11 @@ sub make_env_run {
GLC_TWO_WAY_COUPLING=>"FALSE",
conopts=>"-phys clm5_0",
},
+ "missing_ndep_file" =>{ options=>"-envxml_dir . -bgc bgc -ssp_rcp SSP5-3.4",
+ namelst=>"",
+ GLC_TWO_WAY_COUPLING=>"FALSE",
+ conopts=>"-phys clm5_0",
+ },
"bad_megan_spec" =>{ options=>"-envxml_dir . -bgc bgc -megan",
namelst=>"megan_specifier='ZZTOP=zztop'",
GLC_TWO_WAY_COUPLING=>"FALSE",
@@ -1281,6 +1286,30 @@ sub make_env_run {
&cleanup();
}
}
+# Extensions at one degree with crop on
+$mode = "-phys clm5_0";
+system( "../configure -s $mode" );
+@glc_res = ( "0.9x1.25" );
+my @use_cases = ( "2100-2300_SSP5-8.5_transient",
+ );
+foreach my $res ( @glc_res ) {
+ foreach my $usecase ( @usecases ) {
+ $options = "-bgc bgc -res $res -bgc bgc -crop -use_case $usecase -envxml_dir . ";
+ &make_env_run();
+ eval{ system( "$bldnml $options > $tempfile 2>&1 " ); };
+ is( $@, '', "$options" );
+ $cfiles->checkfilesexist( "$options", $mode );
+ $cfiles->shownmldiff( "default", "standard" );
+ if ( defined($opts{'compare'}) ) {
+ $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode );
+ $cfiles->comparefiles( "$options", $mode, $opts{'compare'} );
+ }
+ if ( defined($opts{'generate'}) ) {
+ $cfiles->copyfiles( "$options", $mode );
+ }
+ &cleanup();
+ }
+}
# Transient 20th Century simulations
$mode = "-phys clm5_0";
system( "../configure -s $mode" );
diff --git a/cime_config/testdefs/ExpectedTestFails.xml b/cime_config/testdefs/ExpectedTestFails.xml
index 9f41cc2e52..63854f7888 100644
--- a/cime_config/testdefs/ExpectedTestFails.xml
+++ b/cime_config/testdefs/ExpectedTestFails.xml
@@ -6,8 +6,6 @@
FAIL ERS_Lm20_Mmpi-serial.1x1_smallvilleIA.I2000Clm50BgcCropQianGs.cheyenne_intel.clm-monthly RUN
FAIL SMS.f10_f10_musgs.I2000Clm50BgcCrop.hobart_pgi.clm-crop RUN
FAIL SMS_D.f10_f10_musgs.I2000Clm50BgcCrop.hobart_pgi.clm-crop RUN
- FAIL SMS.f10_f10_musgs.I2000Clm50BgcCrop.izumi_pgi.clm-crop RUN
- FAIL SMS_D.f10_f10_musgs.I2000Clm50BgcCrop.izumi_pgi.clm-crop RUN
FAIL PEPEM_Ld1.f10_f10_musgs.I2000Clm50BgcCrop.hobart_intel.clm-crop RUN
diff --git a/doc/ChangeSum b/doc/ChangeSum
index b377f166a2..66533bcdf3 100644
--- a/doc/ChangeSum
+++ b/doc/ChangeSum
@@ -1,5 +1,6 @@
Tag Who Date Summary
============================================================================================================================
+release-clm5.0.31 erik 03/29/2020 Bring in raw datasets for 2100-2300 extension for SSP5-8.5/3.5 and SSP1-2.6, some other misc. changes
release-clm5.0.30 erik 01/21/2020 Update FATES to sci.1.30.0_api.8.0.0
release-clm5.0.29 erik 11/19/2019 Some answer changes needed for prescribed soil-moisture and clm4_5 defaults (1850-ndep, and urbantv settings)
release-clm5.0.28 erik 11/14/2019 Several bit-for-bit fixes especially around soil-moisture streams
diff --git a/doc/release-clm5.0.ChangeLog b/doc/release-clm5.0.ChangeLog
index 4d43ab1115..52065c7dc9 100644
--- a/doc/release-clm5.0.ChangeLog
+++ b/doc/release-clm5.0.ChangeLog
@@ -1,4 +1,97 @@
===============================================================
+Tag name: release-clm5.0.31
+Originator(s): erik (Erik Kluzek)
+Date: Sun Mar 29 15:09:19 MDT 2020
+One-line Summary: Bring in raw datasets for 2100-2300 extension for SSP5-8.5/3.5 and SSP1-2.6, some other misc. changes
+
+Purpose of this version:
+------------------------
+
+New Raw datasets to 2300 for SSP1-2.6, SSP5-3.4 and SSP5-8.5.
+Fix the pgi build on izumi. Bring in anomaly forcing script to create af forcing that can be used by datm
+to run anomoly forcing to get SSP like forcing. Update manage_externals that fixes the python 3.8 bug.
+
+Update cime and cism-wrapper.
+
+
+CTSM Master Tag This Corresponds To: ctsm1.0.dev025 (with many other changes)
+
+Summary of changes:
+-------------------
+
+Issues fixed (include CTSM Issue #): #921 #922 #933 #946
+
+ Fixes #921 -- PGI build
+ Sets up the script to use for #922
+ Fixes #933 -- Notes about creating SSP landuse files
+ Fixes #946 -- Better error message for missing ndep files
+
+Science changes since: release-clm5.0.30
+ Raw datasets for the 2100-2300 extenstion for SSP1-2.6, SSP5-3.4 and SSP5-8.5
+
+Software changes since: release-clm5.0.30
+ Fix pgi build on izumi
+ Update manage_externals
+
+Changes to User Interface since:
+ Add ssp_anomaly_forcing script to contrib
+ Improve error message when a ndep file can't be found (tell user what to do, allow -ignore_warnings to override it)
+
+Testing:
+--------
+
+ [PASS means all tests PASS and OK means tests PASS other than expected fails.]
+
+ build-namelist tests:
+
+ cheyenne - PASS
+
+ unit-tests (components/clm/src):
+
+ cheyenne - PASS
+
+ tools-tests (components/clm/test/tools):
+
+ cheyenne - OK
+
+ PTCLM testing (components/clm/tools/shared/PTCLM/test): None
+
+ regular tests (aux_clm):
+
+ cheyenne_intel ---- OK
+ cheyenne_gnu ------ OK
+ izumi_nag --------- OK
+ izumi_pgi --------- OK
+ izumi_intel ------- OK
+
+Summary of Answer changes:
+-------------------------
+
+If the tag used for baseline comparisons was NOT the previous tag, note that here: previous
+
+Changes answers relative to baseline: No bit-for-bit
+
+Detailed list of changes:
+------------------------
+
+Externals being used: update cism and cime
+
+ cism: cism-release-cesm2.1.2_04
+ rtm: release-cesm2.0.04
+ mosart: release-cesm2.0.04
+ cime: cim5.6.32
+ FATES: sci.1.30.0_api.8.0.0
+ PTCLM: PTCLM2_20200121
+
+CTSM Tag versions pulled over from master development branch: None
+
+Pull Requests that document the changes (include PR ids): #949
+(https://github.com/ESCOMP/ctsm/pull)
+
+ #949 -- surface dataset creation for 2100-2300 SSP extensions (SSP1-2.6, SSP5-3.4, SSP5-8.5
+
+===============================================================
+===============================================================
Tag name: release-clm5.0.30
Originator(s): erik (Erik Kluzek,UCAR/TSS,303-497-1326)
Date: Tue Jan 21 13:50:48 MST 2020
diff --git a/manage_externals/.travis.yml b/manage_externals/.travis.yml
index b32f81bd28..1990cb9604 100644
--- a/manage_externals/.travis.yml
+++ b/manage_externals/.travis.yml
@@ -1,7 +1,3 @@
-# NOTE(bja, 2017-11) travis-ci dosen't support python language builds
-# on mac os. As a work around, we use built-in python on linux, and
-# declare osx a 'generic' language, and create our own python env.
-
language: python
os: linux
python:
@@ -9,17 +5,8 @@ python:
- "3.4"
- "3.5"
- "3.6"
-matrix:
- include:
- - os: osx
- language: generic
- before_install:
- # NOTE(bja, 2017-11) update is slow, 2.7.12 installed by default, good enough!
- # - brew update
- # - brew outdated python2 || brew upgrade python2
- - pip install virtualenv
- - virtualenv env -p python2
- - source env/bin/activate
+ - "3.7"
+ - "3.8"
install:
- pip install -r test/requirements.txt
before_script:
diff --git a/manage_externals/README.md b/manage_externals/README.md
index 15e45ffb71..c931c8e213 100644
--- a/manage_externals/README.md
+++ b/manage_externals/README.md
@@ -85,7 +85,7 @@ The root of the source tree will be referred to as `${SRC_ROOT}` below.
description file:
$ cd ${SRC_ROOT}
- $ ./manage_externals/checkout_externals --excernals my-externals.cfg
+ $ ./manage_externals/checkout_externals --externals my-externals.cfg
* Status summary of the repositories managed by checkout_externals:
@@ -202,6 +202,21 @@ The root of the source tree will be referred to as `${SRC_ROOT}` below.
Then the main 'externals' field in the top level repo should point to
'sub-externals.cfg'.
+ * from_submodule (True / False) : used to pull the repo_url, local_path,
+ and hash properties for this external from the .gitmodules file in
+ this repository. Note that the section name (the entry in square
+ brackets) must match the name in the .gitmodules file.
+ If from_submodule is True, the protocol must be git and no repo_url,
+ local_path, hash, branch, or tag entries are allowed.
+ Default: False
+
+ * sparse (string) : used to control a sparse checkout. This optional
+ entry should point to a filename (path relative to local_path) that
+ contains instructions on which repository paths to include (or
+ exclude) from the working tree.
+ See the "SPARSE CHECKOUT" section of https://git-scm.com/docs/git-read-tree
+ Default: sparse checkout is disabled
+
* Lines begining with '#' or ';' are comments and will be ignored.
# Obtaining this tool, reporting issues, etc.
diff --git a/manage_externals/manic/checkout.py b/manage_externals/manic/checkout.py
index c5bbaf5f43..edc5655954 100755
--- a/manage_externals/manic/checkout.py
+++ b/manage_externals/manic/checkout.py
@@ -227,6 +227,21 @@ def commandline_arguments(args=None):
Now, %(prog)s will process Externals.cfg and also process
Externals_LIBX.cfg as if it was a sub-external.
+ * from_submodule (True / False) : used to pull the repo_url, local_path,
+ and hash properties for this external from the .gitmodules file in
+ this repository. Note that the section name (the entry in square
+ brackets) must match the name in the .gitmodules file.
+ If from_submodule is True, the protocol must be git and no repo_url,
+ local_path, hash, branch, or tag entries are allowed.
+ Default: False
+
+ * sparse (string) : used to control a sparse checkout. This optional
+ entry should point to a filename (path relative to local_path) that
+ contains instructions on which repository paths to include (or
+ exclude) from the working tree.
+ See the "SPARSE CHECKOUT" section of https://git-scm.com/docs/git-read-tree
+ Default: sparse checkout is disabled
+
* Lines beginning with '#' or ';' are comments and will be ignored.
# Obtaining this tool, reporting issues, etc.
@@ -280,6 +295,13 @@ def commandline_arguments(args=None):
'used up to two times, increasing the '
'verbosity level each time.')
+ parser.add_argument('--svn-ignore-ancestry', action='store_true', default=False,
+ help='By default, subversion will abort if a component is '
+ 'already checked out and there is no common ancestry with '
+ 'the new URL. This flag passes the "--ignore-ancestry" flag '
+ 'to the svn switch call. (This is not recommended unless '
+ 'you are sure about what you are doing.)')
+
#
# developer options
#
@@ -348,7 +370,7 @@ def main(args):
"No component {} found in {}".format(
comp, args.externals))
- source_tree = SourceTree(root_dir, external)
+ source_tree = SourceTree(root_dir, external, svn_ignore_ancestry=args.svn_ignore_ancestry)
printlog('Checking status of externals: ', end='')
tree_status = source_tree.status()
printlog('')
diff --git a/manage_externals/manic/externals_description.py b/manage_externals/manic/externals_description.py
index b32d37cfc6..b0c4f736a7 100644
--- a/manage_externals/manic/externals_description.py
+++ b/manage_externals/manic/externals_description.py
@@ -22,15 +22,17 @@
import os.path
import re
-# ConfigParser was renamed in python2 to configparser. In python2,
-# ConfigParser returns byte strings, str, instead of unicode. We need
-# unicode to be compatible with xml and json parser and python3.
+# ConfigParser in python2 was renamed to configparser in python3.
+# In python2, ConfigParser returns byte strings, str, instead of unicode.
+# We need unicode to be compatible with xml and json parser and python3.
try:
# python2
from ConfigParser import SafeConfigParser as config_parser
from ConfigParser import MissingSectionHeaderError
from ConfigParser import NoSectionError, NoOptionError
+ USE_PYTHON2 = True
+
def config_string_cleaner(text):
"""convert strings into unicode
"""
@@ -41,6 +43,8 @@ def config_string_cleaner(text):
from configparser import MissingSectionHeaderError
from configparser import NoSectionError, NoOptionError
+ USE_PYTHON2 = False
+
def config_string_cleaner(text):
"""Python3 already uses unicode strings, so just return the string
without modification.
@@ -49,6 +53,7 @@ def config_string_cleaner(text):
return text
from .utils import printlog, fatal_error, str_to_bool, expand_local_url
+from .utils import execute_subprocess
from .global_constants import EMPTY_STR, PPRINTER, VERSION_SEPERATOR
#
@@ -59,8 +64,8 @@ def config_string_cleaner(text):
def read_externals_description_file(root_dir, file_name):
- """Given a file name containing a externals description, determine the
- format and read it into it's internal representation.
+ """Read a file containing an externals description and
+ create its internal representation.
"""
root_dir = os.path.abspath(root_dir)
@@ -70,29 +75,193 @@ def read_externals_description_file(root_dir, file_name):
file_path = os.path.join(root_dir, file_name)
if not os.path.exists(file_name):
- msg = ('ERROR: Model description file, "{0}", does not '
- 'exist at path:\n {1}\nDid you run from the root of '
- 'the source tree?'.format(file_name, file_path))
+ if file_name.lower() == "none":
+ msg = ('INTERNAL ERROR: Attempt to read externals file '
+ 'from {0} when not configured'.format(file_path))
+ else:
+ msg = ('ERROR: Model description file, "{0}", does not '
+ 'exist at path:\n {1}\nDid you run from the root of '
+ 'the source tree?'.format(file_name, file_path))
+
fatal_error(msg)
+ externals_description = None
+ if file_name == ExternalsDescription.GIT_SUBMODULES_FILENAME:
+ externals_description = read_gitmodules_file(root_dir, file_name)
+ else:
+ try:
+ config = config_parser()
+ config.read(file_path)
+ externals_description = config
+ except MissingSectionHeaderError:
+ # not a cfg file
+ pass
+
+ if externals_description is None:
+ msg = 'Unknown file format!'
+ fatal_error(msg)
+
+ return externals_description
+
+class LstripReader(object):
+ "LstripReader formats .gitmodules files to be acceptable for configparser"
+ def __init__(self, filename):
+ with open(filename, 'r') as infile:
+ lines = infile.readlines()
+ self._lines = list()
+ self._num_lines = len(lines)
+ self._index = 0
+ for line in lines:
+ self._lines.append(line.lstrip())
+
+ def readlines(self):
+ """Return all the lines from this object's file"""
+ return self._lines
+
+ def readline(self, size=-1):
+ """Format and return the next line or raise StopIteration"""
+ try:
+ line = self.next()
+ except StopIteration:
+ line = ''
+
+ if (size > 0) and (len(line) < size):
+ return line[0:size]
+
+ return line
+
+ def __iter__(self):
+ """Begin an iteration"""
+ self._index = 0
+ return self
+
+ def next(self):
+ """Return the next line or raise StopIteration"""
+ if self._index >= self._num_lines:
+ raise StopIteration
+
+ self._index = self._index + 1
+ return self._lines[self._index - 1]
+
+ def __next__(self):
+ return self.next()
+
+def git_submodule_status(repo_dir):
+ """Run the git submodule status command to obtain submodule hashes.
+ """
+ # This function is here instead of GitRepository to avoid a dependency loop
+ cwd = os.getcwd()
+ os.chdir(repo_dir)
+ cmd = ['git', 'submodule', 'status']
+ git_output = execute_subprocess(cmd, output_to_caller=True)
+ submodules = {}
+ submods = git_output.split('\n')
+ for submod in submods:
+ if submod:
+ status = submod[0]
+ items = submod[1:].split(' ')
+ if len(items) > 2:
+ tag = items[2]
+ else:
+ tag = None
+
+ submodules[items[1]] = {'hash':items[0], 'status':status, 'tag':tag}
+
+ os.chdir(cwd)
+ return submodules
+
+def parse_submodules_desc_section(section_items, file_path):
+ """Find the path and url for this submodule description"""
+ path = None
+ url = None
+ for item in section_items:
+ name = item[0].strip().lower()
+ if name == 'path':
+ path = item[1].strip()
+ elif name == 'url':
+ url = item[1].strip()
+ else:
+ msg = 'WARNING: Ignoring unknown {} property, in {}'
+ msg = msg.format(item[0], file_path) # fool pylint
+ logging.warning(msg)
+
+ return path, url
+
+def read_gitmodules_file(root_dir, file_name):
+ # pylint: disable=deprecated-method
+ # Disabling this check because the method is only used for python2
+ """Read a .gitmodules file and convert it to be compatible with an
+ externals description.
+ """
+ root_dir = os.path.abspath(root_dir)
+ msg = 'In directory : {0}'.format(root_dir)
+ logging.info(msg)
+ printlog('Processing submodules description file : {0}'.format(file_name))
+
+ file_path = os.path.join(root_dir, file_name)
+ if not os.path.exists(file_name):
+ msg = ('ERROR: submodules description file, "{0}", does not '
+ 'exist at path:\n {1}'.format(file_name, file_path))
+ fatal_error(msg)
+
+ submodules_description = None
externals_description = None
try:
config = config_parser()
- config.read(file_path)
- externals_description = config
+ if USE_PYTHON2:
+ config.readfp(LstripReader(file_path), filename=file_name)
+ else:
+ config.read_file(LstripReader(file_path), source=file_name)
+
+ submodules_description = config
except MissingSectionHeaderError:
# not a cfg file
pass
- if externals_description is None:
+ if submodules_description is None:
msg = 'Unknown file format!'
fatal_error(msg)
+ else:
+ # Convert the submodules description to an externals description
+ externals_description = config_parser()
+ # We need to grab all the commit hashes for this repo
+ submods = git_submodule_status(root_dir)
+ for section in submodules_description.sections():
+ if section[0:9] == 'submodule':
+ sec_name = section[9:].strip(' "')
+ externals_description.add_section(sec_name)
+ section_items = submodules_description.items(section)
+ path, url = parse_submodules_desc_section(section_items,
+ file_path)
+
+ if path is None:
+ msg = 'Submodule {} missing path'.format(sec_name)
+ fatal_error(msg)
- return externals_description
+ if url is None:
+ msg = 'Submodule {} missing url'.format(sec_name)
+ fatal_error(msg)
+ externals_description.set(sec_name,
+ ExternalsDescription.PATH, path)
+ externals_description.set(sec_name,
+ ExternalsDescription.PROTOCOL, 'git')
+ externals_description.set(sec_name,
+ ExternalsDescription.REPO_URL, url)
+ externals_description.set(sec_name,
+ ExternalsDescription.REQUIRED, 'True')
+ git_hash = submods[sec_name]['hash']
+ externals_description.set(sec_name,
+ ExternalsDescription.HASH, git_hash)
+
+ # Required items
+ externals_description.add_section(DESCRIPTION_SECTION)
+ externals_description.set(DESCRIPTION_SECTION, VERSION_ITEM, '1.0.0')
+
+ return externals_description
def create_externals_description(
- model_data, model_format='cfg', components=None):
+ model_data, model_format='cfg', components=None, parent_repo=None):
"""Create the a externals description object from the provided data
"""
externals_description = None
@@ -103,7 +272,7 @@ def create_externals_description(
major, _, _ = get_cfg_schema_version(model_data)
if major == 1:
externals_description = ExternalsDescriptionConfigV1(
- model_data, components=components)
+ model_data, components=components, parent_repo=parent_repo)
else:
msg = ('Externals description file has unsupported schema '
'version "{0}".'.format(major))
@@ -173,18 +342,21 @@ class ExternalsDescription(dict):
# keywords defining the interface into the externals description data
EXTERNALS = 'externals'
BRANCH = 'branch'
- REPO = 'repo'
- REQUIRED = 'required'
- TAG = 'tag'
+ SUBMODULE = 'from_submodule'
+ HASH = 'hash'
+ NAME = 'name'
PATH = 'local_path'
PROTOCOL = 'protocol'
+ REPO = 'repo'
REPO_URL = 'repo_url'
- HASH = 'hash'
- NAME = 'name'
+ REQUIRED = 'required'
+ TAG = 'tag'
+ SPARSE = 'sparse'
PROTOCOL_EXTERNALS_ONLY = 'externals_only'
PROTOCOL_GIT = 'git'
PROTOCOL_SVN = 'svn'
+ GIT_SUBMODULES_FILENAME = '.gitmodules'
KNOWN_PRROTOCOLS = [PROTOCOL_GIT, PROTOCOL_SVN, PROTOCOL_EXTERNALS_ONLY]
# v1 xml keywords
@@ -197,15 +369,17 @@ class ExternalsDescription(dict):
_source_schema = {REQUIRED: True,
PATH: 'string',
EXTERNALS: 'string',
+ SUBMODULE : True,
REPO: {PROTOCOL: 'string',
REPO_URL: 'string',
TAG: 'string',
BRANCH: 'string',
HASH: 'string',
- }
- }
+ SPARSE: 'string',
+ }
+ }
- def __init__(self):
+ def __init__(self, parent_repo=None):
"""Convert the xml into a standardized dict that can be used to
construct the source objects
@@ -218,6 +392,7 @@ def __init__(self):
self._input_major = None
self._input_minor = None
self._input_patch = None
+ self._parent_repo = parent_repo
def _verify_schema_version(self):
"""Use semantic versioning rules to verify we can process this schema.
@@ -265,6 +440,7 @@ def _check_user_input(self):
self._validate()
def _check_data(self):
+ # pylint: disable=too-many-branches,too-many-statements
"""Check user supplied data is valid where possible.
"""
for ext_name in self.keys():
@@ -282,6 +458,13 @@ def _check_data(self):
ext_name))
fatal_error(msg)
+ if ((self[ext_name][self.REPO][self.PROTOCOL] != self.PROTOCOL_GIT)
+ and (self.SUBMODULE in self[ext_name])):
+ msg = ('self.SUBMODULE is only supported with {0} protocol, '
+ '"{1}" is defined as an {2} repository')
+ fatal_error(msg.format(self.PROTOCOL_GIT, ext_name,
+ self[ext_name][self.REPO][self.PROTOCOL]))
+
if (self[ext_name][self.REPO][self.PROTOCOL] !=
self.PROTOCOL_EXTERNALS_ONLY):
ref_count = 0
@@ -301,11 +484,23 @@ def _check_data(self):
found_refs = '"{0} = {1}", {2}'.format(
self.HASH, self[ext_name][self.REPO][self.HASH],
found_refs)
+ if (self.SUBMODULE in self[ext_name] and
+ self[ext_name][self.SUBMODULE]):
+ ref_count += 1
+ found_refs = '"{0} = {1}", {2}'.format(
+ self.SUBMODULE,
+ self[ext_name][self.SUBMODULE], found_refs)
if ref_count > 1:
- msg = ('Model description is over specified! Only one of '
- '"tag", "branch", or "hash" may be specified for '
- 'repo description of "{0}".'.format(ext_name))
+ msg = 'Model description is over specified! '
+ if self.SUBMODULE in self[ext_name]:
+ msg += ('from_submodule is not compatible with '
+ '"tag", "branch", or "hash" ')
+ else:
+ msg += (' Only one of "tag", "branch", or "hash" '
+ 'may be specified ')
+
+ msg += 'for repo description of "{0}".'.format(ext_name)
msg = '{0}\nFound: {1}'.format(msg, found_refs)
fatal_error(msg)
elif ref_count < 1:
@@ -314,17 +509,39 @@ def _check_data(self):
'repo description of "{0}"'.format(ext_name))
fatal_error(msg)
- if self.REPO_URL not in self[ext_name][self.REPO]:
+ if (self.REPO_URL not in self[ext_name][self.REPO] and
+ (self.SUBMODULE not in self[ext_name] or
+ not self[ext_name][self.SUBMODULE])):
msg = ('Model description is under specified! Must have '
'"repo_url" in repo '
'description for "{0}"'.format(ext_name))
fatal_error(msg)
- url = expand_local_url(
- self[ext_name][self.REPO][self.REPO_URL], ext_name)
- self[ext_name][self.REPO][self.REPO_URL] = url
+ if (self.SUBMODULE in self[ext_name] and
+ self[ext_name][self.SUBMODULE]):
+ if self.REPO_URL in self[ext_name][self.REPO]:
+ msg = ('Model description is over specified! '
+ 'from_submodule keyword is not compatible '
+ 'with {0} keyword for'.format(self.REPO_URL))
+ msg = '{0} repo description of "{1}"'.format(msg,
+ ext_name)
+ fatal_error(msg)
+
+ if self.PATH in self[ext_name]:
+ msg = ('Model description is over specified! '
+ 'from_submodule keyword is not compatible with '
+ '{0} keyword for'.format(self.PATH))
+ msg = '{0} repo description of "{1}"'.format(msg,
+ ext_name)
+ fatal_error(msg)
+
+ if self.REPO_URL in self[ext_name][self.REPO]:
+ url = expand_local_url(
+ self[ext_name][self.REPO][self.REPO_URL], ext_name)
+ self[ext_name][self.REPO][self.REPO_URL] = url
def _check_optional(self):
+ # pylint: disable=too-many-branches
"""Some fields like externals, repo:tag repo:branch are
(conditionally) optional. We don't want the user to be
required to enter them in every externals description file, but
@@ -332,6 +549,7 @@ def _check_optional(self):
default values if appropriate.
"""
+ submod_desc = None # Only load submodules info once
for field in self:
# truely optional
if self.EXTERNALS not in self[field]:
@@ -346,6 +564,72 @@ def _check_optional(self):
self[field][self.REPO][self.HASH] = EMPTY_STR
if self.REPO_URL not in self[field][self.REPO]:
self[field][self.REPO][self.REPO_URL] = EMPTY_STR
+ if self.SPARSE not in self[field][self.REPO]:
+ self[field][self.REPO][self.SPARSE] = EMPTY_STR
+
+ # from_submodule has a complex relationship with other fields
+ if self.SUBMODULE in self[field]:
+ # User wants to use submodule information, is it available?
+ if self._parent_repo is None:
+ # No parent == no submodule information
+ PPRINTER.pprint(self[field])
+ msg = 'No parent submodule for "{0}"'.format(field)
+ fatal_error(msg)
+ elif self._parent_repo.protocol() != self.PROTOCOL_GIT:
+ PPRINTER.pprint(self[field])
+ msg = 'Parent protocol, "{0}", does not support submodules'
+ fatal_error(msg.format(self._parent_repo.protocol()))
+ else:
+ args = self._repo_config_from_submodule(field, submod_desc)
+ repo_url, repo_path, ref_hash, submod_desc = args
+
+ if repo_url is None:
+ msg = ('Cannot checkout "{0}" as a submodule, '
+ 'repo not found in {1} file')
+ fatal_error(msg.format(field,
+ self.GIT_SUBMODULES_FILENAME))
+ # Fill in submodule fields
+ self[field][self.REPO][self.REPO_URL] = repo_url
+ self[field][self.REPO][self.HASH] = ref_hash
+ self[field][self.PATH] = repo_path
+
+ if self[field][self.SUBMODULE]:
+ # We should get everything from the parent submodule
+ # configuration.
+ pass
+ # No else (from _submodule = False is the default)
+ else:
+ # Add the default value (not using submodule information)
+ self[field][self.SUBMODULE] = False
+
+ def _repo_config_from_submodule(self, field, submod_desc):
+ """Find the external config information for a repository from
+ its submodule configuration information.
+ """
+ if submod_desc is None:
+ repo_path = os.getcwd() # Is this always correct?
+ submod_file = self._parent_repo.submodules_file(repo_path=repo_path)
+ if submod_file is None:
+ msg = ('Cannot checkout "{0}" from submodule information\n'
+ ' Parent repo, "{1}" does not have submodules')
+ fatal_error(msg.format(field, self._parent_repo.name()))
+
+ submod_file = read_gitmodules_file(repo_path, submod_file)
+ submod_desc = create_externals_description(submod_file)
+
+ # Can we find our external?
+ repo_url = None
+ repo_path = None
+ ref_hash = None
+ for ext_field in submod_desc:
+ if field == ext_field:
+ ext = submod_desc[ext_field]
+ repo_url = ext[self.REPO][self.REPO_URL]
+ repo_path = ext[self.PATH]
+ ref_hash = ext[self.REPO][self.HASH]
+ break
+
+ return repo_url, repo_path, ref_hash, submod_desc
def _validate(self):
"""Validate that the parsed externals description contains all necessary
@@ -383,11 +667,12 @@ def validate_data_struct(schema, data):
if isinstance(schema, dict) and isinstance(data, dict):
# Both are dicts, recursively verify that all fields
# in schema are present in the data.
- for k in schema:
- in_ref = in_ref and (k in data)
+ for key in schema:
+ in_ref = in_ref and (key in data)
if in_ref:
valid = valid and (
- validate_data_struct(schema[k], data[k]))
+ validate_data_struct(schema[key], data[key]))
+
is_valid = in_ref and valid
else:
# non-recursive structure. verify data and schema have
@@ -434,9 +719,9 @@ def __init__(self, model_data, components=None):
self._input_patch = 0
self._verify_schema_version()
if components:
- for k in model_data.items():
- if k not in components:
- del model_data[k]
+ for key in model_data.items():
+ if key not in components:
+ del model_data[key]
self.update(model_data)
self._check_user_input()
@@ -448,12 +733,12 @@ class ExternalsDescriptionConfigV1(ExternalsDescription):
"""
- def __init__(self, model_data, components=None):
+ def __init__(self, model_data, components=None, parent_repo=None):
"""Convert the config data into a standardized dict that can be used to
construct the source objects
"""
- ExternalsDescription.__init__(self)
+ ExternalsDescription.__init__(self, parent_repo=parent_repo)
self._schema_major = 1
self._schema_minor = 1
self._schema_patch = 0
diff --git a/manage_externals/manic/repository.py b/manage_externals/manic/repository.py
index d01849d37a..ea4230fb7b 100644
--- a/manage_externals/manic/repository.py
+++ b/manage_externals/manic/repository.py
@@ -21,6 +21,7 @@ def __init__(self, component_name, repo):
self._branch = repo[ExternalsDescription.BRANCH]
self._hash = repo[ExternalsDescription.HASH]
self._url = repo[ExternalsDescription.REPO_URL]
+ self._sparse = repo[ExternalsDescription.SPARSE]
if self._url is EMPTY_STR:
fatal_error('repo must have a URL')
@@ -40,12 +41,14 @@ def __init__(self, component_name, repo):
fatal_error('repo {0} must have exactly one of '
'tag, branch or hash.'.format(self._name))
- def checkout(self, base_dir_path, repo_dir_name, verbosity): # pylint: disable=unused-argument
+ def checkout(self, base_dir_path, repo_dir_name, verbosity, recursive): # pylint: disable=unused-argument
"""
If the repo destination directory exists, ensure it is correct (from
correct URL, correct branch or tag), and possibly update the source.
If the repo destination directory does not exist, checkout the correce
branch or tag.
+ NB: is include as an argument for compatibility with
+ git functionality (repository_git.py)
"""
msg = ('DEV_ERROR: checkout method must be implemented in all '
'repository classes! {0}'.format(self.__class__.__name__))
@@ -59,6 +62,11 @@ def status(self, stat, repo_dir_path): # pylint: disable=unused-argument
'repository classes! {0}'.format(self.__class__.__name__))
fatal_error(msg)
+ def submodules_file(self, repo_path=None):
+ # pylint: disable=no-self-use,unused-argument
+ """Stub for use by non-git VC systems"""
+ return None
+
def url(self):
"""Public access of repo url.
"""
@@ -78,3 +86,13 @@ def hash(self):
"""Public access of repo hash.
"""
return self._hash
+
+ def name(self):
+ """Public access of repo name.
+ """
+ return self._name
+
+ def protocol(self):
+ """Public access of repo protocol.
+ """
+ return self._protocol
diff --git a/manage_externals/manic/repository_factory.py b/manage_externals/manic/repository_factory.py
index c95e7a509b..80a92a9d8a 100644
--- a/manage_externals/manic/repository_factory.py
+++ b/manage_externals/manic/repository_factory.py
@@ -11,7 +11,7 @@
from .utils import fatal_error
-def create_repository(component_name, repo_info):
+def create_repository(component_name, repo_info, svn_ignore_ancestry=False):
"""Determine what type of repository we have, i.e. git or svn, and
create the appropriate object.
@@ -20,7 +20,7 @@ def create_repository(component_name, repo_info):
if protocol == 'git':
repo = GitRepository(component_name, repo_info)
elif protocol == 'svn':
- repo = SvnRepository(component_name, repo_info)
+ repo = SvnRepository(component_name, repo_info, ignore_ancestry=svn_ignore_ancestry)
elif protocol == 'externals_only':
repo = None
else:
diff --git a/manage_externals/manic/repository_git.py b/manage_externals/manic/repository_git.py
index efb775d0bc..f986051001 100644
--- a/manage_externals/manic/repository_git.py
+++ b/manage_externals/manic/repository_git.py
@@ -12,6 +12,7 @@
from .global_constants import VERBOSITY_VERBOSE
from .repository import Repository
from .externals_status import ExternalStatus
+from .externals_description import ExternalsDescription, git_submodule_status
from .utils import expand_local_url, split_remote_url, is_remote_url
from .utils import fatal_error, printlog
from .utils import execute_subprocess
@@ -41,17 +42,19 @@ def __init__(self, component_name, repo):
Parse repo (a XML element).
"""
Repository.__init__(self, component_name, repo)
+ self._gitmodules = None
+ self._submods = None
# ----------------------------------------------------------------
#
# Public API, defined by Repository
#
# ----------------------------------------------------------------
- def checkout(self, base_dir_path, repo_dir_name, verbosity):
+ def checkout(self, base_dir_path, repo_dir_name, verbosity, recursive):
"""
If the repo destination directory exists, ensure it is correct (from
correct URL, correct branch or tag), and possibly update the source.
- If the repo destination directory does not exist, checkout the correce
+ If the repo destination directory does not exist, checkout the correct
branch or tag.
"""
repo_dir_path = os.path.join(base_dir_path, repo_dir_name)
@@ -59,7 +62,15 @@ def checkout(self, base_dir_path, repo_dir_name, verbosity):
if (repo_dir_exists and not os.listdir(
repo_dir_path)) or not repo_dir_exists:
self._clone_repo(base_dir_path, repo_dir_name, verbosity)
- self._checkout_ref(repo_dir_path, verbosity)
+ self._checkout_ref(repo_dir_path, verbosity, recursive)
+ gmpath = os.path.join(repo_dir_path,
+ ExternalsDescription.GIT_SUBMODULES_FILENAME)
+ if os.path.exists(gmpath):
+ self._gitmodules = gmpath
+ self._submods = git_submodule_status(repo_dir_path)
+ else:
+ self._gitmodules = None
+ self._submods = None
def status(self, stat, repo_dir_path):
"""
@@ -72,6 +83,16 @@ def status(self, stat, repo_dir_path):
if os.path.exists(repo_dir_path):
self._status_summary(stat, repo_dir_path)
+ def submodules_file(self, repo_path=None):
+ if repo_path is not None:
+ gmpath = os.path.join(repo_path,
+ ExternalsDescription.GIT_SUBMODULES_FILENAME)
+ if os.path.exists(gmpath):
+ self._gitmodules = gmpath
+ self._submods = git_submodule_status(repo_path)
+
+ return self._gitmodules
+
# ----------------------------------------------------------------
#
# Internal work functions
@@ -282,23 +303,30 @@ def _create_remote_name(self):
remote_name = "{0}_{1}".format(base_name, repo_name)
return remote_name
- def _checkout_ref(self, repo_dir, verbosity):
+ def _checkout_ref(self, repo_dir, verbosity, submodules):
"""Checkout the user supplied reference
+ if is True, recursively initialize and update
+ the repo's submodules
"""
# import pdb; pdb.set_trace()
cwd = os.getcwd()
os.chdir(repo_dir)
if self._url.strip() == LOCAL_PATH_INDICATOR:
- self._checkout_local_ref(verbosity)
+ self._checkout_local_ref(verbosity, submodules)
else:
- self._checkout_external_ref(verbosity)
+ self._checkout_external_ref(verbosity, submodules)
+
+ if self._sparse:
+ self._sparse_checkout(repo_dir, verbosity)
os.chdir(cwd)
- def _checkout_local_ref(self, verbosity):
+
+ def _checkout_local_ref(self, verbosity, submodules):
"""Checkout the reference considering the local repo only. Do not
fetch any additional remotes or specify the remote when
checkout out the ref.
-
+ if is True, recursively initialize and update
+ the repo's submodules
"""
if self._tag:
ref = self._tag
@@ -308,10 +336,12 @@ def _checkout_local_ref(self, verbosity):
ref = self._hash
self._check_for_valid_ref(ref)
- self._git_checkout_ref(ref, verbosity)
+ self._git_checkout_ref(ref, verbosity, submodules)
- def _checkout_external_ref(self, verbosity):
+ def _checkout_external_ref(self, verbosity, submodules):
"""Checkout the reference from a remote repository
+ if is True, recursively initialize and update
+ the repo's submodules
"""
if self._tag:
ref = self._tag
@@ -326,14 +356,28 @@ def _checkout_external_ref(self, verbosity):
self._git_remote_add(remote_name, self._url)
self._git_fetch(remote_name)
- # NOTE(bja, 2018-03) we need to send seperate ref and remote
+ # NOTE(bja, 2018-03) we need to send separate ref and remote
# name to check_for_vaild_ref, but the combined name to
# checkout_ref!
self._check_for_valid_ref(ref, remote_name)
if self._branch:
ref = '{0}/{1}'.format(remote_name, ref)
- self._git_checkout_ref(ref, verbosity)
+ self._git_checkout_ref(ref, verbosity, submodules)
+
+ def _sparse_checkout(self, repo_dir, verbosity):
+ """Use git read-tree to thin the working tree."""
+ cwd = os.getcwd()
+
+ cmd = ['cp', self._sparse, os.path.join(repo_dir,
+ '.git/info/sparse-checkout')]
+ if verbosity >= VERBOSITY_VERBOSE:
+ printlog(' {0}'.format(' '.join(cmd)))
+ execute_subprocess(cmd)
+ os.chdir(repo_dir)
+ self._git_sparse_checkout(verbosity)
+
+ os.chdir(cwd)
def _check_for_valid_ref(self, ref, remote_name=None):
"""Try some basic sanity checks on the user supplied reference so we
@@ -687,6 +731,19 @@ def _git_remote_verbose():
git_output = execute_subprocess(cmd, output_to_caller=True)
return git_output
+ @staticmethod
+ def has_submodules(repo_dir_path=None):
+ """Return True iff the repository at (or the current
+ directory if is None) has a '.gitmodules' file
+ """
+ if repo_dir_path is None:
+ fname = ExternalsDescription.GIT_SUBMODULES_FILENAME
+ else:
+ fname = os.path.join(repo_dir_path,
+ ExternalsDescription.GIT_SUBMODULES_FILENAME)
+
+ return os.path.exists(fname)
+
# ----------------------------------------------------------------
#
# system call to git for sideffects modifying the working tree
@@ -696,28 +753,34 @@ def _git_remote_verbose():
def _git_clone(url, repo_dir_name, verbosity):
"""Run git clone for the side effect of creating a repository.
"""
- cmd = ['git', 'clone', '--quiet', url, repo_dir_name]
+ cmd = ['git', 'clone', '--quiet']
+ subcmd = None
+
+ cmd.extend([url, repo_dir_name])
if verbosity >= VERBOSITY_VERBOSE:
printlog(' {0}'.format(' '.join(cmd)))
execute_subprocess(cmd)
+ if subcmd is not None:
+ os.chdir(repo_dir_name)
+ execute_subprocess(subcmd)
@staticmethod
def _git_remote_add(name, url):
- """Run the git remote command to for the side effect of adding a remote
+ """Run the git remote command for the side effect of adding a remote
"""
cmd = ['git', 'remote', 'add', name, url]
execute_subprocess(cmd)
@staticmethod
def _git_fetch(remote_name):
- """Run the git fetch command to for the side effect of updating the repo
+ """Run the git fetch command for the side effect of updating the repo
"""
cmd = ['git', 'fetch', '--quiet', '--tags', remote_name]
execute_subprocess(cmd)
@staticmethod
- def _git_checkout_ref(ref, verbosity):
- """Run the git checkout command to for the side effect of updating the repo
+ def _git_checkout_ref(ref, verbosity, submodules):
+ """Run the git checkout command for the side effect of updating the repo
Param: ref is a reference to a local or remote object in the
form 'origin/my_feature', or 'tag1'.
@@ -727,3 +790,30 @@ def _git_checkout_ref(ref, verbosity):
if verbosity >= VERBOSITY_VERBOSE:
printlog(' {0}'.format(' '.join(cmd)))
execute_subprocess(cmd)
+ if submodules:
+ GitRepository._git_update_submodules(verbosity)
+
+ @staticmethod
+ def _git_sparse_checkout(verbosity):
+ """Configure repo via read-tree."""
+ cmd = ['git', 'config', 'core.sparsecheckout', 'true']
+ if verbosity >= VERBOSITY_VERBOSE:
+ printlog(' {0}'.format(' '.join(cmd)))
+ execute_subprocess(cmd)
+ cmd = ['git', 'read-tree', '-mu', 'HEAD']
+ if verbosity >= VERBOSITY_VERBOSE:
+ printlog(' {0}'.format(' '.join(cmd)))
+ execute_subprocess(cmd)
+
+ @staticmethod
+ def _git_update_submodules(verbosity):
+ """Run git submodule update for the side effect of updating this
+ repo's submodules.
+ """
+ # First, verify that we have a .gitmodules file
+ if os.path.exists(ExternalsDescription.GIT_SUBMODULES_FILENAME):
+ cmd = ['git', 'submodule', 'update', '--init', '--recursive']
+ if verbosity >= VERBOSITY_VERBOSE:
+ printlog(' {0}'.format(' '.join(cmd)))
+
+ execute_subprocess(cmd)
diff --git a/manage_externals/manic/repository_svn.py b/manage_externals/manic/repository_svn.py
index bef6f81414..408ed84676 100644
--- a/manage_externals/manic/repository_svn.py
+++ b/manage_externals/manic/repository_svn.py
@@ -37,11 +37,12 @@ class SvnRepository(Repository):
"""
RE_URLLINE = re.compile(r'^URL:')
- def __init__(self, component_name, repo):
+ def __init__(self, component_name, repo, ignore_ancestry=False):
"""
Parse repo (a XML element).
"""
Repository.__init__(self, component_name, repo)
+ self._ignore_ancestry = ignore_ancestry
if self._branch:
self._url = os.path.join(self._url, self._branch)
elif self._tag:
@@ -55,7 +56,7 @@ def __init__(self, component_name, repo):
# Public API, defined by Repository
#
# ----------------------------------------------------------------
- def checkout(self, base_dir_path, repo_dir_name, verbosity):
+ def checkout(self, base_dir_path, repo_dir_name, verbosity, recursive): # pylint: disable=unused-argument
"""Checkout or update the working copy
If the repo destination directory exists, switch the sandbox to
@@ -63,13 +64,15 @@ def checkout(self, base_dir_path, repo_dir_name, verbosity):
If the repo destination directory does not exist, checkout the
correct branch or tag.
+ NB: is include as an argument for compatibility with
+ git functionality (repository_git.py)
"""
repo_dir_path = os.path.join(base_dir_path, repo_dir_name)
if os.path.exists(repo_dir_path):
cwd = os.getcwd()
os.chdir(repo_dir_path)
- self._svn_switch(self._url, verbosity)
+ self._svn_switch(self._url, self._ignore_ancestry, verbosity)
# svn switch can lead to a conflict state, but it gives a
# return code of 0. So now we need to make sure that we're
# in a clean (non-conflict) state.
@@ -137,9 +140,7 @@ def _abort_if_dirty(self, repo_dir_path, message):
To recover: Clean up the above directory (resolving conflicts, etc.),
then rerun checkout_externals.
-""".format(cwd=repo_dir_path,
- message=message,
- status=status)
+""".format(cwd=repo_dir_path, message=message, status=status)
fatal_error(errmsg)
@@ -219,9 +220,8 @@ def xml_status_is_dirty(svn_output):
continue
if item == SVN_UNVERSIONED:
continue
- else:
- is_dirty = True
- break
+ is_dirty = True
+ break
return is_dirty
# ----------------------------------------------------------------
@@ -270,11 +270,14 @@ def _svn_checkout(url, repo_dir_path, verbosity):
execute_subprocess(cmd)
@staticmethod
- def _svn_switch(url, verbosity):
+ def _svn_switch(url, ignore_ancestry, verbosity):
"""
Switch branches for in an svn sandbox
"""
- cmd = ['svn', 'switch', '--quiet', url]
+ cmd = ['svn', 'switch', '--quiet']
+ if ignore_ancestry:
+ cmd.append('--ignore-ancestry')
+ cmd.append(url)
if verbosity >= VERBOSITY_VERBOSE:
printlog(' {0}'.format(' '.join(cmd)))
execute_subprocess(cmd)
diff --git a/manage_externals/manic/sourcetree.py b/manage_externals/manic/sourcetree.py
index dff91dc1af..b9c9c21082 100644
--- a/manage_externals/manic/sourcetree.py
+++ b/manage_externals/manic/sourcetree.py
@@ -11,12 +11,12 @@
from .externals_description import read_externals_description_file
from .externals_description import create_externals_description
from .repository_factory import create_repository
+from .repository_git import GitRepository
from .externals_status import ExternalStatus
from .utils import fatal_error, printlog
from .global_constants import EMPTY_STR, LOCAL_PATH_INDICATOR
from .global_constants import VERBOSITY_VERBOSE
-
class _External(object):
"""
_External represents an external object inside a SourceTree
@@ -24,7 +24,7 @@ class _External(object):
# pylint: disable=R0902
- def __init__(self, root_dir, name, ext_description):
+ def __init__(self, root_dir, name, ext_description, svn_ignore_ancestry):
"""Parse an external description file into a dictionary of externals.
Input:
@@ -37,12 +37,15 @@ def __init__(self, root_dir, name, ext_description):
ext_description : dict - source ExternalsDescription object
+ svn_ignore_ancestry : bool - use --ignore-externals with svn switch
+
"""
self._name = name
self._repo = None
self._externals = EMPTY_STR
self._externals_sourcetree = None
self._stat = ExternalStatus()
+ self._sparse = None
# Parse the sub-elements
# _path : local path relative to the containing source tree
@@ -59,13 +62,20 @@ def __init__(self, root_dir, name, ext_description):
self._required = ext_description[ExternalsDescription.REQUIRED]
self._externals = ext_description[ExternalsDescription.EXTERNALS]
- if self._externals:
- self._create_externals_sourcetree()
+ # Treat a .gitmodules file as a backup externals config
+ if not self._externals:
+ if GitRepository.has_submodules(self._repo_dir_path):
+ self._externals = ExternalsDescription.GIT_SUBMODULES_FILENAME
+
repo = create_repository(
- name, ext_description[ExternalsDescription.REPO])
+ name, ext_description[ExternalsDescription.REPO],
+ svn_ignore_ancestry=svn_ignore_ancestry)
if repo:
self._repo = repo
+ if self._externals and (self._externals.lower() != 'none'):
+ self._create_externals_sourcetree()
+
def get_name(self):
"""
Return the external object's name
@@ -122,7 +132,7 @@ def status(self):
if self._externals and self._externals_sourcetree:
# we expect externals and they exist
cwd = os.getcwd()
- # SourceTree expecteds to be called from the correct
+ # SourceTree expects to be called from the correct
# root directory.
os.chdir(self._repo_dir_path)
ext_stats = self._externals_sourcetree.status(self._local_path)
@@ -145,7 +155,7 @@ def checkout(self, verbosity, load_all):
"""
If the repo destination directory exists, ensure it is correct (from
correct URL, correct branch or tag), and possibly update the external.
- If the repo destination directory does not exist, checkout the correce
+ If the repo destination directory does not exist, checkout the correct
branch or tag.
If load_all is True, also load all of the the externals sub-externals.
"""
@@ -180,13 +190,14 @@ def checkout(self, verbosity, load_all):
checkout_verbosity = verbosity - 1
else:
checkout_verbosity = verbosity
- self._repo.checkout(self._base_dir_path,
- self._repo_dir_name, checkout_verbosity)
+
+ self._repo.checkout(self._base_dir_path, self._repo_dir_name,
+ checkout_verbosity, self.clone_recursive())
def checkout_externals(self, verbosity, load_all):
"""Checkout the sub-externals for this object
"""
- if self._externals:
+ if self.load_externals():
if self._externals_sourcetree:
# NOTE(bja, 2018-02): the subtree externals objects
# were created during initial status check. Updating
@@ -198,6 +209,24 @@ def checkout_externals(self, verbosity, load_all):
self._create_externals_sourcetree()
self._externals_sourcetree.checkout(verbosity, load_all)
+ def load_externals(self):
+ 'Return True iff an externals file should be loaded'
+ load_ex = False
+ if os.path.exists(self._repo_dir_path):
+ if self._externals:
+ if self._externals.lower() != 'none':
+ load_ex = os.path.exists(os.path.join(self._repo_dir_path,
+ self._externals))
+
+ return load_ex
+
+ def clone_recursive(self):
+ 'Return True iff any .gitmodules files should be processed'
+ # Try recursive unless there is an externals entry
+ recursive = not self._externals
+
+ return recursive
+
def _create_externals_sourcetree(self):
"""
"""
@@ -210,6 +239,15 @@ def _create_externals_sourcetree(self):
cwd = os.getcwd()
os.chdir(self._repo_dir_path)
+ if self._externals.lower() == 'none':
+ msg = ('Internal: Attempt to create source tree for '
+ 'externals = none in {}'.format(self._repo_dir_path))
+ fatal_error(msg)
+
+ if not os.path.exists(self._externals):
+ if GitRepository.has_submodules():
+ self._externals = ExternalsDescription.GIT_SUBMODULES_FILENAME
+
if not os.path.exists(self._externals):
# NOTE(bja, 2017-10) this check is redundent with the one
# in read_externals_description_file!
@@ -221,17 +259,17 @@ def _create_externals_sourcetree(self):
externals_root = self._repo_dir_path
model_data = read_externals_description_file(externals_root,
self._externals)
- externals = create_externals_description(model_data)
+ externals = create_externals_description(model_data,
+ parent_repo=self._repo)
self._externals_sourcetree = SourceTree(externals_root, externals)
os.chdir(cwd)
-
class SourceTree(object):
"""
SourceTree represents a group of managed externals
"""
- def __init__(self, root_dir, model):
+ def __init__(self, root_dir, model, svn_ignore_ancestry=False):
"""
Build a SourceTree object from a model description
"""
@@ -239,7 +277,7 @@ def __init__(self, root_dir, model):
self._all_components = {}
self._required_compnames = []
for comp in model:
- src = _External(self._root_dir, comp, model[comp])
+ src = _External(self._root_dir, comp, model[comp], svn_ignore_ancestry)
self._all_components[comp] = src
if model[comp][ExternalsDescription.REQUIRED]:
self._required_compnames.append(comp)
@@ -261,18 +299,20 @@ def status(self, relative_path_base=LOCAL_PATH_INDICATOR):
for comp in load_comps:
printlog('{0}, '.format(comp), end='')
stat = self._all_components[comp].status()
+ stat_final = {}
for name in stat.keys():
# check if we need to append the relative_path_base to
# the path so it will be sorted in the correct order.
- if not stat[name].path.startswith(relative_path_base):
- stat[name].path = os.path.join(relative_path_base,
- stat[name].path)
- # store under key = updated path, and delete the
- # old key.
- comp_stat = stat[name]
- del stat[name]
- stat[comp_stat.path] = comp_stat
- summary.update(stat)
+ if stat[name].path.startswith(relative_path_base):
+ # use as is, without any changes to path
+ stat_final[name] = stat[name]
+ else:
+ # append relative_path_base to path and store under key = updated path
+ modified_path = os.path.join(relative_path_base,
+ stat[name].path)
+ stat_final[modified_path] = stat[name]
+ stat_final[modified_path].path = modified_path
+ summary.update(stat_final)
return summary
diff --git a/manage_externals/test/repos/simple-ext.git/objects/14/2711fdbbcb8034d7cad6bae6801887b12fe61d b/manage_externals/test/repos/simple-ext.git/objects/14/2711fdbbcb8034d7cad6bae6801887b12fe61d
new file mode 100644
index 0000000000..acaf7889b4
Binary files /dev/null and b/manage_externals/test/repos/simple-ext.git/objects/14/2711fdbbcb8034d7cad6bae6801887b12fe61d differ
diff --git a/manage_externals/test/repos/simple-ext.git/objects/60/7ec299c17dd285c029edc41a0109e49d441380 b/manage_externals/test/repos/simple-ext.git/objects/60/7ec299c17dd285c029edc41a0109e49d441380
new file mode 100644
index 0000000000..3f6959cc54
Binary files /dev/null and b/manage_externals/test/repos/simple-ext.git/objects/60/7ec299c17dd285c029edc41a0109e49d441380 differ
diff --git a/manage_externals/test/repos/simple-ext.git/objects/b7/692b6d391899680da7b9b6fd8af4c413f06fe7 b/manage_externals/test/repos/simple-ext.git/objects/b7/692b6d391899680da7b9b6fd8af4c413f06fe7
new file mode 100644
index 0000000000..1b3b272442
Binary files /dev/null and b/manage_externals/test/repos/simple-ext.git/objects/b7/692b6d391899680da7b9b6fd8af4c413f06fe7 differ
diff --git a/manage_externals/test/repos/simple-ext.git/objects/d1/163870d19c3dee34fada3a76b785cfa2a8424b b/manage_externals/test/repos/simple-ext.git/objects/d1/163870d19c3dee34fada3a76b785cfa2a8424b
new file mode 100644
index 0000000000..04e760363a
Binary files /dev/null and b/manage_externals/test/repos/simple-ext.git/objects/d1/163870d19c3dee34fada3a76b785cfa2a8424b differ
diff --git a/manage_externals/test/repos/simple-ext.git/objects/d8/ed2f33179d751937f8fde2e33921e4827babf4 b/manage_externals/test/repos/simple-ext.git/objects/d8/ed2f33179d751937f8fde2e33921e4827babf4
new file mode 100644
index 0000000000..f08ae820c9
Binary files /dev/null and b/manage_externals/test/repos/simple-ext.git/objects/d8/ed2f33179d751937f8fde2e33921e4827babf4 differ
diff --git a/manage_externals/test/repos/simple-ext.git/refs/heads/master b/manage_externals/test/repos/simple-ext.git/refs/heads/master
index 5c67504966..adf1ccb002 100644
--- a/manage_externals/test/repos/simple-ext.git/refs/heads/master
+++ b/manage_externals/test/repos/simple-ext.git/refs/heads/master
@@ -1 +1 @@
-9b75494003deca69527bb64bcaa352e801611dd2
+607ec299c17dd285c029edc41a0109e49d441380
diff --git a/manage_externals/test/repos/simple-ext.git/refs/tags/tag2 b/manage_externals/test/repos/simple-ext.git/refs/tags/tag2
new file mode 100644
index 0000000000..4160b6c494
--- /dev/null
+++ b/manage_externals/test/repos/simple-ext.git/refs/tags/tag2
@@ -0,0 +1 @@
+b7692b6d391899680da7b9b6fd8af4c413f06fe7
diff --git a/manage_externals/test/test_sys_checkout.py b/manage_externals/test/test_sys_checkout.py
index 9ebfb0aeee..df726f2b70 100644
--- a/manage_externals/test/test_sys_checkout.py
+++ b/manage_externals/test/test_sys_checkout.py
@@ -42,6 +42,7 @@
from manic.externals_description import ExternalsDescription
from manic.externals_description import DESCRIPTION_SECTION, VERSION_ITEM
+from manic.externals_description import git_submodule_status
from manic.externals_status import ExternalStatus
from manic.repository_git import GitRepository
from manic.utils import printlog, execute_subprocess
@@ -87,6 +88,8 @@
SVN_TEST_REPO = 'https://github.com/escomp/cesm'
+# Disable too-many-public-methods error
+# pylint: disable=R0904
def setUpModule(): # pylint: disable=C0103
"""Setup for all tests in this module. It is called once per module!
@@ -139,7 +142,7 @@ def container_full(self, dest_dir):
self.create_section(MIXED_REPO_NAME, 'mixed_req',
branch='master', externals=CFG_SUB_NAME)
- self._write_config(dest_dir)
+ self.write_config(dest_dir)
def container_simple_required(self, dest_dir):
"""Create a container externals file with only simple externals.
@@ -155,7 +158,7 @@ def container_simple_required(self, dest_dir):
self.create_section(SIMPLE_REPO_NAME, 'simp_hash',
ref_hash='60b1cc1a38d63')
- self._write_config(dest_dir)
+ self.write_config(dest_dir)
def container_simple_optional(self, dest_dir):
"""Create a container externals file with optional simple externals
@@ -168,7 +171,7 @@ def container_simple_optional(self, dest_dir):
self.create_section(SIMPLE_REPO_NAME, 'simp_opt',
tag='tag1', required=False)
- self._write_config(dest_dir)
+ self.write_config(dest_dir)
def container_simple_svn(self, dest_dir):
"""Create a container externals file with only simple externals.
@@ -180,7 +183,26 @@ def container_simple_svn(self, dest_dir):
self.create_svn_external('svn_branch', branch='trunk')
self.create_svn_external('svn_tag', tag='tags/cesm2.0.beta07')
- self._write_config(dest_dir)
+ self.write_config(dest_dir)
+
+ def container_sparse(self, dest_dir):
+ """Create a container with a full external and a sparse external
+
+ """
+ # Create a file for a sparse pattern match
+ sparse_filename = 'sparse_checkout'
+ with open(os.path.join(dest_dir, sparse_filename), 'w') as sfile:
+ sfile.write('readme.txt')
+
+ self.create_config()
+ self.create_section(SIMPLE_REPO_NAME, 'simp_tag',
+ tag='tag2')
+
+ sparse_relpath = '../../{}'.format(sparse_filename)
+ self.create_section(SIMPLE_REPO_NAME, 'simp_sparse',
+ tag='tag2', sparse=sparse_relpath)
+
+ self.write_config(dest_dir)
def mixed_simple_base(self, dest_dir):
"""Create a mixed-use base externals file with only simple externals.
@@ -197,7 +219,7 @@ def mixed_simple_base(self, dest_dir):
self.create_section(SIMPLE_REPO_NAME, 'simp_hash',
ref_hash='60b1cc1a38d63')
- self._write_config(dest_dir)
+ self.write_config(dest_dir)
def mixed_simple_sub(self, dest_dir):
"""Create a mixed-use sub externals file with only simple externals.
@@ -211,9 +233,9 @@ def mixed_simple_sub(self, dest_dir):
branch=REMOTE_BRANCH_FEATURE2,
path=SUB_EXTERNALS_PATH)
- self._write_config(dest_dir, filename=CFG_SUB_NAME)
+ self.write_config(dest_dir, filename=CFG_SUB_NAME)
- def _write_config(self, dest_dir, filename=CFG_NAME):
+ def write_config(self, dest_dir, filename=CFG_NAME):
"""Write the configuration file to disk
"""
@@ -237,22 +259,41 @@ def create_metadata(self):
self._schema_version)
def create_section(self, repo_type, name, tag='', branch='',
- ref_hash='',
- required=True, path=EXTERNALS_NAME, externals=''):
+ ref_hash='', required=True, path=EXTERNALS_NAME,
+ externals='', repo_path=None, from_submodule=False,
+ sparse=''):
+ # pylint: disable=too-many-branches
"""Create a config section with autofilling some items and handling
optional items.
"""
# pylint: disable=R0913
self._config.add_section(name)
- self._config.set(name, ExternalsDescription.PATH,
- os.path.join(path, name))
+ if not from_submodule:
+ self._config.set(name, ExternalsDescription.PATH,
+ os.path.join(path, name))
self._config.set(name, ExternalsDescription.PROTOCOL,
ExternalsDescription.PROTOCOL_GIT)
- repo_url = os.path.join('${MANIC_TEST_BARE_REPO_ROOT}', repo_type)
- self._config.set(name, ExternalsDescription.REPO_URL, repo_url)
+ # from_submodules is incompatible with some other options, turn them off
+ if (from_submodule and
+ ((repo_path is not None) or tag or ref_hash or branch)):
+ printlog('create_section: "from_submodule" is incompatible with '
+ '"repo_url", "tag", "hash", and "branch" options;\n'
+ 'Ignoring those options for {}'.format(name))
+ repo_url = None
+ tag = ''
+ ref_hash = ''
+ branch = ''
+
+ if repo_path is not None:
+ repo_url = repo_path
+ else:
+ repo_url = os.path.join('${MANIC_TEST_BARE_REPO_ROOT}', repo_type)
+
+ if not from_submodule:
+ self._config.set(name, ExternalsDescription.REPO_URL, repo_url)
self._config.set(name, ExternalsDescription.REQUIRED, str(required))
@@ -268,6 +309,12 @@ def create_section(self, repo_type, name, tag='', branch='',
if externals:
self._config.set(name, ExternalsDescription.EXTERNALS, externals)
+ if sparse:
+ self._config.set(name, ExternalsDescription.SPARSE, sparse)
+
+ if from_submodule:
+ self._config.set(name, ExternalsDescription.SUBMODULE, "True")
+
def create_section_ext_only(self, name,
required=True, externals=CFG_SUB_NAME):
"""Create a config section with autofilling some items and handling
@@ -377,7 +424,7 @@ def update_branch(self, dest_dir, name, branch, repo_type=None,
except BaseException:
pass
- self._write_config(dest_dir, filename)
+ self.write_config(dest_dir, filename)
def update_svn_branch(self, dest_dir, name, branch, filename=CFG_NAME):
"""Update a repository branch, and potentially the remote.
@@ -391,7 +438,7 @@ def update_svn_branch(self, dest_dir, name, branch, filename=CFG_NAME):
except BaseException:
pass
- self._write_config(dest_dir, filename)
+ self.write_config(dest_dir, filename)
def update_tag(self, dest_dir, name, tag, repo_type=None,
filename=CFG_NAME, remove_branch=True):
@@ -416,7 +463,7 @@ def update_tag(self, dest_dir, name, tag, repo_type=None,
except BaseException:
pass
- self._write_config(dest_dir, filename)
+ self.write_config(dest_dir, filename)
def update_underspecify_branch_tag(self, dest_dir, name,
filename=CFG_NAME):
@@ -435,7 +482,7 @@ def update_underspecify_branch_tag(self, dest_dir, name,
except BaseException:
pass
- self._write_config(dest_dir, filename)
+ self.write_config(dest_dir, filename)
def update_underspecify_remove_url(self, dest_dir, name,
filename=CFG_NAME):
@@ -448,7 +495,7 @@ def update_underspecify_remove_url(self, dest_dir, name,
except BaseException:
pass
- self._write_config(dest_dir, filename)
+ self.write_config(dest_dir, filename)
def update_protocol(self, dest_dir, name, protocol, repo_type=None,
filename=CFG_NAME):
@@ -461,7 +508,7 @@ def update_protocol(self, dest_dir, name, protocol, repo_type=None,
repo_url = os.path.join('${MANIC_TEST_BARE_REPO_ROOT}', repo_type)
self._config.set(name, ExternalsDescription.REPO_URL, repo_url)
- self._write_config(dest_dir, filename)
+ self.write_config(dest_dir, filename)
class BaseTestSysCheckout(unittest.TestCase):
@@ -513,7 +560,7 @@ def tearDown(self):
# return to our common starting point
os.chdir(self._return_dir)
- def setup_test_repo(self, parent_repo_name):
+ def setup_test_repo(self, parent_repo_name, dest_dir_in=None):
"""Setup the paths and clone the base test repo
"""
@@ -522,8 +569,12 @@ def setup_test_repo(self, parent_repo_name):
print("Test repository name: {0}".format(test_dir_name))
parent_repo_dir = os.path.join(self._bare_root, parent_repo_name)
- dest_dir = os.path.join(os.environ[MANIC_TEST_TMP_REPO_ROOT],
- test_dir_name)
+ if dest_dir_in is None:
+ dest_dir = os.path.join(os.environ[MANIC_TEST_TMP_REPO_ROOT],
+ test_dir_name)
+ else:
+ dest_dir = dest_dir_in
+
# pylint: disable=W0212
GitRepository._git_clone(parent_repo_dir, dest_dir, VERBOSITY_DEFAULT)
return dest_dir
@@ -684,6 +735,14 @@ def _check_mixed_ext_branch_modified(self, tree, directory=EXTERNALS_NAME):
name = './{0}/mixed_req'.format(directory)
self._check_generic_modified_ok_required(tree, name)
+ def _check_simple_sparse_empty(self, tree, directory=EXTERNALS_NAME):
+ name = './{0}/simp_sparse'.format(directory)
+ self._check_generic_empty_default_required(tree, name)
+
+ def _check_simple_sparse_ok(self, tree, directory=EXTERNALS_NAME):
+ name = './{0}/simp_sparse'.format(directory)
+ self._check_generic_ok_clean_required(tree, name)
+
# ----------------------------------------------------------------
#
# Check results for groups of externals under specific conditions
@@ -844,6 +903,23 @@ def _check_mixed_cont_simple_required_post_checkout(self, overall, tree):
self._check_simple_branch_ok(tree, directory=EXTERNALS_NAME)
self._check_simple_branch_ok(tree, directory=SUB_EXTERNALS_PATH)
+ def _check_container_sparse_pre_checkout(self, overall, tree):
+ self.assertEqual(overall, 0)
+ self._check_simple_tag_empty(tree)
+ self._check_simple_sparse_empty(tree)
+
+ def _check_container_sparse_post_checkout(self, overall, tree):
+ self.assertEqual(overall, 0)
+ self._check_simple_tag_ok(tree)
+ self._check_simple_sparse_ok(tree)
+
+ def _check_file_exists(self, repo_dir, pathname):
+ "Check that exists in "
+ self.assertTrue(os.path.exists(os.path.join(repo_dir, pathname)))
+
+ def _check_file_absent(self, repo_dir, pathname):
+ "Check that does not exist in "
+ self.assertFalse(os.path.exists(os.path.join(repo_dir, pathname)))
class TestSysCheckout(BaseTestSysCheckout):
"""Run systems level tests of checkout_externals
@@ -1208,6 +1284,14 @@ def test_container_full(self):
self.status_args)
self._check_container_full_post_checkout(overall, tree)
+ # Check existance of some files
+ subrepo_path = os.path.join('externals', 'simp_tag')
+ self._check_file_exists(under_test_dir,
+ os.path.join(subrepo_path, 'readme.txt'))
+ self._check_file_absent(under_test_dir, os.path.join(subrepo_path,
+ 'simple_subdir',
+ 'subdir_file.txt'))
+
# update the mixed-use repo to point to different branch
self._generator.update_branch(under_test_dir, 'mixed_req',
'new-feature', MIXED_REPO_NAME)
@@ -1288,6 +1372,40 @@ def test_mixed_simple(self):
self.status_args)
self._check_mixed_cont_simple_required_post_checkout(overall, tree)
+ def test_container_sparse(self):
+ """Verify that 'full' container with simple subrepo
+ can run a sparse checkout and generate the correct initial status.
+
+ """
+ # create the test repository
+ under_test_dir = self.setup_test_repo(CONTAINER_REPO_NAME)
+
+ # create the top level externals file
+ self._generator.container_sparse(under_test_dir)
+
+ # inital checkout
+ overall, tree = self.execute_cmd_in_dir(under_test_dir,
+ self.checkout_args)
+ self._check_container_sparse_pre_checkout(overall, tree)
+
+ overall, tree = self.execute_cmd_in_dir(under_test_dir,
+ self.status_args)
+ self._check_container_sparse_post_checkout(overall, tree)
+
+ # Check existance of some files
+ subrepo_path = os.path.join('externals', 'simp_tag')
+ self._check_file_exists(under_test_dir,
+ os.path.join(subrepo_path, 'readme.txt'))
+ self._check_file_exists(under_test_dir, os.path.join(subrepo_path,
+ 'simple_subdir',
+ 'subdir_file.txt'))
+ subrepo_path = os.path.join('externals', 'simp_sparse')
+ self._check_file_exists(under_test_dir,
+ os.path.join(subrepo_path, 'readme.txt'))
+ self._check_file_absent(under_test_dir, os.path.join(subrepo_path,
+ 'simple_subdir',
+ 'subdir_file.txt'))
+
class TestSysCheckoutSVN(BaseTestSysCheckout):
"""Run systems level tests of checkout_externals accessing svn repositories
@@ -1434,6 +1552,237 @@ def test_container_simple_svn(self):
self.verbose_args)
self._check_container_simple_svn_post_checkout(overall, tree)
+class TestSubrepoCheckout(BaseTestSysCheckout):
+ # Need to store information at setUp time for checking
+ # pylint: disable=too-many-instance-attributes
+ """Run tests to ensure proper handling of repos with submodules.
+
+ By default, submodules in git repositories are checked out. A git
+ repository checked out as a submodule is treated as if it was
+ listed in an external with the same properties as in the source
+ .gitmodules file.
+ """
+
+ def setUp(self):
+ """Setup for all submodule checkout tests
+ Create a repo with two submodule repositories.
+ """
+
+ # Run the basic setup
+ super(TestSubrepoCheckout, self).setUp()
+ # create test repo
+ # We need to do this here (rather than have a static repo) because
+ # git submodules do not allow for variables in .gitmodules files
+ self._test_repo_name = 'test_repo_with_submodules'
+ self._bare_branch_name = 'subrepo_branch'
+ self._config_branch_name = 'subrepo_config_branch'
+ self._container_extern_name = 'externals_container.cfg'
+ self._my_test_dir = os.path.join(os.environ[MANIC_TEST_TMP_REPO_ROOT],
+ self._test_id)
+ self._repo_dir = os.path.join(self._my_test_dir, self._test_repo_name)
+ self._checkout_dir = 'repo_with_submodules'
+ check_dir = self.setup_test_repo(CONTAINER_REPO_NAME,
+ dest_dir_in=self._repo_dir)
+ self.assertTrue(self._repo_dir == check_dir)
+ # Add the submodules
+ cwd = os.getcwd()
+ fork_repo_dir = os.path.join(self._bare_root, SIMPLE_FORK_NAME)
+ simple_repo_dir = os.path.join(self._bare_root, SIMPLE_REPO_NAME)
+ self._simple_ext_fork_name = SIMPLE_FORK_NAME.split('.')[0]
+ self._simple_ext_name = SIMPLE_REPO_NAME.split('.')[0]
+ os.chdir(self._repo_dir)
+ # Add a branch with a subrepo
+ cmd = ['git', 'branch', self._bare_branch_name, 'master']
+ execute_subprocess(cmd)
+ cmd = ['git', 'checkout', self._bare_branch_name]
+ execute_subprocess(cmd)
+ cmd = ['git', 'submodule', 'add', fork_repo_dir]
+ execute_subprocess(cmd)
+ cmd = ['git', 'commit', '-am', "'Added simple-ext-fork as a submodule'"]
+ execute_subprocess(cmd)
+ # Save the fork repo hash for comparison
+ os.chdir(self._simple_ext_fork_name)
+ self._fork_hash_check = self.get_git_hash()
+ os.chdir(self._repo_dir)
+ # Now, create a branch to test from_sbmodule
+ cmd = ['git', 'branch',
+ self._config_branch_name, self._bare_branch_name]
+ execute_subprocess(cmd)
+ cmd = ['git', 'checkout', self._config_branch_name]
+ execute_subprocess(cmd)
+ cmd = ['git', 'submodule', 'add', simple_repo_dir]
+ execute_subprocess(cmd)
+ # Checkout feature2
+ os.chdir(self._simple_ext_name)
+ cmd = ['git', 'branch', 'feature2', 'origin/feature2']
+ execute_subprocess(cmd)
+ cmd = ['git', 'checkout', 'feature2']
+ execute_subprocess(cmd)
+ # Save the fork repo hash for comparison
+ self._simple_hash_check = self.get_git_hash()
+ os.chdir(self._repo_dir)
+ self.create_externals_file(filename=self._container_extern_name,
+ dest_dir=self._repo_dir, from_submodule=True)
+ cmd = ['git', 'add', self._container_extern_name]
+ execute_subprocess(cmd)
+ cmd = ['git', 'commit', '-am', "'Added simple-ext as a submodule'"]
+ execute_subprocess(cmd)
+ # Reset to master
+ cmd = ['git', 'checkout', 'master']
+ execute_subprocess(cmd)
+ os.chdir(cwd)
+
+ @staticmethod
+ def get_git_hash(revision="HEAD"):
+ """Return the hash for """
+ cmd = ['git', 'rev-parse', revision]
+ git_out = execute_subprocess(cmd, output_to_caller=True)
+ return git_out.strip()
+
+ def create_externals_file(self, name='', filename=CFG_NAME, dest_dir=None,
+ branch_name=None, sub_externals=None,
+ from_submodule=False):
+ # pylint: disable=too-many-arguments
+ """Create a container externals file with only simple externals.
+
+ """
+ self._generator.create_config()
+
+ if dest_dir is None:
+ dest_dir = self._my_test_dir
+
+ if from_submodule:
+ self._generator.create_section(SIMPLE_FORK_NAME,
+ self._simple_ext_fork_name,
+ from_submodule=True)
+ self._generator.create_section(SIMPLE_REPO_NAME,
+ self._simple_ext_name,
+ branch='feature3', path='',
+ from_submodule=False)
+ else:
+ if branch_name is None:
+ branch_name = 'master'
+
+ self._generator.create_section(self._test_repo_name,
+ self._checkout_dir,
+ branch=branch_name,
+ path=name, externals=sub_externals,
+ repo_path=self._repo_dir)
+
+ self._generator.write_config(dest_dir, filename=filename)
+
+ def idempotence_check(self, checkout_dir):
+ """Verify that calling checkout_externals and
+ checkout_externals --status does not cause errors"""
+ cwd = os.getcwd()
+ os.chdir(checkout_dir)
+ overall, _ = self.execute_cmd_in_dir(self._my_test_dir,
+ self.checkout_args)
+ self.assertTrue(overall == 0)
+ overall, _ = self.execute_cmd_in_dir(self._my_test_dir,
+ self.status_args)
+ self.assertTrue(overall == 0)
+ os.chdir(cwd)
+
+ def test_submodule_checkout_bare(self):
+ """Verify that a git repo with submodule is properly checked out
+ This test if for where there is no 'externals' keyword in the
+ parent repo.
+ Correct behavior is that the submodule is checked out using
+ normal git submodule behavior.
+ """
+ simple_ext_fork_tag = "(tag1)"
+ simple_ext_fork_status = " "
+ self.create_externals_file(branch_name=self._bare_branch_name)
+ overall, _ = self.execute_cmd_in_dir(self._my_test_dir,
+ self.checkout_args)
+ self.assertTrue(overall == 0)
+ cwd = os.getcwd()
+ checkout_dir = os.path.join(self._my_test_dir, self._checkout_dir)
+ fork_file = os.path.join(checkout_dir,
+ self._simple_ext_fork_name, "readme.txt")
+ self.assertTrue(os.path.exists(fork_file))
+ os.chdir(checkout_dir)
+ submods = git_submodule_status(checkout_dir)
+ self.assertEqual(len(submods.keys()), 1)
+ self.assertTrue(self._simple_ext_fork_name in submods)
+ submod = submods[self._simple_ext_fork_name]
+ self.assertTrue('hash' in submod)
+ self.assertEqual(submod['hash'], self._fork_hash_check)
+ self.assertTrue('status' in submod)
+ self.assertEqual(submod['status'], simple_ext_fork_status)
+ self.assertTrue('tag' in submod)
+ self.assertEqual(submod['tag'], simple_ext_fork_tag)
+ os.chdir(cwd)
+ self.idempotence_check(checkout_dir)
+
+ def test_submodule_checkout_none(self):
+ """Verify that a git repo with submodule is properly checked out
+ This test is for when 'externals=None' is in parent repo's
+ externals cfg file.
+ Correct behavior is the submodle is not checked out.
+ """
+ self.create_externals_file(branch_name=self._bare_branch_name,
+ sub_externals="none")
+ overall, _ = self.execute_cmd_in_dir(self._my_test_dir,
+ self.checkout_args)
+ self.assertTrue(overall == 0)
+ cwd = os.getcwd()
+ checkout_dir = os.path.join(self._my_test_dir, self._checkout_dir)
+ fork_file = os.path.join(checkout_dir,
+ self._simple_ext_fork_name, "readme.txt")
+ self.assertFalse(os.path.exists(fork_file))
+ os.chdir(cwd)
+ self.idempotence_check(checkout_dir)
+
+ def test_submodule_checkout_config(self): # pylint: disable=too-many-locals
+ """Verify that a git repo with submodule is properly checked out
+ This test if for when the 'from_submodule' keyword is used in the
+ parent repo.
+ Correct behavior is that the submodule is checked out using
+ normal git submodule behavior.
+ """
+ tag_check = None # Not checked out as submodule
+ status_check = "-" # Not checked out as submodule
+ self.create_externals_file(branch_name=self._config_branch_name,
+ sub_externals=self._container_extern_name)
+ overall, _ = self.execute_cmd_in_dir(self._my_test_dir,
+ self.checkout_args)
+ self.assertTrue(overall == 0)
+ cwd = os.getcwd()
+ checkout_dir = os.path.join(self._my_test_dir, self._checkout_dir)
+ fork_file = os.path.join(checkout_dir,
+ self._simple_ext_fork_name, "readme.txt")
+ self.assertTrue(os.path.exists(fork_file))
+ os.chdir(checkout_dir)
+ # Check submodule status
+ submods = git_submodule_status(checkout_dir)
+ self.assertEqual(len(submods.keys()), 2)
+ self.assertTrue(self._simple_ext_fork_name in submods)
+ submod = submods[self._simple_ext_fork_name]
+ self.assertTrue('hash' in submod)
+ self.assertEqual(submod['hash'], self._fork_hash_check)
+ self.assertTrue('status' in submod)
+ self.assertEqual(submod['status'], status_check)
+ self.assertTrue('tag' in submod)
+ self.assertEqual(submod['tag'], tag_check)
+ self.assertTrue(self._simple_ext_name in submods)
+ submod = submods[self._simple_ext_name]
+ self.assertTrue('hash' in submod)
+ self.assertEqual(submod['hash'], self._simple_hash_check)
+ self.assertTrue('status' in submod)
+ self.assertEqual(submod['status'], status_check)
+ self.assertTrue('tag' in submod)
+ self.assertEqual(submod['tag'], tag_check)
+ # Check fork repo status
+ os.chdir(self._simple_ext_fork_name)
+ self.assertEqual(self.get_git_hash(), self._fork_hash_check)
+ os.chdir(checkout_dir)
+ os.chdir(self._simple_ext_name)
+ hash_check = self.get_git_hash('origin/feature3')
+ self.assertEqual(self.get_git_hash(), hash_check)
+ os.chdir(cwd)
+ self.idempotence_check(checkout_dir)
class TestSysCheckoutErrors(BaseTestSysCheckout):
"""Run systems level tests of error conditions in checkout_externals
diff --git a/manage_externals/test/test_unit_externals_description.py b/manage_externals/test/test_unit_externals_description.py
index 5de60e4f35..637f760ee5 100644
--- a/manage_externals/test/test_unit_externals_description.py
+++ b/manage_externals/test/test_unit_externals_description.py
@@ -316,11 +316,13 @@ def setUp(self):
"""Create config object used as basis for all tests
"""
self._config = config_parser()
+ self._gmconfig = config_parser()
self.setup_config()
def setup_config(self):
"""Boiler plate construction of xml string for componet 1
"""
+ # Create a standard externals config with a single external
name = 'test'
self._config.add_section(name)
self._config.set(name, ExternalsDescription.PATH, 'externals')
@@ -332,6 +334,14 @@ def setup_config(self):
self._config.add_section(DESCRIPTION_SECTION)
self._config.set(DESCRIPTION_SECTION, VERSION_ITEM, '1.0.0')
+ # Create a .gitmodules test
+ name = 'submodule "gitmodules_test"'
+ self._gmconfig.add_section(name)
+ self._gmconfig.set(name, "path", 'externals/test')
+ self._gmconfig.set(name, "url", '/path/to/repo')
+ # NOTE(goldy, 2019-03) Should test other possible keywords such as
+ # fetchRecurseSubmodules, ignore, and shallow
+
def test_cfg_v1_ok(self):
"""Test that a correct cfg v1 object is created by create_externals_description
@@ -356,7 +366,7 @@ def test_dict(self):
rdata = {ExternalsDescription.PROTOCOL: 'git',
ExternalsDescription.REPO_URL: '/path/to/repo',
ExternalsDescription.TAG: 'tagv1',
- }
+ }
desc = {
'test': {
diff --git a/manage_externals/test/test_unit_repository.py b/manage_externals/test/test_unit_repository.py
index 2152503c2d..5b9c242fd3 100644
--- a/manage_externals/test/test_unit_repository.py
+++ b/manage_externals/test/test_unit_repository.py
@@ -36,7 +36,8 @@ def setUp(self):
ExternalsDescription.REPO_URL: 'junk_root',
ExternalsDescription.TAG: 'junk_tag',
ExternalsDescription.BRANCH: EMPTY_STR,
- ExternalsDescription.HASH: EMPTY_STR, }
+ ExternalsDescription.HASH: EMPTY_STR,
+ ExternalsDescription.SPARSE: EMPTY_STR, }
def test_create_repo_git(self):
"""Verify that several possible names for the 'git' protocol
@@ -95,7 +96,8 @@ def test_tag(self):
ExternalsDescription.REPO_URL: url,
ExternalsDescription.TAG: tag,
ExternalsDescription.BRANCH: EMPTY_STR,
- ExternalsDescription.HASH: EMPTY_STR, }
+ ExternalsDescription.HASH: EMPTY_STR,
+ ExternalsDescription.SPARSE: EMPTY_STR, }
repo = Repository(name, repo_info)
print(repo.__dict__)
self.assertEqual(repo.tag(), tag)
@@ -112,7 +114,8 @@ def test_branch(self):
ExternalsDescription.REPO_URL: url,
ExternalsDescription.BRANCH: branch,
ExternalsDescription.TAG: EMPTY_STR,
- ExternalsDescription.HASH: EMPTY_STR, }
+ ExternalsDescription.HASH: EMPTY_STR,
+ ExternalsDescription.SPARSE: EMPTY_STR, }
repo = Repository(name, repo_info)
print(repo.__dict__)
self.assertEqual(repo.branch(), branch)
@@ -125,11 +128,13 @@ def test_hash(self):
protocol = 'test_protocol'
url = 'test_url'
ref = 'deadc0de'
+ sparse = EMPTY_STR
repo_info = {ExternalsDescription.PROTOCOL: protocol,
ExternalsDescription.REPO_URL: url,
ExternalsDescription.BRANCH: EMPTY_STR,
ExternalsDescription.TAG: EMPTY_STR,
- ExternalsDescription.HASH: ref, }
+ ExternalsDescription.HASH: ref,
+ ExternalsDescription.SPARSE: sparse, }
repo = Repository(name, repo_info)
print(repo.__dict__)
self.assertEqual(repo.hash(), ref)
@@ -146,11 +151,13 @@ def test_tag_branch(self):
branch = 'test_branch'
tag = 'test_tag'
ref = EMPTY_STR
+ sparse = EMPTY_STR
repo_info = {ExternalsDescription.PROTOCOL: protocol,
ExternalsDescription.REPO_URL: url,
ExternalsDescription.BRANCH: branch,
ExternalsDescription.TAG: tag,
- ExternalsDescription.HASH: ref, }
+ ExternalsDescription.HASH: ref,
+ ExternalsDescription.SPARSE: sparse, }
with self.assertRaises(RuntimeError):
Repository(name, repo_info)
@@ -165,11 +172,13 @@ def test_tag_branch_hash(self):
branch = 'test_branch'
tag = 'test_tag'
ref = 'deadc0de'
+ sparse = EMPTY_STR
repo_info = {ExternalsDescription.PROTOCOL: protocol,
ExternalsDescription.REPO_URL: url,
ExternalsDescription.BRANCH: branch,
ExternalsDescription.TAG: tag,
- ExternalsDescription.HASH: ref, }
+ ExternalsDescription.HASH: ref,
+ ExternalsDescription.SPARSE: sparse, }
with self.assertRaises(RuntimeError):
Repository(name, repo_info)
@@ -184,11 +193,13 @@ def test_no_tag_no_branch(self):
branch = EMPTY_STR
tag = EMPTY_STR
ref = EMPTY_STR
+ sparse = EMPTY_STR
repo_info = {ExternalsDescription.PROTOCOL: protocol,
ExternalsDescription.REPO_URL: url,
ExternalsDescription.BRANCH: branch,
ExternalsDescription.TAG: tag,
- ExternalsDescription.HASH: ref, }
+ ExternalsDescription.HASH: ref,
+ ExternalsDescription.SPARSE: sparse, }
with self.assertRaises(RuntimeError):
Repository(name, repo_info)
diff --git a/manage_externals/test/test_unit_repository_git.py b/manage_externals/test/test_unit_repository_git.py
index b025fbd429..4a0a334bb1 100644
--- a/manage_externals/test/test_unit_repository_git.py
+++ b/manage_externals/test/test_unit_repository_git.py
@@ -547,7 +547,8 @@ def setUp(self):
ExternalsDescription.TAG:
'very_useful_tag',
ExternalsDescription.BRANCH: EMPTY_STR,
- ExternalsDescription.HASH: EMPTY_STR, }
+ ExternalsDescription.HASH: EMPTY_STR,
+ ExternalsDescription.SPARSE: EMPTY_STR, }
self._repo = GitRepository('test', self._rdata)
def test_remote_git_proto(self):
diff --git a/src/utils/clmfates_paraminterfaceMod.F90 b/src/utils/clmfates_paraminterfaceMod.F90
index 9a3ce58ff7..2f63389ad4 100644
--- a/src/utils/clmfates_paraminterfaceMod.F90
+++ b/src/utils/clmfates_paraminterfaceMod.F90
@@ -2,6 +2,7 @@ module CLMFatesParamInterfaceMod
! NOTE(bja, 2017-01) this code can not go into the main clm-fates
! interface module because of circular dependancies with pftvarcon.
+ use shr_kind_mod, only : r8 => shr_kind_r8
use FatesGlobals, only : fates_log
implicit none
@@ -172,7 +173,6 @@ end subroutine GetUsedDimensionSizes
!-----------------------------------------------------------------------
subroutine ParametersFromNetCDF(filename, is_host_file, fates_params)
- use shr_kind_mod, only: r8 => shr_kind_r8
use abortutils, only : endrun
use fileutils , only : getfil
use ncdio_pio , only : file_desc_t, ncd_pio_closefile, ncd_pio_openfile
diff --git a/tools/contrib/README b/tools/contrib/README
index c8338a1a8e..bae1b51ca9 100644
--- a/tools/contrib/README
+++ b/tools/contrib/README
@@ -38,5 +38,11 @@ run_clmtowers
It's based on having created surface datasets with PTCLM.
v1 - Keith Oleson, 8/2015
+ssp_anomaly_forcing_smooth
+ This script creates anomaly forcing for CMIP6 SSP scenarios that
+ can be used to run CTSM in CESM with datm.
+ v0 -- Sean Swenson
+ v1 - Peter Lawrence 3/2020
+
diff --git a/tools/contrib/ssp_anomaly_forcing_smooth b/tools/contrib/ssp_anomaly_forcing_smooth
new file mode 100755
index 0000000000..ad25248b7d
--- /dev/null
+++ b/tools/contrib/ssp_anomaly_forcing_smooth
@@ -0,0 +1,338 @@
+#! /usr/bin/env python
+#
+# ssp_anomaly_forcing_smooth
+#
+# Create anomoly forcing datasets for SSP scenarios that can be used by CESM datm model
+#
+import sys
+import os
+import string
+import subprocess
+import datetime
+import numpy as np
+import matplotlib.pyplot as plt
+import netCDF4 as netcdf4
+from scipy import interpolate
+
+# load proper modules first, i.e.
+# cheyenne
+'''
+module load python/2.7.16
+ncar_pylib
+#module load numpy/1.12.0
+#module load matplotlib/2.0.0
+#module load scipy/0.18.1
+#module load intel/16.0.3
+#module load ncarcompilers/0.3.5
+#module load netcdf/4.4.1.1
+#module load netcdf4-python/1.2.7
+'''
+
+# caldera / geyser
+
+'''
+module load python/2.7.7
+module load numpy/1.11.0
+module load pyside/1.1.2
+module load matplotlib/1.5.1
+module load scipy/0.18.1
+module load netcdf4python/1.2.4
+'''
+
+#-------------------------------------------------------
+"""
+
+This script creates CLM anomaly forcing data
+
+"""
+#-------------------------------------------------------
+
+#-- end of function definitions ---------------------------------
+#0
+
+print( "Create anomoly forcing data that can be used by CTSM in CESM" )
+# Input and output directories make sure they exist
+datapath = "/glade/p/cesm/sdwg_dev/thesis/data/cesm_tools/anomalyforcing" # Path on cheyenne
+spath = './'
+if ( os.path.exists(datapath) ):
+ print( "Input data directory:"+datapath )
+else:
+ sys.exit( "Could not find input directory: "+datapath )
+if ( os.path.exists(spath) ):
+ print( "Output data directory:"+spath )
+else:
+ sys.exit( "Could not find output directory: "+spath )
+
+# Settings to run with
+today = datetime.date.today()
+creationdate = "_c"+today.strftime( "%Y%m%d" )
+historydate = today.strftime( "%a %b %d %Y" )
+sspnum = 3
+smoothsize = 5
+
+if sspnum == 1:
+ # SSP1-26
+ ssptag = 'SSP1-2.6'
+ hist_case = 'b.e21.BHIST.f09_g17.CMIP6-historical.010'
+ fut_case = 'b.e21.BSSP126cmip6.f09_g17.CMIP6-SSP1-2.6.001'
+if sspnum == 2:
+ # SSP3-70
+ ssptag = 'SSP3-7.0'
+ hist_case = 'b.e21.BHIST.f09_g17.CMIP6-historical.010'
+ fut_case = 'b.e21.BSSP370cmip6.f09_g17.CMIP6-SSP3-7.0.001'
+if sspnum == 3:
+ # SSP5-85
+ ssptag = 'SSP5-8.5'
+ hist_case = 'b.e21.BHIST.f09_g17.CMIP6-historical.010'
+ fut_case = 'b.e21.BSSP585cmip6.f09_g17.CMIP6-SSP5-8.5.001'
+
+sspoutdir = 'anomaly_forcing/CMIP6-'+ssptag
+
+outdir = spath + sspoutdir
+if ( not os.path.exists(outdir) ):
+ os.makedirs( outdir )
+
+print( "Output specific data directory :"+outdir )
+
+
+hist_yrstart = 2000
+hist_yrend = 2014
+hist_nyrs = hist_yrend - hist_yrstart + 1
+
+fut1_yrstart = 2015
+fut1_yrend = 2064
+fut1_nyrs = fut1_yrend - fut1_yrstart + 1
+
+fut2_yrstart = 2065
+fut2_yrend = 2100
+fut2_nyrs = fut2_yrend - fut2_yrstart + 1
+
+fut_yrstart = 2015
+fut_yrend = 2100
+fut_nyrs = fut_yrend - fut_yrstart + 1
+
+tot_yrstart = 2000
+tot_yrend = 2100
+tot_nyrs = tot_yrend - tot_yrstart + 1
+
+nmo = 12
+histnm = nmo*hist_nyrs
+futnm = nmo*fut_nyrs
+totnm = nmo*tot_nyrs
+outnm = nmo*fut_nyrs
+
+dpath = datapath + '/historyfiles/'
+dfile = '/lnd/proc/tseries/month_1/'
+hdir = dpath+hist_case+dfile
+fdir = dpath+fut_case+dfile
+
+# Check that directories exist
+if ( os.path.exists(hdir) ):
+ print( "Data file directory:"+hdir )
+else:
+ sys.exit( "Could not find directory: "+hdir )
+if ( os.path.exists(fdir) ):
+ print( "Data file directory:"+fdir )
+else:
+ sys.exit( "Could not find directory: "+fdir )
+
+print( "\n\n\n" )
+
+# needed to use QBOT and U10, not using V and U(for sfcwind)
+field_in = [ 'TBOT', 'RAIN', 'SNOW', 'FSDS', 'FLDS', 'QBOT', 'PBOT']
+field_combine = [ 0, 1, 1, 0, 0, 0, 0]
+field_out = [ 'tas', 'pr', 'pr', 'rsds', 'rlds', 'huss', 'ps']
+units = [ 'K', ' ', ' ', ' ', ' ', 'kg/kg', 'Pa']
+units_disp = [ 'K', 'mm/s', 'mm/s', 'W m!U-2!N', 'W m!U-2!N', 'kg/kg', 'Pa']
+anomsf = ['anomaly','scale factor','scale factor','scale factor','scale factor','anomaly','anomaly']
+
+nfields = len(field_in)
+
+#-- Read coordinates
+landfile = hdir+hist_case+'.clm2.h0.TBOT.'+str(hist_yrstart)+'01-'+str(hist_yrend)+'12.nc'
+if ( os.path.exists(landfile) ):
+ print( "Land File: "+landfile )
+else:
+ sys.exit( "Could not find land file: "+landfile )
+
+f1 = netcdf4.Dataset(landfile, 'r')
+landfrac=np.asfarray(f1.variables['landfrac'][:,:],np.float64)
+landmask=np.asfarray(f1.variables['landmask'][:,:],np.float64)
+area=np.asfarray(f1.variables['area'][:,:],np.float64)
+lon = np.asfarray(f1.variables['lon'][:],np.float64)
+lat = np.asfarray(f1.variables['lat'][:],np.float64)
+nlat = lat.size
+nlon = lon.size
+f1.close()
+ind=np.where(landfrac > 1.e10)
+landfrac[ind]=0
+
+#-- Loop over forcing fields ------------------------------------
+fieldskip = 0
+for f in range(nfields):
+ # read in last ten years of historical data ------------------
+
+ infieldname1 = field_in[f]
+ infieldcombine1 = field_combine[f]
+ if ((infieldcombine1 == 1 and fieldskip == 0) or (infieldcombine1 == 0 and fieldskip == 0)):
+ hvarfile1 = hdir+hist_case+'.clm2.h0.'+infieldname1+'.'+str(hist_yrstart)+'01-'+str(hist_yrend)+'12.nc'
+ fvarfile1 = fdir+fut_case+'.clm2.h0.'+infieldname1+'.'+str(fut1_yrstart)+'01-'+str(fut1_yrend)+'12.nc'
+ fvarfile2 = fdir+fut_case+'.clm2.h0.'+infieldname1+'.'+str(fut2_yrstart)+'01-'+str(fut2_yrend)+'12.nc'
+ hf1 = netcdf4.Dataset(hvarfile1, 'r')
+ ff1 = netcdf4.Dataset(fvarfile1, 'r')
+ ff2 = netcdf4.Dataset(fvarfile2, 'r')
+ hvarvalues1 = np.asfarray(hf1.variables[infieldname1][:],np.float64)
+ htime1 = np.asfarray(hf1.variables['time'][:],np.float64)
+ print( 'Reading: ' + hvarfile1 )
+ fvarvalues1 = np.asfarray(ff1.variables[infieldname1][:],np.float64)
+ ftime1 = np.asfarray(ff1.variables['time'][:],np.float64)
+ long_name = ff1.variables[field_in[f]].long_name
+ print( 'Reading: ' + fvarfile1 )
+ fvarvalues2 = np.asfarray(ff2.variables[infieldname1][:],np.float64)
+ ftime2 = np.asfarray(ff2.variables['time'][:],np.float64)
+ print( 'Reading: ' + fvarfile2 )
+ hf1.close()
+ ff1.close()
+ ff2.close()
+ if (infieldcombine1 == 1):
+ infieldname2 = field_in[f+1]
+ infieldcombine2 = field_combine[f+1]
+ hvarfile2 = hdir+hist_case+'.clm2.h0.'+infieldname2+'.'+str(hist_yrstart)+'01-'+str(hist_yrend)+'12.nc'
+ fvarfile3 = fdir+fut_case+'.clm2.h0.'+infieldname2+'.'+str(fut1_yrstart)+'01-'+str(fut1_yrend)+'12.nc'
+ fvarfile4 = fdir+fut_case+'.clm2.h0.'+infieldname2+'.'+str(fut2_yrstart)+'01-'+str(fut2_yrend)+'12.nc'
+ hf2 = netcdf4.Dataset(hvarfile2, 'r')
+ ff3 = netcdf4.Dataset(fvarfile3, 'r')
+ ff4 = netcdf4.Dataset(fvarfile4, 'r')
+ hvarvalues1 = hvarvalues1 + np.asfarray(hf2.variables[infieldname2][:],np.float64)
+ print( 'Reading: ' + hvarfile2 )
+ fvarvalues1 = fvarvalues1 + np.asfarray(ff3.variables[infieldname2][:],np.float64)
+ print( 'Reading: ' + fvarfile3 )
+ fvarvalues2 = fvarvalues2 + np.asfarray(ff4.variables[infieldname2][:],np.float64)
+ print( 'Reading: ' + fvarfile4 )
+ hf2.close()
+ ff3.close()
+ ff4.close()
+ fieldskip = 1
+
+ allvarvalues = np.concatenate((hvarvalues1,fvarvalues1,fvarvalues2),axis=0)
+ alltime = np.concatenate((htime1,ftime1,ftime2),axis=0)
+ ftime = np.concatenate((ftime1,ftime2),axis=0)
+ outtime = ftime - 16
+ histavgvalues = np.zeros((nmo,nlat,nlon))
+ histavgcount = np.zeros((nmo))
+ runningavgvalues = np.zeros((nlat,nlon))
+ runningavgcount = 0.0
+ outputvarvalues = np.zeros((outnm,nlat,nlon))
+
+ for hmonthindex in range(histnm):
+ havgmonthnum = (hmonthindex) % 12 + 1
+ havgmonthindex = havgmonthnum - 1
+ histavgvalues[havgmonthindex,:,:] = histavgvalues[havgmonthindex,:,:] * histavgcount[havgmonthindex]
+ histavgvalues[havgmonthindex,:,:] = histavgvalues[havgmonthindex,:,:] + allvarvalues[hmonthindex,:,:]
+ histavgcount[havgmonthindex] = histavgcount[havgmonthindex] + 1.0
+ histavgvalues[havgmonthindex,:,:] = histavgvalues[havgmonthindex,:,:] / histavgcount[havgmonthindex]
+
+ for fmonthindex in range(futnm):
+ allmonthindex = fmonthindex + histnm
+ allyearindex = int(allmonthindex / nmo)
+ favgmonthnum = (allmonthindex) % 12 + 1
+ favgmonthindex = favgmonthnum - 1
+
+ firstmonthindex = allmonthindex - nmo * smoothsize
+ if allyearindex <= (tot_nyrs - smoothsize):
+ lastmonthindex = allmonthindex + nmo * smoothsize
+ else:
+ lastmonthindex = allmonthindex + nmo * (tot_nyrs - allyearindex)
+
+ runningavgvalues = 0.0
+ runningavgcount = 0.0
+ for smonthindex in range(firstmonthindex,lastmonthindex,nmo):
+ runningavgvalues = runningavgvalues * runningavgcount
+ runningavgvalues = runningavgvalues + allvarvalues[smonthindex,:,:]
+ runningavgcount = runningavgcount + 1.0
+ runningavgvalues = runningavgvalues / runningavgcount
+
+ climoavgvalues = histavgvalues[favgmonthindex,:,:]
+ if anomsf[f] == 'anomaly':
+ anomvalues = runningavgvalues - climoavgvalues
+
+ if anomsf[f] == 'scale factor':
+ anomvalues = np.ones((nlat,nlon),dtype=np.float64)
+
+ nonzeroindex = np.where(climoavgvalues != 0.0)
+ anomvalues[nonzeroindex] = runningavgvalues[nonzeroindex]/climoavgvalues[nonzeroindex]
+
+ max_scale_factor = 5.
+ if field_in[f] == 'FSDS':
+ max_scale_factor = 2.
+ overmaxindex=np.where(anomvalues > max_scale_factor)
+ anomvalues[overmaxindex] = max_scale_factor
+
+ outputvarvalues[fmonthindex,:,:] = anomvalues
+
+ # create netcdf file ---------------------------------
+
+ outfilename = outdir + '/'+'af.'+field_out[f]+'.cesm2.'+ssptag+'.'+str(fut_yrstart)+'-'+str(fut_yrend)+creationdate+'.nc'
+ print( 'Creating: ' + outfilename )
+ outfile = netcdf4.Dataset(outfilename, 'w')
+
+ outfile.source_file1 = hvarfile1
+ outfile.source_file2 = fvarfile1
+ outfile.source_file3 = fvarfile2
+ outfile.title = 'anomaly forcing data'
+ outfile.note1 = 'Anomaly/scale factors calculated relative to ' \
+ +str(hist_yrstart)+'-'+str(hist_yrend) \
+ +' climatology from CESM2 historical simulation (case name: '+hist_case+')'
+ outfile.note2 = ssptag+' '+str(fut_yrstart)+'-'+str(fut_yrend) \
+ +' from CESM simulations (case names: '+fut_case[0]+' and '+fut_case[1]+')'
+ outfile.smoothsize = str(smoothsize)
+ outfile.history = historydate + ": created by "+sys.argv[0]
+ stdout = os.popen( "git describe" )
+ outfile.gitdescribe = stdout.read().rstrip()
+
+ outfile.createDimension('lat', size=int(nlat))
+ outfile.createDimension('lon', size=int(nlon))
+ outfile.createDimension('time', size=None)
+
+ wtime = outfile.createVariable('time',np.float64,('time',))
+ wlat = outfile.createVariable('lat',np.float64,('lat',))
+ wlon = outfile.createVariable('lon',np.float64,('lon',))
+ wmask = outfile.createVariable('landmask',np.int32,('lat','lon'))
+ warea = outfile.createVariable('area',np.float64,('lat','lon'))
+ wfrac = outfile.createVariable('landfrac',np.float64,('lat','lon'))
+ wvar = outfile.createVariable(field_out[f],np.float64,('time','lat','lon'),fill_value=np.float64(1.e36))
+
+ wtime.units = 'days since ' + str(fut_yrstart) + '-01-01 00:00:00'
+ wlon.units = 'degrees'
+ wlat.units = 'degrees'
+ wvar.units = units[f]
+ warea.units = 'km2'
+ wfrac.units = 'unitless'
+ wmask.units = 'unitless'
+
+ #wtime.long_name = 'Months since January '+str(fut_yrstart)
+ wtime.long_name = 'days since ' + str(fut_yrstart) + '-01-01 00:00:00'
+ wlon.long_name = 'Longitude'
+ wlat.long_name = 'Latitude'
+ wvar.long_name = str(long_name)+' '+anomsf[f]
+ warea.long_name = 'Grid cell area'
+ wfrac.long_name = 'Grid cell land fraction'
+ wmask.long_name = 'Grid cell land mask'
+
+ wtime.calendar = 'noleap'
+
+ # write to file --------------------------------------------
+ #wtime[:] = month
+ wtime[:] = outtime
+ wlon[:] = lon
+ wlat[:] = lat
+ wmask[:,:] = landmask
+ wfrac[:,:] = landfrac
+ warea[:,:] = area
+ wvar[:,:,:] = outputvarvalues
+
+ else:
+ fieldskip = 0
+
+
+print( "\n\nSuccessfully made anomoly forcing datasets\n" )
diff --git a/tools/mksurfdata_map/Makefile.data b/tools/mksurfdata_map/Makefile.data
index 38706b75b2..eddd951695 100644
--- a/tools/mksurfdata_map/Makefile.data
+++ b/tools/mksurfdata_map/Makefile.data
@@ -55,8 +55,8 @@ endif
MKSURFDATA = $(BATCHJOBS) $(PWD)/mksurfdata.pl
# f19 and f09 are standard resolutions, f10 is used for testing, f45 is used for FATES
-# ne30np4 is standard resolution for SE dycore in CAM, T31 is for paleo, 360x720cru is for same resolution as forcing data
-STANDARD_RES = 360x720cru,48x96,0.9x1.25,1.9x2.5,10x15,4x5,ne30np4
+# ne30np4 is standard resolution for SE dycore in CAM
+STANDARD_RES = 0.9x1.25,1.9x2.5,10x15,4x5,ne30np4
FUTURE_RES = 0.9x1.25,1.9x2.5,10x15
diff --git a/tools/mksurfdata_map/README b/tools/mksurfdata_map/README
index 5d3a98fe08..bd324580bb 100644
--- a/tools/mksurfdata_map/README
+++ b/tools/mksurfdata_map/README
@@ -52,6 +52,9 @@ and generate the surface dataset:
For supported model resolution ()
> mksurfdata.pl -res [options]
+ For supported model resolutions for SSP scenarios
+ > mksurfdata.pl -res -ssp_rcp -years 1850-2100
+
For unsupported, user specified model resolutions
> mksurfdata.pl -res usrspec -usr_gname -usr_gdate
diff --git a/tools/mksurfdata_map/mksurfdata.pl b/tools/mksurfdata_map/mksurfdata.pl
index 0e45ed717d..bf14234e91 100755
--- a/tools/mksurfdata_map/mksurfdata.pl
+++ b/tools/mksurfdata_map/mksurfdata.pl
@@ -109,17 +109,20 @@ sub usage {
Default: $opts{'usr_mapdir'}
OPTIONS
+ NOTE: The three critical options are (-years, -glc_nec, and -ssp_rcp) they are marked as such.
+
-allownofile Allow the script to run even if one of the input files
does NOT exist.
-dinlc [or -l] Enter the directory location for inputdata
(default $opts{'csmdata'})
-debug [or -d] Do not actually run -- just print out what
would happen if ran.
- -dynpft "filename" Dynamic PFT/harvesting file to use
- (rather than create it on the fly)
- (must be consistent with first year)
+ -dynpft "filename" Dynamic PFT/harvesting file to use if you have a manual list you want to use
+ (rather than create it on the fly, must be consistent with first year)
+ (Normally NOT used)
-fast_maps Toggle fast mode which doesn't use the large mapping files
-glc_nec "number" Number of glacier elevation classes to use (by default $opts{'glc_nec'})
+ (CRITICAL OPTION)
-merge_gis If you want to use the glacier dataset that merges in
the Greenland Ice Sheet data that CISM uses (typically
used only if consistency with CISM is important)
@@ -134,7 +137,8 @@ sub usage {
-no_surfdata Do not output a surface dataset
This is useful if you only want a landuse_timeseries file
-years [or -y] "years" Simulation year(s) to run over (by default $opts{'years'})
- (can also be a simulation year range: i.e. 1850-2000)
+ (can also be a simulation year range: i.e. 1850-2000 or 1850-2100 for ssp_rcp future scenarios)
+ (CRITICAL OPTION)
-help [or -h] Display this help.
-rundir "directory" Directory to run in
@@ -143,6 +147,8 @@ sub usage {
-ssp_rcp "scenario-name" Shared Socioeconomic Pathway and Representative Concentration Pathway Scenario name(s).
"hist" for historical, otherwise in form of SSPn-m.m where n is the SSP number
and m.m is the radiative forcing in W/m^2 at the peak or 2100.
+ (normally use thiw with -years 1850-2100)
+ (CRITICAL OPTION)
-usrname "clm_usrdat_name" CLM user data name to find grid file with.