Source code for openscm_runner.adapters.ciceroscm_adapter.write_parameter_files
"""
Module that makes CICERO-SCM parameter files
"""
import os
from pathlib import Path
[docs]def splitall(path):
"""
Split path into each part, top catalogue on top, filename (if included) last
"""
out = Path(path).parts
return out
[docs]def check_pamset_consistency(pamset):
"""
Check consistency of parameter set so scenario_end is
equal to or earlier than model_end
"""
if "model_end" in pamset and "scenario_end" not in pamset:
pamset["scenario_end"] = pamset["model_end"]
elif "model_end" in pamset and pamset["scenario_end"] > pamset["model_end"]:
pamset["scenario_end"] = pamset["model_end"]
return pamset
[docs]class PARAMETERFILEWRITER: # pylint: disable=too-few-public-methods
"""
Class to write parameterfiles
"""
# pylint: disable=too-many-instance-attributes
# Eight is reasonable in this case.
def __init__(self, udir):
self.udir = udir
self._pamset_defaults = {
"model_end": 2500,
"scenario_start": 2015,
"scenario_end": 2500,
"lambda": "0.540",
"akapa": "0.341",
"cpi": "0.556",
"W": "1.897",
"rlamdo": "16.618",
"beto": "3.225",
"mixed": "107.277",
"dirso2_forc": "-0.457",
"indso2_forc": "-0.514",
"bc_forc": "0.200",
"oc_forc": "-0.103",
}
with open(
os.path.join(self.udir, "pam_RCMIP_test_klimsensdefault.scm"),
encoding="ascii",
) as origfile:
self.origfiledata = origfile.read()
[docs] def write_parameterfile(self, pamset, filedir):
"""
Make parameter file for single run
"""
scen = splitall(filedir)[-1]
filedir_to_pamfile = os.path.join(".", scen)
filedata = self.origfiledata
filedata = filedata.replace(
"output_rbs/test_rcmip",
os.path.join(filedir_to_pamfile, "outputfiles", "temp"),
)
filedata = filedata.replace("../input_RCP/", "")
filedata = filedata.replace("input/ssp434_conc_", "ssp245_conc_")
filedata = filedata.replace(
"input/ssp434_em_RCMIP.txt",
f"{filedir_to_pamfile}/inputfiles/{scen}_em.txt",
)
pamset = check_pamset_consistency(pamset)
for k, value in self._pamset_defaults.items():
old = f"{k} {value}"
if k in ("model_end", "scenario_start", "scenario_end"):
new = f"{k} {pamset.get(k, value)}"
print(f"{k} {pamset.get(k, value)}")
else:
new = f"{k} {pamset.get(k, float(value)):.4}"
filedata = filedata.replace(old, new)
with open(
os.path.join(filedir, "inputfiles", "pam_current.scm"),
"w",
encoding="ascii",
) as scfile:
scfile.write(filedata)