Skip to content

Commit cde4ac6

Browse files
authored
Merge pull request #292 from samsrabin/ssp-fix
Fix and improve anomaly forcings for ISSP cases
2 parents 44dfda4 + e71aa9a commit cde4ac6

6 files changed

+144
-139
lines changed

cime_config/stream_cdeps.py

+5
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,11 @@ def create_stream_xml(
336336
),
337337
)
338338
if var_key in valid_values:
339+
340+
# # Handle, e.g., 'bilinear' in namelist instead of bilinear (no quotes)
341+
mod_dict[var_key] = re.sub(r"[\"\']", "", mod_dict[var_key])
342+
343+
# Check that key is valid
339344
expect(
340345
mod_dict[var_key] in valid_values[var_key],
341346
"{} can only have values of {} for stream {} in file {}".format(

datm/cime_config/buildnml

+31-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
# pylint: disable=wildcard-import,unused-wildcard-import,wrong-import-position
1111

1212
import os, sys
13+
import re
1314

1415
_CDEPS_CONFIG = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir,os.pardir,"cime_config")
1516
_CIMEROOT = os.environ.get("CIMEROOT")
@@ -88,6 +89,19 @@ def _get_neon_data_availability(case, neonsite):
8889
expect(newestdate, "No tower data found on server for NEON site {}".format(neonsite))
8990
return None
9091

92+
####################################################################################
93+
def _check_datm_af_mismatch(anomaly_forcing, datm_mode):
94+
####################################################################################
95+
96+
# CMIP5 and CMIP6 anomalies were only generated relative to GSWP3v1
97+
is_cmip5_or_6 = any(x in anomaly_forcing for x in ["cmip5", "cmip6"])
98+
if is_cmip5_or_6 and datm_mode != "CLMGSWP3v1":
99+
raise SystemExit(
100+
"CMIP5 and CMIP6 anomalies were only generated relative for DATM_MODE CLMGSWP3v1."
101+
" To fix this error, do: ./xmlchange DATM_MODE=CLMGSWP3v1"
102+
)
103+
104+
91105
# pylint: disable=too-many-arguments,too-many-locals,too-many-branches,too-many-statements
92106
####################################################################################
93107
def _create_namelists(case, confdir, inst_string, infile, nmlgen, data_list_path):
@@ -115,6 +129,7 @@ def _create_namelists(case, confdir, inst_string, infile, nmlgen, data_list_path
115129
atm_grid = case.get_value("ATM_GRID")
116130
model_grid = case.get_value("GRID")
117131
comp_lnd = case.get_value("COMP_LND")
132+
compset = case.get_value("COMPSET")
118133

119134
# Check for incompatible options.
120135
if "CLM" in datm_mode and comp_lnd == "clm":
@@ -135,6 +150,7 @@ def _create_namelists(case, confdir, inst_string, infile, nmlgen, data_list_path
135150
logger.debug("DATM preso3 mode is {}".format(datm_preso3))
136151
logger.debug("DATM topo mode is {}".format(datm_topo))
137152
logger.debug("CLM_USRDAT_NAME is {}".format(clm_usrdat_name))
153+
logger.debug("COMPSET is {}".format(compset))
138154

139155
# Initialize namelist defaults
140156
config = {}
@@ -177,6 +193,17 @@ def _create_namelists(case, confdir, inst_string, infile, nmlgen, data_list_path
177193

178194
nmlgen.init_defaults(infile, config)
179195

196+
# Get anomaly forcing
197+
# First, look in namelist
198+
anomaly_forcing = nmlgen.get_value("anomaly_forcing")
199+
if not anomaly_forcing or anomaly_forcing[0] is None:
200+
# If not in namelist, check whether it's an SSP compset
201+
ssp = re.search(r"^SSP\d+_DATM", compset)
202+
if ssp:
203+
ssp = ssp.group().replace("_DATM", "")
204+
anomaly_forcing = ["Anomaly.Forcing.cmip6." + ssp.lower()]
205+
nmlgen.set_value("anomaly_forcing", anomaly_forcing)
206+
180207
# Generate datm_in
181208
namelist_file = os.path.join(confdir, "datm_in")
182209
nmlgen.write_output_file(namelist_file, data_list_path, groups=['datm_nml','const_forcing_nml'])
@@ -205,8 +232,11 @@ def _create_namelists(case, confdir, inst_string, infile, nmlgen, data_list_path
205232
bias_correct = nmlgen.get_value("bias_correct")
206233
if bias_correct is not None:
207234
streamlist.append(bias_correct)
235+
236+
# Set anomaly forcing in datm.streams.xml
208237
anomaly_forcing = nmlgen.get_value("anomaly_forcing")
209-
if anomaly_forcing[0] is not None:
238+
if anomaly_forcing[0] is not None and anomaly_forcing[0] != "none":
239+
_check_datm_af_mismatch(anomaly_forcing[0], datm_mode)
210240
streamlist += anomaly_forcing
211241

212242
# Generate datm.streams.xml

datm/cime_config/namelist_definition_datm.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@
227227
<type>char(10)</type>
228228
<category>datm</category>
229229
<group>datm_nml</group>
230-
<valid_values>Anomaly.Forcing.Precip,Anomaly.Forcing.Temperature,Anomaly.Forcing.Pressure,Anomaly.Forcing.Humidity,Anomaly.Forcing.Uwind,Anomaly.Forcing.Vwind,Anomaly.Forcing.Shortwave,Anomaly.Forcing.Longwave</valid_values>
230+
<valid_values>none,Anomaly.Forcing.cmip5.rcp45,Anomaly.Forcing.cmip6.ssp126,Anomaly.Forcing.cmip6.ssp245,Anomaly.Forcing.cmip6.ssp370,Anomaly.Forcing.cmip6.ssp585</valid_values>
231231
<desc>
232232
If set, include anomaly forcing streams in namelist.
233233
</desc>

datm/cime_config/stream_definition_datm.xml

+67-127
Original file line numberDiff line numberDiff line change
@@ -217,16 +217,13 @@
217217
topo.cplhist
218218
219219
========================
220-
optional streams anonomly forcing (turned on and set my datm_nml variable anomoly_forcing
220+
optional streams anonomly forcing (turned on and set my datm_nml variable anomaly_forcing
221221
========================
222-
Anomaly.Forcing.Humidity
223-
Anomaly.Forcing.Longwave
224-
Anomaly.Forcing.Precip
225-
Anomaly.Forcing.Pressure
226-
Anomaly.Forcing.Shortwave
227-
Anomaly.Forcing.Temperature
228-
Anomaly.Forcing.Uwind
229-
Anomaly.Forcing.Vwind
222+
Anomaly.Forcing.cmip5.rcp45
223+
Anomaly.Forcing.cmip6.ssp126
224+
Anomaly.Forcing.cmip6.ssp245
225+
Anomaly.Forcing.cmip6.ssp370
226+
Anomaly.Forcing.cmip6.ssp585
230227
231228
========================
232229
optional streams bias correction (turned on and set my datm_nml variable bias_correct)
@@ -1280,49 +1277,25 @@
12801277
</stream_entry>
12811278

12821279
<!-- =================== -->
1283-
<!-- anomoly forcing streams -->
1280+
<!-- anomaly forcing streams -->
12841281
<!-- =================== -->
12851282

1286-
<stream_entry name="Anomaly.Forcing.Precip">
1283+
<stream_entry name="Anomaly.Forcing.cmip5.rcp45">
12871284
<stream_meshfile>
1288-
<meshfile>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/domain.permafrostRCN_P2.c2013.nc</meshfile>
1285+
<meshfile>$DIN_LOC_ROOT/share/meshes/fv0.9x1.25_141008_polemod_ESMFmesh.nc</meshfile>
12891286
</stream_meshfile>
12901287
<stream_datafiles>
1291-
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/af.pr.ccsm4.rcp45.2006-2300.nc</file>
1288+
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/af.allvars.ccsm4.rcp45.2006-2300.nc</file>
12921289
</stream_datafiles>
12931290
<stream_datavars>
1291+
<var>huss Sa_shum_af</var>
12941292
<var>pr Faxa_prec_af</var>
1295-
</stream_datavars>
1296-
<stream_lev_dimname>null</stream_lev_dimname>
1297-
<stream_mapalgo>
1298-
<mapalgo>bilinear</mapalgo>
1299-
</stream_mapalgo>
1300-
<stream_vectors>null</stream_vectors>
1301-
<stream_year_align>2006</stream_year_align>
1302-
<stream_year_first>2006</stream_year_first>
1303-
<stream_year_last>2300</stream_year_last>
1304-
<stream_offset>0</stream_offset>
1305-
<stream_tintalgo>
1306-
<tintalgo>nearest</tintalgo>
1307-
</stream_tintalgo>
1308-
<stream_taxmode>
1309-
<taxmode>cycle</taxmode>
1310-
</stream_taxmode>
1311-
<stream_dtlimit>
1312-
<dtlimit>1.5</dtlimit>
1313-
</stream_dtlimit>
1314-
<stream_readmode>single</stream_readmode>
1315-
</stream_entry>
1316-
1317-
<stream_entry name="Anomaly.Forcing.Temperature">
1318-
<stream_meshfile>
1319-
<meshfile>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/domain.permafrostRCN_P2.c2013.nc</meshfile>
1320-
</stream_meshfile>
1321-
<stream_datafiles>
1322-
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/af.tas.ccsm4.rcp45.2006-2300.nc</file>
1323-
</stream_datafiles>
1324-
<stream_datavars>
1293+
<var>ps Sa_pbot_af</var>
1294+
<var>rlds Faxa_lwdn_af</var>
1295+
<var>rsds Faxa_swdn_af</var>
13251296
<var>tas Sa_tbot_af</var>
1297+
<var>uas Sa_u_af</var>
1298+
<var>vas Sa_v_af</var>
13261299
</stream_datavars>
13271300
<stream_lev_dimname>null</stream_lev_dimname>
13281301
<stream_mapalgo>
@@ -1345,24 +1318,31 @@
13451318
<stream_readmode>single</stream_readmode>
13461319
</stream_entry>
13471320

1348-
<stream_entry name="Anomaly.Forcing.Pressure">
1321+
<stream_entry name="Anomaly.Forcing.cmip6.ssp126">
13491322
<stream_meshfile>
1350-
<meshfile>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/domain.permafrostRCN_P2.c2013.nc</meshfile>
1323+
<meshfile>$DIN_LOC_ROOT/share/meshes/fv0.9x1.25_141008_polemod_ESMFmesh.nc</meshfile>
13511324
</stream_meshfile>
13521325
<stream_datafiles>
1353-
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/af.ps.ccsm4.rcp45.2006-2300.nc</file>
1326+
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/CMIP6-SSP1-2.6/af.allvars.CESM.SSP1-2.6.2015-2100_c20220628.nc</file>
13541327
</stream_datafiles>
13551328
<stream_datavars>
1329+
<var>huss Sa_shum_af</var>
1330+
<var>pr Faxa_prec_af</var>
13561331
<var>ps Sa_pbot_af</var>
1332+
<var>rlds Faxa_lwdn_af</var>
1333+
<var>rsds Faxa_swdn_af</var>
1334+
<var>tas Sa_tbot_af</var>
1335+
<var>uas Sa_u_af</var>
1336+
<var>vas Sa_v_af</var>
13571337
</stream_datavars>
13581338
<stream_lev_dimname>null</stream_lev_dimname>
13591339
<stream_mapalgo>
13601340
<mapalgo>bilinear</mapalgo>
13611341
</stream_mapalgo>
13621342
<stream_vectors>null</stream_vectors>
1363-
<stream_year_align>2006</stream_year_align>
1364-
<stream_year_first>2006</stream_year_first>
1365-
<stream_year_last>2300</stream_year_last>
1343+
<stream_year_align>2015</stream_year_align>
1344+
<stream_year_first>2015</stream_year_first>
1345+
<stream_year_last>2100</stream_year_last>
13661346
<stream_offset>0</stream_offset>
13671347
<stream_tintalgo>
13681348
<tintalgo>nearest</tintalgo>
@@ -1376,86 +1356,31 @@
13761356
<stream_readmode>single</stream_readmode>
13771357
</stream_entry>
13781358

1379-
<stream_entry name="Anomaly.Forcing.Humidity">
1359+
<stream_entry name="Anomaly.Forcing.cmip6.ssp245">
13801360
<stream_meshfile>
1381-
<meshfile>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/domain.permafrostRCN_P2.c2013.nc</meshfile>
1361+
<meshfile>$DIN_LOC_ROOT/share/meshes/fv0.9x1.25_141008_polemod_ESMFmesh.nc</meshfile>
13821362
</stream_meshfile>
13831363
<stream_datafiles>
1384-
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/af.huss.ccsm4.rcp45.2006-2300.nc</file>
1364+
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/CMIP6-SSP2-4.5/af.allvars.CESM.SSP2-4.5.2015-2100_c20220628.nc</file>
13851365
</stream_datafiles>
13861366
<stream_datavars>
13871367
<var>huss Sa_shum_af</var>
1388-
</stream_datavars>
1389-
<stream_lev_dimname>null</stream_lev_dimname>
1390-
<stream_mapalgo>
1391-
<mapalgo>bilinear</mapalgo>
1392-
</stream_mapalgo>
1393-
<stream_vectors>null</stream_vectors>
1394-
<stream_year_align>2006</stream_year_align>
1395-
<stream_year_first>2300</stream_year_first>
1396-
<stream_year_last>2300</stream_year_last>
1397-
<stream_offset>0</stream_offset>
1398-
<stream_tintalgo>
1399-
<tintalgo>nearest</tintalgo>
1400-
</stream_tintalgo>
1401-
<stream_taxmode>
1402-
<taxmode>cycle</taxmode>
1403-
</stream_taxmode>
1404-
<stream_dtlimit>
1405-
<dtlimit>1.5</dtlimit>
1406-
</stream_dtlimit>
1407-
<stream_readmode>single</stream_readmode>
1408-
</stream_entry>
1409-
1410-
<stream_entry name="Anomaly.Forcing.Uwind">
1411-
<stream_meshfile>
1412-
<meshfile>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/domain.permafrostRCN_P2.c2013.nc</meshfile>
1413-
</stream_meshfile>
1414-
<stream_datafiles>
1415-
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/af.uas.ccsm4.rcp45.2006-2300.nc</file>
1416-
</stream_datafiles>
1417-
<stream_datavars>
1368+
<var>pr Faxa_prec_af</var>
1369+
<var>ps Sa_pbot_af</var>
1370+
<var>rlds Faxa_lwdn_af</var>
1371+
<var>rsds Faxa_swdn_af</var>
1372+
<var>tas Sa_tbot_af</var>
14181373
<var>uas Sa_u_af</var>
1419-
</stream_datavars>
1420-
<stream_lev_dimname>null</stream_lev_dimname>
1421-
<stream_mapalgo>
1422-
<mapalgo>bilinear</mapalgo>
1423-
</stream_mapalgo>
1424-
<stream_vectors>null</stream_vectors>
1425-
<stream_year_align>2006</stream_year_align>
1426-
<stream_year_first>2006</stream_year_first>
1427-
<stream_year_last>2300</stream_year_last>
1428-
<stream_offset>0</stream_offset>
1429-
<stream_tintalgo>
1430-
<tintalgo>nearest</tintalgo>
1431-
</stream_tintalgo>
1432-
<stream_taxmode>
1433-
<taxmode>cycle</taxmode>
1434-
</stream_taxmode>
1435-
<stream_dtlimit>
1436-
<dtlimit>1.5</dtlimit>
1437-
</stream_dtlimit>
1438-
<stream_readmode>single</stream_readmode>
1439-
</stream_entry>
1440-
1441-
<stream_entry name="Anomaly.Forcing.Vwind">
1442-
<stream_meshfile>
1443-
<meshfile>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/domain.permafrostRCN_P2.c2013.nc</meshfile>
1444-
</stream_meshfile>
1445-
<stream_datafiles>
1446-
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/af.vas.ccsm4.rcp45.2006-2300.nc</file>
1447-
</stream_datafiles>
1448-
<stream_datavars>
14491374
<var>vas Sa_v_af</var>
14501375
</stream_datavars>
14511376
<stream_lev_dimname>null</stream_lev_dimname>
14521377
<stream_mapalgo>
14531378
<mapalgo>bilinear</mapalgo>
14541379
</stream_mapalgo>
14551380
<stream_vectors>null</stream_vectors>
1456-
<stream_year_align>2006</stream_year_align>
1457-
<stream_year_first>2006</stream_year_first>
1458-
<stream_year_last>2300</stream_year_last>
1381+
<stream_year_align>2015</stream_year_align>
1382+
<stream_year_first>2015</stream_year_first>
1383+
<stream_year_last>2100</stream_year_last>
14591384
<stream_offset>0</stream_offset>
14601385
<stream_tintalgo>
14611386
<tintalgo>nearest</tintalgo>
@@ -1469,24 +1394,31 @@
14691394
<stream_readmode>single</stream_readmode>
14701395
</stream_entry>
14711396

1472-
<stream_entry name="Anomaly.Forcing.Shortwave">
1397+
<stream_entry name="Anomaly.Forcing.cmip6.ssp370">
14731398
<stream_meshfile>
1474-
<meshfile>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/domain.permafrostRCN_P2.c2013.nc</meshfile>
1399+
<meshfile>$DIN_LOC_ROOT/share/meshes/fv0.9x1.25_141008_polemod_ESMFmesh.nc</meshfile>
14751400
</stream_meshfile>
14761401
<stream_datafiles>
1477-
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/af.rsds.ccsm4.rcp45.2006-2300.nc</file>
1402+
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/CMIP6-SSP3-7.0/af.allvars.CESM.SSP3-7.0.2015-2100_c20220628.nc</file>
14781403
</stream_datafiles>
14791404
<stream_datavars>
1405+
<var>huss Sa_shum_af</var>
1406+
<var>pr Faxa_prec_af</var>
1407+
<var>ps Sa_pbot_af</var>
1408+
<var>rlds Faxa_lwdn_af</var>
14801409
<var>rsds Faxa_swdn_af</var>
1410+
<var>tas Sa_tbot_af</var>
1411+
<var>uas Sa_u_af</var>
1412+
<var>vas Sa_v_af</var>
14811413
</stream_datavars>
14821414
<stream_lev_dimname>null</stream_lev_dimname>
14831415
<stream_mapalgo>
14841416
<mapalgo>bilinear</mapalgo>
14851417
</stream_mapalgo>
14861418
<stream_vectors>null</stream_vectors>
1487-
<stream_year_align>2006</stream_year_align>
1488-
<stream_year_first>2006</stream_year_first>
1489-
<stream_year_last>2300</stream_year_last>
1419+
<stream_year_align>2015</stream_year_align>
1420+
<stream_year_first>2015</stream_year_first>
1421+
<stream_year_last>2100</stream_year_last>
14901422
<stream_offset>0</stream_offset>
14911423
<stream_tintalgo>
14921424
<tintalgo>nearest</tintalgo>
@@ -1500,24 +1432,31 @@
15001432
<stream_readmode>single</stream_readmode>
15011433
</stream_entry>
15021434

1503-
<stream_entry name="Anomaly.Forcing.Longwave">
1435+
<stream_entry name="Anomaly.Forcing.cmip6.ssp585">
15041436
<stream_meshfile>
1505-
<meshfile>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/domain.permafrostRCN_P2.c2013.nc</meshfile>
1437+
<meshfile>$DIN_LOC_ROOT/share/meshes/fv0.9x1.25_141008_polemod_ESMFmesh.nc</meshfile>
15061438
</stream_meshfile>
15071439
<stream_datafiles>
1508-
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/af.rlds.ccsm4.rcp45.2006-2300.nc</file>
1440+
<file>$DIN_LOC_ROOT/atm/datm7/anomaly_forcing/CMIP6-SSP5-8.5/af.allvars.CESM.SSP5-8.5.2015-2100_c20220628.nc</file>
15091441
</stream_datafiles>
15101442
<stream_datavars>
1443+
<var>huss Sa_shum_af</var>
1444+
<var>pr Faxa_prec_af</var>
1445+
<var>ps Sa_pbot_af</var>
15111446
<var>rlds Faxa_lwdn_af</var>
1447+
<var>rsds Faxa_swdn_af</var>
1448+
<var>tas Sa_tbot_af</var>
1449+
<var>uas Sa_u_af</var>
1450+
<var>vas Sa_v_af</var>
15121451
</stream_datavars>
15131452
<stream_lev_dimname>null</stream_lev_dimname>
15141453
<stream_mapalgo>
15151454
<mapalgo>bilinear</mapalgo>
15161455
</stream_mapalgo>
15171456
<stream_vectors>null</stream_vectors>
1518-
<stream_year_align>2006</stream_year_align>
1519-
<stream_year_first>2006</stream_year_first>
1520-
<stream_year_last>2300</stream_year_last>
1457+
<stream_year_align>2015</stream_year_align>
1458+
<stream_year_first>2015</stream_year_first>
1459+
<stream_year_last>2100</stream_year_last>
15211460
<stream_offset>0</stream_offset>
15221461
<stream_tintalgo>
15231462
<tintalgo>nearest</tintalgo>
@@ -1531,6 +1470,7 @@
15311470
<stream_readmode>single</stream_readmode>
15321471
</stream_entry>
15331472

1473+
15341474
<!-- =================== -->
15351475
<!-- datm_mode CORE2_NYF -->
15361476
<!-- =================== -->

0 commit comments

Comments
 (0)