diff --git a/.gitignore b/.gitignore index b25c15b8..0d547507 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,179 @@ -*~ +gcmpy/sync.sh +gcmpy/jinjafy.py + +####################### generic ######################### + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc diff --git a/AGCM.rc.tmpl b/AGCM.rc.tmpl index 62eb43d3..1b12ca6c 100644 --- a/AGCM.rc.tmpl +++ b/AGCM.rc.tmpl @@ -10,33 +10,33 @@ # 4) if you want fewer cores, half NX (for 0.5), then half NY for (0.25) and so on... # 5) when you hit an odd number we need to get more creative # 6) if you have questions send Bill Putman a Teams message -NX: @NX -NY: @NY - -IOSERVER_NODES: @NUM_OSERVER_NODES -NUM_BACKEND_PES: @NUM_BACKEND_PES - -DATAATM.GRID_TYPE: @GRID_TYPE -DATAATM.GRIDNAME: @AGCM_GRIDNAME -DATAATM.NF: @AGCM_NF -DATAATM.LM: @AGCM_LM -DATAATM.IM_WORLD: @AGCM_IM - -AGCM_IM: @AGCM_IM -AGCM_JM: @AGCM_JM -AGCM_LM: @AGCM_LM -AGCM_GRIDNAME: @AGCM_GRIDNAME - -AGCM.GRID_TYPE: @GRID_TYPE -AGCM.GRIDNAME: @AGCM_GRIDNAME -@CUBE_AGCM AGCM.NF: @AGCM_NF -AGCM.LM: @AGCM_LM -AGCM.IM_WORLD: @AGCM_IM -@LATLON_AGCM AGCM.JM_WORLD: @AGCM_JM - -@CONUS AGCM.STRETCH_FACTOR: @STRETCH_FACTOR -@CONUS AGCM.TARGET_LAT: 39.5 -@CONUS AGCM.TARGET_LON: -98.35 +NX: {{ NX }} +NY: {{ NY }} + +IOSERVER_NODES: {{ NUM_OSERVER_NODES }} +NUM_BACKEND_PES: {{ NUM_BACKEND_PES }} + +DATAATM.GRID_TYPE: {{ GRID_TYPE }} +DATAATM.GRIDNAME: {{ AGCM_GRIDNAME }} +DATAATM.NF: {{ AGCM_NF }} +DATAATM.LM: {{ AGCM_LM }} +DATAATM.IM_WORLD: {{ AGCM_IM }} + +AGCM_IM: {{ AGCM_IM }} +AGCM_JM: {{ AGCM_JM }} +AGCM_LM: {{ AGCM_LM }} +AGCM_GRIDNAME: {{ AGCM_GRIDNAME }} + +AGCM.GRID_TYPE: {{ GRID_TYPE }} +AGCM.GRIDNAME: {{ AGCM_GRIDNAME }} +{{ CUBE_AGCM }} AGCM.NF: {{ AGCM_NF }} +AGCM.LM: {{ AGCM_LM }} +AGCM.IM_WORLD: {{ AGCM_IM }} +{{ LATLON_AGCM }} AGCM.JM_WORLD: {{ AGCM_JM }} + +{{ CONUS }} AGCM.STRETCH_FACTOR: {{ STRETCH_FACTOR }} +{{ CONUS }} AGCM.TARGET_LAT: 39.5 +{{ CONUS }} AGCM.TARGET_LON: -98.35 ########################################################### # debug options @@ -56,27 +56,27 @@ AGCM.IM_WORLD: @AGCM_IM # the defaults are most ideal # ---------------------------------------- ADJUST_DT: .FALSE. -GOCART2G_DT: @CHEM_DT -GOCART_DT: @CHEM_DT -HEMCO_DT: @CHEM_DT -ACHEM_DT: @CHEM_DT -PCHEM_DT: @CHEM_DT -GF_DT: @CONV_DT -UW_DT: @CONV_DT +GOCART2G_DT: {{ CHEM_DT }} +GOCART_DT: {{ CHEM_DT }} +HEMCO_DT: {{ CHEM_DT }} +ACHEM_DT: {{ CHEM_DT }} +PCHEM_DT: {{ CHEM_DT }} +GF_DT: {{ CONV_DT }} +UW_DT: {{ CONV_DT }} ########################################################### ########################################################### # dynamics options # ---------------------------------------- -DYCORE: @DYCORE +DYCORE: {{ DYCORE }} ########################################################### ########################################################### # radiation options # ---------------------------------------- - SOLAR_DT: @SOLAR_DT - IRRAD_DT: @IRRAD_DT -SATSIM_DT: @IRRAD_DT + SOLAR_DT: {{ SOLAR_DT }} + IRRAD_DT: {{ IRRAD_DT }} +SATSIM_DT: {{ IRRAD_DT }} SOLARAvrg: 0 IRRADAvrg: 0 EOT: .TRUE. @@ -86,19 +86,19 @@ ORBIT_ANAL2B: .TRUE. ########################################################### # BACM_1M microphysics options # ---------------------------------------- -@BACM_1M_CLDMICR_OPTION: BACM_1M +{{ BACM_1M_ }}CLDMICR_OPTION: BACM_1M ########################################################### ########################################################### # GFDL_1M microphysics options # ---------------------------------------- -@GFDL_1M_CLDMICR_OPTION: GFDL_1M +{{ GFDL_1M_ }}CLDMICR_OPTION: GFDL_1M ########################################################### ########################################################### # MGB2_2M microphysics options # ---------------------------------------- -@MGB2_2M_CLDMICR_OPTION: MGB2_2M +{{ MGB2_2M_ }}CLDMICR_OPTION: MGB2_2M ########################################################### ########################################################### @@ -110,7 +110,7 @@ SHALLOW_OPTION: UW ########################################################### # convection scheme options # ---------------------------------------- -CONVPAR_OPTION: @CONVPAR_OPTION +CONVPAR_OPTION: {{ CONVPAR_OPTION }} # Convective plumes to be activated (1 true, 0 false) DEEP: 1 SHALLOW: 0 @@ -127,56 +127,55 @@ CLOSURE_CONGESTUS: 3 ########################################################### # TRB/GWD Parameterization # ------------------------ -NCAR_NRDG: @NCAR_NRDG +NCAR_NRDG: {{ NCAR_NRDG }} ########################################################### -########################################################### # Enable wet scavenging diagnostics # NOTE: this section should be commented out when running gocart.data # 2D mass weighted vertical integrated moist scavenging increments -@HIST_GOCARTMCHEMTRI_increments:: -@HIST_GOCARTDU::DU default -@HIST_GOCARTSS::SS default -@HIST_GOCARTSU::SO4 default -@HIST_GOCARTCA.bc::CA.bcphilic default -@HIST_GOCARTCA.br::CA.brphilic default -@HIST_GOCARTCA.oc::CA.ocphilic default -@HIST_GOCARTNI::NO3an1 "NI::NO3an2,NI::NO3an3" -@HIST_GOCARTPCHEM::OX default -@HIST_GOCARTNI::NH3 default -@HIST_GOCARTNI::NH4a default -@HIST_GOCART:: +{{ HIST_GOCART }}MCHEMTRI_increments:: +{{ HIST_GOCART }}DU::DU default +{{ HIST_GOCART }}SS::SS default +{{ HIST_GOCART }}SU::SO4 default +{{ HIST_GOCART }}CA.bc::CA.bcphilic default +{{ HIST_GOCART }}CA.br::CA.brphilic default +{{ HIST_GOCART }}CA.oc::CA.ocphilic default +{{ HIST_GOCART }}NI::NO3an1 "NI::NO3an2,NI::NO3an3" +{{ HIST_GOCART }}PCHEM::OX default +{{ HIST_GOCART }}NI::NH3 default +{{ HIST_GOCART }}NI::NH4a default +{{ HIST_GOCART }}:: # 3D moist scavenging increments -@HIST_GOCARTMTRI_increments:: -@HIST_GOCARTDU::DU default -@HIST_GOCARTSS::SS default -@HIST_GOCARTSU::SO4 default -@HIST_GOCARTCA.bc::CA.bcphilic default -@HIST_GOCARTCA.br::CA.brphilic default -@HIST_GOCARTCA.oc::CA.ocphilic default -@HIST_GOCARTNI::NO3an1 "NI::NO3an2,NI::NO3an3" -@HIST_GOCARTPCHEM::OX default -@HIST_GOCART:: +{{ HIST_GOCART }}MTRI_increments:: +{{ HIST_GOCART }}DU::DU default +{{ HIST_GOCART }}SS::SS default +{{ HIST_GOCART }}SU::SO4 default +{{ HIST_GOCART }}CA.bc::CA.bcphilic default +{{ HIST_GOCART }}CA.br::CA.brphilic default +{{ HIST_GOCART }}CA.oc::CA.ocphilic default +{{ HIST_GOCART }}NI::NO3an1 "NI::NO3an2,NI::NO3an3" +{{ HIST_GOCART }}PCHEM::OX default +{{ HIST_GOCART }}:: ########################################################### ########################################################### # Ocean Model Configuration Parameters # ------------------------------------ -OGCM.GRID_TYPE: @OGCM_GRID_TYPE -OGCM.GRIDNAME: @OGCM_GRIDNAME -OGCM.IM_WORLD: @OGCM_IM -OGCM.JM_WORLD: @OGCM_JM -OGCM.LM: @OGCM_LM -@COUPLED OGCM.NX: @OGCM_NX -@COUPLED OGCM.NY: @OGCM_NY -@MOM5 OGCM.GRIDSPEC: MAPL_Tripolar.nc -@MOM6 OGCM.GRIDSPEC: MAPL_Tripolar.nc -@MIT OGCM.GRIDSPEC: mit.ascii -@MIT OCEAN_DIR: mitocean_run -@DATAOCEAN @LATLON_OGCM OGCM.POLE: 'PE' -@DATAOCEAN @LATLON_OGCM OGCM.DATELINE: 'DE' -@DATAOCEAN @CUBE_OGCM OGCM.NF: @OGCM_NF -OGCM_RUN_DT: @OCEAN_DT +OGCM.GRID_TYPE: {{ OGCM_GRID_TYPE }} +OGCM.GRIDNAME: {{ OGCM_GRIDNAME }} +OGCM.IM_WORLD: {{ OGCM_IM }} +OGCM.JM_WORLD: {{ OGCM_JM }} +OGCM.LM: {{ OGCM_LM }} +{{ COUPLED }} OGCM.NX: {{ OGCM_NX }} +{{ COUPLED }} OGCM.NY: {{ OGCM_NY }} +{{ MOM5 }} OGCM.GRIDSPEC: MAPL_Tripolar.nc +{{ MOM6 }} OGCM.GRIDSPEC: MAPL_Tripolar.nc +{{ MIT }} OGCM.GRIDSPEC: mit.ascii +{{ MIT }} OCEAN_DIR: mitocean_run +{{ DATAOCEAN }} {{ LATLON_OGCM }} OGCM.POLE: 'PE' +{{ DATAOCEAN }} {{ LATLON_OGCM }} OGCM.DATELINE: 'DE' +{{ DATAOCEAN }} {{ CUBE_OGCM }} OGCM.NF: {{ OGCM_NF }} +OGCM_RUN_DT: {{ OCEAN_DT }} ########################################################### ############################################################################################## #### #### @@ -204,7 +203,7 @@ PRINTRC: 1 #--------------------------------------------------------------- PARALLEL_READFORCING: 0 # The num_readers should be set to multiple of 6 if READ_RESTART_BY_FACE is set to YES -NUM_READERS: @NUM_READERS +NUM_READERS: {{ NUM_READERS }} # The num_writers should be set to multiple of 6 if WRITE_RESTART_BY_FACE is set to YES NUM_WRITERS: 1 @@ -215,16 +214,16 @@ READ_RESTART_BY_FACE: NO WRITE_RESTART_BY_FACE: NO # Write restarts by oserver (Default: NO) -WRITE_RESTART_BY_OSERVER: @RESTART_BY_OSERVER +WRITE_RESTART_BY_OSERVER: {{ RESTART_BY_OSERVER }} # Active observer when desired # ---------------------------- -BKG_FREQUENCY: @OBSERVER_FRQ +BKG_FREQUENCY: {{ OBSERVER_FRQ }} # Resolution of state passed to atmos analysis # -------------------------------------------- -ANA_GRIDNAME: PC@AGCM_IMx@AGCM_JM-DC -ANA_LM: @AGCM_LM +ANA_GRIDNAME: PC{{ AGCM_IM }}x{{ AGCM_JM }}-DC +ANA_LM: {{ AGCM_LM }} # Restart Record Parameters # ------------------------- @@ -356,23 +355,23 @@ RECORD_REF_TIME: >>>REFTIME<<< >>>FCSTIME<<< # Typical Exact REPLAY Configuration # ---------------------------------- # REPLAY_MODE: Exact -# REPLAY_FILE: rs/Y%y4/M%m2/@REPLAY_ANA_EXPID.agcm_import_rst.%y4%m2%d2_%h2z.bin -# REPLAY_FILE09: rs/Y%y4/M%m2/@REPLAY_ANA_EXPID.agcm09_import_rst.%y4%m2%d2_%h2z.bin +# REPLAY_FILE: rs/Y%y4/M%m2/{{ REPLAY_ANA_EXPID }}.agcm_import_rst.%y4%m2%d2_%h2z.bin +# REPLAY_FILE09: rs/Y%y4/M%m2/{{ REPLAY_ANA_EXPID }}.agcm09_import_rst.%y4%m2%d2_%h2z.bin # REPLAY_FILE_FREQUENCY: 10800 # REPLAY_FILE_REFERENCE_TIME: 000000 # Typical Regular REPLAY Configuration # ------------------------------------ # REPLAY_MODE: Regular -# REPLAY_FILE: ana/Y%y4/M%m2/@REPLAY_ANA_EXPID.ana.eta.%y4%m2%d2_%h2z.nc4 -# REPLAY_FILE09: ana/Y%y4/M%m2/@REPLAY_ANA_EXPID.ana09.eta.%y4%m2%d2_%h2z.nc4 +# REPLAY_FILE: ana/Y%y4/M%m2/{{ REPLAY_ANA_EXPID }}.ana.eta.%y4%m2%d2_%h2z.nc4 +# REPLAY_FILE09: ana/Y%y4/M%m2/{{ REPLAY_ANA_EXPID }}.ana09.eta.%y4%m2%d2_%h2z.nc4 # REPLAY_FILE_FREQUENCY: 10800 # REPLAY_FILE_REFERENCE_TIME: 000000 # MERRA-2 Regular REPLAY Configuration # -------------------------------------------- #M2 REPLAY_ANA_EXPID: MERRA-2 -#M2 REPLAY_ANA_LOCATION: @M2_REPLAY_ANA_LOCATION +#M2 REPLAY_ANA_LOCATION: {{ M2_REPLAY_ANA_LOCATION }} #M2 REPLAY_MODE: Regular #M2 REPLAY_FILE: ana/MERRA2_all/Y%y4/M%m2/MERRA2.ana.eta.%y4%m2%d2_%h2z.nc4 #M2 MKIAU_JCAP: 62 @@ -415,21 +414,21 @@ RECORD_REF_TIME: >>>REFTIME<<< >>>FCSTIME<<< # 4DIAU (recreate analysis tendency on the fly) # --------------------------------------------- -#@4DIAUDAS AINC_FILE: @EXPID.ana.eta.%y4%m2%d2_%h2%n2z.nc4 -#@4DIAUDAS NUDGE_STATE: YES -##@4DIAUDAS TAUANL: 3600 -#@4DIAUDAS AGCM_IMPORT_RESTART_FILE: agcm_import_rst.>>>ANA0YYYYMMDDHHMN<<>>ANA0YYYYMMDDHHMN<<>>REFTIME<<< >>>FCSTIME<<< # REPLAY_V: YES or NO # (Default: YES) # REPLAY_T: YES or NO # (Default: YES) # REPLAY_QV: YES or NO # (Default: YES) -@REGULAR_REPLAY_GMAO REPLAY_O3: YES or NO # (Default: YES) -@REGULAR_REPLAY_NCEP REPLAY_O3: YES or NO # (Default: YES) -@REGULAR_REPLAY_ECMWF REPLAY_O3: YES or NO # (Default: YES) +{{ REGULAR_REPLAY_GMAO }} REPLAY_O3: YES or NO # (Default: YES) +{{ REGULAR_REPLAY_NCEP }} REPLAY_O3: YES or NO # (Default: YES) +{{ REGULAR_REPLAY_ECMWF }} REPLAY_O3: YES or NO # (Default: YES) # REPLAY_TS: YES or NO # (Default: NO) # # Regular REPLAY Remapping and Blending Variables # ----------------------------------------------- # REPLAY_REMAP: YES # Default = YES, Remap ANA Data to BKG Topography -@REGULAR_REPLAY_ECMWF REPLAY_DAMPBEG: 1000.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) -@REGULAR_REPLAY_ECMWF REPLAY_DAMPEND: 5000.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) -@REGULAR_REPLAY_GMAO REPLAY_DAMPBEG: 100.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) -@REGULAR_REPLAY_GMAO REPLAY_DAMPEND: 5000.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) -@REGULAR_REPLAY_NCEP REPLAY_DAMPBEG: 1000.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) -@REGULAR_REPLAY_NCEP REPLAY_DAMPEND: 5000.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) -@REGULAR_REPLAY REPLAY_SHUTOFF: 21600 # ShutOff Replay after 6-hours of Integration -@REGULAR_REPLAY REPLAY_WINDFIX: YES # Apply windfix to force vertically-integrated analysis divergence increment to zero +{{ REGULAR_REPLAY_ECMWF }} REPLAY_DAMPBEG: 1000.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) +{{ REGULAR_REPLAY_ECMWF }} REPLAY_DAMPEND: 5000.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) +{{ REGULAR_REPLAY_GMAO }} REPLAY_DAMPBEG: 100.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) +{{ REGULAR_REPLAY_GMAO }} REPLAY_DAMPEND: 5000.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) +{{ REGULAR_REPLAY_NCEP }} REPLAY_DAMPBEG: 1000.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) +{{ REGULAR_REPLAY_NCEP }} REPLAY_DAMPEND: 5000.0 # Default = 1, Linearly Damp Increments between DAMPBEG & DAMPEND (Pascals) +{{ REGULAR_REPLAY }} REPLAY_SHUTOFF: 21600 # ShutOff Replay after 6-hours of Integration +{{ REGULAR_REPLAY }} REPLAY_WINDFIX: YES # Apply windfix to force vertically-integrated analysis divergence increment to zero # # REPLAY_BLEND_QV_AT_TP: .FALSE. # Default = FALSE, Blend QV to BKG upwards from tropopause # @@ -585,7 +584,7 @@ RECORD_REF_TIME: >>>REFTIME<<< >>>FCSTIME<<< # 1 : Catchment # 2 : CatchmentCNCLM40 # ------------------------------------------------------------ -LSM_CHOICE: @LSM_CHOICE +LSM_CHOICE: {{ LSM_CHOICE }} # Apply increments from LDAS? # 0 : no (default) @@ -620,233 +619,233 @@ LSM_CHOICE: @LSM_CHOICE # AGCM_INTERNAL = BIAS Correction Increment: BIAS(n+1) = ALPHA*IAU(n) + BETA*BIAS(n) # ---------------------------------------------------------------------------------- -@FORCEDASAGCM_IMPORT_RESTART_FILE: agcm_import_rst +{{ FORCEDAS }}AGCM_IMPORT_RESTART_FILE: agcm_import_rst -@FORCEGCMAGCM_INTERNAL_RESTART_FILE: agcm_internal_rst -@FORCEGCMAGCM_INTERNAL_CHECKPOINT_FILE: agcm_internal_checkpoint -@FORCEGCMAGCM_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ FORCEGCM }}AGCM_INTERNAL_RESTART_FILE: agcm_internal_rst +{{ FORCEGCM }}AGCM_INTERNAL_CHECKPOINT_FILE: agcm_internal_checkpoint +{{ FORCEGCM }}AGCM_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@FORCEGCMAGCM_ALPHA: 0.000 -@FORCEGCMAGCM_BETA: 1.000 +{{ FORCEGCM }}AGCM_ALPHA: 0.000 +{{ FORCEGCM }}AGCM_BETA: 1.000 -MAPL_ENABLE_BOOTSTRAP: @BOOT +MAPL_ENABLE_BOOTSTRAP: {{ BOOT }} # Required AGCM Model Restart Files # --------------------------------- -@MODELATMDYN_INTERNAL_RESTART_FILE: fvcore_internal_rst -@MODELATMDYN_INTERNAL_CHECKPOINT_FILE: fvcore_internal_checkpoint -@MODELATMDYN_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE -@MODELATMDYN_INTERNAL_HEADER: 1 +{{ MODELATM }}DYN_INTERNAL_RESTART_FILE: fvcore_internal_rst +{{ MODELATM }}DYN_INTERNAL_CHECKPOINT_FILE: fvcore_internal_checkpoint +{{ MODELATM }}DYN_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} +{{ MODELATM }}DYN_INTERNAL_HEADER: 1 -@MODELATMGWD_INTERNAL_RESTART_FILE: gwd_internal_rst +{{ MODELATM }}GWD_INTERNAL_RESTART_FILE: gwd_internal_rst -@MODELATMLAKE_INTERNAL_RESTART_FILE: lake_internal_rst -@MODELATMLAKE_INTERNAL_CHECKPOINT_FILE: lake_internal_checkpoint -@MODELATMLAKE_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}LAKE_INTERNAL_RESTART_FILE: lake_internal_rst +{{ MODELATM }}LAKE_INTERNAL_CHECKPOINT_FILE: lake_internal_checkpoint +{{ MODELATM }}LAKE_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMLANDICE_INTERNAL_RESTART_FILE: landice_internal_rst -@MODELATMLANDICE_INTERNAL_CHECKPOINT_FILE: landice_internal_checkpoint -@MODELATMLANDICE_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}LANDICE_INTERNAL_RESTART_FILE: landice_internal_rst +{{ MODELATM }}LANDICE_INTERNAL_CHECKPOINT_FILE: landice_internal_checkpoint +{{ MODELATM }}LANDICE_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMCATCH_INTERNAL_RESTART_FILE: catch_internal_rst -@MODELATMCATCH_INTERNAL_CHECKPOINT_FILE: catch_internal_checkpoint -@MODELATMCATCH_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}CATCH_INTERNAL_RESTART_FILE: catch_internal_rst +{{ MODELATM }}CATCH_INTERNAL_CHECKPOINT_FILE: catch_internal_checkpoint +{{ MODELATM }}CATCH_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMCATCHCNCLM40_INTERNAL_RESTART_FILE: catchcn_internal_rst -@MODELATMCATCHCNCLM40_INTERNAL_CHECKPOINT_FILE: catchcn_internal_checkpoint -@MODELATMCATCHCNCLM40_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}CATCHCNCLM40_INTERNAL_RESTART_FILE: catchcn_internal_rst +{{ MODELATM }}CATCHCNCLM40_INTERNAL_CHECKPOINT_FILE: catchcn_internal_checkpoint +{{ MODELATM }}CATCHCNCLM40_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMMOIST_INTERNAL_RESTART_FILE: moist_internal_rst -@MODELATMMOIST_INTERNAL_CHECKPOINT_FILE: moist_internal_checkpoint -@MODELATMMOIST_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}MOIST_INTERNAL_RESTART_FILE: moist_internal_rst +{{ MODELATM }}MOIST_INTERNAL_CHECKPOINT_FILE: moist_internal_checkpoint +{{ MODELATM }}MOIST_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} # Boot-Strapable AGCM Model Restart Files # --------------------------------------- -@MODELATMAIAU_IMPORT_RESTART_FILE: aiau_import_rst -@MODELATMAIAU_IMPORT_CHECKPOINT_FILE: aiau_import_checkpoint -@MODELATMAIAU_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}AIAU_IMPORT_RESTART_FILE: aiau_import_rst +{{ MODELATM }}AIAU_IMPORT_CHECKPOINT_FILE: aiau_import_checkpoint +{{ MODELATM }}AIAU_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMGWD_IMPORT_RESTART_FILE: gwd_import_rst -@MODELATMGWD_IMPORT_CHECKPOINT_FILE: gwd_import_checkpoint -@MODELATMGWD_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}GWD_IMPORT_RESTART_FILE: gwd_import_rst +{{ MODELATM }}GWD_IMPORT_CHECKPOINT_FILE: gwd_import_checkpoint +{{ MODELATM }}GWD_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMMOIST_IMPORT_RESTART_FILE: moist_import_rst -@MODELATMMOIST_IMPORT_CHECKPOINT_FILE: moist_import_checkpoint -@MODELATMMOIST_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}MOIST_IMPORT_RESTART_FILE: moist_import_rst +{{ MODELATM }}MOIST_IMPORT_CHECKPOINT_FILE: moist_import_checkpoint +{{ MODELATM }}MOIST_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} SURFACE_IMPORT_RESTART_FILE: surf_import_rst SURFACE_IMPORT_CHECKPOINT_FILE: surf_import_checkpoint -SURFACE_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +SURFACE_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMSOLAR_INTERNAL_RESTART_FILE: solar_internal_rst -@MODELATMSOLAR_INTERNAL_CHECKPOINT_FILE: solar_internal_checkpoint -@MODELATMSOLAR_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}SOLAR_INTERNAL_RESTART_FILE: solar_internal_rst +{{ MODELATM }}SOLAR_INTERNAL_CHECKPOINT_FILE: solar_internal_checkpoint +{{ MODELATM }}SOLAR_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMIRRAD_INTERNAL_RESTART_FILE: irrad_internal_rst -@MODELATMIRRAD_INTERNAL_CHECKPOINT_FILE: irrad_internal_checkpoint -@MODELATMIRRAD_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}IRRAD_INTERNAL_RESTART_FILE: irrad_internal_rst +{{ MODELATM }}IRRAD_INTERNAL_CHECKPOINT_FILE: irrad_internal_checkpoint +{{ MODELATM }}IRRAD_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMTURBULENCE_INTERNAL_RESTART_FILE: turb_internal_rst -@MODELATMTURBULENCE_INTERNAL_CHECKPOINT_FILE: turb_internal_checkpoint -@MODELATMTURBULENCE_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}TURBULENCE_INTERNAL_RESTART_FILE: turb_internal_rst +{{ MODELATM }}TURBULENCE_INTERNAL_CHECKPOINT_FILE: turb_internal_checkpoint +{{ MODELATM }}TURBULENCE_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMTURBULENCE_IMPORT_RESTART_FILE: turb_import_rst -@MODELATMTURBULENCE_IMPORT_CHECKPOINT_FILE: turb_import_checkpoint -@MODELATMTURBULENCE_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}TURBULENCE_IMPORT_RESTART_FILE: turb_import_rst +{{ MODELATM }}TURBULENCE_IMPORT_CHECKPOINT_FILE: turb_import_checkpoint +{{ MODELATM }}TURBULENCE_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMPCHEM_INTERNAL_RESTART_FILE: pchem_internal_rst -@MODELATMPCHEM_INTERNAL_CHECKPOINT_FILE: pchem_internal_checkpoint -@MODELATMPCHEM_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}PCHEM_INTERNAL_RESTART_FILE: pchem_internal_rst +{{ MODELATM }}PCHEM_INTERNAL_CHECKPOINT_FILE: pchem_internal_checkpoint +{{ MODELATM }}PCHEM_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMH2O_INTERNAL_RESTART_FILE: h2o_internal_rst -@MODELATMH2O_INTERNAL_CHECKPOINT_FILE: h2o_internal_checkpoint -@MODELATMH2O_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}H2O_INTERNAL_RESTART_FILE: h2o_internal_rst +{{ MODELATM }}H2O_INTERNAL_CHECKPOINT_FILE: h2o_internal_checkpoint +{{ MODELATM }}H2O_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} # Chemistry/AEROSOL Model Restart Files # ------------------------------------- -@MODELATMGOCART_IMPORT_RESTART_FILE: gocart_import_rst -@MODELATMGOCART_IMPORT_CHECKPOINT_FILE: gocart_import_checkpoint -@MODELATMGOCART_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}GOCART_IMPORT_RESTART_FILE: gocart_import_rst +{{ MODELATM }}GOCART_IMPORT_CHECKPOINT_FILE: gocart_import_checkpoint +{{ MODELATM }}GOCART_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMGOCART_INTERNAL_RESTART_FILE: gocart_internal_rst -@MODELATMGOCART_INTERNAL_CHECKPOINT_FILE: gocart_internal_checkpoint -@MODELATMGOCART_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}GOCART_INTERNAL_RESTART_FILE: gocart_internal_rst +{{ MODELATM }}GOCART_INTERNAL_CHECKPOINT_FILE: gocart_internal_checkpoint +{{ MODELATM }}GOCART_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMGOCART.data_INTERNAL_RESTART_FILE: gocartdata_internal_rst -@MODELATMGOCART.data_INTERNAL_CHECKPOINT_FILE: gocartdata_internal_checkpoint -@MODELATMGOCART.data_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}GOCART.data_INTERNAL_RESTART_FILE: gocartdata_internal_rst +{{ MODELATM }}GOCART.data_INTERNAL_CHECKPOINT_FILE: gocartdata_internal_checkpoint +{{ MODELATM }}GOCART.data_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMDU_INTERNAL_RESTART_FILE: du_internal_rst -@MODELATMDU_INTERNAL_CHECKPOINT_FILE: du_internal_checkpoint -@MODELATMDU_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}DU_INTERNAL_RESTART_FILE: du_internal_rst +{{ MODELATM }}DU_INTERNAL_CHECKPOINT_FILE: du_internal_checkpoint +{{ MODELATM }}DU_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMSS_INTERNAL_RESTART_FILE: ss_internal_rst -@MODELATMSS_INTERNAL_CHECKPOINT_FILE: ss_internal_checkpoint -@MODELATMSS_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}SS_INTERNAL_RESTART_FILE: ss_internal_rst +{{ MODELATM }}SS_INTERNAL_CHECKPOINT_FILE: ss_internal_checkpoint +{{ MODELATM }}SS_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMCA.oc_INTERNAL_RESTART_FILE: caoc_internal_rst -@MODELATMCA.oc_INTERNAL_CHECKPOINT_FILE: caoc_internal_checkpoint -@MODELATMCA.oc_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}CA.oc_INTERNAL_RESTART_FILE: caoc_internal_rst +{{ MODELATM }}CA.oc_INTERNAL_CHECKPOINT_FILE: caoc_internal_checkpoint +{{ MODELATM }}CA.oc_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMCA.bc_INTERNAL_RESTART_FILE: cabc_internal_rst -@MODELATMCA.bc_INTERNAL_CHECKPOINT_FILE: cabc_internal_checkpoint -@MODELATMCA.bc_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}CA.bc_INTERNAL_RESTART_FILE: cabc_internal_rst +{{ MODELATM }}CA.bc_INTERNAL_CHECKPOINT_FILE: cabc_internal_checkpoint +{{ MODELATM }}CA.bc_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMCA.br_INTERNAL_RESTART_FILE: cabr_internal_rst -@MODELATMCA.br_INTERNAL_CHECKPOINT_FILE: cabr_internal_checkpoint -@MODELATMCA.br_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}CA.br_INTERNAL_RESTART_FILE: cabr_internal_rst +{{ MODELATM }}CA.br_INTERNAL_CHECKPOINT_FILE: cabr_internal_checkpoint +{{ MODELATM }}CA.br_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMNI_INTERNAL_RESTART_FILE: ni_internal_rst -@MODELATMNI_INTERNAL_CHECKPOINT_FILE: ni_internal_checkpoint -@MODELATMNI_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}NI_INTERNAL_RESTART_FILE: ni_internal_rst +{{ MODELATM }}NI_INTERNAL_CHECKPOINT_FILE: ni_internal_checkpoint +{{ MODELATM }}NI_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMSU_INTERNAL_RESTART_FILE: su_internal_rst -@MODELATMSU_INTERNAL_CHECKPOINT_FILE: su_internal_checkpoint -@MODELATMSU_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}SU_INTERNAL_RESTART_FILE: su_internal_rst +{{ MODELATM }}SU_INTERNAL_CHECKPOINT_FILE: su_internal_checkpoint +{{ MODELATM }}SU_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMCARMA_INTERNAL_RESTART_FILE: carma_internal_rst -@MODELATMCARMA_INTERNAL_CHECKPOINT_FILE: carma_internal_checkpoint -@MODELATMCARMA_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}CARMA_INTERNAL_RESTART_FILE: carma_internal_rst +{{ MODELATM }}CARMA_INTERNAL_CHECKPOINT_FILE: carma_internal_checkpoint +{{ MODELATM }}CARMA_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} #STRATCHEM_INTERNAL_RESTART_FILE: stratchem_internal_rst #STRATCHEM_INTERNAL_CHECKPOINT_FILE: stratchem_internal_checkpoint -#STRATCHEM_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +#STRATCHEM_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} #STRATCHEM_IMPORT_RESTART_FILE: stratchem_import_rst #STRATCHEM_IMPORT_CHECKPOINT_FILE: stratchem_import_checkpoint -#STRATCHEM_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +#STRATCHEM_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} #GMICHEM_INTERNAL_RESTART_FILE: gmichem_internal_rst #GMICHEM_INTERNAL_CHECKPOINT_FILE: gmichem_internal_checkpoint -#GMICHEM_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +#GMICHEM_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} #GMICHEM_IMPORT_RESTART_FILE: gmichem_import_rst #GMICHEM_IMPORT_CHECKPOINT_FILE: gmichem_import_checkpoint -#GMICHEM_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +#GMICHEM_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} #GEOSCHEMCHEM_INTERNAL_RESTART_FILE: geoschemchem_internal_rst #GEOSCHEMCHEM_INTERNAL_CHECKPOINT_FILE: geoschemchem_internal_checkpoint -#GEOSCHEMCHEM_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +#GEOSCHEMCHEM_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} #GEOSCHEMCHEM_IMPORT_RESTART_FILE: geoschemchem_import_rst #GEOSCHEMCHEM_IMPORT_CHECKPOINT_FILE: geoschemchem_import_checkpoint -#GEOSCHEMCHEM_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +#GEOSCHEMCHEM_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMMAM_INTERNAL_RESTART_FILE: mam_internal_rst -@MODELATMMAM_INTERNAL_CHECKPOINT_FILE: mam_internal_checkpoint -@MODELATMMAM_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}MAM_INTERNAL_RESTART_FILE: mam_internal_rst +{{ MODELATM }}MAM_INTERNAL_CHECKPOINT_FILE: mam_internal_checkpoint +{{ MODELATM }}MAM_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMACHEM_INTERNAL_RESTART_FILE: achem_internal_rst -@MODELATMACHEM_INTERNAL_CHECKPOINT_FILE: achem_internal_checkpoint -@MODELATMACHEM_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}ACHEM_INTERNAL_RESTART_FILE: achem_internal_rst +{{ MODELATM }}ACHEM_INTERNAL_CHECKPOINT_FILE: achem_internal_checkpoint +{{ MODELATM }}ACHEM_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMTR_INTERNAL_RESTART_FILE: tr_internal_rst -@MODELATMTR_INTERNAL_CHECKPOINT_FILE: tr_internal_checkpoint -@MODELATMTR_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}TR_INTERNAL_RESTART_FILE: tr_internal_rst +{{ MODELATM }}TR_INTERNAL_CHECKPOINT_FILE: tr_internal_checkpoint +{{ MODELATM }}TR_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMTR_IMPORT_RESTART_FILE: tr_import_rst -@MODELATMTR_IMPORT_CHECKPOINT_FILE: tr_import_checkpoint -@MODELATMTR_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}TR_IMPORT_RESTART_FILE: tr_import_rst +{{ MODELATM }}TR_IMPORT_CHECKPOINT_FILE: tr_import_checkpoint +{{ MODELATM }}TR_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMHEMCO_INTERNAL_RESTART_FILE: hemco_internal_rst -@MODELATMHEMCO_INTERNAL_CHECKPOINT_FILE: hemco_internal_checkpoint -@MODELATMHEMCO_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}HEMCO_INTERNAL_RESTART_FILE: hemco_internal_rst +{{ MODELATM }}HEMCO_INTERNAL_CHECKPOINT_FILE: hemco_internal_checkpoint +{{ MODELATM }}HEMCO_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@MODELATMHEMCO_IMPORT_RESTART_FILE: hemco_import_rst -@MODELATMHEMCO_IMPORT_CHECKPOINT_FILE: hemco_import_checkpoint -@MODELATMHEMCO_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ MODELATM }}HEMCO_IMPORT_RESTART_FILE: hemco_import_rst +{{ MODELATM }}HEMCO_IMPORT_CHECKPOINT_FILE: hemco_import_checkpoint +{{ MODELATM }}HEMCO_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} #OH_INTERNAL_RESTART_FILE: oh_internal_rst #OH_INTERNAL_CHECKPOINT_FILE: oh_internal_checkpoint -#OH_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +#OH_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} #OH_IMPORT_RESTART_FILE: oh_import_rst #OH_IMPORT_CHECKPOINT_FILE: oh_import_checkpoint -#OH_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +#OH_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} #RRG_INTERNAL_RESTART_FILE: rrg_internal_rst #RRG_INTERNAL_CHECKPOINT_FILE: rrg_internal_checkpoint -#RRG_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +#RRG_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} # OCEAN Model Restart Files # ------------------------- SALTWATER_IMPORT_RESTART_FILE: saltwater_import_rst SALTWATER_IMPORT_CHECKPOINT_FILE: saltwater_import_checkpoint -SALTWATER_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +SALTWATER_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} OPENWATER_INTERNAL_RESTART_FILE: openwater_internal_rst OPENWATER_INTERNAL_CHECKPOINT_FILE: openwater_internal_checkpoint -OPENWATER_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +OPENWATER_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@CICE6SEAICETHERMO_IMPORT_RESTART_FILE: seaicethermo_import_rst -@CICE6SEAICETHERMO_IMPORT_CHECKPOINT_FILE: seaicethermo_import_checkpoint -@CICE6SEAICETHERMO_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ CICE6 }}SEAICETHERMO_IMPORT_RESTART_FILE: seaicethermo_import_rst +{{ CICE6 }}SEAICETHERMO_IMPORT_CHECKPOINT_FILE: seaicethermo_import_checkpoint +{{ CICE6 }}SEAICETHERMO_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} SEAICETHERMO_INTERNAL_RESTART_FILE: seaicethermo_internal_rst SEAICETHERMO_INTERNAL_CHECKPOINT_FILE: seaicethermo_internal_checkpoint -SEAICETHERMO_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +SEAICETHERMO_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@CICE4CICE4_IMPORT_RESTART_FILE: seaice_import_rst -@CICE4CICE4_IMPORT_CHECKPOINT_FILE: seaice_import_checkpoint -@CICE4CICE4_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE -@CICE6CICE6_IMPORT_RESTART_FILE: seaice_import_rst -@CICE6CICE6_IMPORT_CHECKPOINT_FILE: seaice_import_checkpoint -@CICE6CICE6_IMPORT_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ CICE4 }}CICE4_IMPORT_RESTART_FILE: seaice_import_rst +{{ CICE4 }}CICE4_IMPORT_CHECKPOINT_FILE: seaice_import_checkpoint +{{ CICE4 }}CICE4_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} +{{ CICE6 }}CICE6_IMPORT_RESTART_FILE: seaice_import_rst +{{ CICE6 }}CICE6_IMPORT_CHECKPOINT_FILE: seaice_import_checkpoint +{{ CICE6 }}CICE6_IMPORT_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@CICE4CICE4_INTERNAL_RESTART_FILE: seaice_internal_rst -@CICE4CICE4_INTERNAL_CHECKPOINT_FILE: seaice_internal_checkpoint -@CICE4CICE4_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ CICE4 }}CICE4_INTERNAL_RESTART_FILE: seaice_internal_rst +{{ CICE4 }}CICE4_INTERNAL_CHECKPOINT_FILE: seaice_internal_checkpoint +{{ CICE4 }}CICE4_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} -@COUPLEDOCEAN_INTERNAL_RESTART_FILE: ocean_internal_rst -@COUPLEDOCEAN_INTERNAL_CHECKPOINT_FILE: ocean_internal_checkpoint -@COUPLEDOCEAN_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +{{ COUPLED }}OCEAN_INTERNAL_RESTART_FILE: ocean_internal_rst +{{ COUPLED }}OCEAN_INTERNAL_CHECKPOINT_FILE: ocean_internal_checkpoint +{{ COUPLED }}OCEAN_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} # GIGATRAJ RUN CONFIG # ------------------------- #GIGATRAJ_INTERNAL_RESTART_FILE: gigatraj_internal_rst #GIGATRAJ_INTERNAL_CHECKPOINT_FILE: gigatraj_internal_checkpoint -#GIGATRAJ_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +#GIGATRAJ_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} GIGATRAJ_REGRID_TO_LATLON: NO #GIGATRAJ_PARCELS_FILE: parcels.nc4 # time interval (minutes) for integration. Default is heart beat and it must be a multiple of heart beat. @@ -872,7 +871,7 @@ GIGATRAJ_EXTRA_FIELDS: DYN%TH|Theta;DYN%ZL|PAlt # ------------------ #IGNI_INTERNAL_RESTART_FILE: igni_internal_rst #IGNI_INTERNAL_CHECKPOINT_FILE: igni_internal_checkpoint -#IGNI_INTERNAL_CHECKPOINT_TYPE: @CHECKPOINT_TYPE +#IGNI_INTERNAL_CHECKPOINT_TYPE: {{ CHECKPOINT_TYPE }} # Boundary Datasets # ----------------- @@ -887,16 +886,16 @@ TILING_FILE: tile.bin VISDF_FILE: visdf.dat NIRDF_FILE: nirdf.dat LNFM_FILE: lnfm.data -@MODELATM@COUPLED ROUTING_FILE: runoff.bin +{{ MODELATM }}{{ COUPLED }} ROUTING_FILE: runoff.bin -@MODELATMVEGDYN_INTERNAL_RESTART_FILE: vegdyn.data +{{ MODELATM }}VEGDYN_INTERNAL_RESTART_FILE: vegdyn.data KPAR_FILE: SEAWIFS_KPAR_mon_clim.data # AeroChem Environment # -------------------- - OX_RELAXTIME: @OX_RELAXTIME # Standard Options: GCM: 259200., DAS: 0.000 + OX_RELAXTIME: {{ OX_RELAXTIME }} # Standard Options: GCM: 259200., DAS: 0.000 CH4_RELAXTIME: 259200. N2O_RELAXTIME: 259200. CFC11_RELAXTIME: 259200. @@ -911,7 +910,7 @@ KPAR_FILE: SEAWIFS_KPAR_mon_clim.data H2O_FRIENDLIES: DYNAMICS:TURBULENCE:MOIST HCFC22_FRIENDLIES: DYNAMICS:TURBULENCE:MOIST pchem_clim: species.data - pchem_clim_years: @PCHEM_CLIM_YEARS + pchem_clim_years: {{ PCHEM_CLIM_YEARS }} # Age-of-Air Parameters # --------------------- @@ -940,16 +939,16 @@ NUM_BANDS: 30 DIURNAL_BIOMASS_BURNING: yes - RATS_PROVIDER: @RATS_PROVIDER # options: PCHEM, GMICHEM, STRATCHEM (Radiatively active tracers) - AERO_PROVIDER: @AERO_PROVIDER # options: GOCART2G, MAM, none (Radiatively active aerosols) -ANALYSIS_OX_PROVIDER: @OANA_PROVIDER # options: PCHEM, GMICHEM, STRATCHEM, GOCART - CH4_PROVIDER: @CH4_PROVIDER # options: GOCART, RRG, none - CO2_PROVIDER: @CO2_PROVIDER # options: GOCART, RRG, none + RATS_PROVIDER: {{ RATS_PROVIDER }} # options: PCHEM, GMICHEM, STRATCHEM (Radiatively active tracers) + AERO_PROVIDER: {{ AERO_PROVIDER }} # options: GOCART2G, MAM, none (Radiatively active aerosols) +ANALYSIS_OX_PROVIDER: {{ OANA_PROVIDER }} # options: PCHEM, GMICHEM, STRATCHEM, GOCART + CH4_PROVIDER: {{ CH4_PROVIDER }} # options: GOCART, RRG, none + CO2_PROVIDER: {{ CO2_PROVIDER }} # options: GOCART, RRG, none # Flag for real-time forecasts (persisted SST) OGCM_IS_FCST: 1 (AMIP-Style Default: 0) # ------------------------------------------------------------------------------- - OGCM_IS_FCST: @OGCM_IS_FCST + OGCM_IS_FCST: {{ OGCM_IS_FCST }} # Time step for aerosol assimilation (GAAS) @@ -958,16 +957,16 @@ ANALYSIS_OX_PROVIDER: @OANA_PROVIDER # options: PCHEM, GMICHEM, STRATCHEM, GOC # DATAOCEAN Parameters for AMIP-Style Run # ---------------------------------------- -@DATAOCEAN DATA_SST_FILE: sst.data -@DATAOCEAN DATA_FRT_FILE: fraci.data -@DATAOCEAN MIN_SEAICE_DEPTH: 0.07 -@DATAOCEAN MAX_SEAICE_DEPTH: 0.07 -@DATAOCEAN TAU_SIT: 86400 +{{ DATAOCEAN }} DATA_SST_FILE: sst.data +{{ DATAOCEAN }} DATA_FRT_FILE: fraci.data +{{ DATAOCEAN }} MIN_SEAICE_DEPTH: 0.07 +{{ DATAOCEAN }} MAX_SEAICE_DEPTH: 0.07 +{{ DATAOCEAN }} TAU_SIT: 86400 # To compute skin SST over water (or to use SST Analysis Increment) set values to 1 # --------------------------------------------------------------------------------- -USE_SKIN_LAYER: @USE_SKIN_LAYER - ANALYZE_TS: @ANALYZE_TS +USE_SKIN_LAYER: {{ USE_SKIN_LAYER }} + ANALYZE_TS: {{ ANALYZE_TS }} # Model Tuning Parameters (For CMIP5 recommended SOLAR_CONSTANT and CO2 values, use -1) # ------------------------------------------------------------------------------------- @@ -978,31 +977,31 @@ RATS_DIAGNOSTICS: # Set one or more LW diagnostic analysis for specific RATS in # Flags for SATSIM Output # ----------------------- -USE_SATSIM: @SATSIM -USE_SATSIM_ISCCP: @ISCCP_SATSIM -USE_SATSIM_MODIS: @MODIS_SATSIM -USE_SATSIM_RADAR: @RADAR_SATSIM -USE_SATSIM_LIDAR: @LIDAR_SATSIM -USE_SATSIM_MISR: @MISR_SATSIM +USE_SATSIM: {{ SATSIM }} +USE_SATSIM_ISCCP: {{ ISCCP_SATSIM }} +USE_SATSIM_MODIS: {{ MODIS_SATSIM }} +USE_SATSIM_RADAR: {{ RADAR_SATSIM }} +USE_SATSIM_LIDAR: {{ LIDAR_SATSIM }} +USE_SATSIM_MISR: {{ MISR_SATSIM }} # Flags to enable wave code # ------------------------- USE_WAVES: 0 -@COUPLED INTERPOLATE_ATMLM: 0 -@COUPLED INTERPOLATE_ATMTAU: 1 -@COUPLED INTERPOLATE_OCEAN_ICE_CURRENTS: 0 +{{ COUPLED }} INTERPOLATE_ATMLM: 0 +{{ COUPLED }} INTERPOLATE_ATMTAU: 1 +{{ COUPLED }} INTERPOLATE_OCEAN_ICE_CURRENTS: 0 -@COUPLED CLDMICRO: @CLDMICRO +{{ COUPLED }} CLDMICRO: {{ CLDMICRO }} -@COUPLED # Section for ocean -@COUPLED # ---------------- -@COUPLED USE_DATASEA:0 -@COUPLED OCEAN_NAME: @OCEAN_NAME -@COUPLED USE_DATA_ATM4OCN: @USE_DATA_ATM4OCN -@COUPLED USE_DATASEAICE:0 -@COUPLED steady_state_ocean: 0 -@COUPLED OCEAN_PICE_SCALING: 0.0 +{{ COUPLED }} # Section for ocean +{{ COUPLED }} # ---------------- +{{ COUPLED }} USE_DATASEA:0 +{{ COUPLED }} OCEAN_NAME: {{ OCEAN_NAME }} +{{ COUPLED }} USE_DATA_ATM4OCN: {{ USE_DATA_ATM4OCN }} +{{ COUPLED }} USE_DATASEAICE:0 +{{ COUPLED }} steady_state_ocean: 0 +{{ COUPLED }} OCEAN_PICE_SCALING: 0.0 # For running MOM5 coupled model in dual ocean mode, uncomment three lines below, # make sure that regular replay is enabled, proper PRECIP_FILE is chosen, @@ -1010,28 +1009,28 @@ USE_WAVES: 0 # the run starts at 21z/03z/09z/15z, # HISTORY.rc collections have proper ref_time field # --------------------------------------------------------------------------- -@MOM5#DUAL_OCEAN: 1 -@MOM5#DATA_SST_FILE: sst.data -@MOM5#DATA_FRT_FILE: fraci.data - -@COUPLED -@COUPLED# Section for CICE -@COUPLED# ----------------- -@CICE4USE_CICE_Thermo: 1 -@CICE6USE_CICE_Thermo: 2 -@CICE6SEAICE_NAME: CICE6 -@CICE4PRESCRIBED_ICE: 0 -@CICE4CICE_DT: @OCEAN_DT -@CICE4CICE_NDTE: 300 -@CICE4CICE_GRID: grid_cice.bin -@CICE4CICE_KMT: kmt_cice.bin -@COUPLEDCICE_N_ICE_CATEGORIES:5 -@CICE4CICE_N_ICE_LAYERS:4 -@CICE4CICE_MU_RDG: 3.0 -@CICE4CICE_AH_MAX: 0.3 -@CICE4CICE_STRENGTH: 0 -@CICE4ALBICEV: 0.78 -@CICE4ALBICEI: 0.36 -@CICE4ALBSNOWV: 0.98 -@CICE4ALBSNOWI: 0.7 -@CICE4MIN_FREEZE_SALINITY: 5.0 +{{ MOM5 }}#DUAL_OCEAN: 1 +{{ MOM5 }}#DATA_SST_FILE: sst.data +{{ MOM5 }}#DATA_FRT_FILE: fraci.data + +{{ COUPLED }} +{{ COUPLED }}# Section for CICE +{{ COUPLED }}# ----------------- +{{ CICE4 }}USE_CICE_Thermo: 1 +{{ CICE6 }}USE_CICE_Thermo: 2 +{{ CICE6 }}SEAICE_NAME: CICE6 +{{ CICE4 }}PRESCRIBED_ICE: 0 +{{ CICE4 }}CICE_DT: {{ OCEAN_DT }} +{{ CICE4 }}CICE_NDTE: 300 +{{ CICE4 }}CICE_GRID: grid_cice.bin +{{ CICE4 }}CICE_KMT: kmt_cice.bin +{{ COUPLED }}CICE_N_ICE_CATEGORIES:5 +{{ CICE4 }}CICE_N_ICE_LAYERS:4 +{{ CICE4 }}CICE_MU_RDG: 3.0 +{{ CICE4 }}CICE_AH_MAX: 0.3 +{{ CICE4 }}CICE_STRENGTH: 0 +{{ CICE4 }}ALBICEV: 0.78 +{{ CICE4 }}ALBICEI: 0.36 +{{ CICE4 }}ALBSNOWV: 0.98 +{{ CICE4 }}ALBSNOWI: 0.7 +{{ CICE4 }}MIN_FREEZE_SALINITY: 5.0 diff --git a/CAP.rc.tmpl b/CAP.rc.tmpl index 5a3aab48..c33f85b8 100644 --- a/CAP.rc.tmpl +++ b/CAP.rc.tmpl @@ -2,13 +2,13 @@ ROOT_NAME: GCM ROOT_CF: AGCM.rc HIST_CF: HISTORY.rc -BEG_DATE: @BEG_DATE -END_DATE: @END_DATE -JOB_SGMT: @JOB_SGMT -NUM_SGMT: @NUM_SGMT -HEARTBEAT_DT: @DT +BEG_DATE: {{ BEG_DATE }} +END_DATE: {{ END_DATE }} +JOB_SGMT: {{ JOB_SGMT }} +NUM_SGMT: {{ NUM_SGMT }} +HEARTBEAT_DT: {{ DT }} -USE_SHMEM: @USE_SHMEM +USE_SHMEM: {{ USE_SHMEM }} USE_EXTDATA2G: .TRUE. # Parameters for Cycled REPLAY Forecasts diff --git a/CMakeLists.txt b/CMakeLists.txt index c1d0d9d9..7066cd0f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,3 +78,4 @@ endforeach () configure_file(.AGCM_VERSION .AGCM_VERSION @ONLY) install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/.AGCM_VERSION DESTINATION etc) +add_subdirectory(gcmpy) diff --git a/HISTORY.AGCM.rc.tmpl b/HISTORY.AGCM.rc.tmpl index 28eb4dea..0c137c6f 100644 --- a/HISTORY.AGCM.rc.tmpl +++ b/HISTORY.AGCM.rc.tmpl @@ -1,7 +1,7 @@ VERSION: 1 -EXPID: @EXPID -EXPDSC: @EXPDSC -EXPSRC: @EXPSRC +EXPID: {{ EXPID }} +EXPDSC: {{ EXPDSC }} +EXPSRC: {{ EXPSRC }} CONTACT: 'http://gmao.gsfc.nasa.gov' @@ -20,10 +20,10 @@ COLLECTIONS: 'geosgcm_prog' 'geosgcm_meltwtr' 'geosgcm_snowlayer' 'geosgcm_tracer' -@HIST_GOCART 'tavg2d_aer_x' -@HIST_GOCART 'tavg3d_aer_p' -#@HIST_GOCART 'inst3d_aer_v' -#@HIST_GOCART 'inst2d_hwl_x' + {{ HIST_GOCART }} 'tavg2d_aer_x' + {{ HIST_GOCART }} 'tavg3d_aer_p' +#{{ HIST_GOCART }} 'inst3d_aer_v' +#{{ HIST_GOCART }} 'inst2d_hwl_x' # 'geosgcm_iau' # 'geosgcm_conv' # 'goswim_catch' @@ -44,32 +44,32 @@ COLLECTIONS: 'geosgcm_prog' # list of COLLECTIONS for scripting purposes. # ################################################## -GRID_LABELS: PC@HIST_IMx@HIST_JM-DC - PC@CLIM_IMx@CLIM_JM-DC +GRID_LABELS: PC{{ HIST_IM }}x{{ HIST_JM }}-DC + PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC :: # High Resolution Global Fields for Synoptic Meteorology -PC@HIST_IMx@HIST_JM-DC.GRID_TYPE: LatLon -PC@HIST_IMx@HIST_JM-DC.IM_WORLD: @HIST_IM -PC@HIST_IMx@HIST_JM-DC.JM_WORLD: @HIST_JM -PC@HIST_IMx@HIST_JM-DC.POLE: PC -PC@HIST_IMx@HIST_JM-DC.DATELINE: DC -PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.GRID_TYPE: LatLon +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.IM_WORLD: {{ HIST_IM }} +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.JM_WORLD: {{ HIST_JM }} +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.POLE: PC +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.DATELINE: DC +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.LM: {{ AGCM_LM }} # Coarse Resolution GLobal Fields for Climatology -PC@CLIM_IMx@CLIM_JM-DC.GRID_TYPE: LatLon -PC@CLIM_IMx@CLIM_JM-DC.IM_WORLD: @CLIM_IM -PC@CLIM_IMx@CLIM_JM-DC.JM_WORLD: @CLIM_JM -PC@CLIM_IMx@CLIM_JM-DC.POLE: PC -PC@CLIM_IMx@CLIM_JM-DC.DATELINE: DC -PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM +PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC.GRID_TYPE: LatLon +PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC.IM_WORLD: {{ CLIM_IM }} +PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC.JM_WORLD: {{ CLIM_JM }} +PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC.POLE: PC +PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC.DATELINE: DC +PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC.LM: {{ AGCM_LM }} geosgcm_prog.template: '%y4%m2%d2_%h2%n2z.nc4' , geosgcm_prog.archive: '%c/Y%y4' , geosgcm_prog.format: 'CFIO' , geosgcm_prog.deflate: 1 , - geosgcm_prog.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_prog.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_prog.regrid_method: 'BILINEAR', geosgcm_prog.frequency: 060000 , geosgcm_prog.vscale: 100.0 , @@ -98,7 +98,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM prog.eta.archive: '%c/Y%y4' , prog.eta.format: 'CFIO' , prog.eta.deflate: 1 , - prog.eta.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + prog.eta.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , prog.eta.regrid_method: 'BILINEAR', prog.eta.mode: 'instantaneous' , prog.eta.frequency: 060000 , @@ -132,7 +132,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_surf.archive: '%c/Y%y4' , geosgcm_surf.format: 'CFIO' , geosgcm_surf.deflate: 1 , - geosgcm_surf.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_surf.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_surf.regrid_method: 'BILINEAR', geosgcm_surf.mode: 'time-averaged' , # geosgcm_surf.monthly: 1 , @@ -294,51 +294,51 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM 'PHIW' , 'SURFACE' , 'TAUTW' , 'SURFACE' , 'ZETA_W' , 'SURFACE' , -@HIST_CATCHCN 'CNLAI' , 'SURFACE' , -@HIST_CATCHCN 'CNTLAI' , 'SURFACE' , -@HIST_CATCHCN 'CNSAI' , 'SURFACE' , -@HIST_CATCHCN 'CNTOTC' , 'SURFACE' , -@HIST_CATCHCN 'CNVEGC' , 'SURFACE' , -@HIST_CATCHCN 'CNROOT' , 'SURFACE' , -@HIST_CATCHCN 'CNFROOTC' , 'SURFACE' , -@HIST_CATCHCN 'CNNPP' , 'SURFACE' , -@HIST_CATCHCN 'CNGPP' , 'SURFACE' , -@HIST_CATCHCN 'CNSR' , 'SURFACE' , -@HIST_CATCHCN 'CNNEE' , 'SURFACE' , -@HIST_CATCHCN 'CNXSMR' , 'SURFACE' , -@HIST_CATCHCN 'CNADD' , 'SURFACE' , -@HIST_CATCHCN 'PARABS' , 'SURFACE' , -@HIST_CATCHCN 'PARINC' , 'SURFACE' , -@HIST_CATCHCN 'SCSAT' , 'SURFACE' , -@HIST_CATCHCN 'SCUNS' , 'SURFACE' , -@HIST_CATCHCN 'BTRANT' , 'SURFACE' , 'BTRAN' , -@HIST_CATCHCN 'SIF' , 'SURFACE' , -@HIST_CATCHCN 'CNLOSS' , 'SURFACE' , 'CLOSS' , -@HIST_CATCHCN 'CNBURN' , 'SURFACE' , 'BURN' , -@HIST_CATCHCN 'CNFSEL' , 'SURFACE' , 'FSEL' , -@HIST_CATCHCN 'EVPICE' , 'SURFACE' , -@HIST_CATCHCN 'EVPSNO' , 'SURFACE' , -@HIST_CATCHCN 'EVPINT' , 'SURFACE' , -@HIST_CATCHCN 'EVPSOI' , 'SURFACE' , -@HIST_CATCHCN 'EVPVEG' , 'SURFACE' , -@HIST_CATCHCN 'FRSAT' , 'SURFACE' , -@HIST_CATCHCN 'FRUST' , 'SURFACE' , -@HIST_CATCHCN 'FRWLT' , 'SURFACE' , -@HIST_CATCHCN 'TPSAT' , 'SURFACE' , -@HIST_CATCHCN 'TPUNST' , 'SURFACE' , -@HIST_CATCHCN 'TPWLT' , 'SURFACE' , -@HIST_CATCHCN 'TPSURF' , 'SURFACE' , 'TSURF' , -@HIST_CATCHCN 'GHTSKIN' , 'SURFACE' , -@HIST_CATCHCN 'WAT10CM' , 'SURFACE' , -@HIST_CATCHCN 'WATSOI' , 'SURFACE' , -@HIST_CATCHCN 'ICESOI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNLAI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNTLAI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNSAI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNTOTC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNVEGC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNROOT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNFROOTC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNNPP' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNGPP' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNSR' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNNEE' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNXSMR' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNADD' , 'SURFACE' , +{{ HIST_CATCHCN }} 'PARABS' , 'SURFACE' , +{{ HIST_CATCHCN }} 'PARINC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'SCSAT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'SCUNS' , 'SURFACE' , +{{ HIST_CATCHCN }} 'BTRANT' , 'SURFACE' , 'BTRAN' , +{{ HIST_CATCHCN }} 'SIF' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNLOSS' , 'SURFACE' , 'CLOSS' , +{{ HIST_CATCHCN }} 'CNBURN' , 'SURFACE' , 'BURN' , +{{ HIST_CATCHCN }} 'CNFSEL' , 'SURFACE' , 'FSEL' , +{{ HIST_CATCHCN }} 'EVPICE' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPSNO' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPINT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPSOI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPVEG' , 'SURFACE' , +{{ HIST_CATCHCN }} 'FRSAT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'FRUST' , 'SURFACE' , +{{ HIST_CATCHCN }} 'FRWLT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPSAT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPUNST' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPWLT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPSURF' , 'SURFACE' , 'TSURF' , +{{ HIST_CATCHCN }} 'GHTSKIN' , 'SURFACE' , +{{ HIST_CATCHCN }} 'WAT10CM' , 'SURFACE' , +{{ HIST_CATCHCN }} 'WATSOI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'ICESOI' , 'SURFACE' , :: geosgcm_ocn.template: '%y4%m2%d2_%h2%n2z.nc4' , geosgcm_ocn.archive: '%c/Y%y4' , geosgcm_ocn.format: 'CFIO' , geosgcm_ocn.deflate: 1 , - geosgcm_ocn.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_ocn.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_ocn.regrid_method: 'BILINEAR', geosgcm_ocn.mode: 'time-averaged' , geosgcm_ocn.monthly: 1 , @@ -397,9 +397,9 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_meltwtr.archive: '%c/Y%y4' , geosgcm_meltwtr.format: 'CFIO' , geosgcm_meltwtr.deflate: 1 , - geosgcm_meltwtr.regrid_name: '@AGCM_GRIDNAME' , + geosgcm_meltwtr.regrid_name: '{{ AGCM_GRIDNAME }}' , geosgcm_meltwtr.regrid_exch: 'tile.bin' , - geosgcm_meltwtr.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_meltwtr.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_meltwtr.regrid_method: 'BILINEAR', geosgcm_meltwtr.mode: 'time-averaged' , geosgcm_meltwtr.monthly: 1 , @@ -412,9 +412,9 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_landice.archive: '%c/Y%y4' , geosgcm_landice.format: 'CFIO' , geosgcm_landice.deflate: 1 , - geosgcm_landice.regrid_name: '@AGCM_GRIDNAME' , + geosgcm_landice.regrid_name: '{{ AGCM_GRIDNAME }}' , geosgcm_landice.regrid_exch: 'tile.bin' , - geosgcm_landice.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_landice.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_landice.regrid_method: 'BILINEAR', geosgcm_landice.mode: 'time-averaged' , geosgcm_landice.monthly: 1 , @@ -447,9 +447,9 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_snowlayer.archive: '%c/Y%y4' , geosgcm_snowlayer.format: 'CFIO' , geosgcm_snowlayer.deflate: 1 , - geosgcm_snowlayer.regrid_name: '@AGCM_GRIDNAME' , + geosgcm_snowlayer.regrid_name: '{{ AGCM_GRIDNAME }}' , geosgcm_snowlayer.regrid_exch: 'tile.bin' , - geosgcm_snowlayer.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_snowlayer.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_snowlayer.regrid_method: 'BILINEAR', geosgcm_snowlayer.mode: 'time-averaged' , geosgcm_snowlayer.monthly: 1 , @@ -471,7 +471,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_moist.archive: '%c/Y%y4' , geosgcm_moist.format: 'CFIO' , geosgcm_moist.deflate: 1 , - geosgcm_moist.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_moist.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_moist.regrid_method: 'BILINEAR', geosgcm_moist.mode: 'time-averaged' , geosgcm_moist.monthly: 1 , @@ -519,7 +519,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_turb.archive: '%c/Y%y4' , geosgcm_turb.format: 'CFIO' , geosgcm_turb.deflate: 1 , - geosgcm_turb.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_turb.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_turb.regrid_method: 'BILINEAR', geosgcm_turb.mode: 'time-averaged' , geosgcm_turb.monthly: 1 , @@ -550,7 +550,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_gwd.archive: '%c/Y%y4' , geosgcm_gwd.format: 'CFIO' , geosgcm_gwd.deflate: 1 , - geosgcm_gwd.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_gwd.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_gwd.regrid_method: 'BILINEAR', geosgcm_gwd.mode: 'time-averaged' , geosgcm_gwd.monthly: 1 , @@ -575,7 +575,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_tend.archive: '%c/Y%y4' , geosgcm_tend.format: 'CFIO' , geosgcm_tend.deflate: 1 , - geosgcm_tend.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_tend.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_tend.regrid_method: 'BILINEAR', geosgcm_tend.mode: 'time-averaged' , geosgcm_tend.monthly: 1 , @@ -613,7 +613,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_budi.archive: '%c/Y%y4' , geosgcm_budi.format: 'CFIO' , geosgcm_budi.deflate: 1 , - geosgcm_budi.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_budi.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_budi.regrid_method: 'CONSERVE', geosgcm_budi.frequency: 030000 , geosgcm_budi.fields: 'TQV' , 'AGCM' , @@ -630,7 +630,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_buda.archive: '%c/Y%y4' , geosgcm_buda.format: 'CFIO' , geosgcm_buda.deflate: 1 , - geosgcm_buda.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_buda.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_buda.regrid_method: 'CONSERVE', geosgcm_buda.mode: 'time-averaged' , geosgcm_buda.monthly: 1 , @@ -662,7 +662,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_iau.archive: '%c/Y%y4', geosgcm_iau.format: 'CFIO', geosgcm_iau.deflate: 1, - geosgcm_iau.grid_label: PC@CLIM_IMx@CLIM_JM-DC, + geosgcm_iau.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC, geosgcm_iau.regrid_method: 'BILINEAR', geosgcm_iau.mode: 'time-averaged', # geosgcm_iau.monthly: 1, @@ -691,7 +691,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_conv.archive: '%c/Y%y4' , geosgcm_conv.format: 'CFIO' , geosgcm_conv.deflate: 1 , - geosgcm_conv.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_conv.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_conv.regrid_method: 'BILINEAR', geosgcm_conv.frequency: 010000 , geosgcm_conv.fields: 'TQV' , 'AGCM' , @@ -716,7 +716,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_bud.archive: '%c/Y%y4' , geosgcm_bud.format: 'CFIO' , geosgcm_bud.deflate: 1 , - geosgcm_bud.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_bud.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_bud.regrid_method: 'BILINEAR', geosgcm_bud.mode: 'time-averaged' , geosgcm_bud.frequency: 240000 , @@ -767,9 +767,9 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM goswim_catch.archive: '%c/Y%y4' , goswim_catch.format: 'CFIO' , goswim_catch.deflate: 1 , - goswim_catch.regrid_name: '@AGCM_GRIDNAME' , + goswim_catch.regrid_name: '{{ AGCM_GRIDNAME }}' , goswim_catch.regrid_exch: 'tile.bin' , - goswim_catch.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + goswim_catch.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , goswim_catch.regrid_method: 'BILINEAR', goswim_catch.mode: 'time-averaged' , goswim_catch.frequency: 240000 , @@ -801,7 +801,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM goswim_land.archive: '%c/Y%y4' , goswim_land.format: 'CFIO' , goswim_land.deflate: 1 , - goswim_land.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + goswim_land.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , goswim_land.regrid_method: 'BILINEAR', goswim_land.mode: 'time-averaged' , goswim_land.frequency: 240000 , @@ -830,9 +830,9 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM goswim_landice.archive: '%c/Y%y4' , goswim_landice.format: 'CFIO' , goswim_landice.deflate: 1 , - goswim_landice.regrid_name: '@AGCM_GRIDNAME' + goswim_landice.regrid_name: '{{ AGCM_GRIDNAME }}' goswim_landice.regrid_exch: 'tile.bin' , - goswim_landice.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + goswim_landice.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , goswim_landice.regrid_method: 'BILINEAR', goswim_landice.mode: 'time-averaged' , goswim_landice.frequency: 240000 , @@ -859,7 +859,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM tavg2d_aer_x.archive: '%c/Y%y4', tavg2d_aer_x.format: 'CFIO', tavg2d_aer_x.deflate: 1, - tavg2d_aer_x.grid_label: PC@CLIM_IMx@CLIM_JM-DC, + tavg2d_aer_x.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC, tavg2d_aer_x.mode: 'time-averaged', tavg2d_aer_x.monthly: 1, # tavg2d_aer_x.frequency: 240000, @@ -1026,7 +1026,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM 'NIFLUXU' , 'NI' , 'NIFLUXV' , 'NI' , 'MCHEMTRI%NI::NH3IM' , 'PHYSICS' , 'NH3SV' , - 'MCHEMTRI%NI::NH4aIM' , 'PHYSICS' , 'NH4SV' , + 'MCHEMTRI%NI::NH4aIM' , 'PHYSICS' , 'NH4SV' , 'MCHEMTRI%DU::DUIM' , 'PHYSICS' , 'DUSV' , 'MCHEMTRI%SS::SSIM' , 'PHYSICS' , 'SSSV' , 'MCHEMTRI%CA.oc::CA.ocphilicIM' , 'PHYSICS' , 'OCSV' , @@ -1040,7 +1040,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM tavg3d_aer_p.archive: '%c/Y%y4', tavg3d_aer_p.format: 'CFIO', tavg3d_aer_p.deflate: 1, - tavg3d_aer_p.grid_label: PC@CLIM_IMx@CLIM_JM-DC, + tavg3d_aer_p.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC, tavg3d_aer_p.mode: 'time-averaged', tavg3d_aer_p.monthly: 1, # tavg3d_aer_p.frequency: 240000, @@ -1060,17 +1060,17 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM 'CA.bcMASS' , 'CA.bc' , 'BC' , 'CA.ocMASS' , 'CA.oc' , 'OC' , 'CA.brMASS' , 'CA.br' , 'BR' , - 'SO2' , 'SU' , - 'SO4' , 'SU' , + 'SO2' , 'SU' , + 'SO4' , 'SU' , 'NH3MASS' , 'NI' , 'NH3' , 'NH4MASS' , 'NI' , 'NH4' , 'NIMASS' , 'NI' , 'NI' , 'HNO3CONC' , 'NI' , 'NICONC' , 'NI' , - 'DUEXTCOEF' , 'DU' , - 'SSEXTCOEF' , 'SS' , - 'SUEXTCOEF' , 'SU' , - 'NIEXTCOEF' , 'NI' , + 'DUEXTCOEF' , 'DU' , + 'SSEXTCOEF' , 'SS' , + 'SUEXTCOEF' , 'SU' , + 'NIEXTCOEF' , 'NI' , 'CA.bcEXTCOEF' , 'CA.bc' , 'BCEXTCOEF' , 'CA.brEXTCOEF' , 'CA.br' , 'BREXTCOEF' , 'CA.ocEXTCOEF' , 'CA.oc' , 'OCEXTCOEF' , @@ -1080,13 +1080,13 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM 'pSOA_BIOB_VOC' , 'ACHEM', 'pSOAbiob' , 'GOCART::CO' , 'GOCART','CO' , :: - + inst3d_aer_v.format: 'CFIO' , inst3d_aer_v.template: '%y4%m2%d2_%h2%n2z.nc4', inst3d_aer_v.archive: '%c/Y%y4', inst3d_aer_v.frequency: 030000, inst3d_aer_v.ref_time: 000000, - inst3d_aer_v.grid_label: PC@HIST_IMx@HIST_JM-DC + inst3d_aer_v.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3d_aer_v.mode: 'instantaneous', inst3d_aer_v.nbits: 12, #inst3d_aer_v.chunksize: 120 91 1 1, @@ -1100,13 +1100,13 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM 'AIRDENS' , 'CHEMENV', 'T' , 'DYN', 'ZL' , 'DYN' , 'H' , - 'DU' , 'DU', 'DU001;DU002;DU003;DU004;DU005', + 'DU' , 'DU', 'DU001;DU002;DU003;DU004;DU005', 'SS' , 'SS', 'SS001;SS002;SS003;SS004;SS005', 'SO2' , 'SU', 'SO4' , 'SU', 'DMS' , 'SU', 'MSA' , 'SU', - 'NH3' , 'NI', + 'NH3' , 'NI', 'NH4a' , 'NI', 'NO3an1' , 'NI', 'NO3an2' , 'NI', @@ -1133,21 +1133,21 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM inst2d_hwl_x.frequency: 010000, inst2d_hwl_x.duration: 010000, inst2d_hwl_x.ref_time: 000000, - inst2d_hwl_x.grid_label: PC@HIST_IMx@HIST_JM-DC + inst2d_hwl_x.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst2d_hwl_x.splitField: 1, inst2d_hwl_x.fields: 'SLP' , 'DYN' , - 'TOTEXTTAU' , 'GOCART2G' , 'TOTEXTTAU470;TOTEXTTAU550;TOTEXTTAU870', - 'TOTSCATAU' , 'GOCART2G' , 'TOTSCATAU470;TOTSCATAU550;TOTSCATAU870', - 'TOTSTEXTTAU' , 'GOCART2G' , 'TOTSTEXTTAU470;TOTSTEXTTAU550;TOTSTEXTTAU870', - 'TOTSTSCATAU' , 'GOCART2G' , 'TOTSTSCATAU470;TOTSTSCATAU550;TOTSTSCATAU870', + 'TOTEXTTAU' , 'GOCART2G' , 'TOTEXTTAU470;TOTEXTTAU550;TOTEXTTAU870', + 'TOTSCATAU' , 'GOCART2G' , 'TOTSCATAU470;TOTSCATAU550;TOTSCATAU870', + 'TOTSTEXTTAU' , 'GOCART2G' , 'TOTSTEXTTAU470;TOTSTEXTTAU550;TOTSTEXTTAU870', + 'TOTSTSCATAU' , 'GOCART2G' , 'TOTSTSCATAU470;TOTSTSCATAU550;TOTSTSCATAU870', 'TOTANGSTR' , 'GOCART2G' , - 'DUEXTTAU' , 'DU' , 'DUEXTTAU470;DUEXTTAU550;DUEXTTAU870', - 'SSEXTTAU' , 'SS' , 'SSEXTTAU470;SSEXTTAU550;SSEXTTAU870', - 'SUEXTTAU' , 'SU' , 'SUEXTTAU470;SUEXTTAU550;SUEXTTAU870', - 'CA.bcEXTTAU', 'CA.bc' , 'BCEXTTAU470;BCEXTTAU550;BCEXTTAU870', - 'CA.brEXTTAU', 'CA.br' , 'BREXTTAU470;BREXTTAU550;BREXTTAU870', - 'CA.ocEXTTAU', 'CA.oc' , 'OCEXTTAU470;OCEXTTAU550;OCEXTTAU870', - 'NIEXTTAU' , 'NI' , 'NIEXTTAU470;NIEXTTAU550;NIEXTTAU870', + 'DUEXTTAU' , 'DU' , 'DUEXTTAU470;DUEXTTAU550;DUEXTTAU870', + 'SSEXTTAU' , 'SS' , 'SSEXTTAU470;SSEXTTAU550;SSEXTTAU870', + 'SUEXTTAU' , 'SU' , 'SUEXTTAU470;SUEXTTAU550;SUEXTTAU870', + 'CA.bcEXTTAU', 'CA.bc' , 'BCEXTTAU470;BCEXTTAU550;BCEXTTAU870', + 'CA.brEXTTAU', 'CA.br' , 'BREXTTAU470;BREXTTAU550;BREXTTAU870', + 'CA.ocEXTTAU', 'CA.oc' , 'OCEXTTAU470;OCEXTTAU550;OCEXTTAU870', + 'NIEXTTAU' , 'NI' , 'NIEXTTAU470;NIEXTTAU550;NIEXTTAU870', 'DUSMASS' , 'DU' , 'SSSMASS' , 'SS' , 'DUSMASS25' , 'DU' , @@ -1170,14 +1170,14 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM 'SUPSO4G' , 'SU' , :: - - + + geosgcm_tracer.template: '%y4%m2%d2_%h2%n2z.nc4' , geosgcm_tracer.archive: '%c/Y%y4' , geosgcm_tracer.format: 'CFIO' , geosgcm_tracer.deflate: 1 , - geosgcm_tracer.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_tracer.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_tracer.regrid_method: 'BILINEAR', geosgcm_tracer.mode: 'time-averaged' , geosgcm_tracer.monthly: 1 , @@ -1207,7 +1207,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_lidar.archive: '%c/Y%y4' , geosgcm_lidar.format: 'CFIO' , geosgcm_lidar.deflate: 1 , - geosgcm_lidar.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_lidar.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_lidar.regrid_method: 'BILINEAR', geosgcm_lidar.mode: 'time-averaged' , geosgcm_lidar.frequency: 030000 , @@ -1250,7 +1250,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_parasol.archive: '%c/Y%y4' , geosgcm_parasol.format: 'CFIO' , geosgcm_parasol.deflate: 1 , - geosgcm_parasol.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_parasol.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_parasol.regrid_method: 'BILINEAR', geosgcm_parasol.mode: 'time-averaged' , geosgcm_parasol.frequency: 030000 , @@ -1266,7 +1266,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_radar.archive: '%c/Y%y4' , geosgcm_radar.format: 'CFIO' , geosgcm_radar.deflate: 1 , - geosgcm_radar.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_radar.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_radar.regrid_method: 'BILINEAR', geosgcm_radar.mode: 'time-averaged' , geosgcm_radar.frequency: 030000 , @@ -1309,7 +1309,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_isccp.archive: '%c/Y%y4' , geosgcm_isccp.format: 'CFIO' , geosgcm_isccp.deflate: 1 , - geosgcm_isccp.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_isccp.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_isccp.regrid_method: 'BILINEAR', geosgcm_isccp.mode: 'time-averaged' , geosgcm_isccp.frequency: 030000 , @@ -1379,7 +1379,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_modis.archive: '%c/Y%y4' , geosgcm_modis.format: 'CFIO' , geosgcm_modis.deflate: 1 , - geosgcm_modis.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_modis.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_modis.regrid_method: 'BILINEAR', geosgcm_modis.mode: 'time-averaged' , geosgcm_modis.frequency: 030000 , @@ -1461,7 +1461,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM geosgcm_misr.archive: '%c/Y%y4' , geosgcm_misr.format: 'CFIO' , geosgcm_misr.deflate: 1 , - geosgcm_misr.grid_label: PC@CLIM_IMx@CLIM_JM-DC , + geosgcm_misr.grid_label: PC{{ CLIM_IM }}x{{ CLIM_JM }}-DC , geosgcm_misr.regrid_method: 'BILINEAR', geosgcm_misr.mode: 'time-averaged' , geosgcm_misr.frequency: 030000 , @@ -1489,7 +1489,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM tavg6_2d_flx_Nx.format: 'CFIO' , - tavg6_2d_flx_Nx.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg6_2d_flx_Nx.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg6_2d_flx_Nx.template: '%y4%m2%d2_%h2%n2z.nc4' , tavg6_2d_flx_Nx.mode: 'time-averaged' , tavg6_2d_flx_Nx.frequency: 060000 , @@ -1544,7 +1544,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM :: inst3_2d_asm_Nx.format: 'CFIO' , - inst3_2d_asm_Nx.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst3_2d_asm_Nx.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3_2d_asm_Nx.template: '%y4%m2%d2_%h2%n2z.nc4' , inst3_2d_asm_Nx.mode: 'instantaneous' , inst3_2d_asm_Nx.frequency: 030000 , @@ -1556,10 +1556,10 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM 'ISRB08RG' , 'SOLAR' , 'ISRB09RG' , 'SOLAR' , 'ISRB10RG' , 'SOLAR' , - 'OSRB08RG' , 'SOLAR' , - 'OSRB09RG' , 'SOLAR' , - 'OSRB10RG' , 'SOLAR' , - 'OSRB11RG' , 'SOLAR' , + 'OSRB08RG' , 'SOLAR' , + 'OSRB09RG' , 'SOLAR' , + 'OSRB10RG' , 'SOLAR' , + 'OSRB11RG' , 'SOLAR' , 'TBRB05RG' , 'IRRAD' , 'TBRB06RG' , 'IRRAD' , 'TBRB07RG' , 'IRRAD' , @@ -1594,11 +1594,11 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM 'LS_PRCP' , 'MOIST' , 'PRECLSC' , 'U850;V850' , 'DYN' , 'U250;V250' , 'DYN' , - 'VORT200' , 'DYN' , + 'VORT200' , 'DYN' , 'VORT500' , 'DYN' , 'VORT700' , 'DYN' , 'VORT850' , 'DYN' , - 'DIVG200' , 'DYN' , + 'DIVG200' , 'DYN' , 'DIVG500' , 'DYN' , 'DIVG700' , 'DYN' , 'DIVG850' , 'DYN' , @@ -1615,7 +1615,7 @@ PC@CLIM_IMx@CLIM_JM-DC.LM: @AGCM_LM 'CA.ocEXTTAU' , 'CA.oc' , 'OCEXTTAU' , 'SUEXTTAU' , 'SU' , 'NIEXTTAU' , 'NI' , - 'FRACI' , 'SURFACE' , 'frseaice' , + 'FRACI' , 'SURFACE' , 'frseaice' , 'SNOMAS' , 'SURFACE' , :: diff --git a/HISTORY.AOGCM-MOM5.rc.tmpl b/HISTORY.AOGCM-MOM5.rc.tmpl index 97d3b3e3..d222ef73 100644 --- a/HISTORY.AOGCM-MOM5.rc.tmpl +++ b/HISTORY.AOGCM-MOM5.rc.tmpl @@ -1,7 +1,7 @@ VERSION: 1 -EXPID: @EXPID -EXPDSC: @EXPDSC -EXPSRC: @EXPSRC +EXPID: {{ EXPID }} +EXPDSC: {{ EXPDSC }} +EXPSRC: {{ EXPSRC }} CONTACT: 'http://gmao.gsfc.nasa.gov' @@ -20,8 +20,8 @@ COLLECTIONS: 'geosgcm_prog' # 'geosgcm_meltwtr' # 'geosgcm_snowlayer' 'geosgcm_tracer' -@HIST_GOCART 'tavg2d_aer_x' -@HIST_GOCART 'tavg3d_aer_p' + {{ HIST_GOCART }} 'tavg2d_aer_x' + {{ HIST_GOCART }} 'tavg3d_aer_p' # 'geosgcm_iau' # 'geosgcm_conv' # 'goswim_catch' @@ -56,22 +56,22 @@ COLLECTIONS: 'geosgcm_prog' # list of COLLECTIONS for scripting purposes. # ################################################## -GRID_LABELS: PC@HIST_IMx@HIST_JM-DC +GRID_LABELS: PC{{ HIST_IM }}x{{ HIST_JM }}-DC :: -PC@HIST_IMx@HIST_JM-DC.GRID_TYPE: LatLon -PC@HIST_IMx@HIST_JM-DC.IM_WORLD: @HIST_IM -PC@HIST_IMx@HIST_JM-DC.JM_WORLD: @HIST_JM -PC@HIST_IMx@HIST_JM-DC.POLE: PC -PC@HIST_IMx@HIST_JM-DC.DATELINE: DC -PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.GRID_TYPE: LatLon +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.IM_WORLD: {{ HIST_IM }} +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.JM_WORLD: {{ HIST_JM }} +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.POLE: PC +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.DATELINE: DC +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.LM: {{ AGCM_LM }} geosgcm_prog.template: '%y4%m2%d2_%h2%n2z.nc4' , geosgcm_prog.archive: '%c/Y%y4' , geosgcm_prog.format: 'CFIO' , geosgcm_prog.deflate: 1 , - geosgcm_prog.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_prog.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_prog.regrid_method: 'BILINEAR', geosgcm_prog.frequency: 060000 , geosgcm_prog.vscale: 100.0 , @@ -96,7 +96,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM prog.eta.archive: '%c/Y%y4' , prog.eta.format: 'CFIO' , prog.eta.deflate: 1 , - prog.eta.grid_label: PC@HIST_IMx@HIST_JM-DC , + prog.eta.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , prog.eta.regrid_method: 'BILINEAR', prog.eta.mode: 'instantaneous' , prog.eta.frequency: 060000 , @@ -126,7 +126,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_surf.archive: '%c/Y%y4' , geosgcm_surf.format: 'CFIO' , geosgcm_surf.deflate: 1 , - geosgcm_surf.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_surf.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_surf.regrid_method: 'BILINEAR', geosgcm_surf.mode: 'time-averaged' , geosgcm_surf.monthly: 1 , @@ -280,51 +280,51 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM 'PHIW' , 'SURFACE' , 'TAUTW' , 'SURFACE' , 'ZETA_W' , 'SURFACE' , -@HIST_CATCHCN 'CNLAI' , 'SURFACE' , -@HIST_CATCHCN 'CNTLAI' , 'SURFACE' , -@HIST_CATCHCN 'CNSAI' , 'SURFACE' , -@HIST_CATCHCN 'CNTOTC' , 'SURFACE' , -@HIST_CATCHCN 'CNVEGC' , 'SURFACE' , -@HIST_CATCHCN 'CNROOT' , 'SURFACE' , -@HIST_CATCHCN 'CNFROOTC' , 'SURFACE' , -@HIST_CATCHCN 'CNNPP' , 'SURFACE' , -@HIST_CATCHCN 'CNGPP' , 'SURFACE' , -@HIST_CATCHCN 'CNSR' , 'SURFACE' , -@HIST_CATCHCN 'CNNEE' , 'SURFACE' , -@HIST_CATCHCN 'CNXSMR' , 'SURFACE' , -@HIST_CATCHCN 'CNADD' , 'SURFACE' , -@HIST_CATCHCN 'PARABS' , 'SURFACE' , -@HIST_CATCHCN 'PARINC' , 'SURFACE' , -@HIST_CATCHCN 'SCSAT' , 'SURFACE' , -@HIST_CATCHCN 'SCUNS' , 'SURFACE' , -@HIST_CATCHCN 'BTRANT' , 'SURFACE' , 'BTRAN' , -@HIST_CATCHCN 'SIF' , 'SURFACE' , -@HIST_CATCHCN 'CNLOSS' , 'SURFACE' , 'CLOSS' , -@HIST_CATCHCN 'CNBURN' , 'SURFACE' , 'BURN' , -@HIST_CATCHCN 'CNFSEL' , 'SURFACE' , 'FSEL' , -@HIST_CATCHCN 'EVPICE' , 'SURFACE' , -@HIST_CATCHCN 'EVPSNO' , 'SURFACE' , -@HIST_CATCHCN 'EVPINT' , 'SURFACE' , -@HIST_CATCHCN 'EVPSOI' , 'SURFACE' , -@HIST_CATCHCN 'EVPVEG' , 'SURFACE' , -@HIST_CATCHCN 'FRSAT' , 'SURFACE' , -@HIST_CATCHCN 'FRUST' , 'SURFACE' , -@HIST_CATCHCN 'FRWLT' , 'SURFACE' , -@HIST_CATCHCN 'TPSAT' , 'SURFACE' , -@HIST_CATCHCN 'TPUNST' , 'SURFACE' , -@HIST_CATCHCN 'TPWLT' , 'SURFACE' , -@HIST_CATCHCN 'TPSURF' , 'SURFACE' , 'TSURF' , -@HIST_CATCHCN 'GHTSKIN' , 'SURFACE' , -@HIST_CATCHCN 'WAT10CM' , 'SURFACE' , -@HIST_CATCHCN 'WATSOI' , 'SURFACE' , -@HIST_CATCHCN 'ICESOI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNLAI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNTLAI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNSAI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNTOTC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNVEGC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNROOT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNFROOTC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNNPP' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNGPP' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNSR' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNNEE' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNXSMR' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNADD' , 'SURFACE' , +{{ HIST_CATCHCN }} 'PARABS' , 'SURFACE' , +{{ HIST_CATCHCN }} 'PARINC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'SCSAT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'SCUNS' , 'SURFACE' , +{{ HIST_CATCHCN }} 'BTRANT' , 'SURFACE' , 'BTRAN' , +{{ HIST_CATCHCN }} 'SIF' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNLOSS' , 'SURFACE' , 'CLOSS' , +{{ HIST_CATCHCN }} 'CNBURN' , 'SURFACE' , 'BURN' , +{{ HIST_CATCHCN }} 'CNFSEL' , 'SURFACE' , 'FSEL' , +{{ HIST_CATCHCN }} 'EVPICE' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPSNO' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPINT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPSOI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPVEG' , 'SURFACE' , +{{ HIST_CATCHCN }} 'FRSAT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'FRUST' , 'SURFACE' , +{{ HIST_CATCHCN }} 'FRWLT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPSAT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPUNST' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPWLT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPSURF' , 'SURFACE' , 'TSURF' , +{{ HIST_CATCHCN }} 'GHTSKIN' , 'SURFACE' , +{{ HIST_CATCHCN }} 'WAT10CM' , 'SURFACE' , +{{ HIST_CATCHCN }} 'WATSOI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'ICESOI' , 'SURFACE' , :: geosgcm_ocn.template: '%y4%m2%d2_%h2%n2z.nc4' , geosgcm_ocn.archive: '%c/Y%y4' , geosgcm_ocn.format: 'CFIO' , geosgcm_ocn.deflate: 1 , - geosgcm_ocn.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_ocn.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_ocn.regrid_method: 'BILINEAR', geosgcm_ocn.mode: 'time-averaged' , geosgcm_ocn.monthly: 1 , @@ -383,9 +383,9 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_meltwtr.archive: '%c/Y%y4' , geosgcm_meltwtr.format: 'CFIO' , geosgcm_meltwtr.deflate: 1 , - geosgcm_meltwtr.regrid_name: '@AGCM_GRIDNAME' , + geosgcm_meltwtr.regrid_name: '{{ AGCM_GRIDNAME }}' , geosgcm_meltwtr.regrid_exch: 'tile.bin' , - geosgcm_meltwtr.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_meltwtr.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_meltwtr.regrid_method: 'BILINEAR', geosgcm_meltwtr.mode: 'time-averaged' , geosgcm_meltwtr.monthly: 1 , @@ -398,9 +398,9 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_landice.archive: '%c/Y%y4' , geosgcm_landice.format: 'CFIO' , geosgcm_landice.deflate: 1 , - geosgcm_landice.regrid_name: '@AGCM_GRIDNAME' , + geosgcm_landice.regrid_name: '{{ AGCM_GRIDNAME }}' , geosgcm_landice.regrid_exch: 'tile.bin' , - geosgcm_landice.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_landice.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_landice.regrid_method: 'BILINEAR', geosgcm_landice.mode: 'time-averaged' , geosgcm_landice.monthly: 1 , @@ -433,9 +433,9 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_snowlayer.archive: '%c/Y%y4' , geosgcm_snowlayer.format: 'CFIO' , geosgcm_snowlayer.deflate: 1 , - geosgcm_snowlayer.regrid_name: '@AGCM_GRIDNAME' , + geosgcm_snowlayer.regrid_name: '{{ AGCM_GRIDNAME }}' , geosgcm_snowlayer.regrid_exch: 'tile.bin' , - geosgcm_snowlayer.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_snowlayer.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_snowlayer.regrid_method: 'BILINEAR', geosgcm_snowlayer.mode: 'time-averaged' , geosgcm_snowlayer.monthly: 1 , @@ -457,7 +457,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_moist.archive: '%c/Y%y4' , geosgcm_moist.format: 'CFIO' , geosgcm_moist.deflate: 1 , - geosgcm_moist.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_moist.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_moist.regrid_method: 'BILINEAR', geosgcm_moist.mode: 'time-averaged' , geosgcm_moist.monthly: 1 , @@ -498,7 +498,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_turb.archive: '%c/Y%y4' , geosgcm_turb.format: 'CFIO' , geosgcm_turb.deflate: 1 , - geosgcm_turb.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_turb.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_turb.regrid_method: 'BILINEAR', geosgcm_turb.mode: 'time-averaged' , geosgcm_turb.monthly: 1 , @@ -529,7 +529,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_gwd.archive: '%c/Y%y4' , geosgcm_gwd.format: 'CFIO' , geosgcm_gwd.deflate: 1 , - geosgcm_gwd.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_gwd.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_gwd.regrid_method: 'BILINEAR', geosgcm_gwd.mode: 'time-averaged' , geosgcm_gwd.monthly: 1 , @@ -553,7 +553,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_tend.archive: '%c/Y%y4' , geosgcm_tend.format: 'CFIO' , geosgcm_tend.deflate: 1 , - geosgcm_tend.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_tend.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_tend.regrid_method: 'BILINEAR', geosgcm_tend.mode: 'time-averaged' , geosgcm_tend.monthly: 1 , @@ -590,7 +590,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_budi.archive: '%c/Y%y4' , geosgcm_budi.format: 'CFIO' , geosgcm_budi.deflate: 1 , - geosgcm_budi.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_budi.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_budi.regrid_method: 'CONSERVE', geosgcm_budi.frequency: 030000 , geosgcm_budi.fields: 'TQV' , 'AGCM' , @@ -604,7 +604,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_buda.archive: '%c/Y%y4' , geosgcm_buda.format: 'CFIO' , geosgcm_buda.deflate: 1 , - geosgcm_buda.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_buda.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_buda.regrid_method: 'CONSERVE', geosgcm_buda.mode: 'time-averaged' , geosgcm_buda.monthly: 1 , @@ -636,7 +636,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_iau.archive: '%c/Y%y4' , geosgcm_iau.format: 'CFIO' , geosgcm_iau.deflate: 1 , - geosgcm_iau.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_iau.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_iau.regrid_method: 'BILINEAR', geosgcm_iau.mode: 'time-averaged' , # geosgcm_iau.monthly: 1 , @@ -660,7 +660,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_conv.archive: '%c/Y%y4' , geosgcm_conv.format: 'CFIO' , geosgcm_conv.deflate: 1 , - geosgcm_conv.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_conv.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_conv.regrid_method: 'BILINEAR', geosgcm_conv.frequency: 010000 , geosgcm_conv.fields: 'TQV' , 'AGCM' , @@ -685,7 +685,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_bud.archive: '%c/Y%y4' , geosgcm_bud.format: 'CFIO' , geosgcm_bud.deflate: 1 , - geosgcm_bud.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_bud.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_bud.regrid_method: 'BILINEAR', geosgcm_bud.mode: 'time-averaged' , geosgcm_bud.frequency: 240000 , @@ -736,9 +736,9 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM goswim_catch.archive: '%c/Y%y4' , goswim_catch.format: 'CFIO' , goswim_catch.deflate: 1 , - goswim_catch.regrid_name: '@AGCM_GRIDNAME' , + goswim_catch.regrid_name: '{{ AGCM_GRIDNAME }}' , goswim_catch.regrid_exch: 'tile.bin' , - goswim_catch.grid_label: PC@HIST_IMx@HIST_JM-DC , + goswim_catch.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , goswim_catch.regrid_method: 'BILINEAR', goswim_catch.mode: 'time-averaged' , goswim_catch.frequency: 240000 , @@ -770,7 +770,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM goswim_land.archive: '%c/Y%y4' , goswim_land.format: 'CFIO' , goswim_land.deflate: 1 , - goswim_land.grid_label: PC@HIST_IMx@HIST_JM-DC , + goswim_land.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , goswim_land.regrid_method: 'BILINEAR', goswim_land.mode: 'time-averaged' , goswim_land.frequency: 240000 , @@ -799,9 +799,9 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM goswim_landice.archive: '%c/Y%y4' , goswim_landice.format: 'CFIO' , goswim_landice.deflate: 1 , - goswim_landice.regrid_name: '@AGCM_GRIDNAME' + goswim_landice.regrid_name: '{{ AGCM_GRIDNAME }}' goswim_landice.regrid_exch: 'tile.bin' , - goswim_landice.grid_label: PC@HIST_IMx@HIST_JM-DC , + goswim_landice.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , goswim_landice.regrid_method: 'BILINEAR', goswim_landice.mode: 'time-averaged' , goswim_landice.frequency: 240000 , @@ -828,7 +828,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM tavg2d_aer_x.archive: '%c/Y%y4', tavg2d_aer_x.format: 'CFIO', tavg2d_aer_x.deflate: 1, - tavg2d_aer_x.grid_label: PC@HIST_IMx@HIST_JM-DC, + tavg2d_aer_x.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC, tavg2d_aer_x.mode: 'time-averaged', tavg2d_aer_x.monthly: 1, # tavg2d_aer_x.frequency: 240000, @@ -1007,7 +1007,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM tavg3d_aer_p.archive: '%c/Y%y4', tavg3d_aer_p.format: 'CFIO', tavg3d_aer_p.deflate: 1, - tavg3d_aer_p.grid_label: PC@HIST_IMx@HIST_JM-DC, + tavg3d_aer_p.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC, tavg3d_aer_p.mode: 'time-averaged', tavg3d_aer_p.monthly: 1, # tavg3d_aer_p.frequency: 240000, @@ -1027,17 +1027,17 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM 'CA.bcMASS' , 'CA.bc' , 'BC' , 'CA.ocMASS' , 'CA.oc' , 'OC' , 'CA.brMASS' , 'CA.br' , 'BR' , - 'SO2' , 'SU' , - 'SO4' , 'SU' , + 'SO2' , 'SU' , + 'SO4' , 'SU' , 'NH3MASS' , 'NI' , 'NH3' , 'NH4MASS' , 'NI' , 'NH4' , 'NIMASS' , 'NI' , 'NI' , 'HNO3CONC' , 'NI' , 'NICONC' , 'NI' , - 'DUEXTCOEF' , 'DU' , - 'SSEXTCOEF' , 'SS' , - 'SUEXTCOEF' , 'SU' , - 'NIEXTCOEF' , 'NI' , + 'DUEXTCOEF' , 'DU' , + 'SSEXTCOEF' , 'SS' , + 'SUEXTCOEF' , 'SU' , + 'NIEXTCOEF' , 'NI' , 'CA.bcEXTCOEF' , 'CA.bc' , 'BCEXTCOEF' , 'CA.brEXTCOEF' , 'CA.br' , 'BREXTCOEF' , 'CA.ocEXTCOEF' , 'CA.oc' , 'OCEXTCOEF' , @@ -1052,7 +1052,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_tracer.archive: '%c/Y%y4' , geosgcm_tracer.format: 'CFIO' , geosgcm_tracer.deflate: 1 , - geosgcm_tracer.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_tracer.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_tracer.regrid_method: 'BILINEAR', geosgcm_tracer.mode: 'time-averaged' , geosgcm_tracer.monthly: 1 , @@ -1082,7 +1082,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_lidar.archive: '%c/Y%y4' , geosgcm_lidar.format: 'CFIO' , geosgcm_lidar.deflate: 1 , - geosgcm_lidar.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_lidar.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_lidar.regrid_method: 'BILINEAR', geosgcm_lidar.mode: 'time-averaged' , geosgcm_lidar.frequency: 030000 , @@ -1125,7 +1125,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_parasol.archive: '%c/Y%y4' , geosgcm_parasol.format: 'CFIO' , geosgcm_parasol.deflate: 1 , - geosgcm_parasol.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_parasol.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_parasol.regrid_method: 'BILINEAR', geosgcm_parasol.mode: 'time-averaged' , geosgcm_parasol.frequency: 030000 , @@ -1141,7 +1141,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_radar.archive: '%c/Y%y4' , geosgcm_radar.format: 'CFIO' , geosgcm_radar.deflate: 1 , - geosgcm_radar.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_radar.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_radar.regrid_method: 'BILINEAR', geosgcm_radar.mode: 'time-averaged' , geosgcm_radar.frequency: 030000 , @@ -1184,7 +1184,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_isccp.archive: '%c/Y%y4' , geosgcm_isccp.format: 'CFIO' , geosgcm_isccp.deflate: 1 , - geosgcm_isccp.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_isccp.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_isccp.regrid_method: 'BILINEAR', geosgcm_isccp.mode: 'time-averaged' , geosgcm_isccp.frequency: 030000 , @@ -1254,7 +1254,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_modis.archive: '%c/Y%y4' , geosgcm_modis.format: 'CFIO' , geosgcm_modis.deflate: 1 , - geosgcm_modis.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_modis.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_modis.regrid_method: 'BILINEAR', geosgcm_modis.mode: 'time-averaged' , geosgcm_modis.frequency: 030000 , @@ -1336,7 +1336,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_misr.archive: '%c/Y%y4' , geosgcm_misr.format: 'CFIO' , geosgcm_misr.deflate: 1 , - geosgcm_misr.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_misr.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_misr.regrid_method: 'BILINEAR', geosgcm_misr.mode: 'time-averaged' , geosgcm_misr.frequency: 030000 , @@ -1370,7 +1370,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_rad.archive: '%c/Y%y4', geosgcm_rad.format: 'CFIO', geosgcm_rad.deflate: 1 , - geosgcm_rad.grid_label: PC@HIST_IMx@HIST_JM-DC, + geosgcm_rad.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC, geosgcm_rad.regrid_method: 'BILINEAR', geosgcm_rad.mode: 'time-averaged', geosgcm_rad.monthly: 1, @@ -1423,7 +1423,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_int.archive: '%c/Y%y4', geosgcm_int.format: 'CFIO' , geosgcm_int.deflate: 1 , - geosgcm_int.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_int.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_int.regrid_method: 'BILINEAR', geosgcm_int.mode: 'time-averaged' , geosgcm_int.monthly: 1 , @@ -1449,7 +1449,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_seaice.archive: '%c/Y%y4', geosgcm_seaice.format: 'CFIO', geosgcm_seaice.deflate: 1 , -# geosgcm_seaice.grid_label: PC@HIST_IMx@HIST_JM-DC , +# geosgcm_seaice.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , # geosgcm_seaice.regrid_method: 'BILINEAR', geosgcm_seaice.mode: 'time-averaged' , geosgcm_seaice.monthly: 1 , @@ -1497,13 +1497,13 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_icethm.archive: '%c/Y%y4', geosgcm_icethm.format: 'CFIO', geosgcm_icethm.deflate: 1 , -# geosgcm_icethm.grid_label: PC@HIST_IMx@HIST_JM-DC , +# geosgcm_icethm.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , # geosgcm_icethm.regrid_method: 'BILINEAR', geosgcm_icethm.mode: 'time-averaged' , geosgcm_icethm.monthly: 1 , # geosgcm_icethm.frequency: 240000, geosgcm_icethm.regrid_exch:'tile.bin', - geosgcm_icethm.regrid_name:'@OGCM_GRIDNAME', + geosgcm_icethm.regrid_name:'{{ OGCM_GRIDNAME }}', geosgcm_icethm.fields: 'DVIDTT' , 'SEAICETHERMO', 'dvidtt', 'DAIDTT' , 'SEAICETHERMO', 'daidtt', 'FBOT' , 'SEAICETHERMO', 'fbot', @@ -1526,11 +1526,11 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_ocn3d.template: '%y4%m2%d2_%h2%n2z.nc4', geosgcm_ocn3d.archive: '%c/Y%y4', - geosgcm_ocn3d.format: 'CFIO', + geosgcm_ocn3d.format: 'CFIO', geosgcm_ocn3d.deflate: 1 , geosgcm_ocn3d.monthly: 1 , geosgcm_ocn3d.mode: 'time-averaged', - geosgcm_ocn3d.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_ocn3d.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_ocn3d.levels: 'vgrid.ascii' geosgcm_ocn3d.fields: 'DH' , 'MOM', 'T' , 'MOM', @@ -1549,7 +1549,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_ocn2d.deflate: 1 , geosgcm_ocn2d.monthly: 1 , geosgcm_ocn2d.mode: 'time-averaged', - geosgcm_ocn2d.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_ocn2d.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_ocn2d.fields: 'UW' , 'MOM', 'US' 'VW' , 'MOM', 'VS' 'TW' , 'MOM', 'TS' @@ -1579,7 +1579,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_ocn3dT.template: '%y4%m2%d2_%h2%n2z.nc4', geosgcm_ocn3dT.archive: '%c/Y%y4', - geosgcm_ocn3dT.format: 'CFIO', + geosgcm_ocn3dT.format: 'CFIO', geosgcm_ocn3dT.deflate: 1 , geosgcm_ocn3dT.monthly: 1 , geosgcm_ocn3dT.mode: 'time-averaged', @@ -1633,13 +1633,13 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_aoflux.archive: '%c/Y%y4', geosgcm_aoflux.format: 'CFIO', geosgcm_aoflux.deflate: 1 , -# geosgcm_aoflux.grid_label: PC@HIST_IMx@HIST_JM-DC , +# geosgcm_aoflux.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , # geosgcm_aoflux.regrid_method: 'BILINEAR', geosgcm_aoflux.mode: 'time-averaged' , geosgcm_aoflux.monthly: 1 , geosgcm_aoflux.frequency: 240000, # geosgcm_aoflux.regrid_exch:'tile.bin', - geosgcm_aoflux.regrid_name:'@OGCM_GRIDNAME', + geosgcm_aoflux.regrid_name:'{{ OGCM_GRIDNAME }}', geosgcm_aoflux.fields: 'TS_FOUND' , 'OPENWATER', 'SS_FOUND' , 'OPENWATER', 'AO_DRNIR' , 'OPENWATER', @@ -1703,7 +1703,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_iceflxn.mode: 'time-averaged', # geosgcm_iceflxn.frequency: 240000, geosgcm_iceflxn.regrid_exch:'tile.bin', - geosgcm_iceflxn.regrid_name:'@OGCM_GRIDNAME', + geosgcm_iceflxn.regrid_name:'{{ OGCM_GRIDNAME }}', geosgcm_iceflxn.fields: 'FCONDBOTN' , 'SEAICETHERMO', 'fcondbotn', 'SHICEN' , 'SEAICETHERMO', 'FSWSFCN' , 'SEAICETHERMO', @@ -1719,12 +1719,12 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_iceflx.template: '%y4%m2%d2_%h2%n2z.nc4', geosgcm_iceflx.archive: '%c/Y%y4', geosgcm_iceflx.format: 'CFIO', - geosgcm_iceflx.deflate: 1, - geosgcm_iceflx.monthly: 1, + geosgcm_iceflx.deflate: 1, + geosgcm_iceflx.monthly: 1, geosgcm_iceflx.mode: 'time-averaged', # geosgcm_iceflx.frequency: 240000, geosgcm_iceflx.regrid_exch:'tile.bin', - geosgcm_iceflx.regrid_name:'@OGCM_GRIDNAME', + geosgcm_iceflx.regrid_name:'{{ OGCM_GRIDNAME }}', geosgcm_iceflx.fields: 'LWDNSRF' , 'SEAICETHERMO', 'SWDNSRF' , 'SEAICETHERMO', 'HLWUPICE' , 'SEAICETHERMO', diff --git a/HISTORY.AOGCM.rc.tmpl b/HISTORY.AOGCM.rc.tmpl index dcde413f..588a948e 100644 --- a/HISTORY.AOGCM.rc.tmpl +++ b/HISTORY.AOGCM.rc.tmpl @@ -1,7 +1,7 @@ VERSION: 1 -EXPID: @EXPID -EXPDSC: @EXPDSC -EXPSRC: @EXPSRC +EXPID: {{ EXPID }} +EXPDSC: {{ EXPDSC }} +EXPSRC: {{ EXPSRC }} CONTACT: 'http://gmao.gsfc.nasa.gov' @@ -20,8 +20,8 @@ COLLECTIONS: 'geosgcm_prog' # 'geosgcm_meltwtr' # 'geosgcm_snowlayer' 'geosgcm_tracer' -@HIST_GOCART 'tavg2d_aer_x' -@HIST_GOCART 'tavg3d_aer_p' + {{ HIST_GOCART }} 'tavg2d_aer_x' + {{ HIST_GOCART }} 'tavg3d_aer_p' # 'geosgcm_iau' # 'geosgcm_conv' # 'goswim_catch' @@ -39,7 +39,7 @@ COLLECTIONS: 'geosgcm_prog' 'geosgcm_rad' # 'geosgcm_int' 'geosgcm_seaice' -@HIST_CICE4 'geosgcm_icethm' + {{ HIST_CICE4 }} 'geosgcm_icethm' 'geosgcm_ocn2dT' # 'geosgcm_aoflux' # 'geosgcm_icecat' @@ -53,22 +53,22 @@ COLLECTIONS: 'geosgcm_prog' # list of COLLECTIONS for scripting purposes. # ################################################## -GRID_LABELS: PC@HIST_IMx@HIST_JM-DC +GRID_LABELS: PC{{ HIST_IM }}x{{ HIST_JM }}-DC :: -PC@HIST_IMx@HIST_JM-DC.GRID_TYPE: LatLon -PC@HIST_IMx@HIST_JM-DC.IM_WORLD: @HIST_IM -PC@HIST_IMx@HIST_JM-DC.JM_WORLD: @HIST_JM -PC@HIST_IMx@HIST_JM-DC.POLE: PC -PC@HIST_IMx@HIST_JM-DC.DATELINE: DC -PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.GRID_TYPE: LatLon +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.IM_WORLD: {{ HIST_IM }} +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.JM_WORLD: {{ HIST_JM }} +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.POLE: PC +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.DATELINE: DC +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.LM: {{ AGCM_LM }} geosgcm_prog.template: '%y4%m2%d2_%h2%n2z.nc4' , geosgcm_prog.archive: '%c/Y%y4' , geosgcm_prog.format: 'CFIO' , geosgcm_prog.deflate: 1 , - geosgcm_prog.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_prog.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_prog.regrid_method: 'BILINEAR', geosgcm_prog.frequency: 060000 , geosgcm_prog.vscale: 100.0 , @@ -93,7 +93,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM prog.eta.archive: '%c/Y%y4' , prog.eta.format: 'CFIO' , prog.eta.deflate: 1 , - prog.eta.grid_label: PC@HIST_IMx@HIST_JM-DC , + prog.eta.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , prog.eta.regrid_method: 'BILINEAR', prog.eta.mode: 'instantaneous' , prog.eta.frequency: 060000 , @@ -123,7 +123,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_surf.archive: '%c/Y%y4' , geosgcm_surf.format: 'CFIO' , geosgcm_surf.deflate: 1 , - geosgcm_surf.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_surf.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_surf.regrid_method: 'BILINEAR', geosgcm_surf.mode: 'time-averaged' , geosgcm_surf.monthly: 1 , @@ -277,51 +277,51 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM 'PHIW' , 'SURFACE' , 'TAUTW' , 'SURFACE' , 'ZETA_W' , 'SURFACE' , -@HIST_CATCHCN 'CNLAI' , 'SURFACE' , -@HIST_CATCHCN 'CNTLAI' , 'SURFACE' , -@HIST_CATCHCN 'CNSAI' , 'SURFACE' , -@HIST_CATCHCN 'CNTOTC' , 'SURFACE' , -@HIST_CATCHCN 'CNVEGC' , 'SURFACE' , -@HIST_CATCHCN 'CNROOT' , 'SURFACE' , -@HIST_CATCHCN 'CNFROOTC' , 'SURFACE' , -@HIST_CATCHCN 'CNNPP' , 'SURFACE' , -@HIST_CATCHCN 'CNGPP' , 'SURFACE' , -@HIST_CATCHCN 'CNSR' , 'SURFACE' , -@HIST_CATCHCN 'CNNEE' , 'SURFACE' , -@HIST_CATCHCN 'CNXSMR' , 'SURFACE' , -@HIST_CATCHCN 'CNADD' , 'SURFACE' , -@HIST_CATCHCN 'PARABS' , 'SURFACE' , -@HIST_CATCHCN 'PARINC' , 'SURFACE' , -@HIST_CATCHCN 'SCSAT' , 'SURFACE' , -@HIST_CATCHCN 'SCUNS' , 'SURFACE' , -@HIST_CATCHCN 'BTRANT' , 'SURFACE' , 'BTRAN' , -@HIST_CATCHCN 'SIF' , 'SURFACE' , -@HIST_CATCHCN 'CNLOSS' , 'SURFACE' , 'CLOSS' , -@HIST_CATCHCN 'CNBURN' , 'SURFACE' , 'BURN' , -@HIST_CATCHCN 'CNFSEL' , 'SURFACE' , 'FSEL' , -@HIST_CATCHCN 'EVPICE' , 'SURFACE' , -@HIST_CATCHCN 'EVPSNO' , 'SURFACE' , -@HIST_CATCHCN 'EVPINT' , 'SURFACE' , -@HIST_CATCHCN 'EVPSOI' , 'SURFACE' , -@HIST_CATCHCN 'EVPVEG' , 'SURFACE' , -@HIST_CATCHCN 'FRSAT' , 'SURFACE' , -@HIST_CATCHCN 'FRUST' , 'SURFACE' , -@HIST_CATCHCN 'FRWLT' , 'SURFACE' , -@HIST_CATCHCN 'TPSAT' , 'SURFACE' , -@HIST_CATCHCN 'TPUNST' , 'SURFACE' , -@HIST_CATCHCN 'TPWLT' , 'SURFACE' , -@HIST_CATCHCN 'TPSURF' , 'SURFACE' , 'TSURF' , -@HIST_CATCHCN 'GHTSKIN' , 'SURFACE' , -@HIST_CATCHCN 'WAT10CM' , 'SURFACE' , -@HIST_CATCHCN 'WATSOI' , 'SURFACE' , -@HIST_CATCHCN 'ICESOI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNLAI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNTLAI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNSAI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNTOTC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNVEGC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNROOT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNFROOTC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNNPP' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNGPP' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNSR' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNNEE' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNXSMR' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNADD' , 'SURFACE' , +{{ HIST_CATCHCN }} 'PARABS' , 'SURFACE' , +{{ HIST_CATCHCN }} 'PARINC' , 'SURFACE' , +{{ HIST_CATCHCN }} 'SCSAT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'SCUNS' , 'SURFACE' , +{{ HIST_CATCHCN }} 'BTRANT' , 'SURFACE' , 'BTRAN' , +{{ HIST_CATCHCN }} 'SIF' , 'SURFACE' , +{{ HIST_CATCHCN }} 'CNLOSS' , 'SURFACE' , 'CLOSS' , +{{ HIST_CATCHCN }} 'CNBURN' , 'SURFACE' , 'BURN' , +{{ HIST_CATCHCN }} 'CNFSEL' , 'SURFACE' , 'FSEL' , +{{ HIST_CATCHCN }} 'EVPICE' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPSNO' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPINT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPSOI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'EVPVEG' , 'SURFACE' , +{{ HIST_CATCHCN }} 'FRSAT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'FRUST' , 'SURFACE' , +{{ HIST_CATCHCN }} 'FRWLT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPSAT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPUNST' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPWLT' , 'SURFACE' , +{{ HIST_CATCHCN }} 'TPSURF' , 'SURFACE' , 'TSURF' , +{{ HIST_CATCHCN }} 'GHTSKIN' , 'SURFACE' , +{{ HIST_CATCHCN }} 'WAT10CM' , 'SURFACE' , +{{ HIST_CATCHCN }} 'WATSOI' , 'SURFACE' , +{{ HIST_CATCHCN }} 'ICESOI' , 'SURFACE' , :: geosgcm_ocn.template: '%y4%m2%d2_%h2%n2z.nc4' , geosgcm_ocn.archive: '%c/Y%y4' , geosgcm_ocn.format: 'CFIO' , geosgcm_ocn.deflate: 1 , - geosgcm_ocn.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_ocn.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_ocn.regrid_method: 'BILINEAR', geosgcm_ocn.mode: 'time-averaged' , geosgcm_ocn.monthly: 1 , @@ -380,9 +380,9 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_meltwtr.archive: '%c/Y%y4' , geosgcm_meltwtr.format: 'CFIO' , geosgcm_meltwtr.deflate: 1 , - geosgcm_meltwtr.regrid_name: '@AGCM_GRIDNAME' , + geosgcm_meltwtr.regrid_name: '{{ AGCM_GRIDNAME }}' , geosgcm_meltwtr.regrid_exch: 'tile.bin' , - geosgcm_meltwtr.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_meltwtr.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_meltwtr.regrid_method: 'BILINEAR', geosgcm_meltwtr.mode: 'time-averaged' , geosgcm_meltwtr.monthly: 1 , @@ -395,9 +395,9 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_landice.archive: '%c/Y%y4' , geosgcm_landice.format: 'CFIO' , geosgcm_landice.deflate: 1 , - geosgcm_landice.regrid_name: '@AGCM_GRIDNAME' , + geosgcm_landice.regrid_name: '{{ AGCM_GRIDNAME }}' , geosgcm_landice.regrid_exch: 'tile.bin' , - geosgcm_landice.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_landice.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_landice.regrid_method: 'BILINEAR', geosgcm_landice.mode: 'time-averaged' , geosgcm_landice.monthly: 1 , @@ -430,9 +430,9 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_snowlayer.archive: '%c/Y%y4' , geosgcm_snowlayer.format: 'CFIO' , geosgcm_snowlayer.deflate: 1 , - geosgcm_snowlayer.regrid_name: '@AGCM_GRIDNAME' , + geosgcm_snowlayer.regrid_name: '{{ AGCM_GRIDNAME }}' , geosgcm_snowlayer.regrid_exch: 'tile.bin' , - geosgcm_snowlayer.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_snowlayer.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_snowlayer.regrid_method: 'BILINEAR', geosgcm_snowlayer.mode: 'time-averaged' , geosgcm_snowlayer.monthly: 1 , @@ -454,7 +454,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_moist.archive: '%c/Y%y4' , geosgcm_moist.format: 'CFIO' , geosgcm_moist.deflate: 1 , - geosgcm_moist.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_moist.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_moist.regrid_method: 'BILINEAR', geosgcm_moist.mode: 'time-averaged' , geosgcm_moist.monthly: 1 , @@ -495,7 +495,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_turb.archive: '%c/Y%y4' , geosgcm_turb.format: 'CFIO' , geosgcm_turb.deflate: 1 , - geosgcm_turb.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_turb.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_turb.regrid_method: 'BILINEAR', geosgcm_turb.mode: 'time-averaged' , geosgcm_turb.monthly: 1 , @@ -526,7 +526,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_gwd.archive: '%c/Y%y4' , geosgcm_gwd.format: 'CFIO' , geosgcm_gwd.deflate: 1 , - geosgcm_gwd.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_gwd.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_gwd.regrid_method: 'BILINEAR', geosgcm_gwd.mode: 'time-averaged' , geosgcm_gwd.monthly: 1 , @@ -550,7 +550,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_tend.archive: '%c/Y%y4' , geosgcm_tend.format: 'CFIO' , geosgcm_tend.deflate: 1 , - geosgcm_tend.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_tend.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_tend.regrid_method: 'BILINEAR', geosgcm_tend.mode: 'time-averaged' , geosgcm_tend.monthly: 1 , @@ -587,7 +587,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_budi.archive: '%c/Y%y4' , geosgcm_budi.format: 'CFIO' , geosgcm_budi.deflate: 1 , - geosgcm_budi.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_budi.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_budi.regrid_method: 'CONSERVE', geosgcm_budi.frequency: 030000 , geosgcm_budi.fields: 'TQV' , 'AGCM' , @@ -601,7 +601,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_buda.archive: '%c/Y%y4' , geosgcm_buda.format: 'CFIO' , geosgcm_buda.deflate: 1 , - geosgcm_buda.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_buda.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_buda.regrid_method: 'CONSERVE', geosgcm_buda.mode: 'time-averaged' , geosgcm_buda.monthly: 1 , @@ -633,7 +633,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_iau.archive: '%c/Y%y4' , geosgcm_iau.format: 'CFIO' , geosgcm_iau.deflate: 1 , - geosgcm_iau.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_iau.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_iau.regrid_method: 'BILINEAR', geosgcm_iau.mode: 'time-averaged' , # geosgcm_iau.monthly: 1 , @@ -657,7 +657,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_conv.archive: '%c/Y%y4' , geosgcm_conv.format: 'CFIO' , geosgcm_conv.deflate: 1 , - geosgcm_conv.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_conv.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_conv.regrid_method: 'BILINEAR', geosgcm_conv.frequency: 010000 , geosgcm_conv.fields: 'TQV' , 'AGCM' , @@ -682,7 +682,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_bud.archive: '%c/Y%y4' , geosgcm_bud.format: 'CFIO' , geosgcm_bud.deflate: 1 , - geosgcm_bud.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_bud.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_bud.regrid_method: 'BILINEAR', geosgcm_bud.mode: 'time-averaged' , geosgcm_bud.frequency: 240000 , @@ -733,9 +733,9 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM goswim_catch.archive: '%c/Y%y4' , goswim_catch.format: 'CFIO' , goswim_catch.deflate: 1 , - goswim_catch.regrid_name: '@AGCM_GRIDNAME' , + goswim_catch.regrid_name: '{{ AGCM_GRIDNAME }}' , goswim_catch.regrid_exch: 'tile.bin' , - goswim_catch.grid_label: PC@HIST_IMx@HIST_JM-DC , + goswim_catch.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , goswim_catch.regrid_method: 'BILINEAR', goswim_catch.mode: 'time-averaged' , goswim_catch.frequency: 240000 , @@ -767,7 +767,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM goswim_land.archive: '%c/Y%y4' , goswim_land.format: 'CFIO' , goswim_land.deflate: 1 , - goswim_land.grid_label: PC@HIST_IMx@HIST_JM-DC , + goswim_land.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , goswim_land.regrid_method: 'BILINEAR', goswim_land.mode: 'time-averaged' , goswim_land.frequency: 240000 , @@ -796,9 +796,9 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM goswim_landice.archive: '%c/Y%y4' , goswim_landice.format: 'CFIO' , goswim_landice.deflate: 1 , - goswim_landice.regrid_name: '@AGCM_GRIDNAME' + goswim_landice.regrid_name: '{{ AGCM_GRIDNAME }}' goswim_landice.regrid_exch: 'tile.bin' , - goswim_landice.grid_label: PC@HIST_IMx@HIST_JM-DC , + goswim_landice.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , goswim_landice.regrid_method: 'BILINEAR', goswim_landice.mode: 'time-averaged' , goswim_landice.frequency: 240000 , @@ -825,7 +825,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM tavg2d_aer_x.archive: '%c/Y%y4', tavg2d_aer_x.format: 'CFIO', tavg2d_aer_x.deflate: 1, - tavg2d_aer_x.grid_label: PC@HIST_IMx@HIST_JM-DC, + tavg2d_aer_x.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC, tavg2d_aer_x.mode: 'time-averaged', tavg2d_aer_x.monthly: 1, # tavg2d_aer_x.frequency: 240000, @@ -1004,7 +1004,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM tavg3d_aer_p.archive: '%c/Y%y4', tavg3d_aer_p.format: 'CFIO', tavg3d_aer_p.deflate: 1, - tavg3d_aer_p.grid_label: PC@HIST_IMx@HIST_JM-DC, + tavg3d_aer_p.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC, tavg3d_aer_p.mode: 'time-averaged', tavg3d_aer_p.monthly: 1, # tavg3d_aer_p.frequency: 240000, @@ -1024,17 +1024,17 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM 'CA.bcMASS' , 'CA.bc' , 'BC' , 'CA.ocMASS' , 'CA.oc' , 'OC' , 'CA.brMASS' , 'CA.br' , 'BR' , - 'SO2' , 'SU' , - 'SO4' , 'SU' , + 'SO2' , 'SU' , + 'SO4' , 'SU' , 'NH3MASS' , 'NI' , 'NH3' , 'NH4MASS' , 'NI' , 'NH4' , 'NIMASS' , 'NI' , 'NI' , 'HNO3CONC' , 'NI' , 'NICONC' , 'NI' , - 'DUEXTCOEF' , 'DU' , - 'SSEXTCOEF' , 'SS' , - 'SUEXTCOEF' , 'SU' , - 'NIEXTCOEF' , 'NI' , + 'DUEXTCOEF' , 'DU' , + 'SSEXTCOEF' , 'SS' , + 'SUEXTCOEF' , 'SU' , + 'NIEXTCOEF' , 'NI' , 'CA.bcEXTCOEF' , 'CA.bc' , 'BCEXTCOEF' , 'CA.brEXTCOEF' , 'CA.br' , 'BREXTCOEF' , 'CA.ocEXTCOEF' , 'CA.oc' , 'OCEXTCOEF' , @@ -1049,7 +1049,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_tracer.archive: '%c/Y%y4' , geosgcm_tracer.format: 'CFIO' , geosgcm_tracer.deflate: 1 , - geosgcm_tracer.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_tracer.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_tracer.regrid_method: 'BILINEAR', geosgcm_tracer.mode: 'time-averaged' , geosgcm_tracer.monthly: 1 , @@ -1079,7 +1079,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_lidar.archive: '%c/Y%y4' , geosgcm_lidar.format: 'CFIO' , geosgcm_lidar.deflate: 1 , - geosgcm_lidar.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_lidar.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_lidar.regrid_method: 'BILINEAR', geosgcm_lidar.mode: 'time-averaged' , geosgcm_lidar.frequency: 030000 , @@ -1122,7 +1122,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_parasol.archive: '%c/Y%y4' , geosgcm_parasol.format: 'CFIO' , geosgcm_parasol.deflate: 1 , - geosgcm_parasol.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_parasol.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_parasol.regrid_method: 'BILINEAR', geosgcm_parasol.mode: 'time-averaged' , geosgcm_parasol.frequency: 030000 , @@ -1138,7 +1138,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_radar.archive: '%c/Y%y4' , geosgcm_radar.format: 'CFIO' , geosgcm_radar.deflate: 1 , - geosgcm_radar.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_radar.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_radar.regrid_method: 'BILINEAR', geosgcm_radar.mode: 'time-averaged' , geosgcm_radar.frequency: 030000 , @@ -1181,7 +1181,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_isccp.archive: '%c/Y%y4' , geosgcm_isccp.format: 'CFIO' , geosgcm_isccp.deflate: 1 , - geosgcm_isccp.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_isccp.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_isccp.regrid_method: 'BILINEAR', geosgcm_isccp.mode: 'time-averaged' , geosgcm_isccp.frequency: 030000 , @@ -1251,7 +1251,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_modis.archive: '%c/Y%y4' , geosgcm_modis.format: 'CFIO' , geosgcm_modis.deflate: 1 , - geosgcm_modis.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_modis.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_modis.regrid_method: 'BILINEAR', geosgcm_modis.mode: 'time-averaged' , geosgcm_modis.frequency: 030000 , @@ -1333,7 +1333,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_misr.archive: '%c/Y%y4' , geosgcm_misr.format: 'CFIO' , geosgcm_misr.deflate: 1 , - geosgcm_misr.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_misr.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_misr.regrid_method: 'BILINEAR', geosgcm_misr.mode: 'time-averaged' , geosgcm_misr.frequency: 030000 , @@ -1367,7 +1367,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_rad.archive: '%c/Y%y4', geosgcm_rad.format: 'CFIO', geosgcm_rad.deflate: 1 , - geosgcm_rad.grid_label: PC@HIST_IMx@HIST_JM-DC, + geosgcm_rad.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC, geosgcm_rad.regrid_method: 'BILINEAR', geosgcm_rad.mode: 'time-averaged', geosgcm_rad.monthly: 1, @@ -1420,7 +1420,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_int.archive: '%c/Y%y4', geosgcm_int.format: 'CFIO' , geosgcm_int.deflate: 1 , - geosgcm_int.grid_label: PC@HIST_IMx@HIST_JM-DC , + geosgcm_int.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , geosgcm_int.regrid_method: 'BILINEAR', geosgcm_int.mode: 'time-averaged' , geosgcm_int.monthly: 1 , @@ -1446,61 +1446,61 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_seaice.archive: '%c/Y%y4', geosgcm_seaice.format: 'CFIO', geosgcm_seaice.deflate: 1 , -# geosgcm_seaice.grid_label: PC@HIST_IMx@HIST_JM-DC , +# geosgcm_seaice.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , # geosgcm_seaice.regrid_method: 'BILINEAR', geosgcm_seaice.mode: 'time-averaged' , geosgcm_seaice.monthly: 1 , # geosgcm_seaice.frequency: 240000, geosgcm_seaice.fields: 'UI' , 'SEAICE', 'VI' , 'SEAICE', -@HIST_CICE4 'VEL' , 'SEAICE', -@HIST_CICE4 'STRENGTH' , 'SEAICE', -@HIST_CICE4 'SHEAR' , 'SEAICE', -@HIST_CICE4 'DIVU' , 'SEAICE', - 'HICE' , 'SEAICE', -@HIST_CICE4 'HICE0' , 'SEAICE', - 'HSNO' , 'SEAICE', -@HIST_CICE4 'HSNO0' , 'SEAICE', -@HIST_CICE4 'DRAFT' , 'SEAICE', -@HIST_CICE4 'DRAFT0' , 'SEAICE', - 'AICE' , 'SEAICE', -@HIST_CICE4 'DVIDTD' , 'SEAICE', -@HIST_CICE4 'DAIDTD' , 'SEAICE', -@HIST_CICE4 'DVIRDGDT' , 'SEAICE', -@HIST_CICE4 'STRCORX' , 'SEAICE', -@HIST_CICE4 'STRCORY' , 'SEAICE', -@HIST_CICE4 'STRTLTX' , 'SEAICE', -@HIST_CICE4 'STRTLTY' , 'SEAICE', -@HIST_CICE4 'STRINTX' , 'SEAICE', -@HIST_CICE4 'STRINTY' , 'SEAICE', -@HIST_CICE4 'TAUXOCNB' , 'SEAICE', -@HIST_CICE4 'TAUYOCNB' , 'SEAICE', -@HIST_CICE4 'TAUXI' , 'SEAICE', -@HIST_CICE4 'TAUYI' , 'SEAICE', -@HIST_CICE4 'TAUXIB' , 'SEAICE', -@HIST_CICE4 'TAUYIB' , 'SEAICE', - 'TAUXBOT' , 'SEAICE', - 'TAUYBOT' , 'SEAICE', -@HIST_CICE4 'UOCN' , 'SEAICE', -@HIST_CICE4 'VOCN' , 'SEAICE', -@HIST_CICE4 'SSH' , 'SEAICE', -@HIST_CICE4 'SLV' , 'SEAICE', -@HIST_CICE4 'AREA' , 'SEAICE', -@HIST_CICE4 'FROCEAN' , 'SEAICE', -@HIST_CICE4 'TMASK' , 'SEAICE', +{{ HIST_CICE4 }} 'VEL' , 'SEAICE', +{{ HIST_CICE4 }} 'STRENGTH' , 'SEAICE', +{{ HIST_CICE4 }} 'SHEAR' , 'SEAICE', +{{ HIST_CICE4 }} 'DIVU' , 'SEAICE', + 'HICE' , 'SEAICE', +{{ HIST_CICE4 }} 'HICE0' , 'SEAICE', + 'HSNO' , 'SEAICE', +{{ HIST_CICE4 }} 'HSNO0' , 'SEAICE', +{{ HIST_CICE4 }} 'DRAFT' , 'SEAICE', +{{ HIST_CICE4 }} 'DRAFT0' , 'SEAICE', + 'AICE' , 'SEAICE', +{{ HIST_CICE4 }} 'DVIDTD' , 'SEAICE', +{{ HIST_CICE4 }} 'DAIDTD' , 'SEAICE', +{{ HIST_CICE4 }} 'DVIRDGDT' , 'SEAICE', +{{ HIST_CICE4 }} 'STRCORX' , 'SEAICE', +{{ HIST_CICE4 }} 'STRCORY' , 'SEAICE', +{{ HIST_CICE4 }} 'STRTLTX' , 'SEAICE', +{{ HIST_CICE4 }} 'STRTLTY' , 'SEAICE', +{{ HIST_CICE4 }} 'STRINTX' , 'SEAICE', +{{ HIST_CICE4 }} 'STRINTY' , 'SEAICE', +{{ HIST_CICE4 }} 'TAUXOCNB' , 'SEAICE', +{{ HIST_CICE4 }} 'TAUYOCNB' , 'SEAICE', +{{ HIST_CICE4 }} 'TAUXI' , 'SEAICE', +{{ HIST_CICE4 }} 'TAUYI' , 'SEAICE', +{{ HIST_CICE4 }} 'TAUXIB' , 'SEAICE', +{{ HIST_CICE4 }} 'TAUYIB' , 'SEAICE', + 'TAUXBOT' , 'SEAICE', + 'TAUYBOT' , 'SEAICE', +{{ HIST_CICE4 }} 'UOCN' , 'SEAICE', +{{ HIST_CICE4 }} 'VOCN' , 'SEAICE', +{{ HIST_CICE4 }} 'SSH' , 'SEAICE', +{{ HIST_CICE4 }} 'SLV' , 'SEAICE', +{{ HIST_CICE4 }} 'AREA' , 'SEAICE', +{{ HIST_CICE4 }} 'FROCEAN' , 'SEAICE', +{{ HIST_CICE4 }} 'TMASK' , 'SEAICE', :: geosgcm_icethm.template: '%y4%m2%d2_%h2%n2z.nc4', geosgcm_icethm.archive: '%c/Y%y4', geosgcm_icethm.format: 'CFIO', geosgcm_icethm.deflate: 1 , -# geosgcm_icethm.grid_label: PC@HIST_IMx@HIST_JM-DC , +# geosgcm_icethm.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , # geosgcm_icethm.regrid_method: 'BILINEAR', geosgcm_icethm.mode: 'time-averaged' , geosgcm_icethm.monthly: 1 , # geosgcm_icethm.frequency: 240000, geosgcm_icethm.regrid_exch:'tile.bin', - geosgcm_icethm.regrid_name:'@OGCM_GRIDNAME', + geosgcm_icethm.regrid_name:'{{ OGCM_GRIDNAME }}', geosgcm_icethm.fields: 'DVIDTT' , 'SEAICETHERMO', 'dvidtt', 'DAIDTT' , 'SEAICETHERMO', 'daidtt', 'FBOT' , 'SEAICETHERMO', 'fbot', @@ -1558,13 +1558,13 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_aoflux.archive: '%c/Y%y4', geosgcm_aoflux.format: 'CFIO', geosgcm_aoflux.deflate: 1 , -# geosgcm_aoflux.grid_label: PC@HIST_IMx@HIST_JM-DC , +# geosgcm_aoflux.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , # geosgcm_aoflux.regrid_method: 'BILINEAR', geosgcm_aoflux.mode: 'time-averaged' , geosgcm_aoflux.monthly: 1 , geosgcm_aoflux.frequency: 240000, # geosgcm_aoflux.regrid_exch:'tile.bin', - geosgcm_aoflux.regrid_name:'@OGCM_GRIDNAME', + geosgcm_aoflux.regrid_name:'{{ OGCM_GRIDNAME }}', geosgcm_aoflux.fields: 'TS_FOUND' , 'OPENWATER', 'SS_FOUND' , 'OPENWATER', 'AO_DRNIR' , 'OPENWATER', @@ -1628,7 +1628,7 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_iceflxn.mode: 'time-averaged', # geosgcm_iceflxn.frequency: 240000, geosgcm_iceflxn.regrid_exch:'tile.bin', - geosgcm_iceflxn.regrid_name:'@OGCM_GRIDNAME', + geosgcm_iceflxn.regrid_name:'{{ OGCM_GRIDNAME }}', geosgcm_iceflxn.fields: 'FCONDBOTN' , 'SEAICETHERMO', 'fcondbotn', 'SHICEN' , 'SEAICETHERMO', 'FSWSFCN' , 'SEAICETHERMO', @@ -1644,12 +1644,12 @@ PC@HIST_IMx@HIST_JM-DC.LM: @AGCM_LM geosgcm_iceflx.template: '%y4%m2%d2_%h2%n2z.nc4', geosgcm_iceflx.archive: '%c/Y%y4', geosgcm_iceflx.format: 'CFIO', - geosgcm_iceflx.deflate: 1, - geosgcm_iceflx.monthly: 1, + geosgcm_iceflx.deflate: 1, + geosgcm_iceflx.monthly: 1, geosgcm_iceflx.mode: 'time-averaged', # geosgcm_iceflx.frequency: 240000, geosgcm_iceflx.regrid_exch:'tile.bin', - geosgcm_iceflx.regrid_name:'@OGCM_GRIDNAME', + geosgcm_iceflx.regrid_name:'{{ OGCM_GRIDNAME }}', geosgcm_iceflx.fields: 'LWDNSRF' , 'SEAICETHERMO', 'SWDNSRF' , 'SEAICETHERMO', 'HLWUPICE' , 'SEAICETHERMO', diff --git a/HISTORY.AOGCM_MITgcm.rc.tmpl b/HISTORY.AOGCM_MITgcm.rc.tmpl index 456ab560..291ea5f5 100755 --- a/HISTORY.AOGCM_MITgcm.rc.tmpl +++ b/HISTORY.AOGCM_MITgcm.rc.tmpl @@ -1,7 +1,7 @@ VERSION: 1 -EXPID: @EXPID -EXPDSC: @EXPDSC -EXPSRC: @EXPSRC +EXPID: {{ EXPID }} +EXPDSC: {{ EXPDSC }} +EXPSRC: {{ EXPSRC }} CONTACT: 'http://gmao.gsfc.nasa.gov' diff --git a/HISTORY.rc.tmpl b/HISTORY.rc.tmpl index a931a2c9..a373baae 100644 --- a/HISTORY.rc.tmpl +++ b/HISTORY.rc.tmpl @@ -3,12 +3,12 @@ ####################################################################### VERSION: 1 -EXPID: @EXPID -EXPDSC: @EXPDSC -EXPSRC: @EXPSRC +EXPID: {{ EXPID }} +EXPDSC: {{ EXPDSC }} +EXPSRC: {{ EXPSRC }} Allow_Overwrite: .true. -GRID_LABELS: PC@HIST_IMx@HIST_JM-DC +GRID_LABELS: PC{{ HIST_IM }}x{{ HIST_JM }}-DC PC@HISTC_IMx@HISTC_JM-DC PE@APERT_IMx@APERT_JM-CF PE@BJEDI_IMx@BJEDI_JM-CF @@ -18,12 +18,12 @@ GRID_LABELS: PC@HIST_IMx@HIST_JM-DC PC540x361-DC :: -PC@HIST_IMx@HIST_JM-DC.GRID_TYPE: LatLon -PC@HIST_IMx@HIST_JM-DC.IM_WORLD: @HIST_IM -PC@HIST_IMx@HIST_JM-DC.JM_WORLD: @HIST_JM -PC@HIST_IMx@HIST_JM-DC.POLE: PC -PC@HIST_IMx@HIST_JM-DC.DATELINE: DC -PC@HIST_IMx@HIST_JM-DC.LM: 72 +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.GRID_TYPE: LatLon +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.IM_WORLD: {{ HIST_IM }} +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.JM_WORLD: {{ HIST_JM }} +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.POLE: PC +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.DATELINE: DC +PC{{ HIST_IM }}x{{ HIST_JM }}-DC.LM: 72 PC@HISTC_IMx@HISTC_JM-DC.GRID_TYPE: LatLon @@ -174,7 +174,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst3_3d_asm_Np-.regrid_method: 'BILINEAR_MONOTONIC' , inst3_3d_asm_Np-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst3_3d_asm_Np-.mode: 'instantaneous' , - inst3_3d_asm_Np-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst3_3d_asm_Np-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3_3d_asm_Np-.frequency: 030000 , inst3_3d_asm_Np-.duration: 030000 , inst3_3d_asm_Np-.end_date: >>>IOEDATE<<< , @@ -209,7 +209,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst3_3d_asm_Nv-.regrid_method: 'BILINEAR_MONOTONIC' , inst3_3d_asm_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst3_3d_asm_Nv-.mode: 'instantaneous' , - inst3_3d_asm_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst3_3d_asm_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3_3d_asm_Nv-.frequency: 030000 , inst3_3d_asm_Nv-.duration: 030000 , inst3_3d_asm_Nv-.end_date: >>>IOEDATE<<< , @@ -240,7 +240,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst1_2d_asm_Nx-.regrid_method: 'BILINEAR_MONOTONIC' , inst1_2d_asm_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst1_2d_asm_Nx-.mode: 'instantaneous' , - inst1_2d_asm_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst1_2d_asm_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst1_2d_asm_Nx-.frequency: 010000 , inst1_2d_asm_Nx-.duration: 010000 , inst1_2d_asm_Nx-.end_date: >>>IOEDATE<<< , @@ -283,7 +283,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_cld_Nv-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_cld_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_cld_Nv-.mode: 'time-averaged' , - tavg3_3d_cld_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_cld_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_cld_Nv-.frequency: 030000 , tavg3_3d_cld_Nv-.duration: 030000 , tavg3_3d_cld_Nv-.end_date: >>>IOEDATE<<< , @@ -340,7 +340,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_mst_Ne-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_mst_Ne-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_mst_Ne-.mode: 'time-averaged' , - tavg3_3d_mst_Ne-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_mst_Ne-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_mst_Ne-.frequency: 030000 , tavg3_3d_mst_Ne-.duration: 030000 , tavg3_3d_mst_Ne-.end_date: >>>IOEDATE<<< , @@ -361,7 +361,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_mst_Nv-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_mst_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_mst_Nv-.mode: 'time-averaged' , - tavg3_3d_mst_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_mst_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_mst_Nv-.frequency: 030000 , tavg3_3d_mst_Nv-.duration: 030000 , tavg3_3d_mst_Nv-.end_date: >>>IOEDATE<<< , @@ -419,7 +419,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_rad_Nv-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_rad_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_rad_Nv-.mode: 'time-averaged' , - tavg3_3d_rad_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_rad_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_rad_Nv-.frequency: 030000 , tavg3_3d_rad_Nv-.duration: 030000 , tavg3_3d_rad_Nv-.end_date: >>>IOEDATE<<< , @@ -463,7 +463,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_trb_Ne-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_trb_Ne-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_trb_Ne-.mode: 'time-averaged' , - tavg3_3d_trb_Ne-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_trb_Ne-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_trb_Ne-.frequency: 030000 , tavg3_3d_trb_Ne-.duration: 030000 , tavg3_3d_trb_Ne-.end_date: >>>IOEDATE<<< , @@ -519,7 +519,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_tdt_Nv-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_tdt_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_tdt_Nv-.mode: 'time-averaged' , - tavg3_3d_tdt_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_tdt_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_tdt_Nv-.frequency: 030000 , tavg3_3d_tdt_Nv-.duration: 030000 , tavg3_3d_tdt_Nv-.end_date: >>>IOEDATE<<< , @@ -573,7 +573,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_udt_Nv-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_udt_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_udt_Nv-.mode: 'time-averaged' , - tavg3_3d_udt_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_udt_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_udt_Nv-.frequency: 030000 , tavg3_3d_udt_Nv-.duration: 030000 , tavg3_3d_udt_Nv-.end_date: >>>IOEDATE<<< , @@ -621,7 +621,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_qdt_Nv-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_qdt_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_qdt_Nv-.mode: 'time-averaged' , - tavg3_3d_qdt_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_qdt_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_qdt_Nv-.frequency: 030000 , tavg3_3d_qdt_Nv-.duration: 030000 , tavg3_3d_qdt_Nv-.end_date: >>>IOEDATE<<< , @@ -679,7 +679,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_odt_Nv-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_odt_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_odt_Nv-.mode: 'time-averaged' , - tavg3_3d_odt_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_odt_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_odt_Nv-.frequency: 030000 , tavg3_3d_odt_Nv-.duration: 030000 , tavg3_3d_odt_Nv-.end_date: >>>IOEDATE<<< , @@ -725,7 +725,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_lsf_Nv-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_lsf_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_lsf_Nv-.mode: 'time-averaged' , - tavg3_3d_lsf_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_lsf_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_lsf_Nv-.frequency: 030000 , tavg3_3d_lsf_Nv-.duration: 030000 , tavg3_3d_lsf_Nv-.end_date: >>>IOEDATE<<< , @@ -743,7 +743,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_lsf_Ne-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_lsf_Ne-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_lsf_Ne-.mode: 'time-averaged' , - tavg3_3d_lsf_Ne-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_lsf_Ne-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_lsf_Ne-.frequency: 030000 , tavg3_3d_lsf_Ne-.duration: 030000 , tavg3_3d_lsf_Ne-.end_date: >>>IOEDATE<<< , @@ -759,7 +759,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg1_2d_slv_Nx-.regrid_method: 'BILINEAR_MONOTONIC' , tavg1_2d_slv_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg1_2d_slv_Nx-.mode: 'time-averaged' , - tavg1_2d_slv_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg1_2d_slv_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg1_2d_slv_Nx-.frequency: 010000 , tavg1_2d_slv_Nx-.duration: 010000 , tavg1_2d_slv_Nx-.end_date: >>>IOEDATE<<< , @@ -811,7 +811,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg1_2d_flx_Nx-.regrid_method: 'BILINEAR_MONOTONIC' , tavg1_2d_flx_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg1_2d_flx_Nx-.mode: 'time-averaged' , - tavg1_2d_flx_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg1_2d_flx_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg1_2d_flx_Nx-.frequency: 010000 , tavg1_2d_flx_Nx-.duration: 010000 , tavg1_2d_flx_Nx-.end_date: >>>IOEDATE<<< , @@ -870,7 +870,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg1_2d_rad_Nx-.regrid_method: 'BILINEAR_MONOTONIC' , tavg1_2d_rad_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg1_2d_rad_Nx-.mode: 'time-averaged' , - tavg1_2d_rad_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg1_2d_rad_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg1_2d_rad_Nx-.frequency: 010000 , tavg1_2d_rad_Nx-.duration: 010000 , tavg1_2d_rad_Nx-.end_date: >>>IOEDATE<<< , @@ -919,7 +919,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg1_2d_lnd_Nx-.descr: '2d,1-Hourly,Time-Averaged,Single-Level,Assimilation,Land Surface Diagnostics' , tavg1_2d_lnd_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg1_2d_lnd_Nx-.mode: 'time-averaged' , - tavg1_2d_lnd_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg1_2d_lnd_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg1_2d_lnd_Nx-.frequency: 010000 , tavg1_2d_lnd_Nx-.duration: 010000 , tavg1_2d_lnd_Nx-.end_date: >>>IOEDATE<<< , @@ -983,7 +983,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' # tavg1_2d_lfo_Nx-.nbits: 10, tavg1_2d_lfo_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg1_2d_lfo_Nx-.mode: 'time-averaged' , - tavg1_2d_lfo_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg1_2d_lfo_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg1_2d_lfo_Nx-.frequency: 010000 , tavg1_2d_lfo_Nx-.duration: 010000 , tavg1_2d_lfo_Nx-.end_date: >>>IOEDATE<<< , @@ -1002,7 +1002,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' # inst1_2d_lfo_Nx-.nbits: 10, inst1_2d_lfo_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst1_2d_lfo_Nx-.mode: 'instantaneous' , - inst1_2d_lfo_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst1_2d_lfo_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst1_2d_lfo_Nx-.frequency: 010000 , inst1_2d_lfo_Nx-.duration: 010000 , inst1_2d_lfo_Nx-.end_date: >>>IOEDATE<<< , @@ -1021,7 +1021,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg1_2d_ocn_Nx-.regrid_method: 'BILINEAR_MONOTONIC' , tavg1_2d_ocn_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg1_2d_ocn_Nx-.mode: 'time-averaged' , - tavg1_2d_ocn_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg1_2d_ocn_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg1_2d_ocn_Nx-.frequency: 010000 , tavg1_2d_ocn_Nx-.duration: 010000 , tavg1_2d_ocn_Nx-.end_date: >>>IOEDATE<<< , @@ -1081,7 +1081,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst1_2d_ocn_Nx-.regrid_method: 'BILINEAR_MONOTONIC' , inst1_2d_ocn_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst1_2d_ocn_Nx-.mode: 'instantaneous' , - inst1_2d_ocn_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst1_2d_ocn_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst1_2d_ocn_Nx-.frequency: 010000 , inst1_2d_ocn_Nx-.duration: 010000 , inst1_2d_ocn_Nx-.end_date: >>>IOEDATE<<< , @@ -1345,7 +1345,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' gaas_bkg.sfc.frequency: 030000 , gaas_bkg.sfc.duration: 030000 , gaas_bkg.sfc.mode: 'instantaneous' , - gaas_bkg.sfc.grid_label: PC@HIST_IMx@HIST_JM-DC , + gaas_bkg.sfc.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , gaas_bkg.sfc.fields: 'U10M;V10M' , 'SURFACE' , 'DUEXTTAU' , 'DU' , 'SSEXTTAU' , 'SS' , @@ -1367,7 +1367,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst3_2d_gas_Nx-.frequency: 030000 , inst3_2d_gas_Nx-.duration: 030000 , inst3_2d_gas_Nx-.mode: 'instantaneous' , - inst3_2d_gas_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst3_2d_gas_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3_2d_gas_Nx-.fields: 'AODANA' , 'GAAS' , 'AODINC' , 'GAAS' , :: @@ -1385,7 +1385,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst3_3d_gas_Nv-.frequency: 030000 , inst3_3d_gas_Nv-.duration: 030000 , inst3_3d_gas_Nv-.mode: 'instantaneous' , - inst3_3d_gas_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst3_3d_gas_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3_3d_gas_Nv-.fields: 'DELP' , 'DYN' , 'delp' , 'AIRDENS' , 'CHEMENV' , 'DUINC' , 'GAAS' , @@ -1401,7 +1401,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst1_2d_aer_Nx-.descr: '2d,1-Hourly,Instantaneous,Single-Level,Analysis,Aerosol Diagnostics' , inst1_2d_aer_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst1_2d_aer_Nx-.mode: 'instantaneous' , - inst1_2d_aer_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst1_2d_aer_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst1_2d_aer_Nx-.conservative: 1 , inst1_2d_aer_Nx-.splitField: 1 , inst1_2d_aer_Nx-.frequency: 010000 , @@ -1514,7 +1514,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg1_2d_adg_Nx-.descr: '2d,1-Hourly,Time-Averaged,Single-Level,Analysis,Aerosol Diagnostics (extended)' , tavg1_2d_adg_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg1_2d_adg_Nx-.mode: 'time-averaged' , - tavg1_2d_adg_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg1_2d_adg_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg1_2d_adg_Nx-.frequency: 010000 , tavg1_2d_adg_Nx-.duration: 010000 , tavg1_2d_adg_Nx-.end_date: >>>IOEDATE<<< , @@ -1604,7 +1604,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_2d_chm_Nx-.descr: '2d,3-Hourly,Time-Averaged,Single-Level,Analysis,Constituent Diagnostics' , tavg3_2d_chm_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_2d_chm_Nx-.mode: 'time-averaged' , - tavg3_2d_chm_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_2d_chm_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_2d_chm_Nx-.frequency: 030000 , tavg3_2d_chm_Nx-.duration: 030000 , tavg3_2d_chm_Nx-.end_date: >>>IOEDATE<<< , @@ -1631,7 +1631,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst1_2d_hwl_Nx-.descr: '2d,1-Hourly,Instantaneous,Single-Level,Analysis,Hyperwall' , inst1_2d_hwl_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst1_2d_hwl_Nx-.mode: 'instantaneous' , - inst1_2d_hwl_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst1_2d_hwl_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst1_2d_hwl_Nx-.splitField: 1 , inst1_2d_hwl_Nx-.frequency: 010000 , inst1_2d_hwl_Nx-.duration: 010000 , @@ -1649,7 +1649,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst3_3d_aer_Nv-.descr: '3d,3-Hourly,Instantaneous,Model-Level,Analysis,Aerosol Concentrations' , inst3_3d_aer_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst3_3d_aer_Nv-.mode: 'instantaneous' , - inst3_3d_aer_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst3_3d_aer_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3_3d_aer_Nv-.frequency: 030000 , inst3_3d_aer_Nv-.duration: 030000 , inst3_3d_aer_Nv-.ref_time: 000000 , @@ -1702,7 +1702,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst3_3d_chm_Nv-.descr: '3d,3-Hourly,Instantaneous,Model-Level,Analysis,Chemistry' , inst3_3d_chm_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst3_3d_chm_Nv-.mode: 'instantaneous' , - inst3_3d_chm_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst3_3d_chm_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3_3d_chm_Nv-.frequency: 030000 , inst3_3d_chm_Nv-.duration: 030000 , inst3_3d_chm_Nv-.ref_time: 000000 , @@ -1722,7 +1722,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst3_3d_tag_Nv-.descr: '3d,3-Hourly,Instantaneous,Model-Level,Analysis,Tag Tracers' , inst3_3d_tag_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst3_3d_tag_Nv-.mode: 'instantaneous' , - inst3_3d_tag_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst3_3d_tag_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3_3d_tag_Nv-.frequency: 030000 , inst3_3d_tag_Nv-.duration: 030000 , inst3_3d_tag_Nv-.ref_time: 000000 , @@ -1751,7 +1751,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_2d_tag_Nx-.descr: '2d,3-Hourly,Time-Averaged,Single-Level,Analysis,Constituent Diagnostics' , tavg3_2d_tag_Nx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_2d_tag_Nx-.mode: 'time-averaged' , - tavg3_2d_tag_Nx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_2d_tag_Nx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_2d_tag_Nx-.frequency: 030000 , tavg3_2d_tag_Nx-.duration: 030000 , tavg3_2d_tag_Nx-.end_date: >>>IOEDATE<<< , @@ -1820,7 +1820,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_ctm_Cv-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_ctm_Cv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_ctm_Cv-.mode: 'time-averaged' , - tavg3_3d_ctm_Cv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_ctm_Cv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_ctm_Cv-.frequency: 030000 , tavg3_3d_ctm_Cv-.duration: 030000 , tavg3_3d_ctm_Cv-.end_date: >>>IOEDATE<<< , @@ -1851,7 +1851,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_ctm_Ce-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_ctm_Ce-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_ctm_Ce-.mode: 'time-averaged' , - tavg3_3d_ctm_Ce-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_ctm_Ce-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_ctm_Ce-.frequency: 030000 , tavg3_3d_ctm_Ce-.duration: 030000 , tavg3_3d_ctm_Ce-.end_date: >>>IOEDATE<<< , @@ -1872,7 +1872,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_2d_ctm_Cx-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_2d_ctm_Cx-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_2d_ctm_Cx-.mode: 'time-averaged' , - tavg3_2d_ctm_Cx-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_2d_ctm_Cx-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_2d_ctm_Cx-.frequency: 030000 , tavg3_2d_ctm_Cx-.duration: 030000 , tavg3_2d_ctm_Cx-.end_date: >>>IOEDATE<<< , @@ -1916,7 +1916,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_nav_Nv-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_nav_Nv-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_nav_Nv-.mode: 'time-averaged' , - tavg3_3d_nav_Nv-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_nav_Nv-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_nav_Nv-.frequency: 030000 , tavg3_3d_nav_Nv-.duration: 030000 , tavg3_3d_nav_Nv-.end_date: >>>IOEDATE<<< , @@ -1932,7 +1932,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_nav_Ne-.regrid_method: 'BILINEAR_MONOTONIC' , tavg3_3d_nav_Ne-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg3_3d_nav_Ne-.mode: 'time-averaged' , - tavg3_3d_nav_Ne-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_nav_Ne-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_nav_Ne-.frequency: 030000 , tavg3_3d_nav_Ne-.duration: 030000 , tavg3_3d_nav_Ne-.end_date: >>>IOEDATE<<< , @@ -1947,7 +1947,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_trc_Np-.frequency: 030000 , tavg3_3d_trc_Np-.duration: 030000 , tavg3_3d_trc_Np-.mode: 'time-averaged' , - tavg3_3d_trc_Np-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_trc_Np-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_trc_Np-.vscale: 100.0 , tavg3_3d_trc_Np-.vunit: 'hPa' , tavg3_3d_trc_Np-.vvars: 'log(PLE)' , 'DYN' , @@ -1973,7 +1973,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' vtx.mix.end_date: >>>IOEBKGD<<< , vtx.mix.end_time: >>>IOEBKGT<<< , vtx.mix.mode: 'instantaneous' , - vtx.mix.grid_label: PC@HIST_IMx@HIST_JM-DC , + vtx.mix.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , vtx.mix.fields: 'PHIS' , 'AGCM' , 'SLP' , 'DYN' , 'PS' , 'DYN' , @@ -2000,7 +2000,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' vtx.prs.end_date: >>>IOEBKGD<<< , vtx.prs.end_time: >>>IOEBKGT<<< , vtx.prs.mode: 'instantaneous' , - vtx.prs.grid_label: PC@HIST_IMx@HIST_JM-DC , + vtx.prs.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , vtx.prs.vscale: 100.0 , vtx.prs.vunit: 'hPa' , vtx.prs.vvars: 'log(PLE)' , 'DYN' , @@ -2036,7 +2036,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg2_3d_aiau_Np+-.regrid_method: 'BILINEAR_MONOTONIC' , tavg2_3d_aiau_Np+-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg2_3d_aiau_Np+-.mode: 'time-averaged' , - tavg2_3d_aiau_Np+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg2_3d_aiau_Np+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg2_3d_aiau_Np+-.frequency: 020000 , tavg2_3d_aiau_Np+-.duration: 020000 , tavg2_3d_aiau_Np+-.reftime: 010000 , @@ -2073,7 +2073,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst3_3d_asm_Np+-.regrid_method: 'BILINEAR_MONOTONIC' , inst3_3d_asm_Np+-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst3_3d_asm_Np+-.mode: 'instantaneous' , - inst3_3d_asm_Np+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst3_3d_asm_Np+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3_3d_asm_Np+-.frequency: 030000 , inst3_3d_asm_Np+-.duration: 030000 , inst3_3d_asm_Np+-.ref_date: >>>IOBBKGD<<< , @@ -2108,7 +2108,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst3_3d_asm_Nv+-.regrid_method: 'BILINEAR_MONOTONIC' , inst3_3d_asm_Nv+-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst3_3d_asm_Nv+-.mode: 'instantaneous' , - inst3_3d_asm_Nv+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst3_3d_asm_Nv+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3_3d_asm_Nv+-.frequency: 030000 , inst3_3d_asm_Nv+-.duration: 030000 , inst3_3d_asm_Nv+-.ref_date: >>>IOBBKGD<<< , @@ -2139,7 +2139,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg1_2d_slv_Nx+-.regrid_method: 'BILINEAR_MONOTONIC' , tavg1_2d_slv_Nx+-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg1_2d_slv_Nx+-.mode: 'time-averaged' , - tavg1_2d_slv_Nx+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg1_2d_slv_Nx+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg1_2d_slv_Nx+-.frequency: 010000 , tavg1_2d_slv_Nx+-.duration: 010000 , tavg1_2d_slv_Nx+-.ref_date: >>>IOBBKGD<<< , @@ -2189,7 +2189,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg1_2d_flx_Nx+-.regrid_method: 'BILINEAR_MONOTONIC' , tavg1_2d_flx_Nx+-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg1_2d_flx_Nx+-.mode: 'time-averaged' , - tavg1_2d_flx_Nx+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg1_2d_flx_Nx+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg1_2d_flx_Nx+-.frequency: 010000 , tavg1_2d_flx_Nx+-.duration: 010000 , tavg1_2d_flx_Nx+-.ref_date: >>>IOBBKGD<<< , @@ -2240,7 +2240,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg1_2d_lnd_Nx+-.descr: '2d,1-Hourly,Time-Averaged,Single-Level,Forecast,Land Surface Diagnostics' , tavg1_2d_lnd_Nx+-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg1_2d_lnd_Nx+-.mode: 'time-averaged' , - tavg1_2d_lnd_Nx+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg1_2d_lnd_Nx+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg1_2d_lnd_Nx+-.frequency: 010000 , tavg1_2d_lnd_Nx+-.duration: 010000 , tavg1_2d_lnd_Nx+-.ref_date: >>>IOBBKGD<<< , @@ -2306,7 +2306,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg1_2d_rad_Nx+-.regrid_method: 'BILINEAR_MONOTONIC' , tavg1_2d_rad_Nx+-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , tavg1_2d_rad_Nx+-.mode: 'time-averaged' , - tavg1_2d_rad_Nx+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg1_2d_rad_Nx+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg1_2d_rad_Nx+-.frequency: 010000 , tavg1_2d_rad_Nx+-.duration: 010000 , tavg1_2d_rad_Nx+-.ref_date: >>>IOBBKGD<<< , @@ -2358,7 +2358,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst3_2d_met_Nx+-.regrid_method: 'BILINEAR_MONOTONIC' , inst3_2d_met_Nx+-.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , inst3_2d_met_Nx+-.mode: 'instantaneous' , - inst3_2d_met_Nx+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst3_2d_met_Nx+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst3_2d_met_Nx+-.frequency: 030000 , inst3_2d_met_Nx+-.duration: 030000 , inst3_2d_met_Nx+-.ref_date: >>>IOBBKGD<<< , @@ -2499,7 +2499,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_ext_Np+-.frequency: 030000 , tavg3_3d_ext_Np+-.duration: 030000 , tavg3_3d_ext_Np+-.mode: 'time-averaged' , - tavg3_3d_ext_Np+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_ext_Np+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_ext_Np+-.splitField: 1 , tavg3_3d_ext_Np+-.conservative: 1 , tavg3_3d_ext_Np+-.vscale: 100.0 , @@ -2534,7 +2534,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_aer_Np+-.frequency: 030000 , tavg3_3d_aer_Np+-.duration: 030000 , tavg3_3d_aer_Np+-.mode: 'time-averaged' , - tavg3_3d_aer_Np+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_aer_Np+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_aer_Np+-.splitField: 1 , tavg3_3d_aer_Np+-.conservative: 1 , tavg3_3d_aer_Np+-.vscale: 100.0 , @@ -2559,7 +2559,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_chm_Np+-.frequency: 030000 , tavg3_3d_chm_Np+-.duration: 030000 , tavg3_3d_chm_Np+-.mode: 'time-averaged' , - tavg3_3d_chm_Np+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_chm_Np+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_chm_Np+-.vscale: 100.0 , tavg3_3d_chm_Np+-.vunit: 'hPa' , tavg3_3d_chm_Np+-.vvars: 'log(PLE)' , 'DYN' , @@ -2581,7 +2581,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' tavg3_3d_tag_Np+-.frequency: 030000 , tavg3_3d_tag_Np+-.duration: 030000 , tavg3_3d_tag_Np+-.mode: 'time-averaged' , - tavg3_3d_tag_Np+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + tavg3_3d_tag_Np+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , tavg3_3d_tag_Np+-.vscale: 100.0 , tavg3_3d_tag_Np+-.vunit: 'hPa' , tavg3_3d_tag_Np+-.vvars: 'log(PLE)' , 'DYN' , @@ -2613,7 +2613,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' inst1_2d_hwl_Nx+-.deflate: 2 , inst1_2d_hwl_Nx+-.regrid_method: 'BILINEAR_MONOTONIC' , inst1_2d_hwl_Nx+-.mode: 'instantaneous' , - inst1_2d_hwl_Nx+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + inst1_2d_hwl_Nx+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , inst1_2d_hwl_Nx+-.splitField: 1 , inst1_2d_hwl_Nx+-.frequency: 010000 , inst1_2d_hwl_Nx+-.duration: 010000 , @@ -2645,7 +2645,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' prog.eta+-.frequency: 060000 , prog.eta+-.duration: 060000 , prog.eta+-.mode: 'instantaneous' , - prog.eta+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + prog.eta+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , prog.eta+-.fields: 'PHIS' , 'AGCM' , 'phis' , 'SGH' , 'AGCM' , 'hs_stdv' , 'PS' , 'DYN' , 'ps' , @@ -2673,7 +2673,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' prog.sfc+-.frequency: 060000 , prog.sfc+-.duration: 060000 , prog.sfc+-.mode: 'instantaneous' , - prog.sfc+-.grid_label: PC@HIST_IMx@HIST_JM-DC , + prog.sfc+-.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , prog.sfc+-.fields: 'PHIS' , 'AGCM' , 'US;VS' , 'DYN' , 'UA;VA' , 'TA' , 'DYN' , @@ -2723,7 +2723,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' const_2d_asm_Nx.format: 'CFIO' , const_2d_asm_Nx.template: '%y4%m2%d2_%h2%n2z.>>>NCSUFFIX<<<' , const_2d_asm_Nx.mode: 'instantaneous' , - const_2d_asm_Nx.grid_label: PC@HIST_IMx@HIST_JM-DC , + const_2d_asm_Nx.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , const_2d_asm_Nx.frequency: 240000 , const_2d_asm_Nx.duration: 240000 , const_2d_asm_Nx.ref_time: >>>IOBBKGT<<< , @@ -2780,7 +2780,7 @@ COLLECTIONS: 'inst3_3d_asm_Np-' asm.eta.frequency: @ASYNFRQ , asm.eta.duration: @ASYNFRQ , asm.eta.mode: 'instantaneous' , - asm.eta.grid_label: PC@HIST_IMx@HIST_JM-DC , + asm.eta.grid_label: PC{{ HIST_IM }}x{{ HIST_JM }}-DC , asm.eta.fields: 'PHIS' , 'AGCM' , 'phis' , 'SGH' , 'AGCM' , 'hs_stdv' , 'TS' , 'SURFACE' , 'ts' , diff --git a/fvcore_layout.rc b/fvcore_layout.rc index 009e050b..54fa8d97 100644 --- a/fvcore_layout.rc +++ b/fvcore_layout.rc @@ -1,10 +1,10 @@ &fv_core_nml range_warn = .F. fv_debug = .F. - @FV_SCHMIDT - @FV_STRETCH_FAC - @FV_TARGET_LON - @FV_TARGET_LAT + {{ FV_SCHMIDT }} + {{ FV_STRETCH_FAC }} + {{ FV_TARGET_LON }} + {{ FV_TARGET_LAT }} / &main_nml diff --git a/gcm_archive.j b/gcm_archive.j index a4a8ffcb..a6d58a36 100644 --- a/gcm_archive.j +++ b/gcm_archive.j @@ -4,12 +4,12 @@ # Batch Parameters for Archive Job ####################################################################### -#@BATCH_TIME@ARCHIVE_T -#@ARCHIVE_P -#@BATCH_JOBNAME@ARCHIVE_N -#@ARCHIVE_Q -#@BATCH_GROUP -#@BATCH_OUTPUTNAMEOUTPUT +#{{ BATCH_TIME }}{{ ARCHIVE_T }} +#{{ ARCHIVE_P }} +#{{ BATCH_JOBNAME }}{{ ARCHIVE_N }} +#{{ ARCHIVE_Q }} +#{{ BATCH_GROUP }} +#{{ BATCH_OUTPUTNAME }}OUTPUT ####################################################################### # System Environment Variables @@ -19,9 +19,9 @@ umask 022 limit stacksize unlimited -@SETENVS +{{ SETENVS }} -@MPT_SHEPHERD +{{ MPT_SHEPHERD }} ####################################################################### # Architecture Specific Environment Variables @@ -29,13 +29,13 @@ limit stacksize unlimited setenv ARCH `uname` -setenv SITE @SITE -setenv GEOSBIN @GEOSBIN +setenv SITE {{ SITE }} +setenv GEOSBIN {{ GEOSBIN }} source $GEOSBIN/g5_modules -setenv @LD_LIBRARY_PATH_CMD ${LD_LIBRARY_PATH} +setenv {{ LD_LIBRARY_PATH_CMD }} ${LD_LIBRARY_PATH} if ( $?BASEDIR ) then - setenv @LD_LIBRARY_PATH_CMD ${@LD_LIBRARY_PATH_CMD}:${BASEDIR}/${ARCH}/lib + setenv {{ LD_LIBRARY_PATH_CMD }} ${{'{'}}{{LD_LIBRARY_PATH_CMD}}{{'}'}}:${BASEDIR}/${ARCH}/lib endif ####################################################################### diff --git a/gcm_emip.setup b/gcm_emip.setup index 53f75c14..6b5d7275 100755 --- a/gcm_emip.setup +++ b/gcm_emip.setup @@ -30,6 +30,6 @@ sed -f sedfile gcm_run.tmp > gcm_run.j$RSTDATE /bin/rm -f sedfile /bin/rm -f gcm_run.tmp -echo @BATCH_CMD gcm_run.j$RSTDATE +echo {{ BATCH_CMD }} gcm_run.j$RSTDATE end diff --git a/gcm_forecast.setup b/gcm_forecast.setup index bce27a19..88417308 100755 --- a/gcm_forecast.setup +++ b/gcm_forecast.setup @@ -5,12 +5,12 @@ ####################################################################### setenv ARCH `uname` -setenv SITE @SITE +setenv SITE {{ SITE }} -setenv EXPID @EXPID -setenv EXPDIR @EXPDIR -setenv HOMDIR @HOMDIR -setenv GEOSUTIL @GEOSUTIL +setenv EXPID {{ EXPID }} +setenv EXPDIR {{ EXPDIR }} +setenv HOMDIR {{ HOMDIR }} +setenv GEOSUTIL {{ GEOSUTIL }} ####################################################################### # Parameters for Forecasts @@ -107,7 +107,7 @@ s?&FHRS?$FHRS?g EOF sed -f sedfile $EXPDIR/forecasts/gcm_forecast.tmp > $EXPDIR/forecasts/gcm_forecast_${FCST_LABL}.j${date}-${nymde} -if( $QSUB != 'FALSE' ) @BATCH_CMD $EXPDIR/forecasts/gcm_forecast_${FCST_LABL}.j${date}-${nymde} +if( $QSUB != 'FALSE' ) {{ BATCH_CMD }} $EXPDIR/forecasts/gcm_forecast_${FCST_LABL}.j${date}-${nymde} set date = $test end diff --git a/gcm_forecast.tmpl b/gcm_forecast.tmpl index a58d7025..b8bef908 100755 --- a/gcm_forecast.tmpl +++ b/gcm_forecast.tmpl @@ -4,12 +4,12 @@ # Batch Parameters for Run Job ####################################################################### -#@BATCH_TIME@RUN_FT -#@RUN_FP -#@BATCH_JOBNAME@RUN_FN_&DATE -#@RUN_Q -#@BATCH_GROUP -#@BATCH_OUTPUTNAMEFCSTOUT +#{{ BATCH_TIME }}{{ RUN_FT }} +#{{ RUN_FP }} +#{{ BATCH_JOBNAME }}{{ RUN_FN }}_&DATE +#{{ RUN_Q }} +#{{ BATCH_GROUP }} +#{{ BATCH_OUTPUTNAME }}FCSTOUT ####################################################################### # System Settings @@ -25,19 +25,19 @@ limit stacksize unlimited setenv ARCH `uname` -setenv SITE @SITE -setenv GEOSDIR @GEOSDIR -setenv GEOSBIN @GEOSBIN -setenv GEOSETC @GEOSETC -setenv GEOSUTIL @GEOSSRC +setenv SITE {{ SITE }} +setenv GEOSDIR {{ GEOSDIR }} +setenv GEOSBIN {{ GEOSBIN }} +setenv GEOSETC {{ GEOSETC }} +setenv GEOSUTIL {{ GEOSSRC }} source $GEOSBIN/g5_modules -setenv @LD_LIBRARY_PATH_CMD ${LD_LIBRARY_PATH}:${GEOSDIR}/lib +setenv {{ LD_LIBRARY_PATH_CMD }} ${LD_LIBRARY_PATH}:${GEOSDIR}/lib if ( $?BASEDIR ) then - setenv @LD_LIBRARY_PATH_CMD ${@LD_LIBRARY_PATH_CMD}:${BASEDIR}/${ARCH}/lib + setenv {{ LD_LIBRARY_PATH_CMD }} ${{'{'}}{{LD_LIBRARY_PATH_CMD}}{{'}'}}:${BASEDIR}/${ARCH}/lib endif -setenv RUN_CMD "@RUN_CMD" +setenv RUN_CMD "{{ RUN_CMD }}" setenv GCMVER `cat $GEOSETC/.AGCM_VERSION` echo VERSION: $GCMVER @@ -47,9 +47,9 @@ echo VERSION: $GCMVER ####################################################################### -setenv EXPID @EXPID -setenv EXPDIR @EXPDIR -setenv HOMDIR @HOMDIR +setenv EXPID {{ EXPID }} +setenv EXPDIR {{ EXPDIR }} +setenv HOMDIR {{ HOMDIR }} ####################################################################### # Set Forecast Run Parameters @@ -160,14 +160,14 @@ set AGCM_LM = `grep '^\s*AGCM_LM:' $HOMDIR/AGCM.rc | cut -d: -f2` set OGCM_IM = `grep '^\s*OGCM\.IM_WORLD:' $HOMDIR/AGCM.rc | cut -d: -f2` set OGCM_JM = `grep '^\s*OGCM\.JM_WORLD:' $HOMDIR/AGCM.rc | cut -d: -f2` -@COUPLED set OGCM_LM = `grep '^\s*OGCM\.LM:' $HOMDIR/AGCM.rc | cut -d: -f2` -@COUPLED set NX = `grep '^\s*OGCM\.NX:' $HOMDIR/AGCM.rc | cut -d: -f2` -@COUPLED set NY = `grep '^\s*OGCM\.NY:' $HOMDIR/AGCM.rc | cut -d: -f2` +{{ COUPLED }} set OGCM_LM = `grep '^\s*OGCM\.LM:' $HOMDIR/AGCM.rc | cut -d: -f2` +{{ COUPLED }} set NX = `grep '^\s*OGCM\.NX:' $HOMDIR/AGCM.rc | cut -d: -f2` +{{ COUPLED }} set NY = `grep '^\s*OGCM\.NY:' $HOMDIR/AGCM.rc | cut -d: -f2` # Calculate number of cores/nodes for IOSERVER # -------------------------------------------- -set USE_IOSERVER = @USE_IOSERVER +set USE_IOSERVER = {{ USE_IOSERVER }} set NUM_OSERVER_NODES = `grep '^\s*IOSERVER_NODES:' $HOMDIR/AGCM.rc | cut -d: -f2` set NUM_BACKEND_PES = `grep '^\s*NUM_BACKEND_PES:' $HOMDIR/AGCM.rc | cut -d: -f2` @@ -183,7 +183,7 @@ endif @ MODEL_NPES = $NX * $NY -set NCPUS_PER_NODE = @NCPUS_PER_NODE +set NCPUS_PER_NODE = {{ NCPUS_PER_NODE }} set NUM_MODEL_NODES=`echo "scale=6;($MODEL_NPES / $NCPUS_PER_NODE)" | bc | awk 'function ceil(x, y){y=int(x); return(x>y?y+1:y)} {print ceil($1)}'` if ( $NCPUS != NULL ) then @@ -417,22 +417,22 @@ done: # Link Boundary Datasets ####################################################################### -setenv BCSDIR @BCSDIR -@DATAOCEANsetenv SSTDIR @SSTDIR -setenv BCRSLV @ATMOStag_@OCEANtag -@MOM5setenv SSTDIR @COUPLEDIR/SST/MERRA2/${OGCM_IM}x${OGCM_JM}/v1 -@MOM6setenv SSTDIR @COUPLEDIR/SST/MERRA2/${OGCM_IM}x${OGCM_JM}/v1 +setenv BCSDIR {{ BCSDIR }} +{{ DATAOCEAN }}setenv SSTDIR {{ SSTDIR }} +setenv BCRSLV {{ ATMOStag }}_{{ OCEANtag }} +{{ MOM5 }}setenv SSTDIR {{ COUPLEDIR }}/SST/MERRA2/${OGCM_IM}x${OGCM_JM}/v1 +{{ MOM6 }}setenv SSTDIR {{ COUPLEDIR }}/SST/MERRA2/${OGCM_IM}x${OGCM_JM}/v1 #this is hard-wired for NAS for now - should make it more general -@DATAOCEANsetenv BCTAG `basename $BCSDIR` -@COUPLEDsetenv BCTAG `basename @COUPLEDIR/@OCNMODEL/${OGCM_IM}x${OGCM_JM}` -setenv EMISSIONS @EMISSIONS +{{ DATAOCEAN }}setenv BCTAG `basename $BCSDIR` +{{ COUPLED }}setenv BCTAG `basename {{ COUPLEDIR }}/{{ OCNMODEL }}/${OGCM_IM}x${OGCM_JM}` +setenv EMISSIONS {{ EMISSIONS }} chmod +x linkbcs -@GCMRUN_CATCHCNset LSM_CHOICE = `grep LSM_CHOICE: AGCM.rc | cut -d':' -f2` -@GCMRUN_CATCHCNif ($LSM_CHOICE == 2) then -@GCMRUN_CATCHCN grep -v "'CNFROOTC'" HISTORY.rc > Hist_tmp.rc && mv Hist_tmp.rc HISTORY.rc -@GCMRUN_CATCHCNendif +{{ GCMRUN_CATCHCN }}set LSM_CHOICE = `grep LSM_CHOICE: AGCM.rc | cut -d':' -f2` +{{ GCMRUN_CATCHCN }}if ($LSM_CHOICE == 2) then +{{ GCMRUN_CATCHCN }} grep -v "'CNFROOTC'" HISTORY.rc > Hist_tmp.rc && mv Hist_tmp.rc HISTORY.rc +{{ GCMRUN_CATCHCN }}endif ####################################################################### # Get Executable and RESTARTS @@ -633,16 +633,16 @@ if ( $DNA_TRUE == 0 && -e DNA_ExtData.rc ) /bin/mv set ACHEM_TRUE = `grep -i '^\s*ENABLE_ACHEM:\s*\.TRUE\.' GEOS_ChemGridComp.rc | wc -l` if ( $ACHEM_TRUE == 0 && -e ACHEM_ExtData.rc ) /bin/mv ACHEM_ExtData.rc ACHEM_ExtData.rc.NOT_USED -@MP_TURN_OFF_WSUB_EXTDATA# 1MOM and GFDL microphysics do not use WSUB_CLIM -@MP_TURN_OFF_WSUB_EXTDATA# ------------------------------------------------- +{{ MP_TURN_OFF_WSUB_EXTDATA }}# 1MOM and GFDL microphysics do not use WSUB_CLIM +{{ MP_TURN_OFF_WSUB_EXTDATA }}# ------------------------------------------------- if ($EXTDATA2G_TRUE == 0 ) then - @MP_TURN_OFF_WSUB_EXTDATA/bin/mv WSUB_ExtData.rc WSUB_ExtData.tmp - @MP_TURN_OFF_WSUB_EXTDATAcat WSUB_ExtData.tmp | sed -e '/^WSUB_CLIM/ s#ExtData.*#/dev/null#' > WSUB_ExtData.rc + {{ MP_TURN_OFF_WSUB_EXTDATA }}/bin/mv WSUB_ExtData.rc WSUB_ExtData.tmp + {{ MP_TURN_OFF_WSUB_EXTDATA }}cat WSUB_ExtData.tmp | sed -e '/^WSUB_CLIM/ s#ExtData.*#/dev/null#' > WSUB_ExtData.rc else - @MP_TURN_OFF_WSUB_EXTDATA/bin/mv WSUB_ExtData.yaml WSUB_ExtData.tmp - @MP_TURN_OFF_WSUB_EXTDATAcat WSUB_ExtData.tmp | sed -e '/collection:/ s#WSUB_SWclim.*#/dev/null#' > WSUB_ExtData.yaml + {{ MP_TURN_OFF_WSUB_EXTDATA }}/bin/mv WSUB_ExtData.yaml WSUB_ExtData.tmp + {{ MP_TURN_OFF_WSUB_EXTDATA }}cat WSUB_ExtData.tmp | sed -e '/collection:/ s#WSUB_SWclim.*#/dev/null#' > WSUB_ExtData.yaml endif -@MP_TURN_OFF_WSUB_EXTDATA/bin/rm WSUB_ExtData.tmp +{{ MP_TURN_OFF_WSUB_EXTDATA }}/bin/rm WSUB_ExtData.tmp # Generate the complete ExtData.rc # -------------------------------- @@ -696,7 +696,7 @@ endif if (! -e tile.bin) then $GEOSBIN/binarytile.x tile.data tile.bin -@MOM5 $GEOSBIN/binarytile.x tile_hist.data tile_hist.bin +{{ MOM5 }} $GEOSBIN/binarytile.x tile_hist.data tile_hist.bin endif # If running in dual ocean mode, link sst and fraci data here @@ -726,8 +726,8 @@ else # Run the script # -------------- - @SINGULARITY_BUILD $RUN_CMD 1 $SINGULARITY_RUN $GEOSBIN/SaltIntSplitter tile.data $SCRDIR/saltwater_internal_rst - @NATIVE_BUILD $RUN_CMD 1 $GEOSBIN/SaltIntSplitter tile.data $SCRDIR/saltwater_internal_rst + {{ SINGULARITY_BUILD }} $RUN_CMD 1 $SINGULARITY_RUN $GEOSBIN/SaltIntSplitter tile.data $SCRDIR/saltwater_internal_rst + {{ NATIVE_BUILD }} $RUN_CMD 1 $GEOSBIN/SaltIntSplitter tile.data $SCRDIR/saltwater_internal_rst # Move restarts # ------------- @@ -765,8 +765,8 @@ endif if ( -x $GEOSBIN/rs_numtiles.x ) then set N_OPENW_TILES_EXPECTED = `grep '^\s*0' tile.data | wc -l` - @SINGULARITY_BUILD set N_OPENW_TILES_FOUND = `$RUN_CMD 1 $SINGULARITY_RUN $GEOSBIN/rs_numtiles.x openwater_internal_rst | grep Total | awk '{print $NF}'` - @NATIVE_BUILD set N_OPENW_TILES_FOUND = `$RUN_CMD 1 $GEOSBIN/rs_numtiles.x openwater_internal_rst | grep Total | awk '{print $NF}'` + {{ SINGULARITY_BUILD }} set N_OPENW_TILES_FOUND = `$RUN_CMD 1 $SINGULARITY_RUN $GEOSBIN/rs_numtiles.x openwater_internal_rst | grep Total | awk '{print $NF}'` + {{ NATIVE_BUILD }} set N_OPENW_TILES_FOUND = `$RUN_CMD 1 $GEOSBIN/rs_numtiles.x openwater_internal_rst | grep Total | awk '{print $NF}'` if ( $N_OPENW_TILES_EXPECTED != $N_OPENW_TILES_FOUND ) then echo "Error! Found $N_OPENW_TILES_FOUND tiles in openwater. Expect to find $N_OPENW_TILES_EXPECTED tiles." @@ -810,9 +810,9 @@ endif # Environment variables for MPI, etc # ---------------------------------- -@SETENVS +{{ SETENVS }} -@MPT_SHEPHERD +{{ MPT_SHEPHERD }} # Run bundleParser.py #--------------------- @@ -857,8 +857,8 @@ else set IOSERVER_EXTRA = "" endif -@SINGULARITY_BUILD @OCEAN_PRELOAD $RUN_CMD $TOTAL_PES $SINGULARITY_RUN $GEOSEXE $IOSERVER_OPTIONS $IOSERVER_EXTRA --logging_config 'logging.yaml' -@NATIVE_BUILD @OCEAN_PRELOAD @SEVERAL_TRIES $RUN_CMD $TOTAL_PES $GEOSEXE $IOSERVER_OPTIONS $IOSERVER_EXTRA --logging_config 'logging.yaml' +{{ SINGULARITY_BUILD }} {{ OCEAN_PRELOAD }} $RUN_CMD $TOTAL_PES $SINGULARITY_RUN $GEOSEXE $IOSERVER_OPTIONS $IOSERVER_EXTRA --logging_config 'logging.yaml' +{{ NATIVE_BUILD }} {{ OCEAN_PRELOAD }} {{ SEVERAL_TRIES }} $RUN_CMD $TOTAL_PES $GEOSEXE $IOSERVER_OPTIONS $IOSERVER_EXTRA --logging_config 'logging.yaml' if( $USE_SHMEM == 1 ) $GEOSBIN/RmShmKeys_sshmpi.csh >& /dev/null diff --git a/gcm_moveplot.j b/gcm_moveplot.j index cfe19f21..2624022d 100755 --- a/gcm_moveplot.j +++ b/gcm_moveplot.j @@ -4,12 +4,12 @@ # Batch Parameters for Plot Job ####################################################################### -#@BATCH_TIME1:00:00 -#@MOVE_P -#@BATCH_JOBNAME@MOVE_N -#@MOVE_Q -#@BATCH_GROUP -#@BATCH_OUTPUTNAMEgcm_moveplot.o +#{{ BATCH_TIME }}1:00:00 +#{{ MOVE_P }} +#{{ BATCH_JOBNAME }}{{ MOVE_N }} +#{{ MOVE_Q }} +#{{ BATCH_GROUP }} +#{{ BATCH_OUTPUTNAME }}gcm_moveplot.o ####################################################################### # System Environment Variables @@ -19,9 +19,9 @@ umask 022 limit stacksize unlimited -@SETENVS +{{ SETENVS }} -@MPT_SHEPHERD +{{ MPT_SHEPHERD }} ####################################################################### # Architecture Specific Environment Variables @@ -29,23 +29,23 @@ limit stacksize unlimited setenv ARCH `uname` -setenv SITE @SITE -setenv GEOSBIN @GEOSBIN -setenv GEOSUTIL @GEOSSRC +setenv SITE {{ SITE }} +setenv GEOSBIN {{ GEOSBIN }} +setenv GEOSUTIL {{ GEOSSRC }} source $GEOSBIN/g5_modules -setenv @LD_LIBRARY_PATH_CMD ${LD_LIBRARY_PATH} +setenv {{ LD_LIBRARY_PATH_CMD }} ${LD_LIBRARY_PATH} if ( $?BASEDIR ) then - setenv @LD_LIBRARY_PATH_CMD ${@LD_LIBRARY_PATH_CMD}:${BASEDIR}/${ARCH}/lib + setenv {{ LD_LIBRARY_PATH_CMD }} ${{'{'}}{{LD_LIBRARY_PATH_CMD}}{{'}'}}:${BASEDIR}/${ARCH}/lib endif ####################################################################### # Experiment Specific Environment Variables ####################################################################### -setenv EXPID @EXPID -setenv EXPDIR @EXPDIR -setenv HOMDIR @HOMDIR +setenv EXPID {{ EXPID }} +setenv EXPDIR {{ EXPDIR }} +setenv HOMDIR {{ HOMDIR }} ####################################################################### # MOVE Commands diff --git a/gcm_plot.tmpl b/gcm_plot.tmpl index e202c413..17f6c479 100755 --- a/gcm_plot.tmpl +++ b/gcm_plot.tmpl @@ -4,12 +4,12 @@ # Batch Parameters for Plot Job ####################################################################### -#@BATCH_TIME@PLOT_T -#@PLOT_P -#@BATCH_JOBNAME@NAME -#@PLOT_Q -#@BATCH_GROUP -#@BATCH_OUTPUTNAMEOUTPUT +#{{ BATCH_TIME }}{{ PLOT_T }} +#{{ PLOT_P }} +#{{ BATCH_JOBNAME }}@NAME +#{{ PLOT_Q }} +#{{ BATCH_GROUP }} +#{{ BATCH_OUTPUTNAME }}OUTPUT ####################################################################### # System Environment Variables @@ -19,9 +19,9 @@ umask 022 limit stacksize unlimited -@SETENVS +{{ SETENVS }} -@MPT_SHEPHERD +{{ MPT_SHEPHERD }} ####################################################################### # Architecture Specific Environment Variables @@ -29,23 +29,23 @@ limit stacksize unlimited setenv ARCH `uname` -setenv SITE @SITE -setenv GEOSBIN @GEOSBIN -setenv GEOSUTIL @GEOSSRC +setenv SITE {{ SITE }} +setenv GEOSBIN {{ GEOSBIN }} +setenv GEOSUTIL {{ GEOSSRC }} source $GEOSBIN/g5_modules -setenv @LD_LIBRARY_PATH_CMD ${LD_LIBRARY_PATH} +setenv {{ LD_LIBRARY_PATH_CMD }} ${LD_LIBRARY_PATH} if ( $?BASEDIR ) then - setenv @LD_LIBRARY_PATH_CMD ${@LD_LIBRARY_PATH_CMD}:${BASEDIR}/${ARCH}/lib + setenv {{ LD_LIBRARY_PATH_CMD }} ${{'{'}}{{LD_LIBRARY_PATH_CMD}}{{'}'}}:${BASEDIR}/${ARCH}/lib endif ####################################################################### # Experiment Specific Environment Variables ####################################################################### -setenv EXPID @EXPID -setenv EXPDIR @EXPDIR -setenv HOMDIR @HOMDIR +setenv EXPID {{ EXPID }} +setenv EXPDIR {{ EXPDIR }} +setenv HOMDIR {{ HOMDIR }} ####################################################################### # Quickplot Commands @@ -64,5 +64,5 @@ endif ####################################################################### set MOVE = `grep PLOT_MOVE: $EXPDIR/plot/plot.rc | cut -d'#' -f1 | cut -d':' -f2` -if( $MOVE[1] == 'ON' ) @BATCH_CMD $EXPDIR/plot/gcm_moveplot.j +if( $MOVE[1] == 'ON' ) {{ BATCH_CMD }} $EXPDIR/plot/gcm_moveplot.j diff --git a/gcm_post.j b/gcm_post.j index 7cc0be91..97a4a10f 100755 --- a/gcm_post.j +++ b/gcm_post.j @@ -4,13 +4,13 @@ # Batch Parameters for Post-Processing Job ####################################################################### -#@BATCH_TIME@POST_T -#@POST_P -#@BATCH_JOBNAME@POST_N_@COLLECTION.@YYYYMM -#@POST_Q -#@BATCH_GROUP -#@BATCH_OUTPUTNAME@POST_O -#@BATCH_JOINOUTERR +#{{ BATCH_TIME }}{{ POST_T }} +#{{ POST_P }} +#{{ BATCH_JOBNAME }}{{ POST_N }}_@COLLECTION.@YYYYMM +#{{ POST_Q }} +#{{ BATCH_GROUP }} +#{{ BATCH_OUTPUTNAME }}@POST_O +#{{ BATCH_JOINOUTERR }} ####################################################################### # System Environment Variables @@ -20,9 +20,9 @@ umask 022 limit stacksize unlimited -@SETENVS +{{ SETENVS }} -@MPT_SHEPHERD +{{ MPT_SHEPHERD }} ####################################################################### # Architecture Specific Environment Variables @@ -30,22 +30,22 @@ limit stacksize unlimited setenv ARCH `uname` -setenv SITE @SITE -setenv GEOSBIN @GEOSBIN -setenv GEOSUTIL @GEOSSRC -setenv BATCHNAME "@POST_N" +setenv SITE {{ SITE }} +setenv GEOSBIN {{ GEOSBIN }} +setenv GEOSUTIL {{ GEOSSRC }} +setenv BATCHNAME "{{ POST_N }}" source $GEOSBIN/g5_modules -setenv @LD_LIBRARY_PATH_CMD ${LD_LIBRARY_PATH} +setenv {{ LD_LIBRARY_PATH_CMD }} ${LD_LIBRARY_PATH} if ( $?BASEDIR ) then - setenv @LD_LIBRARY_PATH_CMD ${@LD_LIBRARY_PATH_CMD}:${BASEDIR}/${ARCH}/lib + setenv {{ LD_LIBRARY_PATH_CMD }} ${{'{'}}{{LD_LIBRARY_PATH_CMD}}{{'}'}}:${BASEDIR}/${ARCH}/lib endif if( $?SLURM_NTASKS ) then - setenv RUN_CMD "@RUN_CMD" + setenv RUN_CMD "{{ RUN_CMD }}" set NCPUS = $SLURM_NTASKS else if( $?PBS_NODEFILE ) then - setenv RUN_CMD "@RUN_CMD" + setenv RUN_CMD "{{ RUN_CMD }}" set NCPUS = `cat $PBS_NODEFILE | wc -l` else set NCPUS = NULL @@ -55,6 +55,6 @@ endif # Perform Post Processing ####################################################################### -$GEOSUTIL/post/gcmpost.script -source @EXPDIR -ncpus $NCPUS -collections @COLLECTION -rec_plt @YYYYMM +$GEOSUTIL/post/gcmpost.script -source {{ EXPDIR }} -ncpus $NCPUS -collections @COLLECTION -rec_plt @YYYYMM exit diff --git a/gcm_regress.j b/gcm_regress.j index c2660af4..a442186f 100755 --- a/gcm_regress.j +++ b/gcm_regress.j @@ -4,11 +4,11 @@ # Batch Parameters for Regress Job ####################################################################### -#@BATCH_TIME@RUN_T -#@REGRESS_P -#@BATCH_JOBNAME@REGRESS_N -#@RUN_Q -#@BATCH_GROUP +#{{ BATCH_TIME }}{{ RUN_T }} +#{{ REGRESS_P }} +#{{ BATCH_JOBNAME }}{{ REGRESS_N }} +#{{ RUN_Q }} +#{{ BATCH_GROUP }} ####################################################################### # System Environment Variables @@ -18,9 +18,9 @@ umask 022 limit stacksize unlimited -@SETENVS +{{ SETENVS }} -@MPT_SHEPHERD +{{ MPT_SHEPHERD }} # Establish safe default number of OpenMP threads # ----------------------------------------------- @@ -94,26 +94,26 @@ set argv = () setenv ARCH `uname` -setenv SITE @SITE -setenv GEOSDIR @GEOSDIR -setenv GEOSBIN @GEOSBIN +setenv SITE {{ SITE }} +setenv GEOSDIR {{ GEOSDIR }} +setenv GEOSBIN {{ GEOSBIN }} source $GEOSBIN/g5_modules -setenv @LD_LIBRARY_PATH_CMD ${LD_LIBRARY_PATH}:${GEOSDIR}/lib -# We only add BASEDIR to the @LD_LIBRARY_PATH_CMD if BASEDIR is defined (i.e., not running with Spack) +setenv {{ LD_LIBRARY_PATH_CMD }} ${LD_LIBRARY_PATH}:${GEOSDIR}/lib +# We only add BASEDIR to the {{ LD_LIBRARY_PATH_CMD }} if BASEDIR is defined (i.e., not running with Spack) if ( $?BASEDIR ) then - setenv @LD_LIBRARY_PATH_CMD ${@LD_LIBRARY_PATH_CMD}:${BASEDIR}/${ARCH}/lib + setenv {{ LD_LIBRARY_PATH_CMD }} ${{'{'}}{{LD_LIBRARY_PATH_CMD}}{{'}'}}:${BASEDIR}/${ARCH}/lib endif -setenv RUN_CMD "@RUN_CMD" +setenv RUN_CMD "{{ RUN_CMD }}" ####################################################################### # Experiment Specific Environment Variables ####################################################################### -setenv EXPID @EXPID -setenv EXPDIR @EXPDIR -setenv HOMDIR @HOMDIR +setenv EXPID {{ EXPID }} +setenv EXPDIR {{ EXPDIR }} +setenv HOMDIR {{ HOMDIR }} setenv SCRDIR $EXPDIR/scratch ####################################################################### @@ -139,9 +139,9 @@ cp $EXPDIR/RC/*.yaml $EXPDIR/regress cp $EXPDIR/GEOSgcm.x $EXPDIR/regress cp $EXPDIR/linkbcs $EXPDIR/regress cp $HOMDIR/*.yaml $EXPDIR/regress -@COUPLED cp $HOMDIR/*.nml $EXPDIR/regress -@MOM6cp $HOMDIR/MOM_input $EXPDIR/regress -@MOM6cp $HOMDIR/MOM_override $EXPDIR/regress +{{ COUPLED }} cp $HOMDIR/*.nml $EXPDIR/regress +{{ MOM6 }}cp $HOMDIR/MOM_input $EXPDIR/regress +{{ MOM6 }}cp $HOMDIR/MOM_override $EXPDIR/regress cat fvcore_layout.rc >> input.nml @@ -178,8 +178,8 @@ foreach rst ( $rst_file_names ) end cp $EXPDIR/cap_restart $EXPDIR/regress -@COUPLED /bin/mkdir INPUT -@COUPLED cp $EXPDIR/RESTART/* INPUT +{{ COUPLED }} /bin/mkdir INPUT +{{ COUPLED }} cp $EXPDIR/RESTART/* INPUT setenv YEAR `cat cap_restart | cut -c1-4` ./linkbcs @@ -257,23 +257,23 @@ COLLECTIONS: test_collection test_collection.grid_label: PC180x91-DC , test_collection.deflate: 1 , test_collection.frequency: 060000 , -@DATAOCEAN test_collection.fields: 'PHIS', 'AGCM' , -@DATAOCEAN 'SLP' , 'DYN' , -@DATAOCEAN 'T' , 'DYN' , -@DATAOCEAN 'U;V' , 'DYN' , -@DATAOCEAN 'Q' , 'MOIST', 'QV', -@MOM5 test_collection.fields: 'UW' ,'MOM' , 'US', -@MOM5 'VW' ,'MOM' , 'VS', -@MOM5 'TW' ,'MOM' , 'TS', -@MOM5 'SW' ,'MOM' , 'SS', -@MOM5 'SLV' ,'MOM' , -@MOM5 'QFLUX','OCEAN' , -@MOM6 test_collection.fields: 'UW' ,'MOM6' , 'US', -@MOM6 'VW' ,'MOM6' , 'VS', -@MOM6 'TW' ,'MOM6' , 'TS', -@MOM6 'SW' ,'MOM6' , 'SS', -@MOM6 'SLV' ,'MOM6' , -@MOM6 'QFLUX','OCEAN' , +{{ DATAOCEAN }} test_collection.fields: 'PHIS', 'AGCM' , +{{ DATAOCEAN }} 'SLP' , 'DYN' , +{{ DATAOCEAN }} 'T' , 'DYN' , +{{ DATAOCEAN }} 'U;V' , 'DYN' , +{{ DATAOCEAN }} 'Q' , 'MOIST', 'QV', +{{ MOM5 }} test_collection.fields: 'UW' ,'MOM' , 'US', +{{ MOM5 }} 'VW' ,'MOM' , 'VS', +{{ MOM5 }} 'TW' ,'MOM' , 'TS', +{{ MOM5 }} 'SW' ,'MOM' , 'SS', +{{ MOM5 }} 'SLV' ,'MOM' , +{{ MOM5 }} 'QFLUX','OCEAN' , +{{ MOM6 }} test_collection.fields: 'UW' ,'MOM6' , 'US', +{{ MOM6 }} 'VW' ,'MOM6' , 'VS', +{{ MOM6 }} 'TW' ,'MOM6' , 'TS', +{{ MOM6 }} 'SW' ,'MOM6' , 'SS', +{{ MOM6 }} 'SLV' ,'MOM6' , +{{ MOM6 }} 'QFLUX','OCEAN' , :: _EOF_ @@ -322,8 +322,8 @@ set EXTDATA2G_TRUE = `grep -i '^\s*USE_EXTDATA2G:\s*\.TRUE\.' CAP.rc | wc -l # Select proper AMIP GOCART Emission RC Files # ------------------------------------------- -setenv EMISSIONS @EMISSIONS -if( @EMISSIONS == AMIP_EMISSIONS ) then +setenv EMISSIONS {{ EMISSIONS }} +if( {{ EMISSIONS }} == AMIP_EMISSIONS ) then if( $EXTDATA2G_TRUE == 0 ) then set AMIP_Transition_Date = 20000301 @@ -350,16 +350,16 @@ if( @EMISSIONS == AMIP_EMISSIONS ) then endif endif -@MP_TURN_OFF_WSUB_EXTDATA# 1MOM and GFDL microphysics do not use WSUB_CLIM -@MP_TURN_OFF_WSUB_EXTDATA# ------------------------------------------------- +{{ MP_TURN_OFF_WSUB_EXTDATA }}# 1MOM and GFDL microphysics do not use WSUB_CLIM +{{ MP_TURN_OFF_WSUB_EXTDATA }}# ------------------------------------------------- if ($EXTDATA2G_TRUE == 0 ) then - @MP_TURN_OFF_WSUB_EXTDATA/bin/mv WSUB_ExtData.rc WSUB_ExtData.tmp - @MP_TURN_OFF_WSUB_EXTDATAcat WSUB_ExtData.tmp | sed -e '/^WSUB_CLIM/ s#ExtData.*#/dev/null#' > WSUB_ExtData.rc + {{ MP_TURN_OFF_WSUB_EXTDATA }}/bin/mv WSUB_ExtData.rc WSUB_ExtData.tmp + {{ MP_TURN_OFF_WSUB_EXTDATA }}cat WSUB_ExtData.tmp | sed -e '/^WSUB_CLIM/ s#ExtData.*#/dev/null#' > WSUB_ExtData.rc else - @MP_TURN_OFF_WSUB_EXTDATA/bin/mv WSUB_ExtData.yaml WSUB_ExtData.tmp - @MP_TURN_OFF_WSUB_EXTDATAcat WSUB_ExtData.tmp | sed -e '/collection:/ s#WSUB_SWclim.*#/dev/null#' > WSUB_ExtData.yaml + {{ MP_TURN_OFF_WSUB_EXTDATA }}/bin/mv WSUB_ExtData.yaml WSUB_ExtData.tmp + {{ MP_TURN_OFF_WSUB_EXTDATA }}cat WSUB_ExtData.tmp | sed -e '/collection:/ s#WSUB_SWclim.*#/dev/null#' > WSUB_ExtData.yaml endif -@MP_TURN_OFF_WSUB_EXTDATA/bin/rm WSUB_ExtData.tmp +{{ MP_TURN_OFF_WSUB_EXTDATA }}/bin/rm WSUB_ExtData.tmp # Generate the complete ExtData.rc # -------------------------------- @@ -509,7 +509,7 @@ if( $RUN_STARTSTOP == TRUE ) then echo "=== Running test of duration ${test_duration_step1} with NX = $NX and NY = $NY starting at $nymd0 $nhms0 ===" - @OCEAN_PRELOAD @SEVERAL_TRIES $RUN_CMD $NPES ./GEOSgcm.x --logging_config 'logging.yaml' + {{ OCEAN_PRELOAD }} {{ SEVERAL_TRIES }} $RUN_CMD $NPES ./GEOSgcm.x --logging_config 'logging.yaml' set date = `cat cap_restart` set nymde1 = $date[1] @@ -528,7 +528,7 @@ if( $RUN_STARTSTOP == TRUE ) then /bin/mv -v $chk ${chk}.${nymde1}_${nhmse1}.1 end - @MOM6/bin/mv -v RESTART/MOM.res.nc MOM.res.nc.1 + {{ MOM6 }}/bin/mv -v RESTART/MOM.res.nc MOM.res.nc.1 # Move history as well set hist_file_names = `ls -1 ${EXPID}.test_collection.*.nc4` @@ -557,9 +557,9 @@ cp CAP.rc.orig CAP.rc cp AGCM.rc.orig AGCM.rc cp HISTORY.rc0 HISTORY.rc -@COUPLED /bin/rm -rf INPUT -@COUPLED /bin/mkdir INPUT -@COUPLED cp $EXPDIR/RESTART/* INPUT +{{ COUPLED }} /bin/rm -rf INPUT +{{ COUPLED }} /bin/mkdir INPUT +{{ COUPLED }} cp $EXPDIR/RESTART/* INPUT ./strip CAP.rc set oldstring = `cat CAP.rc | grep JOB_SGMT:` @@ -575,7 +575,7 @@ set NY = `grep "^ *NY": AGCM.rc | cut -d':' -f2` echo "=== Running test of duration ${test_duration_step2} with NX = $NX and NY = $NY starting at $nymd0 $nhms0 ===" -@OCEAN_PRELOAD @SEVERAL_TRIES $RUN_CMD $NPES ./GEOSgcm.x --logging_config 'logging.yaml' +{{ OCEAN_PRELOAD }} {{ SEVERAL_TRIES }} $RUN_CMD $NPES ./GEOSgcm.x --logging_config 'logging.yaml' set date = `cat cap_restart` set nymde2 = $date[1] @@ -602,7 +602,7 @@ foreach chk ( $replay_chk_file_names ) $MOVE_OR_COPY $chk ${chk}.${nymde1}_${nhmse1}.2 end -@MOM6 $MOVE_OR_COPY RESTART/MOM.res.nc MOM.res.nc.2 +{{ MOM6 }} $MOVE_OR_COPY RESTART/MOM.res.nc MOM.res.nc.2 # *Copy* history as well set hist_file_names = `ls -1 ${EXPID}.test_collection.*.nc4` @@ -643,7 +643,7 @@ while ( $n <= $numchk ) @ n = $n + 1 end -@COUPLED cp RESTART/* INPUT +{{ COUPLED }} cp RESTART/* INPUT ################################################################## ###### @@ -658,10 +658,10 @@ if ($RUN_STARTSTOP == TRUE) then cp HISTORY.rc0 HISTORY.rc - @MOM6# When you restart in MOM6 mode, you must change input_filename - @MOM6# in the input.nml file from 'n' to 'r' - @MOM6 /bin/cp input.nml input.nml.orig - @MOM6 sed -i -e "s/input_filename = 'n'/input_filename = 'r'/g" input.nml + {{ MOM6 }}# When you restart in MOM6 mode, you must change input_filename + {{ MOM6 }}# in the input.nml file from 'n' to 'r' + {{ MOM6 }} /bin/cp input.nml input.nml.orig + {{ MOM6 }} sed -i -e "s/input_filename = 'n'/input_filename = 'r'/g" input.nml ./strip CAP.rc set oldstring = `cat CAP.rc | grep JOB_SGMT:` @@ -694,7 +694,7 @@ if ($RUN_STARTSTOP == TRUE) then echo "=== Running test of duration ${test_duration_step3} with NX = $NX and NY = $NY starting at $nymdb $nhmsb ===" - @OCEAN_PRELOAD @SEVERAL_TRIES $RUN_CMD $NPES ./GEOSgcm.x --logging_config 'logging.yaml' + {{ OCEAN_PRELOAD }} {{ SEVERAL_TRIES }} $RUN_CMD $NPES ./GEOSgcm.x --logging_config 'logging.yaml' set date = `cat cap_restart` set nymde3 = $date[1] @@ -710,7 +710,7 @@ if ($RUN_STARTSTOP == TRUE) then foreach chk ( $replay_chk_file_names ) /bin/mv -v $chk ${chk}.${nymde1}_${nhmse1}.3 end - @MOM6/bin/mv -v RESTART/MOM.res.nc MOM.res.nc.3 + {{ MOM6 }}/bin/mv -v RESTART/MOM.res.nc MOM.res.nc.3 # Move history as well set hist_file_names = `ls -1 ${EXPID}.test_collection.*.nc4` @@ -746,12 +746,12 @@ if ( $RUN_LAYOUT == TRUE) then cp $EXPDIR/$rst $EXPDIR/regress end - @COUPLED /bin/rm -rf INPUT - @COUPLED /bin/mkdir INPUT - @COUPLED cp $EXPDIR/RESTART/* INPUT + {{ COUPLED }} /bin/rm -rf INPUT + {{ COUPLED }} /bin/mkdir INPUT + {{ COUPLED }} cp $EXPDIR/RESTART/* INPUT - @COUPLED # restore original input.nml - @COUPLED /bin/mv input.nml.orig input.nml + {{ COUPLED }} # restore original input.nml + {{ COUPLED }} /bin/mv input.nml.orig input.nml /bin/rm cap_restart echo $nymd0 $nhms0 > cap_restart @@ -792,17 +792,17 @@ if ( $RUN_LAYOUT == TRUE) then # cat AGCM.tmp | sed -e "s?$oldstring?$newstring?g" > AGCM.rc # ############################################################### - @COUPLED set oldstring = `cat AGCM.rc | grep "^ *OGCM.NX:"` - @COUPLED set newstring = "OGCM.NX: ${test_NY}" - @COUPLED /bin/mv AGCM.rc AGCM.tmp - @COUPLED cat AGCM.tmp | sed -e "s?$oldstring?$newstring?g" > AGCM.rc - @COUPLED set oldstring = `cat AGCM.rc | grep "^ *OGCM.NY:"` - @COUPLED set newstring = "OGCM.NY: ${test_NX}" - @COUPLED /bin/mv AGCM.rc AGCM.tmp - @COUPLED cat AGCM.tmp | sed -e "s?$oldstring?$newstring?g" > AGCM.rc + {{ COUPLED }} set oldstring = `cat AGCM.rc | grep "^ *OGCM.NX:"` + {{ COUPLED }} set newstring = "OGCM.NX: ${test_NY}" + {{ COUPLED }} /bin/mv AGCM.rc AGCM.tmp + {{ COUPLED }} cat AGCM.tmp | sed -e "s?$oldstring?$newstring?g" > AGCM.rc + {{ COUPLED }} set oldstring = `cat AGCM.rc | grep "^ *OGCM.NY:"` + {{ COUPLED }} set newstring = "OGCM.NY: ${test_NX}" + {{ COUPLED }} /bin/mv AGCM.rc AGCM.tmp + {{ COUPLED }} cat AGCM.tmp | sed -e "s?$oldstring?$newstring?g" > AGCM.rc - @MOM5sed -r -i -e "/^ *layout/ s#= ([0-9]+),*([0-9]+)#= ${test_NY},${test_NX}#" input.nml - @MOM6sed -r -i -e "s/#override LAYOUT = 3, 2/#override LAYOUT = ${test_NY}, ${test_NX}/g" MOM_override + {{ MOM5 }}sed -r -i -e "/^ *layout/ s#= ([0-9]+),*([0-9]+)#= ${test_NY},${test_NX}#" input.nml + {{ MOM6 }}sed -r -i -e "s/#override LAYOUT = 3, 2/#override LAYOUT = ${test_NY}, ${test_NX}/g" MOM_override setenv YEAR `cat cap_restart | cut -c1-4` ./linkbcs @@ -825,7 +825,7 @@ if ( $RUN_LAYOUT == TRUE) then echo "=== Running test of duration ${test_duration_step4} with NX = $test_NX and NY = $test_NY starting at $nymd0 $nhms0 ===" - @OCEAN_PRELOAD @SEVERAL_TRIES $RUN_CMD $NPES ./GEOSgcm.x --logging_config 'logging.yaml' + {{ OCEAN_PRELOAD }} {{ SEVERAL_TRIES }} $RUN_CMD $NPES ./GEOSgcm.x --logging_config 'logging.yaml' set date = `cat cap_restart` set nymde4 = $date[1] @@ -842,7 +842,7 @@ if ( $RUN_LAYOUT == TRUE) then /bin/mv -v $chk ${chk}.${nymde1}_${nhmse1}.4 end - @MOM6/bin/mv -v RESTART/MOM.res.nc MOM.res.nc.4 + {{ MOM6 }}/bin/mv -v RESTART/MOM.res.nc MOM.res.nc.4 # Move history as well set hist_file_names = `ls -1 ${EXPID}.test_collection.*.nc4` @@ -884,12 +884,12 @@ if ( $RUN_OPENMP == TRUE) then cp $EXPDIR/$rst $EXPDIR/regress end - @COUPLED /bin/rm -rf INPUT - @COUPLED /bin/mkdir INPUT - @COUPLED cp $EXPDIR/RESTART/* INPUT + {{ COUPLED }} /bin/rm -rf INPUT + {{ COUPLED }} /bin/mkdir INPUT + {{ COUPLED }} cp $EXPDIR/RESTART/* INPUT - @COUPLED # restore original input.nml - @COUPLED /bin/mv input.nml.orig input.nml + {{ COUPLED }} # restore original input.nml + {{ COUPLED }} /bin/mv input.nml.orig input.nml /bin/rm cap_restart echo $nymd0 $nhms0 > cap_restart @@ -915,17 +915,17 @@ if ( $RUN_OPENMP == TRUE) then /bin/mv AGCM.rc AGCM.tmp cat AGCM.tmp | sed -e "s?$oldstring?$newstring?g" > AGCM.rc - @COUPLED set oldstring = `cat AGCM.rc | grep "^ *OGCM.NX:"` - @COUPLED set newstring = "OGCM.NX: ${OGCM_NX0}" - @COUPLED /bin/mv AGCM.rc AGCM.tmp - @COUPLED cat AGCM.tmp | sed -e "s?$oldstring?$newstring?g" > AGCM.rc - @COUPLED set oldstring = `cat AGCM.rc | grep "^ *OGCM.NY:"` - @COUPLED set newstring = "OGCM.NY: ${OGCM_NY0}" - @COUPLED /bin/mv AGCM.rc AGCM.tmp - @COUPLED cat AGCM.tmp | sed -e "s?$oldstring?$newstring?g" > AGCM.rc + {{ COUPLED }} set oldstring = `cat AGCM.rc | grep "^ *OGCM.NX:"` + {{ COUPLED }} set newstring = "OGCM.NX: ${OGCM_NX0}" + {{ COUPLED }} /bin/mv AGCM.rc AGCM.tmp + {{ COUPLED }} cat AGCM.tmp | sed -e "s?$oldstring?$newstring?g" > AGCM.rc + {{ COUPLED }} set oldstring = `cat AGCM.rc | grep "^ *OGCM.NY:"` + {{ COUPLED }} set newstring = "OGCM.NY: ${OGCM_NY0}" + {{ COUPLED }} /bin/mv AGCM.rc AGCM.tmp + {{ COUPLED }} cat AGCM.tmp | sed -e "s?$oldstring?$newstring?g" > AGCM.rc - @MOM5sed -r -i -e "/^ *layout/ s#= ([0-9]+),*([0-9]+)#= ${OGCM_NX0},${OGCM_NY0}#" input.nml - @MOM6sed -r -i -e "s/#override LAYOUT = 3, 2/#override LAYOUT = ${OGCM_NX0}, ${OGCM_NY0}/g" MOM_override + {{ MOM5 }}sed -r -i -e "/^ *layout/ s#= ([0-9]+),*([0-9]+)#= ${OGCM_NX0},${OGCM_NY0}#" input.nml + {{ MOM6 }}sed -r -i -e "s/#override LAYOUT = 3, 2/#override LAYOUT = ${OGCM_NX0}, ${OGCM_NY0}/g" MOM_override setenv YEAR `cat cap_restart | cut -c1-4` ./linkbcs @@ -948,7 +948,7 @@ if ( $RUN_OPENMP == TRUE) then echo "=== Running OpenMP test of duration ${test_duration_step5} with NX = $NX0 and NY = $NY0 starting at $nymd0 $nhms0 ===" - @OCEAN_PRELOAD $RUN_CMD $NPES ./GEOSgcm.x --logging_config 'logging.yaml' + {{ OCEAN_PRELOAD }} $RUN_CMD $NPES ./GEOSgcm.x --logging_config 'logging.yaml' set date = `cat cap_restart` set nymde4 = $date[1] @@ -965,7 +965,7 @@ if ( $RUN_OPENMP == TRUE) then /bin/mv -v $chk ${chk}.${nymde1}_${nhmse1}.5 end - @MOM6/bin/mv -v RESTART/MOM.res.nc MOM.res.nc.5 + {{ MOM6 }}/bin/mv -v RESTART/MOM.res.nc MOM.res.nc.5 # Move history as well set hist_file_names = `ls -1 ${EXPID}.test_collection.*.nc4` @@ -1025,24 +1025,24 @@ if ($RUN_STARTSTOP == TRUE) then endif end - @MOM6# check MOM.res.nc (MOM6 restart) - @MOM6set file1 = MOM.res.nc.1 - @MOM6set file2 = MOM.res.nc.3 - @MOM6if( -e $file1 && -e $file2 ) then - @MOM6 set check = true - @MOM6 if( $check == true ) then - @MOM6 echo Comparing "MOM6 restarts" - @MOM6 cmp $file1 $file2 - @MOM6 if( $status == 0 ) then - @MOM6 echo Start-Stop Success! - @MOM6 echo " " - @MOM6 else - @MOM6 echo Start-Stop Failed! - @MOM6 echo " " - @MOM6 set startstop_pass = false - @MOM6 endif - @MOM6 endif - @MOM6endif + {{ MOM6 }}# check MOM.res.nc (MOM6 restart) + {{ MOM6 }}set file1 = MOM.res.nc.1 + {{ MOM6 }}set file2 = MOM.res.nc.3 + {{ MOM6 }}if( -e $file1 && -e $file2 ) then + {{ MOM6 }} set check = true + {{ MOM6 }} if( $check == true ) then + {{ MOM6 }} echo Comparing "MOM6 restarts" + {{ MOM6 }} cmp $file1 $file2 + {{ MOM6 }} if( $status == 0 ) then + {{ MOM6 }} echo Start-Stop Success! + {{ MOM6 }} echo " " + {{ MOM6 }} else + {{ MOM6 }} echo Start-Stop Failed! + {{ MOM6 }} echo " " + {{ MOM6 }} set pass = false + {{ MOM6 }} endif + {{ MOM6 }} endif + {{ MOM6 }}endif echo "=== Comparing replay checkpoint files from ${NX0}x${NY0} run of duration ${test_duration_step1} with restarts from ${test_duration_step2} + ${test_duration_step3} ${NX0}x${NY0} runs ===" @@ -1150,24 +1150,24 @@ if ($RUN_LAYOUT == TRUE) then endif end - @MOM6# check MOM.res.nc (MOM6 restart) - @MOM6set file1 = MOM.res.nc.2 - @MOM6set file2 = MOM.res.nc.4 - @MOM6if( -e $file1 && -e $file2 ) then - @MOM6 set check = true - @MOM6 if( $check == true ) then - @MOM6 echo Comparing "MOM6 restarts" - @MOM6 cmp $file1 $file2 - @MOM6 if( $status == 0 ) then - @MOM6 echo Layout Success! - @MOM6 echo " " - @MOM6 else - @MOM6 echo Layout Failed! - @MOM6 echo " " - @MOM6 set layout_pass = false - @MOM6 endif - @MOM6 endif - @MOM6endif + {{ MOM6 }}# check MOM.res.nc (MOM6 restart) + {{ MOM6 }}set file1 = MOM.res.nc.2 + {{ MOM6 }}set file2 = MOM.res.nc.4 + {{ MOM6 }}if( -e $file1 && -e $file2 ) then + {{ MOM6 }} set check = true + {{ MOM6 }} if( $check == true ) then + {{ MOM6 }} echo Comparing "MOM6 restarts" + {{ MOM6 }} cmp $file1 $file2 + {{ MOM6 }} if( $status == 0 ) then + {{ MOM6 }} echo Layout Success! + {{ MOM6 }} echo " " + {{ MOM6 }} else + {{ MOM6 }} echo Layout Failed! + {{ MOM6 }} echo " " + {{ MOM6 }} set pass = false + {{ MOM6 }} endif + {{ MOM6 }} endif + {{ MOM6 }}endif echo "=== Comparing replay checkpoint files from 6-hour ${NX0}x${NY0} run with restarts from 6-hour ${test_NX}x${test_NY} run ===" @@ -1282,24 +1282,24 @@ if ($RUN_OPENMP == TRUE) then endif end - @MOM6# check MOM.res.nc (MOM6 restart) - @MOM6set file1 = MOM.res.nc.2 - @MOM6set file2 = MOM.res.nc.5 - @MOM6if( -e $file1 && -e $file2 ) then - @MOM6 set check = true - @MOM6 if( $check == true ) then - @MOM6 echo Comparing "MOM6 restarts" - @MOM6 cmp $file1 $file2 - @MOM6 if( $status == 0 ) then - @MOM6 echo OpenMP Success! - @MOM6 echo " " - @MOM6 else - @MOM6 echo OpenMP Failed! - @MOM6 echo " " - @MOM6 set openmp_pass = false - @MOM6 endif - @MOM6 endif - @MOM6endif + {{ MOM6 }}# check MOM.res.nc (MOM6 restart) + {{ MOM6 }}set file1 = MOM.res.nc.2 + {{ MOM6 }}set file2 = MOM.res.nc.5 + {{ MOM6 }}if( -e $file1 && -e $file2 ) then + {{ MOM6 }} set check = true + {{ MOM6 }} if( $check == true ) then + {{ MOM6 }} echo Comparing "MOM6 restarts" + {{ MOM6 }} cmp $file1 $file2 + {{ MOM6 }} if( $status == 0 ) then + {{ MOM6 }} echo OpenMP Success! + {{ MOM6 }} echo " " + {{ MOM6 }} else + {{ MOM6 }} echo OpenMP Failed! + {{ MOM6 }} echo " " + {{ MOM6 }} set openmp_pass = false + {{ MOM6 }} endif + {{ MOM6 }} endif + {{ MOM6 }}endif echo "=== Comparing replay checkpoint files from 6-hour ${NX0}x${NY0} run with restarts from 6-hour OpenMP:2 ${NX0}x${NY0} run ===" diff --git a/gcm_run.j b/gcm_run.j index 56e515a2..1ee2fac7 100755 --- a/gcm_run.j +++ b/gcm_run.j @@ -4,12 +4,12 @@ # Batch Parameters for Run Job ####################################################################### -#@BATCH_TIME@RUN_T -#@RUN_P -#@BATCH_JOBNAME@RUN_N -#@RUN_Q -#@BATCH_GROUP -#@BATCH_JOINOUTERR +#{{ BATCH_TIME }}{{ RUN_T }} +#{{ RUN_P }} +#{{ BATCH_JOBNAME }}{{ RUN_N }} +#{{ RUN_Q }} +#{{ BATCH_GROUP }} +#{{ BATCH_JOINOUTERR }} #@BATCH_NAME -o gcm_run.o@RSTDATE ####################################################################### @@ -26,21 +26,21 @@ limit stacksize unlimited setenv ARCH `uname` -setenv SITE @SITE -setenv GEOSDIR @GEOSDIR -setenv GEOSBIN @GEOSBIN -setenv GEOSETC @GEOSETC -setenv GEOSUTIL @GEOSSRC +setenv SITE {{ SITE }} +setenv GEOSDIR {{ GEOSDIR }} +setenv GEOSBIN {{ GEOSBIN }} +setenv GEOSETC {{ GEOSETC }} +setenv GEOSUTIL {{ GEOSSRC }} source $GEOSBIN/g5_modules -setenv @LD_LIBRARY_PATH_CMD ${LD_LIBRARY_PATH}:${GEOSDIR}/lib -# We only add BASEDIR to the @LD_LIBRARY_PATH_CMD if BASEDIR is defined (i.e., not running with Spack) +setenv {{ LD_LIBRARY_PATH_CMD }} ${LD_LIBRARY_PATH}:${GEOSDIR}/lib +# We only add BASEDIR to the {{ LD_LIBRARY_PATH_CMD }} if BASEDIR is defined (i.e., not running with Spack) if ( $?BASEDIR ) then - setenv @LD_LIBRARY_PATH_CMD ${@LD_LIBRARY_PATH_CMD}:${BASEDIR}/${ARCH}/lib + setenv {{ LD_LIBRARY_PATH_CMD }} ${{'{'}}{{LD_LIBRARY_PATH_CMD}}{{'}'}}:${BASEDIR}/${ARCH}/lib setenv PATH ${PATH}:${BASEDIR}/${ARCH}/bin endif -setenv RUN_CMD "@RUN_CMD" +setenv RUN_CMD "{{ RUN_CMD }}" setenv GCMVER `cat $GEOSETC/.AGCM_VERSION` echo VERSION: $GCMVER @@ -50,9 +50,9 @@ echo VERSION: $GCMVER ####################################################################### -setenv EXPID @EXPID -setenv EXPDIR @EXPDIR -setenv HOMDIR @HOMDIR +setenv EXPID {{ EXPID }} +setenv EXPDIR {{ EXPDIR }} +setenv HOMDIR {{ HOMDIR }} setenv RSTDATE @RSTDATE setenv GCMEMIP @GCMEMIP @@ -146,14 +146,14 @@ set AGCM_LM = `grep '^\s*AGCM_LM:' $HOMDIR/AGCM.rc | cut -d: -f2` set OGCM_IM = `grep '^\s*OGCM\.IM_WORLD:' $HOMDIR/AGCM.rc | cut -d: -f2` set OGCM_JM = `grep '^\s*OGCM\.JM_WORLD:' $HOMDIR/AGCM.rc | cut -d: -f2` -@COUPLED set OGCM_LM = `grep '^\s*OGCM\.LM:' $HOMDIR/AGCM.rc | cut -d: -f2` -@COUPLED set NX = `grep '^\s*OGCM\.NX:' $HOMDIR/AGCM.rc | cut -d: -f2` -@COUPLED set NY = `grep '^\s*OGCM\.NY:' $HOMDIR/AGCM.rc | cut -d: -f2` +{{ COUPLED }} set OGCM_LM = `grep '^\s*OGCM\.LM:' $HOMDIR/AGCM.rc | cut -d: -f2` +{{ COUPLED }} set NX = `grep '^\s*OGCM\.NX:' $HOMDIR/AGCM.rc | cut -d: -f2` +{{ COUPLED }} set NY = `grep '^\s*OGCM\.NY:' $HOMDIR/AGCM.rc | cut -d: -f2` # Calculate number of cores/nodes for IOSERVER # -------------------------------------------- -set USE_IOSERVER = @USE_IOSERVER +set USE_IOSERVER = {{ USE_IOSERVER }} set NUM_OSERVER_NODES = `grep '^\s*IOSERVER_NODES:' $HOMDIR/AGCM.rc | cut -d: -f2` set NUM_BACKEND_PES = `grep '^\s*NUM_BACKEND_PES:' $HOMDIR/AGCM.rc | cut -d: -f2` @@ -169,7 +169,7 @@ endif @ MODEL_NPES = $NX * $NY -set NCPUS_PER_NODE = @NCPUS_PER_NODE +set NCPUS_PER_NODE = {{ NCPUS_PER_NODE }} set NUM_MODEL_NODES=`echo "scale=6;($MODEL_NPES / $NCPUS_PER_NODE)" | bc | awk 'function ceil(x, y){y=int(x); return(x>y?y+1:y)} {print ceil($1)}'` if ( $NCPUS != NULL ) then @@ -244,7 +244,7 @@ tar -xvf restarts.e${year}${month}10_21z.tar --wildcards "*_internal_rst*" # ------------------------------------------------ set RSTID = `/bin/ls *catch* | /bin/grep -Po '^.*(?=\.\w+_rst\.)'` set day = `/bin/ls *catch* | /bin/grep -Po '(?<=\d{6})\d{2}(?=_21z)'` -$GEOSBIN/remap_restarts.py command_line -np -ymdh ${year}${month}${day}21 -grout C${AGCM_IM} -levsout ${AGCM_LM} -out_dir . -rst_dir . -expid $RSTID -bcvin NL3 -oceanin 1440x720 -in_bc_base /discover/nobackup/projects/gmao/bcs_shared/fvInput/ExtData/esm/tiles -newid regrid -nobkg -nolcv -bcvout @LSMBCS -rs 3 -oceanout @OCEANOUT -out_bc_base @BC_BASE +$GEOSBIN/remap_restarts.py command_line -np -ymdh ${year}${month}${day}21 -grout C${AGCM_IM} -levsout ${AGCM_LM} -out_dir . -rst_dir . -expid $RSTID -bcvin NL3 -oceanin 1440x720 -in_bc_base /discover/nobackup/projects/gmao/bcs_shared/fvInput/ExtData/esm/tiles -newid regrid -nobkg -nolcv -bcvout {{ LSMBCS }} -rs 3 -oceanout {{ OCEANOUT }} -out_bc_base {{ BC_BASE }} set IMC = $AGCM_IM if( $IMC < 10 ) then @@ -321,9 +321,9 @@ if (-z input.nml) then exit 0 endif -@MOM6cp -f $HOMDIR/MOM_input . -@MOM6cp -f $HOMDIR/MOM_override . -@CICE6cp -f $HOMDIR/ice_in . +{{ MOM6 }}cp -f $HOMDIR/MOM_input . +{{ MOM6 }}cp -f $HOMDIR/MOM_override . +{{ CICE6 }}cp -f $HOMDIR/ice_in . if( $GCMEMIP == TRUE ) then cp -f $EXPDIR/restarts/$RSTDATE/cap_restart . @@ -367,112 +367,112 @@ done: ####################################################################### # Link Boundary Datasets ####################################################################### -setenv BCSDIR @BCSDIR -@DATAOCEANsetenv SSTDIR @SSTDIR -setenv BCRSLV @ATMOStag_@OCEANtag -@MOM5setenv SSTDIR @COUPLEDIR/SST/MERRA2/${OGCM_IM}x${OGCM_JM}/v1 -@MOM6setenv SSTDIR @COUPLEDIR/SST/MERRA2/${OGCM_IM}x${OGCM_JM}/v1 +setenv BCSDIR {{ BCSDIR }} +{{ DATAOCEAN }}setenv SSTDIR {{ SSTDIR }} +setenv BCRSLV {{ ATMOStag }}_{{ OCEANtag }} +{{ MOM5 }}setenv SSTDIR {{ COUPLEDIR }}/SST/MERRA2/${OGCM_IM}x${OGCM_JM}/v1 +{{ MOM6 }}setenv SSTDIR {{ COUPLEDIR }}/SST/MERRA2/${OGCM_IM}x${OGCM_JM}/v1 #this is hard-wired for NAS for now - should make it more general -@DATAOCEANsetenv BCTAG `basename $BCSDIR` -@COUPLEDsetenv BCTAG `basename @COUPLEDIR/@OCNMODEL/${OGCM_IM}x${OGCM_JM}` -setenv EMISSIONS @EMISSIONS +{{ DATAOCEAN }}setenv BCTAG `basename $BCSDIR` +{{ COUPLED }}setenv BCTAG `basename {{ COUPLEDIR }}/{{ OCNMODEL }}/${OGCM_IM}x${OGCM_JM}` +setenv EMISSIONS {{ EMISSIONS }} chmod +x linkbcs -@GCMRUN_CATCHCNset LSM_CHOICE = `grep LSM_CHOICE: AGCM.rc | cut -d':' -f2` -@GCMRUN_CATCHCNif ($LSM_CHOICE == 2) then -@GCMRUN_CATCHCN grep -v "'CNFROOTC'" HISTORY.rc > Hist_tmp.rc && mv Hist_tmp.rc HISTORY.rc -@GCMRUN_CATCHCNendif +{{ GCMRUN_CATCHCN }}set LSM_CHOICE = `grep LSM_CHOICE: AGCM.rc | cut -d':' -f2` +{{ GCMRUN_CATCHCN }}if ($LSM_CHOICE == 2) then +{{ GCMRUN_CATCHCN }} grep -v "'CNFROOTC'" HISTORY.rc > Hist_tmp.rc && mv Hist_tmp.rc HISTORY.rc +{{ GCMRUN_CATCHCN }}endif ####################################################################### # Setup executable ####################################################################### -@SINGULARITY_BUILD ####################################################################### -@SINGULARITY_BUILD # Settings for Singularity - EXPERIMENTAL -@SINGULARITY_BUILD ####################################################################### -@SINGULARITY_BUILD -@SINGULARITY_BUILD # Based on work on discover, to run you need to load the same compiler -@SINGULARITY_BUILD # and MPI to match those in the container. For example, if your container was -@SINGULARITY_BUILD # built with: -@SINGULARITY_BUILD # GNU 11.2.0 -@SINGULARITY_BUILD # Intel Fortran 2021.6.0 (aka Intel oneAPI 2022.1.0) -@SINGULARITY_BUILD # Intel MPI 2021.6.0 (aka Intel oneAPI 2022.1.0) -@SINGULARITY_BUILD # then you would need to load: -@SINGULARITY_BUILD # source /usr/share/modules/init/csh -@SINGULARITY_BUILD # module purge -@SINGULARITY_BUILD # module load comp/gcc/11.2.0 -@SINGULARITY_BUILD # module load comp/intel/2021.6.0 -@SINGULARITY_BUILD # module load mpi/impi/2021.6.0 -@SINGULARITY_BUILD # -@SINGULARITY_BUILD # And then also append ${GEOSDIR}/lib to LD_LIBRARY_PATH -@SINGULARITY_BUILD # setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${GEOSDIR}/lib -@SINGULARITY_BUILD # -@SINGULARITY_BUILD # For now we use the fact that on discover we can source g5_modules -@SINGULARITY_BUILD # -@SINGULARITY_BUILD # If you are using singularity, set the path to the singularity sandbox here -@SINGULARITY_BUILD setenv SINGULARITY_SANDBOX @SINGULARITY_SANDBOX -@SINGULARITY_BUILD -@SINGULARITY_BUILD # Error out if SINGULARITY_SANDBOX is not set -@SINGULARITY_BUILD if( $SINGULARITY_SANDBOX == "" ) then -@SINGULARITY_BUILD echo "ERROR: You must set SINGULARITY_SANDBOX to the path to your Singularity sandbox" -@SINGULARITY_BUILD exit 1 -@SINGULARITY_BUILD endif -@SINGULARITY_BUILD -@SINGULARITY_BUILD # If SINGULARITY_SANDBOX is non-empty, then run executable in singularity sandbox -@SINGULARITY_BUILD echo "We are running under Singularity" -@SINGULARITY_BUILD echo "" -@SINGULARITY_BUILD -@SINGULARITY_BUILD # Load the Singularity module -@SINGULARITY_BUILD module load singularity -@SINGULARITY_BUILD -@SINGULARITY_BUILD # Set Singularity Bind Paths. Note: These are dependent on where you are running. -@SINGULARITY_BUILD # By default, we'll assume you are running this script from NOBACKUP -@SINGULARITY_BUILD -@SINGULARITY_BUILD setenv REAL_BIND_PATH @REAL_BIND_PATH -@SINGULARITY_BUILD setenv BASE_BIND_PATH @BASE_BIND_PATH -@SINGULARITY_BUILD setenv BOUNDARY_DIR @BOUNDARY_DIR -@SINGULARITY_BUILD setenv SINGULARITY_BIND_PATH "-B ${NOBACKUP}:${NOBACKUP}:rw,${REAL_BIND_PATH}:${REAL_BIND_PATH}:rw,${BASE_BIND_PATH}:${BASE_BIND_PATH}:ro,${BOUNDARY_DIR}:${BOUNDARY_DIR}:ro" -@SINGULARITY_BUILD -@SINGULARITY_BUILD # If you are running from a different location, you will need to change the bind path -@SINGULARITY_BUILD # Also, note that often $NOBACKUP is, say, /discover/nobackup/username, but gcm_setup -@SINGULARITY_BUILD # will set GEOSDIR, GEOSBIN, etc. above to something like /gpfsm/dnbXX/username which -@SINGULARITY_BUILD # is the "real" physical path that /discover/nobackup/username is a symlink to. -@SINGULARITY_BUILD # You might need to change all the gpfsm paths to nobackup paths. -@SINGULARITY_BUILD -@SINGULARITY_BUILD # Set a variable to encapsulate all Singularity details -@SINGULARITY_BUILD setenv SINGULARITY_RUN "singularity exec $SINGULARITY_BIND_PATH $SINGULARITY_SANDBOX" -@SINGULARITY_BUILD -@SINGULARITY_BUILD # Detect if GEOSgcm.x is in the experiment directory -@SINGULARITY_BUILD if (-e $EXPDIR/GEOSgcm.x) then -@SINGULARITY_BUILD echo "Found GEOSgcm.x in $EXPDIR" -@SINGULARITY_BUILD -@SINGULARITY_BUILD # If SINGULARITY_SANDBOX is non-empty and GEOSgcm.x is found in the experiment directory, -@SINGULARITY_BUILD # force the use of GEOSgcm.x in the installation directory -@SINGULARITY_BUILD if( $SINGULARITY_SANDBOX != "" ) then -@SINGULARITY_BUILD echo "NOTE: Testing has shown Singularity only works when running with" -@SINGULARITY_BUILD echo " the GEOSgcm.x executable directly from the installation bin directory" -@SINGULARITY_BUILD echo "" -@SINGULARITY_BUILD echo " So, we will *ignore* the local GEOSgcm.x and " -@SINGULARITY_BUILD echo " instead use $GEOSBIN/GEOSgcm.x" -@SINGULARITY_BUILD echo "" -@SINGULARITY_BUILD else -@SINGULARITY_BUILD echo "Using GEOSgcm.x from $GEOSBIN" -@SINGULARITY_BUILD endif -@SINGULARITY_BUILD setenv GEOSEXE $GEOSBIN/GEOSgcm.x -@SINGULARITY_BUILD else -@SINGULARITY_BUILD echo "Using GEOSgcm.x from $GEOSBIN" -@SINGULARITY_BUILD setenv GEOSEXE $GEOSBIN/GEOSgcm.x -@SINGULARITY_BUILD endif - -@NATIVE_BUILD if (-e $EXPDIR/GEOSgcm.x) then -@NATIVE_BUILD echo "Copying $EXPDIR/GEOSgcm.x to $SCRDIR" -@NATIVE_BUILD echo "" -@NATIVE_BUILD /bin/cp $EXPDIR/GEOSgcm.x $SCRDIR/GEOSgcm.x -@NATIVE_BUILD else -@NATIVE_BUILD echo "$EXPDIR/GEOSgcm.x not found. Please link or copy the executable to the experiment directory." -@NATIVE_BUILD exit 1 -@NATIVE_BUILD endif -@NATIVE_BUILD setenv GEOSEXE $SCRDIR/GEOSgcm.x +{{ SINGULARITY_BUILD }} ####################################################################### +{{ SINGULARITY_BUILD }} # Settings for Singularity - EXPERIMENTAL +{{ SINGULARITY_BUILD }} ####################################################################### +{{ SINGULARITY_BUILD }} +{{ SINGULARITY_BUILD }} # Based on work on discover, to run you need to load the same compiler +{{ SINGULARITY_BUILD }} # and MPI to match those in the container. For example, if your container was +{{ SINGULARITY_BUILD }} # built with: +{{ SINGULARITY_BUILD }} # GNU 11.2.0 +{{ SINGULARITY_BUILD }} # Intel Fortran 2021.6.0 (aka Intel oneAPI 2022.1.0) +{{ SINGULARITY_BUILD }} # Intel MPI 2021.6.0 (aka Intel oneAPI 2022.1.0) +{{ SINGULARITY_BUILD }} # then you would need to load: +{{ SINGULARITY_BUILD }} # source /usr/share/modules/init/csh +{{ SINGULARITY_BUILD }} # module purge +{{ SINGULARITY_BUILD }} # module load comp/gcc/11.2.0 +{{ SINGULARITY_BUILD }} # module load comp/intel/2021.6.0 +{{ SINGULARITY_BUILD }} # module load mpi/impi/2021.6.0 +{{ SINGULARITY_BUILD }} # +{{ SINGULARITY_BUILD }} # And then also append ${GEOSDIR}/lib to LD_LIBRARY_PATH +{{ SINGULARITY_BUILD }} # setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${GEOSDIR}/lib +{{ SINGULARITY_BUILD }} # +{{ SINGULARITY_BUILD }} # For now we use the fact that on discover we can source g5_modules +{{ SINGULARITY_BUILD }} # +{{ SINGULARITY_BUILD }} # If you are using singularity, set the path to the singularity sandbox here +{{ SINGULARITY_BUILD }} setenv SINGULARITY_SANDBOX {{ SINGULARITY_SANDBOX }} +{{ SINGULARITY_BUILD }} +{{ SINGULARITY_BUILD }} # Error out if SINGULARITY_SANDBOX is not set +{{ SINGULARITY_BUILD }} if( $SINGULARITY_SANDBOX == "" ) then +{{ SINGULARITY_BUILD }} echo "ERROR: You must set SINGULARITY_SANDBOX to the path to your Singularity sandbox" +{{ SINGULARITY_BUILD }} exit 1 +{{ SINGULARITY_BUILD }} endif +{{ SINGULARITY_BUILD }} +{{ SINGULARITY_BUILD }} # If SINGULARITY_SANDBOX is non-empty, then run executable in singularity sandbox +{{ SINGULARITY_BUILD }} echo "We are running under Singularity" +{{ SINGULARITY_BUILD }} echo "" +{{ SINGULARITY_BUILD }} +{{ SINGULARITY_BUILD }} # Load the Singularity module +{{ SINGULARITY_BUILD }} module load singularity +{{ SINGULARITY_BUILD }} +{{ SINGULARITY_BUILD }} # Set Singularity Bind Paths. Note: These are dependent on where you are running. +{{ SINGULARITY_BUILD }} # By default, we'll assume you are running this script from NOBACKUP +{{ SINGULARITY_BUILD }} +{{ SINGULARITY_BUILD }} setenv REAL_BIND_PATH {{ REAL_BIND_PATH }} +{{ SINGULARITY_BUILD }} setenv BASE_BIND_PATH {{ BASE_BIND_PATH }} +{{ SINGULARITY_BUILD }} setenv BOUNDARY_DIR {{ BOUNDARY_DIR }} +{{ SINGULARITY_BUILD }} setenv SINGULARITY_BIND_PATH "-B ${NOBACKUP}:${NOBACKUP}:rw,${REAL_BIND_PATH}:${REAL_BIND_PATH}:rw,${BASE_BIND_PATH}:${BASE_BIND_PATH}:ro,${BOUNDARY_DIR}:${BOUNDARY_DIR}:ro" +{{ SINGULARITY_BUILD }} +{{ SINGULARITY_BUILD }} # If you are running from a different location, you will need to change the bind path +{{ SINGULARITY_BUILD }} # Also, note that often $NOBACKUP is, say, /discover/nobackup/username, but gcm_setup +{{ SINGULARITY_BUILD }} # will set GEOSDIR, GEOSBIN, etc. above to something like /gpfsm/dnbXX/username which +{{ SINGULARITY_BUILD }} # is the "real" physical path that /discover/nobackup/username is a symlink to. +{{ SINGULARITY_BUILD }} # You might need to change all the gpfsm paths to nobackup paths. +{{ SINGULARITY_BUILD }} +{{ SINGULARITY_BUILD }} # Set a variable to encapsulate all Singularity details +{{ SINGULARITY_BUILD }} setenv SINGULARITY_RUN "singularity exec $SINGULARITY_BIND_PATH $SINGULARITY_SANDBOX" +{{ SINGULARITY_BUILD }} +{{ SINGULARITY_BUILD }} # Detect if GEOSgcm.x is in the experiment directory +{{ SINGULARITY_BUILD }} if (-e $EXPDIR/GEOSgcm.x) then +{{ SINGULARITY_BUILD }} echo "Found GEOSgcm.x in $EXPDIR" +{{ SINGULARITY_BUILD }} +{{ SINGULARITY_BUILD }} # If SINGULARITY_SANDBOX is non-empty and GEOSgcm.x is found in the experiment directory, +{{ SINGULARITY_BUILD }} # force the use of GEOSgcm.x in the installation directory +{{ SINGULARITY_BUILD }} if( $SINGULARITY_SANDBOX != "" ) then +{{ SINGULARITY_BUILD }} echo "NOTE: Testing has shown Singularity only works when running with" +{{ SINGULARITY_BUILD }} echo " the GEOSgcm.x executable directly from the installation bin directory" +{{ SINGULARITY_BUILD }} echo "" +{{ SINGULARITY_BUILD }} echo " So, we will *ignore* the local GEOSgcm.x and " +{{ SINGULARITY_BUILD }} echo " instead use $GEOSBIN/GEOSgcm.x" +{{ SINGULARITY_BUILD }} echo "" +{{ SINGULARITY_BUILD }} else +{{ SINGULARITY_BUILD }} echo "Using GEOSgcm.x from $GEOSBIN" +{{ SINGULARITY_BUILD }} endif +{{ SINGULARITY_BUILD }} setenv GEOSEXE $GEOSBIN/GEOSgcm.x +{{ SINGULARITY_BUILD }} else +{{ SINGULARITY_BUILD }} echo "Using GEOSgcm.x from $GEOSBIN" +{{ SINGULARITY_BUILD }} setenv GEOSEXE $GEOSBIN/GEOSgcm.x +{{ SINGULARITY_BUILD }} endif + +{{ NATIVE_BUILD }} if (-e $EXPDIR/GEOSgcm.x) then +{{ NATIVE_BUILD }} echo "Copying $EXPDIR/GEOSgcm.x to $SCRDIR" +{{ NATIVE_BUILD }} echo "" +{{ NATIVE_BUILD }} /bin/cp $EXPDIR/GEOSgcm.x $SCRDIR/GEOSgcm.x +{{ NATIVE_BUILD }} else +{{ NATIVE_BUILD }} echo "$EXPDIR/GEOSgcm.x not found. Please link or copy the executable to the experiment directory." +{{ NATIVE_BUILD }} exit 1 +{{ NATIVE_BUILD }} endif +{{ NATIVE_BUILD }} setenv GEOSEXE $SCRDIR/GEOSgcm.x ####################################################################### # Get RESTARTS @@ -599,8 +599,8 @@ else endif wait -@COUPLED /bin/mkdir INPUT -@COUPLED cp $EXPDIR/RESTART/* INPUT +{{ COUPLED }} /bin/mkdir INPUT +{{ COUPLED }} cp $EXPDIR/RESTART/* INPUT # Copy and Tar Initial Restarts to Restarts Directory # --------------------------------------------------- @@ -613,17 +613,17 @@ if($numrs == 0) then endif end wait -@COUPLED cp -r $EXPDIR/RESTART ${EXPDIR}/restarts/RESTART.${edate} +{{ COUPLED }} cp -r $EXPDIR/RESTART ${EXPDIR}/restarts/RESTART.${edate} # WW3 restart file if( $wavewatch ) then set rst_ww3 = "restart.ww3" if( -e ${rst_ww3} ) cp ${rst_ww3} ${EXPDIR}/restarts/$EXPID.${rst_ww3}.${edate}.${GCMVER}.${BCTAG}_${BCRSLV} endif cd $EXPDIR/restarts - @DATAOCEAN tar cf restarts.${edate}.tar $EXPID.*.${edate}.${GCMVER}.${BCTAG}_${BCRSLV} - @COUPLED tar cvf restarts.${edate}.tar $EXPID.*.${edate}.${GCMVER}.${BCTAG}_${BCRSLV} RESTART.${edate} + {{ DATAOCEAN }} tar cf restarts.${edate}.tar $EXPID.*.${edate}.${GCMVER}.${BCTAG}_${BCRSLV} + {{ COUPLED }} tar cvf restarts.${edate}.tar $EXPID.*.${edate}.${GCMVER}.${BCTAG}_${BCRSLV} RESTART.${edate} /bin/rm -rf `/bin/ls -d -1 $EXPID.*.${edate}.${GCMVER}.${BCTAG}_${BCRSLV}` - @COUPLED /bin/rm -rf RESTART.${edate} + {{ COUPLED }} /bin/rm -rf RESTART.${edate} cd $SCRDIR endif @@ -715,7 +715,7 @@ set yearf = `echo $nymdf | cut -c1-4` # For Non-Reynolds SST, Modify local CAP.rc Ending date if Finish time exceeds Current year boundary # -------------------------------------------------------------------------------------------------- -if( @OCEANtag != DE0360xPE0180 ) then +if( {{ OCEANtag }} != DE0360xPE0180 ) then if( $yearf > $yearc ) then @ yearf = $yearc + 1 @ nymdf = $yearf * 10000 + 0101 @@ -796,19 +796,19 @@ if( $wavewatch ) then /bin/rm ww3_multi.nml.tmp endif -@COUPLED# gcm_setup will make sure AGCM.rc, MOM_override and CICE6 use a Ocean DT -@COUPLED# consistent with CAP.rc HEARTBEAT_DT. But a user might change the -@COUPLED# HEARTBEAT_DT in CAP.rc at run time, so we need to update the dt in -@COUPLED# the other files +{{ COUPLED }}# gcm_setup will make sure AGCM.rc, MOM_override and CICE6 use a Ocean DT +{{ COUPLED }}# consistent with CAP.rc HEARTBEAT_DT. But a user might change the +{{ COUPLED }}# HEARTBEAT_DT in CAP.rc at run time, so we need to update the dt in +{{ COUPLED }}# the other files -@COUPLEDset HEARTBEAT_DT = `grep '^\s*HEARTBEAT_DT:' CAP.rc | cut -d: -f2 | awk '{print $1}'` +{{ COUPLED }}set HEARTBEAT_DT = `grep '^\s*HEARTBEAT_DT:' CAP.rc | cut -d: -f2 | awk '{print $1}'` -@COUPLED sed -i -e "s/OGCM_RUN_DT: [0-9]\+\(\.[0-9]\+\)\?/OGCM_RUN_DT: $HEARTBEAT_DT/g" AGCM.rc -@MOM5 sed -i -e "s/dt_cpld = [0-9]\+\(\.[0-9]\+\)\?,/dt_cpld = $HEARTBEAT_DT,/g" \ -@MOM5 -e "s/dt_atmos = [0-9]\+\(\.[0-9]\+\)\?,/dt_atmos = $HEARTBEAT_DT,/g" MOM_override -@MOM6 sed -i -e "s/DT = [0-9]\+\(\.[0-9]\+\)\?/DT = $HEARTBEAT_DT/g" \ -@MOM6 -e "s/DT_THERM = [0-9]\+\(\.[0-9]\+\)\?/DT_THERM = $HEARTBEAT_DT/g" MOM_override -@CICE6 sed -i -E "s/^([[:space:]]*dt[[:space:]]*=[[:space:]]*)[0-9]+(\.[0-9]+)?/\1${HEARTBEAT_DT}/" ice_in +{{ COUPLED }} sed -i -e "s/OGCM_RUN_DT: [0-9]\+\(\.[0-9]\+\)\?/OGCM_RUN_DT: $HEARTBEAT_DT/g" AGCM.rc +{{ MOM5 }} sed -i -e "s/dt_cpld = [0-9]\+\(\.[0-9]\+\)\?,/dt_cpld = $HEARTBEAT_DT,/g" \ +{{ MOM5 }} -e "s/dt_atmos = [0-9]\+\(\.[0-9]\+\)\?,/dt_atmos = $HEARTBEAT_DT,/g" MOM_override +{{ MOM6 }} sed -i -e "s/DT = [0-9]\+\(\.[0-9]\+\)\?/DT = $HEARTBEAT_DT/g" \ +{{ MOM6 }} -e "s/DT_THERM = [0-9]\+\(\.[0-9]\+\)\?/DT_THERM = $HEARTBEAT_DT/g" MOM_override +{{ CICE6 }} sed -i -E "s/^([[:space:]]*dt[[:space:]]*=[[:space:]]*)[0-9]+(\.[0-9]+)?/\1${HEARTBEAT_DT}/" ice_in if( $AGCM_LM != 72 ) then set files = `/bin/ls *.yaml` @@ -834,16 +834,16 @@ if ( $DNA_TRUE == 0 && -e DNA_ExtData.rc ) /bin/mv set ACHEM_TRUE = `grep -i '^\s*ENABLE_ACHEM:\s*\.TRUE\.' GEOS_ChemGridComp.rc | wc -l` if ( $ACHEM_TRUE == 0 && -e ACHEM_ExtData.rc ) /bin/mv ACHEM_ExtData.rc ACHEM_ExtData.rc.NOT_USED -@MP_TURN_OFF_WSUB_EXTDATA# 1MOM and GFDL microphysics do not use WSUB_CLIM -@MP_TURN_OFF_WSUB_EXTDATA# ------------------------------------------------- +{{ MP_TURN_OFF_WSUB_EXTDATA }}# 1MOM and GFDL microphysics do not use WSUB_CLIM +{{ MP_TURN_OFF_WSUB_EXTDATA }}# ------------------------------------------------- if ($EXTDATA2G_TRUE == 0 ) then - @MP_TURN_OFF_WSUB_EXTDATA/bin/mv WSUB_ExtData.rc WSUB_ExtData.tmp - @MP_TURN_OFF_WSUB_EXTDATAcat WSUB_ExtData.tmp | sed -e '/^WSUB_CLIM/ s#ExtData.*#/dev/null#' > WSUB_ExtData.rc + {{ MP_TURN_OFF_WSUB_EXTDATA }}/bin/mv WSUB_ExtData.rc WSUB_ExtData.tmp + {{ MP_TURN_OFF_WSUB_EXTDATA }}cat WSUB_ExtData.tmp | sed -e '/^WSUB_CLIM/ s#ExtData.*#/dev/null#' > WSUB_ExtData.rc else - @MP_TURN_OFF_WSUB_EXTDATA/bin/mv WSUB_ExtData.yaml WSUB_ExtData.tmp - @MP_TURN_OFF_WSUB_EXTDATAcat WSUB_ExtData.tmp | sed -e '/collection:/ s#WSUB_SWclim.*#/dev/null#' > WSUB_ExtData.yaml + {{ MP_TURN_OFF_WSUB_EXTDATA }}/bin/mv WSUB_ExtData.yaml WSUB_ExtData.tmp + {{ MP_TURN_OFF_WSUB_EXTDATA }}cat WSUB_ExtData.tmp | sed -e '/collection:/ s#WSUB_SWclim.*#/dev/null#' > WSUB_ExtData.yaml endif -@MP_TURN_OFF_WSUB_EXTDATA/bin/rm WSUB_ExtData.tmp +{{ MP_TURN_OFF_WSUB_EXTDATA }}/bin/rm WSUB_ExtData.tmp # Generate the complete ExtData.rc # -------------------------------- @@ -889,7 +889,7 @@ if ( $rst_by_face == YES ) then echo "WARNING: The generated gwd_internal_face_x_rst are used" #foreach n (1 2 3 4 5 6) #/bin/rm gwd_internal_face_${n}_rst - #/bin/cp @GWDRSDIR/gwd_internal_c${AGCM_IM}_face_${n} gwd_internal_face_${n}_rst + #/bin/cp {{ GWDRSDIR }}/gwd_internal_c${AGCM_IM}_face_${n} gwd_internal_face_${n}_rst #end else if (! -e gwd_internal_rst) then @@ -915,15 +915,15 @@ endif #ln -sf $SSTDIR/dataoceanfile_MERRA2_SST.${OGCM_IM}x${OGCM_JM}.${yy}.data sst.data #ln -sf $SSTDIR/dataoceanfile_MERRA2_ICE.${OGCM_IM}x${OGCM_JM}.${yy}.data fraci.data -@CICE6 #detect exisistence of certain fields in CICE6 restart -@CICE6 ncdump -h INPUT/iced.nc | grep 'apnd' > /dev/null -@CICE6 if( $status == 0 ) then -@CICE6 echo 'pond state in restart, turn on restart flag if not already' -@CICE6 sed -i -E 's/^[[:space:]]*restart_pond_lvl[[:space:]]*=[[:space:]]*\.false\./ restart_pond_lvl = .true./' ice_in -@CICE6 else -@CICE6 echo 'pond state NOT in restart, turn off restart flag if already on' -@CICE6 sed -i -E 's/^[[:space:]]*restart_pond_lvl[[:space:]]*=[[:space:]]*\.true\./ restart_pond_lvl = .false./' ice_in -@CICE6 endif +{{ CICE6 }} #detect exisistence of certain fields in CICE6 restart +{{ CICE6 }} ncdump -h INPUT/iced.nc | grep 'apnd' > /dev/null +{{ CICE6 }} if( $status == 0 ) then +{{ CICE6 }} echo 'pond state in restart, turn on restart flag if not already' +{{ CICE6 }} sed -i -E 's/^[[:space:]]*restart_pond_lvl[[:space:]]*=[[:space:]]*\.false\./ restart_pond_lvl = .true./' ice_in +{{ CICE6 }} else +{{ CICE6 }} echo 'pond state NOT in restart, turn off restart flag if already on' +{{ CICE6 }} sed -i -E 's/^[[:space:]]*restart_pond_lvl[[:space:]]*=[[:space:]]*\.true\./ restart_pond_lvl = .false./' ice_in +{{ CICE6 }} endif ####################################################################### # Split Saltwater Restart if detected @@ -946,8 +946,8 @@ else # Run the script # -------------- - @SINGULARITY_BUILD $RUN_CMD 1 $SINGULARITY_RUN $GEOSBIN/SaltIntSplitter tile.data $SCRDIR/saltwater_internal_rst - @NATIVE_BUILD $RUN_CMD 1 $GEOSBIN/SaltIntSplitter tile.data $SCRDIR/saltwater_internal_rst + {{ SINGULARITY_BUILD }} $RUN_CMD 1 $SINGULARITY_RUN $GEOSBIN/SaltIntSplitter tile.data $SCRDIR/saltwater_internal_rst + {{ NATIVE_BUILD }} $RUN_CMD 1 $GEOSBIN/SaltIntSplitter tile.data $SCRDIR/saltwater_internal_rst # Move restarts # ------------- @@ -985,8 +985,8 @@ endif if ( -x $GEOSBIN/rs_numtiles.x ) then set N_OPENW_TILES_EXPECTED = `grep '^\s*0' tile.data | wc -l` - @SINGULARITY_BUILD set N_OPENW_TILES_FOUND = `$RUN_CMD 1 $SINGULARITY_RUN $GEOSBIN/rs_numtiles.x openwater_internal_rst | grep Total | awk '{print $NF}'` - @NATIVE_BUILD set N_OPENW_TILES_FOUND = `$RUN_CMD 1 $GEOSBIN/rs_numtiles.x openwater_internal_rst | grep Total | awk '{print $NF}'` + {{ SINGULARITY_BUILD }} set N_OPENW_TILES_FOUND = `$RUN_CMD 1 $SINGULARITY_RUN $GEOSBIN/rs_numtiles.x openwater_internal_rst | grep Total | awk '{print $NF}'` + {{ NATIVE_BUILD }} set N_OPENW_TILES_FOUND = `$RUN_CMD 1 $GEOSBIN/rs_numtiles.x openwater_internal_rst | grep Total | awk '{print $NF}'` if ( $N_OPENW_TILES_EXPECTED != $N_OPENW_TILES_FOUND ) then echo "Error! Found $N_OPENW_TILES_FOUND tiles in openwater. Expect to find $N_OPENW_TILES_EXPECTED tiles." @@ -1024,9 +1024,9 @@ endif # Environment variables for MPI, etc # ---------------------------------- -@SETENVS +{{ SETENVS }} -@MPT_SHEPHERD +{{ MPT_SHEPHERD }} # Run bundleParser.py #--------------------- @@ -1061,75 +1061,75 @@ endif # Establish safe default number of OpenMP threads # ----------------------------------------------- -@MIT # --------------------------------------------------- -@MIT # For MITgcm restarts - before running GEOSgcm.x -@MIT # --------------------------------------------------- -@MIT -@MIT # set time interval for segment in seconds -@MIT -@MIT set yearc = `echo $nymdc | cut -c1-4` -@MIT set monthc = `echo $nymdc | cut -c5-6` -@MIT set dayc = `echo $nymdc | cut -c7-8` -@MIT set hourc = `echo $nhmsc | cut -c1-2` -@MIT set minutec = `echo $nhmsc | cut -c3-4` -@MIT set secondc = `echo $nhmsc | cut -c5-6` -@MIT -@MIT set yearf = `echo $nymdf | cut -c1-4` -@MIT set monthf = `echo $nymdf | cut -c5-6` -@MIT set dayf = `echo $nymdf | cut -c7-8` -@MIT set hourf = `echo $nhmsf | cut -c1-2` -@MIT set minutef = `echo $nhmsf | cut -c3-4` -@MIT set secondf = `echo $nhmsf | cut -c5-6` -@MIT -@MIT set yearf = `echo $nymdf | cut -c1-4` -@MIT -@MIT set time1 = `date -u -d "${yearc}-${monthc}-${dayc}T${hourc}:${minutec}:${secondc}" "+%s"` -@MIT set time2 = `date -u -d "${yearf}-${monthf}-${dayf}T${hourf}:${minutef}:${secondf}" "+%s"` -@MIT -@MIT @ mitdt = $time2 - $time1 -@MIT echo "Segment time: $mitdt" -@MIT -@MIT -@MIT # Set-up MITgcm run directory -@MIT if (! -e mitocean_run) mkdir -p mitocean_run -@MIT cd mitocean_run -@MIT -@MIT # link mit configuration and initialization files -@MIT ln -sf $EXPDIR/mit_input/* . -@MIT # link mitgcm restarts if exist -@MIT /bin/ln -sf $EXPDIR/restarts/pic* . -@MIT # make an archive folder for mitgcm run -@MIT mkdir $EXPDIR/mit_output -@MIT -@MIT # Calculate segment time steps -@MIT set mit_nTimeSteps = `cat ${SCRDIR}/AGCM.rc | grep OGCM_RUN_DT: | cut -d: -f2 | tr -s " " | cut -d" " -f2` -@MIT @ mit_nTimeSteps = ${mitdt} / $mit_nTimeSteps -@MIT -@MIT #change namelist variables in data - nTimeSteps, chkptFreq and monitorFreq -@MIT sed -i "s/nTimeSteps.*/nTimeSteps = ${mit_nTimeSteps},/" data -@MIT sed -i "s/chkptFreq.*/chkptFreq = ${mitdt}.0,/" data -@MIT sed -i "s/pChkptFreq.*/pChkptFreq = ${mitdt}.0,/" data -@MIT # get nIter0 -@MIT -@MIT if (! -e ${EXPDIR}/restarts/MITgcm_restart_dates.txt ) then -@MIT set nIter0 = `grep nIter0 data | tr -s " " | cut -d"=" -f2 | cut -d"," -f1 | awk '{$1=$1;print}'` -@MIT else -@MIT set nIter0 = `grep "$nymdc $nhmsc" ${EXPDIR}/restarts/MITgcm_restart_dates.txt | cut -d" " -f5` -@MIT if ( $nIter0 == "" ) then -@MIT echo "No ocean restart file for $nymdc $nhmsc, exiting" -@MIT echo "If this is a new initialized experiment, delete:" -@MIT echo "${EXPDIR}/restarts/MITgcm_restart_dates.txt" -@MIT echo "and restart" -@MIT exit -@MIT else -@MIT sed -i "s/nIter0.*/ nIter0 = ${nIter0},/" data -@MIT endif -@MIT endif -@MIT -@MIT cd .. -@MIT # --------------------------------------------------- -@MIT # End MITgcm restarts - before running GEOSgcm.x -@MIT # --------------------------------------------------- +{{ MIT }} # --------------------------------------------------- +{{ MIT }} # For MITgcm restarts - before running GEOSgcm.x +{{ MIT }} # --------------------------------------------------- +{{ MIT }} +{{ MIT }} # set time interval for segment in seconds +{{ MIT }} +{{ MIT }} set yearc = `echo $nymdc | cut -c1-4` +{{ MIT }} set monthc = `echo $nymdc | cut -c5-6` +{{ MIT }} set dayc = `echo $nymdc | cut -c7-8` +{{ MIT }} set hourc = `echo $nhmsc | cut -c1-2` +{{ MIT }} set minutec = `echo $nhmsc | cut -c3-4` +{{ MIT }} set secondc = `echo $nhmsc | cut -c5-6` +{{ MIT }} +{{ MIT }} set yearf = `echo $nymdf | cut -c1-4` +{{ MIT }} set monthf = `echo $nymdf | cut -c5-6` +{{ MIT }} set dayf = `echo $nymdf | cut -c7-8` +{{ MIT }} set hourf = `echo $nhmsf | cut -c1-2` +{{ MIT }} set minutef = `echo $nhmsf | cut -c3-4` +{{ MIT }} set secondf = `echo $nhmsf | cut -c5-6` +{{ MIT }} +{{ MIT }} set yearf = `echo $nymdf | cut -c1-4` +{{ MIT }} +{{ MIT }} set time1 = `date -u -d "${yearc}-${monthc}-${dayc}T${hourc}:${minutec}:${secondc}" "+%s"` +{{ MIT }} set time2 = `date -u -d "${yearf}-${monthf}-${dayf}T${hourf}:${minutef}:${secondf}" "+%s"` +{{ MIT }} +{{ MIT }} @ mitdt = $time2 - $time1 +{{ MIT }} echo "Segment time: $mitdt" +{{ MIT }} +{{ MIT }} +{{ MIT }} # Set-up MITgcm run directory +{{ MIT }} if (! -e mitocean_run) mkdir -p mitocean_run +{{ MIT }} cd mitocean_run +{{ MIT }} +{{ MIT }} # link mit configuration and initialization files +{{ MIT }} ln -sf $EXPDIR/mit_input/* . +{{ MIT }} # link mitgcm restarts if exist +{{ MIT }} /bin/ln -sf $EXPDIR/restarts/pic* . +{{ MIT }} # make an archive folder for mitgcm run +{{ MIT }} mkdir $EXPDIR/mit_output +{{ MIT }} +{{ MIT }} # Calculate segment time steps +{{ MIT }} set mit_nTimeSteps = `cat ${SCRDIR}/AGCM.rc | grep OGCM_RUN_DT: | cut -d: -f2 | tr -s " " | cut -d" " -f2` +{{ MIT }} @ mit_nTimeSteps = ${mitdt} / $mit_nTimeSteps +{{ MIT }} +{{ MIT }} #change namelist variables in data - nTimeSteps, chkptFreq and monitorFreq +{{ MIT }} sed -i "s/nTimeSteps.*/nTimeSteps = ${mit_nTimeSteps},/" data +{{ MIT }} sed -i "s/chkptFreq.*/chkptFreq = ${mitdt}.0,/" data +{{ MIT }} sed -i "s/pChkptFreq.*/pChkptFreq = ${mitdt}.0,/" data +{{ MIT }} # get nIter0 +{{ MIT }} +{{ MIT }} if (! -e ${EXPDIR}/restarts/MITgcm_restart_dates.txt ) then +{{ MIT }} set nIter0 = `grep nIter0 data | tr -s " " | cut -d"=" -f2 | cut -d"," -f1 | awk '{$1=$1;print}'` +{{ MIT }} else +{{ MIT }} set nIter0 = `grep "$nymdc $nhmsc" ${EXPDIR}/restarts/MITgcm_restart_dates.txt | cut -d" " -f5` +{{ MIT }} if ( $nIter0 == "" ) then +{{ MIT }} echo "No ocean restart file for $nymdc $nhmsc, exiting" +{{ MIT }} echo "If this is a new initialized experiment, delete:" +{{ MIT }} echo "${EXPDIR}/restarts/MITgcm_restart_dates.txt" +{{ MIT }} echo "and restart" +{{ MIT }} exit +{{ MIT }} else +{{ MIT }} sed -i "s/nIter0.*/ nIter0 = ${nIter0},/" data +{{ MIT }} endif +{{ MIT }} endif +{{ MIT }} +{{ MIT }} cd .. +{{ MIT }} # --------------------------------------------------- +{{ MIT }} # End MITgcm restarts - before running GEOSgcm.x +{{ MIT }} # --------------------------------------------------- # Set OMP_NUM_THREADS # ------------------- @@ -1156,8 +1156,8 @@ else set IOSERVER_EXTRA = "" endif -@SINGULARITY_BUILD @OCEAN_PRELOAD $RUN_CMD $TOTAL_PES $SINGULARITY_RUN $GEOSEXE $IOSERVER_OPTIONS $IOSERVER_EXTRA --logging_config 'logging.yaml' -@NATIVE_BUILD @OCEAN_PRELOAD @SEVERAL_TRIES $RUN_CMD $TOTAL_PES $GEOSEXE $IOSERVER_OPTIONS $IOSERVER_EXTRA --logging_config 'logging.yaml' +{{ SINGULARITY_BUILD }} {{ OCEAN_PRELOAD }} $RUN_CMD $TOTAL_PES $SINGULARITY_RUN $GEOSEXE $IOSERVER_OPTIONS $IOSERVER_EXTRA --logging_config 'logging.yaml' +{{ NATIVE_BUILD }} {{ OCEAN_PRELOAD }} {{ SEVERAL_TRIES }} $RUN_CMD $TOTAL_PES $GEOSEXE $IOSERVER_OPTIONS $IOSERVER_EXTRA --logging_config 'logging.yaml' if( $USE_SHMEM == 1 ) $GEOSBIN/RmShmKeys_sshmpi.csh >& /dev/null @@ -1173,86 +1173,86 @@ setenv OMP_NUM_THREADS 1 ./strip GWD_GridComp.rc sed -i -e "s|TRUE|FALSE|g" GWD_GridComp.rc -@MIT # --------------------------------------------------- -@MIT # For MITgcm restarts - after running GEOSgcm.x -@MIT # --------------------------------------------------- -@MIT -@MIT set STEADY_STATE_OCEAN=`grep STEADY_STATE_OCEAN AGCM.rc | cut -d':' -f2 | tr -d " "` -@MIT -@MIT # update ocean only if activated. Otherwize use the same pickups (passive ocean). -@MIT if ( ${STEADY_STATE_OCEAN} != 0 ) then -@MIT -@MIT if ( ${rc} == 0 ) then -@MIT -@MIT # Update nIter0 for next segment -@MIT set znIter00 = `echo $nIter0 | awk '{printf("%010d",$1)}'` -@MIT @ nIter0 = $nIter0 + $mit_nTimeSteps -@MIT set znIter0 = `echo $nIter0 | awk '{printf("%010d",$1)}'` -@MIT -@MIT # to update MITgcm restart list file -@MIT sed -i "/${nIter0}/d" ${EXPDIR}/restarts/MITgcm_restart_dates.txt -@MIT echo "Date_GEOS5 $nymdf $nhmsf NITER0_MITgcm ${nIter0}" >> ${EXPDIR}/restarts/MITgcm_restart_dates.txt -@MIT -@MIT /bin/mv $SCRDIR/mitocean_run/STDOUT.0000 $EXPDIR/mit_output/STDOUT.${znIter00} -@MIT -@MIT endif -@MIT -@MIT cd $SCRDIR/mitocean_run -@MIT -@MIT # Check existance of roling pickups -@MIT set nonomatch rp = ( pickup*ckptA* ) -@MIT echo $rp -@MIT # Rename and move them if exist -@MIT if ( -e $rp[1] ) then -@MIT set timeStepNumber=`cat pickup.ckptA.meta | grep timeStepNumber | tr -s " " | cut -d" " -f5 | awk '{printf("%010d",$1)}'` -@MIT foreach fname ( pickup*ckptA* ) -@MIT set bname = `echo ${fname} | cut -d "." -f1 | cut -d "/" -f2` -@MIT set aname = `echo ${fname} | cut -d "." -f3` -@MIT echo $EXPDIR/restarts/${bname}.${timeStepNumber}.${aname} -@MIT /bin/mv ${fname} $EXPDIR/restarts/${bname}.${timeStepNumber}.${aname} -@MIT end -@MIT endif -@MIT -@MIT # Check existance of permanent pickups -@MIT set nonomatch pp = ( pickup* ) -@MIT echo $pp -@MIT # Move them if exist -@MIT if ( -e $pp[1] ) then -@MIT foreach fname ( pickup* ) -@MIT if ( ! -e $EXPDIR/restarts/${fname} ) /bin/mv ${fname} $EXPDIR/restarts/${fname} -@MIT end -@MIT endif -@MIT -@MIT /bin/mv T.* $EXPDIR/mit_output/ -@MIT /bin/mv S.* $EXPDIR/mit_output/ -@MIT /bin/mv U.* $EXPDIR/mit_output/ -@MIT /bin/mv V.* $EXPDIR/mit_output/ -@MIT /bin/mv W.* $EXPDIR/mit_output/ -@MIT /bin/mv PH* $EXPDIR/mit_output/ -@MIT /bin/mv Eta.* $EXPDIR/mit_output/ -@MIT -@MIT /bin/mv AREA.* $EXPDIR/mit_output/ -@MIT /bin/mv HEFF.* $EXPDIR/mit_output/ -@MIT /bin/mv HSNOW.* $EXPDIR/mit_output/ -@MIT /bin/mv UICE.* $EXPDIR/mit_output/ -@MIT /bin/mv VICE.* $EXPDIR/mit_output/ -@MIT -@MIT #copy mit output to mit_output -@MIT foreach i (`grep -i filename data.diagnostics | grep "^ " | cut -d"=" -f2 | cut -d"'" -f2 | awk '{$1=$1;print}'`) -@MIT /bin/mv ${i}* $EXPDIR/mit_output/ -@MIT end -@MIT -@MIT foreach i (`grep -i stat_fName data.diagnostics | grep "^ " | cut -d"=" -f2 | cut -d"'" -f2 | awk '{$1=$1;print}'`) -@MIT /bin/mv ${i}* $EXPDIR/mit_output/ -@MIT end -@MIT -@MIT cd $SCRDIR -@MIT -@MIT endif -@MIT -@MIT # --------------------------------------------------- -@MIT # End MITgcm restarts - after running GEOSgcm.x -@MIT # --------------------------------------------------- +{{ MIT }} # --------------------------------------------------- +{{ MIT }} # For MITgcm restarts - after running GEOSgcm.x +{{ MIT }} # --------------------------------------------------- +{{ MIT }} +{{ MIT }} set STEADY_STATE_OCEAN=`grep STEADY_STATE_OCEAN AGCM.rc | cut -d':' -f2 | tr -d " "` +{{ MIT }} +{{ MIT }} # update ocean only if activated. Otherwize use the same pickups (passive ocean). +{{ MIT }} if ( ${STEADY_STATE_OCEAN} != 0 ) then +{{ MIT }} +{{ MIT }} if ( ${rc} == 0 ) then +{{ MIT }} +{{ MIT }} # Update nIter0 for next segment +{{ MIT }} set znIter00 = `echo $nIter0 | awk '{printf("%010d",$1)}'` +{{ MIT }} @ nIter0 = $nIter0 + $mit_nTimeSteps +{{ MIT }} set znIter0 = `echo $nIter0 | awk '{printf("%010d",$1)}'` +{{ MIT }} +{{ MIT }} # to update MITgcm restart list file +{{ MIT }} sed -i "/${nIter0}/d" ${EXPDIR}/restarts/MITgcm_restart_dates.txt +{{ MIT }} echo "Date_GEOS5 $nymdf $nhmsf NITER0_MITgcm ${nIter0}" >> ${EXPDIR}/restarts/MITgcm_restart_dates.txt +{{ MIT }} +{{ MIT }} /bin/mv $SCRDIR/mitocean_run/STDOUT.0000 $EXPDIR/mit_output/STDOUT.${znIter00} +{{ MIT }} +{{ MIT }} endif +{{ MIT }} +{{ MIT }} cd $SCRDIR/mitocean_run +{{ MIT }} +{{ MIT }} # Check existance of roling pickups +{{ MIT }} set nonomatch rp = ( pickup*ckptA* ) +{{ MIT }} echo $rp +{{ MIT }} # Rename and move them if exist +{{ MIT }} if ( -e $rp[1] ) then +{{ MIT }} set timeStepNumber=`cat pickup.ckptA.meta | grep timeStepNumber | tr -s " " | cut -d" " -f5 | awk '{printf("%010d",$1)}'` +{{ MIT }} foreach fname ( pickup*ckptA* ) +{{ MIT }} set bname = `echo ${fname} | cut -d "." -f1 | cut -d "/" -f2` +{{ MIT }} set aname = `echo ${fname} | cut -d "." -f3` +{{ MIT }} echo $EXPDIR/restarts/${bname}.${timeStepNumber}.${aname} +{{ MIT }} /bin/mv ${fname} $EXPDIR/restarts/${bname}.${timeStepNumber}.${aname} +{{ MIT }} end +{{ MIT }} endif +{{ MIT }} +{{ MIT }} # Check existance of permanent pickups +{{ MIT }} set nonomatch pp = ( pickup* ) +{{ MIT }} echo $pp +{{ MIT }} # Move them if exist +{{ MIT }} if ( -e $pp[1] ) then +{{ MIT }} foreach fname ( pickup* ) +{{ MIT }} if ( ! -e $EXPDIR/restarts/${fname} ) /bin/mv ${fname} $EXPDIR/restarts/${fname} +{{ MIT }} end +{{ MIT }} endif +{{ MIT }} +{{ MIT }} /bin/mv T.* $EXPDIR/mit_output/ +{{ MIT }} /bin/mv S.* $EXPDIR/mit_output/ +{{ MIT }} /bin/mv U.* $EXPDIR/mit_output/ +{{ MIT }} /bin/mv V.* $EXPDIR/mit_output/ +{{ MIT }} /bin/mv W.* $EXPDIR/mit_output/ +{{ MIT }} /bin/mv PH* $EXPDIR/mit_output/ +{{ MIT }} /bin/mv Eta.* $EXPDIR/mit_output/ +{{ MIT }} +{{ MIT }} /bin/mv AREA.* $EXPDIR/mit_output/ +{{ MIT }} /bin/mv HEFF.* $EXPDIR/mit_output/ +{{ MIT }} /bin/mv HSNOW.* $EXPDIR/mit_output/ +{{ MIT }} /bin/mv UICE.* $EXPDIR/mit_output/ +{{ MIT }} /bin/mv VICE.* $EXPDIR/mit_output/ +{{ MIT }} +{{ MIT }} #copy mit output to mit_output +{{ MIT }} foreach i (`grep -i filename data.diagnostics | grep "^ " | cut -d"=" -f2 | cut -d"'" -f2 | awk '{$1=$1;print}'`) +{{ MIT }} /bin/mv ${i}* $EXPDIR/mit_output/ +{{ MIT }} end +{{ MIT }} +{{ MIT }} foreach i (`grep -i stat_fName data.diagnostics | grep "^ " | cut -d"=" -f2 | cut -d"'" -f2 | awk '{$1=$1;print}'`) +{{ MIT }} /bin/mv ${i}* $EXPDIR/mit_output/ +{{ MIT }} end +{{ MIT }} +{{ MIT }} cd $SCRDIR +{{ MIT }} +{{ MIT }} endif +{{ MIT }} +{{ MIT }} # --------------------------------------------------- +{{ MIT }} # End MITgcm restarts - after running GEOSgcm.x +{{ MIT }} # --------------------------------------------------- ####################################################################### @@ -1262,8 +1262,8 @@ sed -i -e "s|TRUE|FALSE|g" GWD_GridComp.rc set edate = e`awk '{print $1}' cap_restart`_`awk '{print $2}' cap_restart | cut -c1-2`z -@COUPLED cp -r RESTART ${EXPDIR}/restarts/RESTART.${edate} -@COUPLED cp RESTART/* INPUT +{{ COUPLED }} cp -r RESTART ${EXPDIR}/restarts/RESTART.${edate} +{{ COUPLED }} cp RESTART/* INPUT # Move Intermediate Checkpoints to RESTARTS directory # --------------------------------------------------- @@ -1332,10 +1332,10 @@ endif # --------------------- cd $EXPDIR/restarts if( $FSEGMENT == 00000000 ) then - @DATAOCEAN tar cf restarts.${edate}.tar $EXPID.*.${edate}.${GCMVER}.${BCTAG}_${BCRSLV}.* - @COUPLED tar cvf restarts.${edate}.tar $EXPID.*.${edate}.${GCMVER}.${BCTAG}_${BCRSLV}.* RESTART.${edate} + {{ DATAOCEAN }} tar cf restarts.${edate}.tar $EXPID.*.${edate}.${GCMVER}.${BCTAG}_${BCRSLV}.* + {{ COUPLED }} tar cvf restarts.${edate}.tar $EXPID.*.${edate}.${GCMVER}.${BCTAG}_${BCRSLV}.* RESTART.${edate} /bin/rm -rf `/bin/ls -d -1 $EXPID.*.${edate}.${GCMVER}.${BCTAG}_${BCRSLV}.*` - @COUPLED /bin/rm -rf RESTART.${edate} + {{ COUPLED }} /bin/rm -rf RESTART.${edate} endif @@ -1350,36 +1350,36 @@ foreach collection ( $collections ) /bin/mv `/bin/ls -1 *.${collection}.*` $EXPDIR/holding/$collection end -@COUPLED # MOM-Specific Output Files -@COUPLED # ------------------------- -@MOM5 set dsets="ocean_month" -@MOM6 set dsets="ocean_state prog_z sfc_ave forcing" -@MOM5 foreach dset ( $dsets ) -@MOM5 set num = `/bin/ls -1 $dset.nc | wc -l` -@MOM5 if($num != 0) then -@MOM5 if(! -e $EXPDIR/MOM_Output) mkdir -p $EXPDIR/MOM_Output -@MOM5 /bin/mv $SCRDIR/$dset.nc $EXPDIR/MOM_Output/$dset.${edate}.nc -@MOM5 endif -@MOM5 end -@MOM6 foreach dset ( $dsets ) -@MOM6 set num = `/bin/ls -1 $dset.nc | wc -l` -@MOM6 if($num != 0) then -@MOM6 if(! -e $EXPDIR/MOM_Output) mkdir -p $EXPDIR/MOM_Output -@MOM6 /bin/mv $SCRDIR/$dset.nc $EXPDIR/MOM_Output/$dset.${edate}.nc -@MOM6 endif -@MOM6 end - -@CICE6 # CICE6-Specific Output Files -@CICE6 # ------------------------- -@CICE6 set dsets="iceh" -@CICE6 foreach dset ( $dsets ) -@CICE6 set num = `/bin/ls -1 $dset.*.nc | wc -l` -@CICE6 if($num != 0) then -@CICE6 if(! -e $EXPDIR/CICE_Output) mkdir -p $EXPDIR/CICE_Output -@CICE6 /bin/mv $SCRDIR/$dset.*.nc $EXPDIR/CICE_Output/ -@CICE6 endif -@CICE6 end -@CICE6 +{{ COUPLED }} # MOM-Specific Output Files +{{ COUPLED }} # ------------------------- +{{ MOM5 }} set dsets="ocean_month" +{{ MOM6 }} set dsets="ocean_state prog_z sfc_ave forcing" +{{ MOM5 }} foreach dset ( $dsets ) +{{ MOM5 }} set num = `/bin/ls -1 $dset.nc | wc -l` +{{ MOM5 }} if($num != 0) then +{{ MOM5 }} if(! -e $EXPDIR/MOM_Output) mkdir -p $EXPDIR/MOM_Output +{{ MOM5 }} /bin/mv $SCRDIR/$dset.nc $EXPDIR/MOM_Output/$dset.${edate}.nc +{{ MOM5 }} endif +{{ MOM5 }} end +{{ MOM6 }} foreach dset ( $dsets ) +{{ MOM6 }} set num = `/bin/ls -1 $dset.nc | wc -l` +{{ MOM6 }} if($num != 0) then +{{ MOM6 }} if(! -e $EXPDIR/MOM_Output) mkdir -p $EXPDIR/MOM_Output +{{ MOM6 }} /bin/mv $SCRDIR/$dset.nc $EXPDIR/MOM_Output/$dset.${edate}.nc +{{ MOM6 }} endif +{{ MOM6 }} end + +{{ CICE6 }} # CICE6-Specific Output Files +{{ CICE6 }} # ------------------------- +{{ CICE6 }} set dsets="iceh" +{{ CICE6 }} foreach dset ( $dsets ) +{{ CICE6 }} set num = `/bin/ls -1 $dset.*.nc | wc -l` +{{ CICE6 }} if($num != 0) then +{{ CICE6 }} if(! -e $EXPDIR/CICE_Output) mkdir -p $EXPDIR/CICE_Output +{{ CICE6 }} /bin/mv $SCRDIR/$dset.*.nc $EXPDIR/CICE_Output/ +{{ CICE6 }} endif +{{ CICE6 }} end +{{ CICE6 }} ####################################################################### # Run Post-Processing and Forecasts ####################################################################### @@ -1458,13 +1458,13 @@ else endif endif -@COUPLED cp -rf RESTART $EXPDIR +{{ COUPLED }} cp -rf RESTART $EXPDIR if ( $rc == 0 ) then cd $HOMDIR if ( $GCMEMIP == TRUE ) then - if( $capdate < $enddate ) @BATCH_CMD $HOMDIR/gcm_run.j$RSTDATE + if( $capdate < $enddate ) {{ BATCH_CMD }} $HOMDIR/gcm_run.j$RSTDATE else - if( $capdate < $enddate ) @BATCH_CMD $HOMDIR/gcm_run.j + if( $capdate < $enddate ) {{ BATCH_CMD }} $HOMDIR/gcm_run.j endif endif diff --git a/gcm_setup b/gcm_setup old mode 100755 new mode 100644 index 55123acd..94903ceb --- a/gcm_setup +++ b/gcm_setup @@ -581,7 +581,7 @@ if( $OGCM == TRUE ) then else if ( "$OCNMODEL" == "MOM6" ) then set OCEAN_NAME="MOM6" set OGRIDTYP = "M6TP" - set OCEAN_PRELOAD = 'env @PRELOAD_COMMAND=\$GEOSDIR/lib/libmom6@CMAKE_SHARED_LIBRARY_SUFFIX@' + set OCEAN_PRELOAD = 'env @PRELOAD_COMMAND=$GEOSDIR/lib/libmom6@CMAKE_SHARED_LIBRARY_SUFFIX@' set MOM6="" set MOM5 = "#DELETE" set DEFAULT_HISTORY_TEMPLATE="HISTORY.AOGCM.rc.tmpl" @@ -1404,7 +1404,7 @@ if( $SITE == 'NAS' ) then if( ${OGCM_IM}x${OGCM_JM} == "1440x720" ) then setenv SSTDIR ${BOUNDARY_DIR}/fvInput/g5gcm/bcs/SST/${OGCM_IM}x${OGCM_JM} # location of SST Boundary Conditions else - setenv SSTDIR ${BOUNDARY_DIR}/fvInput/g5gcm/bcs/realtime/@SSTNAME/${OGCM_IM}x${OGCM_JM} # location of SST Boundary Conditions + setenv SSTDIR ${BOUNDARY_DIR}/fvInput/g5gcm/bcs/realtime/${SSTNAME}/${OGCM_IM}x${OGCM_JM} # location of SST Boundary Conditions endif if (${OGRIDTYP} == "MITLLC") then setenv SSTDIR /nobackupp2/estrobac/geos5/SSTDIR @@ -1452,7 +1452,7 @@ else if( $SITE == 'NCCS' ) then if( ${OGCM_IM}x${OGCM_JM} == "1440x720" ) then setenv SSTDIR $SHARE/gmao_ops/fvInput/g5gcm/bcs/SST/${OGCM_IM}x${OGCM_JM} # location of SST Boundary Conditions else - setenv SSTDIR $SHARE/gmao_ops/fvInput/g5gcm/bcs/realtime/@SSTNAME/${OGCM_IM}x${OGCM_JM} # location of SST Boundary Conditions + setenv SSTDIR $SHARE/gmao_ops/fvInput/g5gcm/bcs/realtime/${SSTNAME}/${OGCM_IM}x${OGCM_JM} # location of SST Boundary Conditions endif setenv CHMDIR $SHARE/gmao_ops/fvInput_nc3 # locations of Aerosol Chemistry BCs setenv WRKDIR /discover/nobackup/$LOGNAME # user work directory @@ -1494,7 +1494,7 @@ else if( $SITE == 'AWS' | $SITE == 'Azure' ) then setenv REPLAY_ANA_LOCATION REPLAY_UNSUPPORTED # Default Analysis Location for REPLAY setenv M2_REPLAY_ANA_LOCATION REPLAY_UNSUPPORTED # Default Analysis Location for M2 REPLAY - setenv SSTDIR ${BOUNDARY_DIR}/@SSTNAME/${OGCM_IM}x${OGCM_JM} # location of SST Boundary Conditions + setenv SSTDIR ${BOUNDARY_DIR}/${SSTNAME}/${OGCM_IM}x${OGCM_JM} # location of SST Boundary Conditions setenv CHMDIR ${BOUNDARY_DIR}/fvInput_nc3 # locations of Aerosol Chemistry BCs setenv WRKDIR $HOME # user work directory setenv COUPLEDIR ${BOUNDARY_DIR}/bcs_shared/make_bcs_inputs/ocean # Coupled Ocean/Atmos Forcing @@ -1533,7 +1533,7 @@ else setenv REPLAY_ANA_LOCATION REPLAY_UNSUPPORTED # Default Analysis Location for REPLAY setenv M2_REPLAY_ANA_LOCATION REPLAY_UNSUPPORTED # Default Analysis Location for M2 REPLAY - setenv SSTDIR ${BOUNDARY_DIR}/@SSTNAME/${OGCM_IM}x${OGCM_JM} # location of SST Boundary Conditions + setenv SSTDIR ${BOUNDARY_DIR}/${SSTNAME}/${OGCM_IM}x${OGCM_JM} # location of SST Boundary Conditions setenv CHMDIR ${BOUNDARY_DIR}/fvInput_nc3 # locations of Aerosol Chemistry BCs setenv WRKDIR $HOME # user work directory setenv COUPLEDIR ${BOUNDARY_DIR}/bcs_shared/make_bcs_inputs/ocean # Coupled Ocean/Atmos Forcing @@ -1918,219 +1918,220 @@ endif ####################################################################### cat > $HOMDIR/sedfile << EOF -/@SETENVS/ { +/{{ SETENVS }}/ { t success : success r $HOMDIR/SETENV.commands d } -s?@GCMVER?$GCMVER?g -s?@EXPSRC?$GEOSTAG?g -s?@EXPID?$EXPID?g -s?@RUN_N?$RUN_N?g -s?@RUN_FN?$RUN_FN?g -s?@RUN_FT?$RUN_FT?g -s?@RUN_T?$RUN_T?g -s?@RUN_P?$RUN_P?g -s?@RUN_FP?$RUN_FP?g -s?@RUN_Q?$RUN_Q?g -s?@REGRESS_P?$REGRESS_P?g -s?@POST_N?$POST_N?g -s?@POST_T?$POST_T?g -s?@POST_P?$POST_P?g -s?@POST_Q?$POST_Q?g -s?@MOVE_N?$MOVE_N?g -s?@PLOT_N?$PLOT_N?g -s?@PLOT_T?$PLOT_T?g -s?@PLOT_P?$PLOT_P?g -s?@PLOT_Q?$PLOT_Q?g -s?@MOVE_Q?$MOVE_Q?g -s?@MOVE_P?$MOVE_P?g -s?@ARCHIVE_N?$ARCHIVE_N?g -s?@ARCHIVE_T?$ARCHIVE_T?g -s?@ARCHIVE_P?$ARCHIVE_P?g -s?@ARCHIVE_Q?$ARCHIVE_Q?g -s?@REGRESS_N?$REGRESS_N?g -s?@BCSDIR?$BCSDIR?g -s?@SSTDIR?$SSTDIR?g -s?@SSTNAME?$SSTNAME?g -s?@OCEANOUT?$OCEANOUT?g -s?@LSMBCS?$LSM_BCS?g -s?@EMIP_BCS_IN?$EMIP_BCS_IN?g -s?@EMIP_MERRA2?$EMIP_MERRA2?g -s?@BCSTAG?$OCEAN_TAG?g -s?@SSTFILE?$SSTFILE?g -s?@ICEFILE?$ICEFILE?g -s?@KPARFILE?$KPARFILE?g -s?@CHMDIR?$CHMDIR?g -s?@COUPLEDIR?$COUPLEDIR?g -s?@GWDRSDIR?$GWDRSDIR?g -s?@NCAR_NRDG?$NCAR_NRDG?g -s?@EXPDIR?$EXPDIR?g -s?@EXPDSC?$EXPDSC?g -s?@HOMDIR?$HOMDIR?g -s?@BATCH_GROUP?${BATCH_GROUP}${GROUP}?g -s?@BATCH_TIME?$BATCH_TIME?g -s?@BATCH_CMD?$BATCH_CMD?g -s?@BATCH_JOBNAME?$BATCH_JOBNAME?g -s?@BATCH_OUTPUTNAME?$BATCH_OUTPUTNAME?g -s?@BATCH_JOINOUTERR?$BATCH_JOINOUTERR?g -s?@SITE?$SITE?g -s?@GEOSDIR?$GEOSDIR?g -s?@GEOSSRC?$GEOSSRC?g -s?@GEOSBIN?$GEOSBIN?g -s?@GEOSETC?$GEOSETC?g -s?@GEOSUTIL?$GEOSUTIL?g -s?@SINGULARITY_BUILD?$SINGULARITY_BUILD?g -s?@NATIVE_BUILD?$NATIVE_BUILD?g -s?@MPT_SHEPHERD?$MPT_SHEPHERD?g -s?@SINGULARITY_SANDBOX?$SINGULARITY_SANDBOX?g -s?@REAL_BIND_PATH?$REAL_BIND_PATH?g -s?@BASE_BIND_PATH?$BASE_BIND_PATH?g -s?@BC_BASE?$BC_BASE?g -s?@BOUNDARY_DIR?$BOUNDARY_DIR?g - -s?@CHECKPOINT_TYPE?default?g - -s?@OGCM_NX?$OGCM_NX?g -s?@OGCM_NY?$OGCM_NY?g -s?@OGCM_NPROCS?$OGCM_NPROCS?g - -s?@OBSERVER_FRQ?0?g +s?{{ GCMVER }}?$GCMVER?g +s?{{ EXPSRC }}?$GEOSTAG?g +s?{{ EXPID }}?$EXPID?g +s?{{ RUN_N }}?$RUN_N?g +s?{{ RUN_FN }}?$RUN_FN?g +s?{{ RUN_FT }}?$RUN_FT?g +s?{{ RUN_T }}?$RUN_T?g +s?{{ RUN_P }}?$RUN_P?g +s?{{ RUN_FP }}?$RUN_FP?g +s?{{ RUN_Q }}?$RUN_Q?g +s?{{ REGRESS_P }}?$REGRESS_P?g +s?{{ POST_N }}?$POST_N?g +s?{{ POST_T }}?$POST_T?g +s?{{ POST_P }}?$POST_P?g +s?{{ POST_Q }}?$POST_Q?g +s?{{ MOVE_N }}?$MOVE_N?g +s?{{ PLOT_N }}?$PLOT_N?g +s?{{ PLOT_T }}?$PLOT_T?g +s?{{ PLOT_P }}?$PLOT_P?g +s?{{ PLOT_Q }}?$PLOT_Q?g +s?{{ MOVE_Q }}?$MOVE_Q?g +s?{{ MOVE_P }}?$MOVE_P?g +s?{{ ARCHIVE_N }}?$ARCHIVE_N?g +s?{{ ARCHIVE_T }}?$ARCHIVE_T?g +s?{{ ARCHIVE_P }}?$ARCHIVE_P?g +s?{{ ARCHIVE_Q }}?$ARCHIVE_Q?g +s?{{ REGRESS_N }}?$REGRESS_N?g +s?{{ BCSDIR }}?$BCSDIR?g +s?{{ SSTDIR }}?$SSTDIR?g +s?{{ SSTNAME }}?$SSTNAME?g +s?{{ OCEANOUT }}?$OCEANOUT?g +s?{{ LSMBCS }}?$LSM_BCS?g +s?{{ EMIP_BCS_IN }}?$EMIP_BCS_IN?g +s?{{ EMIP_MERRA2 }}?$EMIP_MERRA2?g +s?{{ BCSTAG }}?$OCEAN_TAG?g +s?{{ SSTFILE }}?$SSTFILE?g +s?{{ ICEFILE }}?$ICEFILE?g +s?{{ KPARFILE }}?$KPARFILE?g +s?{{ CHMDIR }}?$CHMDIR?g +s?{{ COUPLEDIR }}?$COUPLEDIR?g +s?{{ GWDRSDIR }}?$GWDRSDIR?g +s?{{ NCAR_NRDG }}?$NCAR_NRDG?g +s?{{ EXPDIR }}?$EXPDIR?g +s?{{ EXPDSC }}?$EXPDSC?g +s?{{ HOMDIR }}?$HOMDIR?g +s?{{ BATCH_GROUP }}?${BATCH_GROUP}${GROUP}?g +s?{{ BATCH_TIME }}?$BATCH_TIME?g +s?{{ BATCH_CMD }}?$BATCH_CMD?g +s?{{ BATCH_JOBNAME }}?$BATCH_JOBNAME?g +s?{{ BATCH_OUTPUTNAME }}?$BATCH_OUTPUTNAME?g +s?{{ BATCH_JOINOUTERR }}?$BATCH_JOINOUTERR?g +s?{{ SITE }}?$SITE?g +s?{{ GEOSDIR }}?$GEOSDIR?g +s?{{ GEOSSRC }}?$GEOSSRC?g +s?{{ GEOSBIN }}?$GEOSBIN?g +s?{{ GEOSETC }}?$GEOSETC?g +s?{{ GEOSUTIL }}?$GEOSUTIL?g +s?{{ SINGULARITY_BUILD }}?$SINGULARITY_BUILD?g +s?{{ NATIVE_BUILD }}?$NATIVE_BUILD?g +s?{{ MPT_SHEPHERD }}?$MPT_SHEPHERD?g +s?{{ SINGULARITY_SANDBOX }}?$SINGULARITY_SANDBOX?g +s?{{ REAL_BIND_PATH }}?$REAL_BIND_PATH?g +s?{{ BASE_BIND_PATH }}?$BASE_BIND_PATH?g +s?{{ BC_BASE }}?$BC_BASE?g +s?{{ BOUNDARY_DIR }}?$BOUNDARY_DIR?g + +s?{{ CHECKPOINT_TYPE }}?default?g + +s?{{ OGCM_NX }}?$OGCM_NX?g +s?{{ OGCM_NY }}?$OGCM_NY?g +s?{{ OGCM_NPROCS }}?$OGCM_NPROCS?g + +s?{{ OBSERVER_FRQ }}?0?g s?^[ \t]*RECORD_?#RECORD_?g -s?@DASTUNING?#?g - -s?@FORCEDAS?$FORCEDAS?g -s?@FORCEGCM?$FORCEGCM?g -s?@COUPLED?$COUPLED?g -s?@CLDMICRO?$CLDMICRO?g -s?@MOM5?$MOM5?g -s?@MOM6?$MOM6?g -s?@OCNMODEL?$OCNMODEL?g -s?@CICE4?$CICE4?g -s?@CICE6?$CICE6?g -s?@HIST_CICE4?$HIST_CICE4?g -s?@MIT?$MIT?g -s?@DATAOCEAN?$DATAOCEAN?g -s?@OPS_SPECIES?$OPS_SPECIES?g -s?@CMIP_SPECIES?$CMIP_SPECIES?g -s?@MERRA2OX_SPECIES?$MERRA2OX_SPECIES?g -s?@FVCUBED?$FVCUBED?g -s?@HIST_GOCART?$HIST_GOCART?g -s?@HIST_CATCHCN?$HIST_CATCHCN?g -s?@GCMRUN_CATCHCN?$GCMRUN_CATCHCN?g -s?@EMIP_OLDLAND?$EMIP_OLDLAND?g -s?@EMIP_NEWLAND?$EMIP_NEWLAND?g -s?@LSM_PARMS?$LSM_PARMS?g -s?@OCEAN_NAME?$OCEAN_NAME?g -s?@OCEAN_PRELOAD?$OCEAN_PRELOAD?g - -s?@4DIAUDAS?#DELETE?g -s?@REGULAR_REPLAY_GMAO?#?g -s?@REGULAR_REPLAY_NCEP?#DELETE?g -s?@REGULAR_REPLAY_ECMWF?#DELETE?g -s?@REGULAR_REPLAY?#?g +s?{{ DASTUNING }}?#?g + +s?{{ FORCEDAS }}?$FORCEDAS?g +s?{{ FORCEGCM }}?$FORCEGCM?g +s?{{ COUPLED }}?$COUPLED?g +s?{{ CLDMICRO }}?$CLDMICRO?g +s?{{ MOM5 }}?$MOM5?g +s?{{ MOM6 }}?$MOM6?g +s?{{ OCNMODEL }}?$OCNMODEL?g +s?{{ CICE4 }}?$CICE4?g +s?{{ CICE6 }}?$CICE6?g +s?{{ HIST_CICE4 }}?$HIST_CICE4?g +s?{{ MIT }}?$MIT?g +s?{{ DATAOCEAN }}?$DATAOCEAN?g +s?{{ OPS_SPECIES }}?$OPS_SPECIES?g +s?{{ CMIP_SPECIES }}?$CMIP_SPECIES?g +s?{{ MERRA2OX_SPECIES }}?$MERRA2OX_SPECIES?g +s?{{ FVCUBED }}?$FVCUBED?g +s?{{ HIST_GOCART }}?$HIST_GOCART?g +s?{{ HIST_CATCHCN }}?$HIST_CATCHCN?g +s?{{ GCMRUN_CATCHCN }}?$GCMRUN_CATCHCN?g +s?{{ EMIP_OLDLAND }}?$EMIP_OLDLAND?g +s?{{ EMIP_NEWLAND }}?$EMIP_NEWLAND?g +s?{{ LSM_PARMS }}?$LSM_PARMS?g +s?{{ OCEAN_NAME }}?$OCEAN_NAME?g +s?{{ OCEAN_PRELOAD }}?$OCEAN_PRELOAD?g + +s?{{ _4DIAUDAS }}?#DELETE?g +s?{{ REGULAR_REPLAY_GMAO }}?#?g +s?{{ REGULAR_REPLAY_NCEP }}?#DELETE?g +s?{{ REGULAR_REPLAY_ECMWF }}?#DELETE?g +s?{{ REGULAR_REPLAY }}?#?g s?ana4replay.eta.%y4%m2%d2_%h2z.nc4?/discover/nobackup/projects/gmao/merra2/data/ana/MERRA2_all/Y%y4/M%m2/MERRA2.ana.eta.%y4%m2%d2_%h2z.nc4?g -s?@REPLAY_ANA_EXPID?$REPLAY_ANA_EXPID?g -s?@REPLAY_ANA_LOCATION?$REPLAY_ANA_LOCATION?g -s?@M2_REPLAY_ANA_LOCATION?$M2_REPLAY_ANA_LOCATION?g - -s?@OX_RELAXTIME?$OX_RELAXTIME?g -s?@PCHEM_CLIM_YEARS?$PCHEM_CLIM_YEARS?g - -s?@RATS_PROVIDER?$RATS_PROVIDER?g -s?@AERO_PROVIDER?$AERO_PROVIDER?g -s?@OANA_PROVIDER?PCHEM?g -s?@EMISSIONS?$EMISSIONS?g - -s?@CH4_PROVIDER?$CH4_PROVIDER?g -s?@CO2_PROVIDER?$CO2_PROVIDER?g - -s^@DYCORE^$DYCORE^g -s^@AGCM_GRIDNAME^$AGCM_GRIDNAME^g -s^@OGCM_GRIDNAME^$OGCM_GRIDNAME^g - -s?@OGCM_IS_FCST?$OGCM_IS_FCST?g -s^@BOOT^YES^g -s^@BCSRES^$BCSRES^g -s^@OCEANtag^$OCEAN_RES^g -s^@ATMOStag^$ATMOS_RES^g -s^@RES_DATELINE^$RES_DATELINE^g -s^@TILEDATA^$TILEDATA^g -s^@TILEBIN^$TILEBIN^g -s/@DT/$DT/g -s/@CONV_DT/$CONV_DT/g -s/@CHEM_DT/$CHEM_DT/g -s/@SOLAR_DT/$SOLAR_DT/g -s/@IRRAD_DT/$IRRAD_DT/g -s/@OCEAN_DT/$OCEAN_DT/g -s/@NX/$NX/g -s/@NY/$NY/g -s/@USE_SHMEM/$USE_SHMEM/g -s/@USE_IOSERVER/$USE_IOSERVER/g -s/@NUM_OSERVER_NODES/$NUM_OSERVER_NODES/g -s/@NUM_BACKEND_PES/$NUM_BACKEND_PES/g -s/@RESTART_BY_OSERVER/$RESTART_BY_OSERVER/g -s#@SEVERAL_TRIES#$SEVERAL_TRIES#g -s/@NCPUS_PER_NODE/$NCPUS_PER_NODE/g -s/@NUM_READERS/$NUM_READERS/g -s/@NUM_WRITERS/$NUM_WRITERS/g -s/@LATLON_AGCM/$LATLON_AGCM/g -s?@LATLON_OGCM?$LATLON_OGCM?g -s/@CUBE_AGCM/$CUBE_AGCM/g -s?@CUBE_OGCM?$CUBE_OGCM?g -s/@GRID_TYPE/$GRID_TYPE/g -s/@AGCM_NF/$AGCM_NF/g -s/@AGCM_IM/$AGCM_IM/g -s/@AGCM_JM/$AGCM_JM/g -s/@AGCM_LM/$AGCM_LM/g -s/@OGCM_IM/$OGCM_IM/g -s/@OGCM_JM/$OGCM_JM/g -s/@OGCM_LM/$OGCM_LM/g -s/@OGCM_NF/$OGCM_NF/g -s/@OGCM_GRID_TYPE/$OGCM_GRID_TYPE/g -s/@BEG_DATE/${BEG_DATE}/g -s/@END_DATE/${END_DATE}/g -s/@JOB_SGMT/${JOB_SGMT}/g -s/@NUM_SGMT/${NUM_SGMT}/g - -s/@CONUS/${CONUS}/g -s/@CONVPAR_OPTION/${CONVPAR_OPTION}/g -s/@STRETCH_FACTOR/${STRETCH_FACTOR}/g - -s/@INTERPOLATE_SST/$INTERPOLATE_SST/g -s/@HIST_IM/$HIST_IM/g -s/@HIST_JM/$HIST_JM/g -s/@CLIM_IM/$CLIM_IM/g -s/@CLIM_JM/$CLIM_JM/g - -s/@ISCCP_SATSIM/1/g -s/@MODIS_SATSIM/0/g -s/@RADAR_SATSIM/0/g -s/@LIDAR_SATSIM/0/g -s/@MISR_SATSIM/0/g -s/@SATSIM/0/g - -s/@USE_SKIN_LAYER/1/g -s/@ANALYZE_TS/0/g - -s/@LSM_CHOICE/$LSM_CHOICE/g - -s/@MP_TURN_OFF_WSUB_EXTDATA/$MP_TURN_OFF_WSUB_EXTDATA/g - -s?@BACM_1M_?$BACM_1M_?g -s?@GFDL_1M_?$GFDL_1M_?g -s?@MGB2_2M_?$MGB2_2M_?g - -s?@PRELOAD_COMMAND?$PRELOAD_COMMAND?g -s?@LD_LIBRARY_PATH_CMD?$LD_LIBRARY_PATH_CMD?g -s?@RUN_CMD?$RUN_CMD?g - -s?@MODELATM?$MODELATM?g -s?@USE_DATA_ATM4OCN?$USE_DATA_ATM4OCN?g +s?{{ REPLAY_ANA_EXPID }}?$REPLAY_ANA_EXPID?g +s?{{ REPLAY_ANA_LOCATION }}?$REPLAY_ANA_LOCATION?g +s?{{ M2_REPLAY_ANA_LOCATION }}?$M2_REPLAY_ANA_LOCATION?g + +s?{{ OX_RELAXTIME }}?$OX_RELAXTIME?g +s?{{ PCHEM_CLIM_YEARS }}?$PCHEM_CLIM_YEARS?g + +s?{{ RATS_PROVIDER }}?$RATS_PROVIDER?g +s?{{ AERO_PROVIDER }}?$AERO_PROVIDER?g +s?{{ OANA_PROVIDER }}?PCHEM?g +s?{{ EMISSIONS }}?$EMISSIONS?g + +s?{{ CH4_PROVIDER }}?$CH4_PROVIDER?g +s?{{ CO2_PROVIDER }}?$CO2_PROVIDER?g + +s^{{ DYCORE }}^$DYCORE^g +s^{{ AGCM_GRIDNAME }}^$AGCM_GRIDNAME^g +s^{{ OGCM_GRIDNAME }}^$OGCM_GRIDNAME^g + +s?{{ OGCM_IS_FCST }}?$OGCM_IS_FCST?g +s^{{ BOOT }}^YES^g +s^{{ BCSRES }}^$BCSRES^g +s^{{ OCEANtag }}^$OCEAN_RES^g +s^{{ ATMOStag }}^$ATMOS_RES^g +s^{{ RES_DATELINE }}^$RES_DATELINE^g +s^{{ TILEDATA }}^$TILEDATA^g +s^{{ TILEBIN }}^$TILEBIN^g +s/{{ DT }}/$DT/g +s/{{ CONV_DT }}/$CONV_DT/g +s/{{ CHEM_DT }}/$CHEM_DT/g +s/{{ SOLAR_DT }}/$SOLAR_DT/g +s/{{ IRRAD_DT }}/$IRRAD_DT/g +s/{{ OCEAN_DT }}/$OCEAN_DT/g +s/{{ NX }}/$NX/g +s/{{ NY }}/$NY/g +s/{{ USE_SHMEM }}/$USE_SHMEM/g +s/{{ USE_IOSERVER }}/$USE_IOSERVER/g +s/{{ NUM_OSERVER_NODES }}/$NUM_OSERVER_NODES/g +s/{{ NUM_BACKEND_PES }}/$NUM_BACKEND_PES/g +s/{{ RESTART_BY_OSERVER }}/$RESTART_BY_OSERVER/g +s#{{ SEVERAL_TRIES }}#$SEVERAL_TRIES#g +s/{{ NCPUS_PER_NODE }}/$NCPUS_PER_NODE/g +s/{{ NUM_READERS }}/$NUM_READERS/g +s/{{ NUM_WRITERS }}/$NUM_WRITERS/g +s/{{ LATLON_AGCM }}/$LATLON_AGCM/g +s?{{ LATLON_OGCM }}?$LATLON_OGCM?g +s/{{ CUBE_AGCM }}/$CUBE_AGCM/g +s?{{ CUBE_OGCM }}?$CUBE_OGCM?g +s/{{ GRID_TYPE }}/$GRID_TYPE/g +s/{{ AGCM_NF }}/$AGCM_NF/g +s/{{ AGCM_IM }}/$AGCM_IM/g +s/{{ AGCM_JM }}/$AGCM_JM/g +s/{{ AGCM_LM }}/$AGCM_LM/g +s/{{ OGCM_IM }}/$OGCM_IM/g +s/{{ OGCM_JM }}/$OGCM_JM/g +s/{{ OGCM_LM }}/$OGCM_LM/g +s/{{ OGCM_NF }}/$OGCM_NF/g +s/{{ OGCM_GRID_TYPE }}/$OGCM_GRID_TYPE/g +s/{{ BEG_DATE }}/${BEG_DATE}/g +s/{{ END_DATE }}/${END_DATE}/g +s/{{ JOB_SGMT }}/${JOB_SGMT}/g +s/{{ NUM_SGMT }}/${NUM_SGMT}/g + +s/{{ CONUS }}/${CONUS}/g +s/{{ CONVPAR_OPTION }}/${CONVPAR_OPTION}/g +s/{{ STRETCH_FACTOR }}/${STRETCH_FACTOR}/g + +s/{{ INTERPOLATE_SST }}/$INTERPOLATE_SST/g +s/{{ HIST_IM }}/$HIST_IM/g +s/{{ HIST_JM }}/$HIST_JM/g +s/{{ CLIM_IM }}/$CLIM_IM/g +s/{{ CLIM_JM }}/$CLIM_JM/g + +s/{{ ISCCP_SATSIM }}/1/g +s/{{ MODIS_SATSIM }}/0/g +s/{{ RADAR_SATSIM }}/0/g +s/{{ LIDAR_SATSIM }}/0/g +s/{{ MISR_SATSIM }}/0/g +s/{{ SATSIM }}/0/g + +s/{{ USE_SKIN_LAYER }}/1/g +s/{{ ANALYZE_TS }}/0/g + +s/{{ LSM_CHOICE }}/$LSM_CHOICE/g + +s/{{ MP_TURN_OFF_WSUB_EXTDATA }}/$MP_TURN_OFF_WSUB_EXTDATA/g + +s?{{ BACM_1M_ }}?$BACM_1M_?g +s?{{ GFDL_1M_ }}?$GFDL_1M_?g +s?{{ MGB2_2M_ }}?$MGB2_2M_?g + +s?{{ PRELOAD_COMMAND }}?$PRELOAD_COMMAND?g +s?{{ LD_LIBRARY_PATH_CMD }}?$LD_LIBRARY_PATH_CMD?g +s?{{'{'}}{{LD_LIBRARY_PATH_CMD}}{{'}'}}?\{$LD_LIBRARY_PATH_CMD\}?g +s?{{ RUN_CMD }}?$RUN_CMD?g + +s?{{ MODELATM }}?$MODELATM?g +s?{{ USE_DATA_ATM4OCN }}?$USE_DATA_ATM4OCN?g EOF @@ -2139,10 +2140,10 @@ EOF cat >> $HOMDIR/sedfile << EOF -s?@FV_SCHMIDT?$SCHMIDT?g -s?@FV_STRETCH_FAC?$STRETCH_FAC?g -s?@FV_TARGET_LON?$TARGET_LON?g -s?@FV_TARGET_LAT?$TARGET_LAT?g +s?{{ FV_SCHMIDT }}?$SCHMIDT?g +s?{{ FV_STRETCH_FAC }}?$STRETCH_FAC?g +s?{{ FV_TARGET_LON }}?$TARGET_LON?g +s?{{ FV_TARGET_LAT }}?$TARGET_LAT?g EOF diff --git a/gcmpy/CMakeLists.txt b/gcmpy/CMakeLists.txt new file mode 100644 index 00000000..a577c96c --- /dev/null +++ b/gcmpy/CMakeLists.txt @@ -0,0 +1,3 @@ +# cp (makes exe) +add_subdirectory(scripts) +add_subdirectory(yaml) diff --git a/gcmpy/scripts/CMakeLists.txt b/gcmpy/scripts/CMakeLists.txt new file mode 100644 index 00000000..0e192ab0 --- /dev/null +++ b/gcmpy/scripts/CMakeLists.txt @@ -0,0 +1,16 @@ +set (programs + atmosphere.py + env.py + generate_question.py + gocart.py + land.py + gcm_setup.py + ocean.py + process_questions.py + utility.py + ) + +foreach (file ${programs}) + configure_file(${file} ${file} @ONLY) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${file} DESTINATION bin/gcmpy/scripts) +endforeach () diff --git a/gcmpy/scripts/atmosphere.py b/gcmpy/scripts/atmosphere.py new file mode 100755 index 00000000..3683d7b6 --- /dev/null +++ b/gcmpy/scripts/atmosphere.py @@ -0,0 +1,417 @@ +from env import answerdict +from utility import color + +class atmosphere: + def __init__(self): + self.use_SHMEM = 0 + self.force_das = "#" + self.force_gcm = "#" + self.num_readers = 1 + self.num_writers = 1 + self.dt = answerdict['heartbeat'].q_answer + self.dt_solar = None + self.dt_irrad = None + self.dt_ocean = answerdict['heartbeat'].q_answer + self.lm = int(answerdict['AM_vertical_res'].q_answer) + self.im = int(answerdict['AM_horizontal_res'].q_answer[1:]) + self.jm = self.im * 6 + self.nx = None + self.ny = None + self.nf = 6 + self.microphysics = answerdict["AM_microphysics"].q_answer + self.hist_im = self.im * 4 + self.hist_jm = self.im * 2 + 1 + self.gridfile = f"Gnomonic_c{self.im}.dat" + self.job_sgmt = None + self.num_sgmt = None + self.res = f"CF{self.im:04}x6C" + self.post_NDS = None + self.nx_convert = 2 + self.ny_convert = 24 + self.conus = '#' + self.stretch_factor = '' + self.FV_stretch_fac = '' + self.gridname = f"PE{self.im}x{self.jm}-CF" + self.res_dateline = f"{self.im}x{self.jm}" + self.BACM_1M = "#" + self.GFDL_1M = "#" + self.MGB2_2M = "#" + self.GFDL_hydro = ".TRUE." + self.GFDL_prog_ccn = "prog_ccn = .true." + self.GFDL_use_ccn = "use_ccn = .true." + self.MP_turnoff_wsub = None + self.FV_make_NH = None + self.FV_hydro = None + self.FV_hwt = None + self.schmidt = None + self.target_lon = None + self.target_lat = None + self.convpar_option = 'GF' + self.mp_turn_off_wsub_extdata = None + + # These are superfluous for GCM, but are needed SCM (considered latlon) + self.latlon = '#DELETE' + self.cube = '' + + + # for debugging purposes + def print_vars(self): + all_vars = vars(self) + for var_name, var_value in all_vars.items(): + print(f"{color.BLUE}{var_name}: {var_value}{color.RESET}") + + def hres(self, ocean_nx, ocean_ny): + match answerdict["AM_horizontal_res"].q_answer: + case "c12": + self.conv_dt = 3600 + self.chem_dt = 3600 + self.dt_solar = 3600 + self.dt_irrad = 3600 + self.dt_ocean = 3600 + if answerdict["OM_name"].q_answer == "MOM6": + self.nx = 1 + else: + self.nx = 2 + self.ny = self.nx * 6 + self.job_sgmt = f"{15:08}" + self.num_sgmt = 20 + self.post_NDS = 4 + self.nx_convert = 1 + self.ny_convert = 6 + self.res = 'CF0012x6C' + + + case "c24": + self.conv_dt = 1800 + self.chem_dt = 3600 + self.dt_solar = 3600 + self.dt_irrad = 3600 + self.dt_ocean = 3600 + self.nx = 4 + self.ny = self.nx * 6 + self.job_sgmt = f"{15:08}" + self.num_sgmt = 20 + self.post_NDS = 4 + self.nx_convert = 1 + self.ny_convert = 6 + self.res = 'CF0024x6C' + + case "c48": + self.conv_dt = 1200 + self.chem_dt = 3600 + self.dt_solar = 3600 + self.dt_irrad = 3600 + self.dt_ocean = 3600 + self.nx = 6 + self.ny = self.nx * 6 + self.im_hist = 180 + self.jm_hist = 91 + self.job_sgmt = f"{15:08}" + self.num_sgmt = 20 + self.post_NDS = 4 + self.res = 'CF0048x6C' + self.hist_im = 180 + self.hist_jm = 91 + + case "c90": + self.conv_dt = 900 + self.chem_dt = 1800 + self.dt_solar = 3600 + self.dt_irrad = 3600 + self.dt_ocean = self.dt + if answerdict['OM_name'].q_answer == 'MIT': + self.nx = 10 + self.ny = 36 + elif answerdict['OM_name'].q_answer == 'MOM5': + self.nx = ocean_nx + self.ny = ocean_ny + elif answerdict['OM_name'].q_answer == 'MOM6': + self.nx = 5 + self.ny = 36 + else: + self.nx = 10 + self.ny = self.nx * 6 + self.dt_ocean = 3600 + self.job_sgmt = f"{32:08}" + self.num_sgmt = 4 + self.post_NDS = 8 + self.res = 'CF0090x6C' + + case "c180": + self.conv_dt = 600 + self.chem_dt = 1200 + self.dt_solar = 3600 + self.dt_irrad = 3600 + self.dt_ocean = self.dt + if answerdict['OM_name'].q_answer == 'MOM6': + self.nx = 30 + self.ny = 36 + elif answerdict['OM_name'].q_answer == 'MOM5' or answerdict['OM_name'].q_answer == 'MIT': + self.nx = ocean_nx + self.ny = ocean_ny + else: + self.nx = 20 + self.ny = self.nx * 6 + self.dt_ocean = 3600 + self.job_sgmt = f"{16:08}" + self.num_sgmt = 1 + self.post_NDS = 8 + self.num_readers = 2 + self.res = 'CF0180x6C' + + case "c360": + self.conv_dt = 450 + self.chem_dt = 900 + self.dt_solar = 3600 + self.dt_irrad = 3600 + self.dt_ocean = 4600 + self.nx = 30 + self.ny = self.nx * 6 + self.num_readers = 4 + self.job_sgmt = f"{5:08}" + self.num_sgmt = 1 + self.post_NDS = 12 + self.nx_convert = 4 + self.res = 'CF0360x6C' + + case "c720": + self.conv_dt = 300 + self.chem_dt = 600 + self.dt_solar = 3600 + self.dt_irrad = 3600 + self.dt_ocean = 3600 + self.nx = 40 + self.ny = self.nx * 6 + self.num_readers = 6 + self.job_sgmt = f"{5:08}" + self.num_sgmt = 1 + self.post_NDS = 16 + self.nx_convert = 8 + self.use_SHMEM = 1 + self.res = 'CF0720x6C' + + case "c1120": + self.conv_dt = 300 + self.chem_dt = 600 + self.dt_solar = 3600 + self.dt_irrad = 3600 + self.dt_ocean = 3600 + self.nx = 60 + self.ny = self.nx * 6 + self.num_readers = 6 + self.job_sgmt = f"{5:08}" + self.num_sgmt = 1 + self.post_NDS = 16 + self.nx_convert = 8 + self.use_SHMEM = 1 + self.res = 'CF1120x6C' + + case "c1440": + self.conv_dt = 300 + self.chem_dt = 600 + self.dt_solar = 1200 + self.dt_irrad = 1200 + self.dt_ocean = 1200 + self.nx = 80 + self.ny = self.nx * 6 + self.num_readers = 6 + self.job_sgmt = f"{1:08}" + self.num_sgmt = 1 + self.post_NDS = 32 + self.nx_convert = 8 + self.use_SHMEM = 1 + self.res = 'CF1440x6C' + + case "c2880": + self.conv_dt = 300 + self.chem_dt = 300 + self.dt_solar = 900 + self.dt_irrad = 900 + self.dt_ocean = 900 + self.nx = 80 + self.ny = self.nx * 6 + self.num_readers = 6 + self.job_sgmt = f"{1:08}" + self.num_sgmt = 1 + self.post_NDS = 32 + self.nx_convert = 8 + self.use_SHMEM = True + self.convpar_option = 'NONE' + self.res = 'CF2880x6C' + + case "c5760": + self.conv_dt = 300 + self.chem_dt = 300 + self.dt_solar = 600 + self.dt_irrad = 600 + self.dt_ocean = 600 + self.nx = 80 + self.ny = self.nx * 6 + self.num_readers = 6 + self.job_sgmt = f"{1:08}" + self.num_sgmt = 1 + self.post_NDS = 32 + self.nx_convert = 8 + self.use_SHMEM = True + self.convpar_option = 'NONE' + self.res = 'CF5760x6C' + + case "c270": + self.conv_dt = 600 + self.chem_dt = 1800 + self.dt_solar = 3600 + self.dt_irrad = 3600 + self.dt_ocean = 3600 + self.nx = 20 + self.ny = self.nx * 6 * 2 + self.num_readers = 6 + self.job_sgmt = f"{1:08}" + self.num_sgmt = 1 + self.post_NDS = 32 + self.nx_convert = 8 + self.use_SHMEM = 1 + self.conus = "" + self.stretch_factor = 2.5 + self.res = 'CF0270x6C-SG001' + + case "c540": + self.conv_dt = 300 + self.chem_dt = 900 + self.dt_solar = 3600 + self.dt_irrad = 3600 + self.dt_ocean = 3600 + self.nx = 30 + self.ny = self.nx * 6 * 2 + self.num_readers = 6 + self.job_sgmt = f"{1:08}" + self.num_sgmt = 1 + self.post_NDS = 32 + self.nx_convert = 8 + self.use_SHMEM = 1 + self.conus = "" + self.stretch_factor = 2.5 + self.res = 'CF0540x6C-SG001' + + case "c1080": + self.conv_dt = 300 + self.chem_dt = 600 + self.dt_solar = 1800 + self.dt_irrad = 1800 + self.dt_ocean = 1800 + self.nx = 40 + self.ny = self.nx * 6 * 2 + self.num_readers = 6 + self.job_sgmt = f"{1:08}" + self.num_sgmt = 1 + self.post_NDS = 32 + self.nx_convert = 8 + self.use_SHMEM = 1 + self.conus = "" + self.stretch_factor = 2.5 + self.res = 'CF1080x6C-SG001' + + case "c1536": + self.conv_dt = 300 + self.chem_dt = 900 + self.dt_solar = 900 + self.dt_irrad = 900 + self.dt_ocean = 900 + self.nx = 60 + self.ny = self.nx * 6 + self.num_readers = 6 + self.job_sgmt = f"{5:08}" + self.num_sgmt = 1 + self.post_NDS = 16 + self.nx_convert = 8 + self.use_SHMEM = 1 + self.conus = "" + self.stretch_factor = 3.0 + self.res = 'CF1536x6C-SG002' + + case "c2160": + self.conv_dt = 300 + self.chem_dt = 300 + self.dt_solar = 900 + self.dt_irrad = 900 + self.dt_ocean = 900 + self.nx = 80 + self.ny = self.nx * 6 * 2 + self.num_readers = 6 + self.job_sgmt = f"{5:08}" + self.num_sgmt = 1 + self.post_NDS = 32 + self.nx_convert = 8 + self.use_SHMEM = 1 + self.conus = "" + self.stretch_factor = 2.5 + self.res = 'CF2160x6C-SG001' + + case 'c4320': + self.conv_dt = 300 + self.chem_dt = 300 + self.dt_solar = 900 + self.dt_irrad = 900 + self.dt_ocean = 900 + self.nx = 80 + self.ny = self.nx * 6 * 2 + self.num_readers = 6 + self.job_sgmt = f"{5:08}" + self.num_sgmt = 1 + self.post_NDS = 32 + self.nx_convert = 8 + self.use_SHMEM = 1 + self.conus = "" + self.stretch_factor = 2.5 + self.res = 'CF4320x6C' + + + + def set_microphysics(self): + if self.microphysics == "BACM_1M": + self.BACM_1M = "" + self.conv_dt = 450 + self.chem_dt = 3600 + elif self.microphysics == "GFDL_1M": + self.GFDL_1M = "" + elif self.microphysics == "MGB2_2M": + self.MGB2_2M = "" + + def set_turnoff_wsub(self): + if self.microphysics == "MGB2_2M": + self.MP_turnoff_wsub = "#DELETE" + else: + self.MP_turnoff_wsub = "" + + def set_conus(self): + if self.conus == "#": + self.schmidt = "do_schmidt = .false." + self.FV_stretch_fac = "stretch_fac = 1.0" + self.target_lon = "target_lon = 0.0" + self.target_lat = "target_lat = -90.0" + else: + self.schmidt = "do_schmidt = .true." + self.FV_stretch_fac = f"stretch_fac = {self.stretch_factor}" + self.target_lon = "target_lon = -98.35" + self.target_lat = "target_lat = 39.5" + self.FV_hwt = '' + + def set_wsub_extdata(self): + if self.microphysics == 'BACM_1M' or self.microphysics == 'GFDL_1M': + self.mp_turn_off_wsub_extdata = '' + else: + self.mp_turn_off_wsub_extdata = '#DELETE#' + + # Set coarse resolution CLIM output + def set_CLIM(self): + self.CLIM_IM = 576 + self.CLIM_JM = 361 + if (self.CLIM_IM > self.im_hist): + self.CLIM_IM = im_hist + self.CLIM_JM = jm_hist + + def config(self, ocean_nx, ocean_ny): + self.hres(ocean_nx, ocean_ny) + self.set_microphysics() + self.set_conus() + self.set_wsub_extdata() + self.set_CLIM() diff --git a/gcmpy/scripts/env.py b/gcmpy/scripts/env.py new file mode 100755 index 00000000..a8f5d419 --- /dev/null +++ b/gcmpy/scripts/env.py @@ -0,0 +1,133 @@ +import os, sys, platform +import process_questions as pq +from utility import envdict, pathdict, color, exceptions +import questionary + +# PROBABLY WANT TO REMOVE/MODIFY THIS! +''' +# Check if GEOSgcm.x is here, which means you are in the correct directory +if not os.path.exists(os.path.join(pathdict['BIN'], 'GEOSgcm.x')): + exceptions.raise_user_exception( + "You are trying to run " + color.color_file(pathdict['SCRIPTNAME']) + \ + " in the " + color.color_path(pathdict['CWD']) + " directory." + \ + "\nThis is no longer supported.\nPlease run from the " + color.color_path('bin/') + \ + " directory in your installation.") + exit(1) +''' + + +####################################################################### +# Check for Command Line Flags +####################################################################### +# Set default behavior of switches +linkx = False +exe_verb = 'copied' +bool_usingSingularity = False + +# Loop through arguments and mtch to each case +# If argument is not recognized, display usage and exit +for arg in enumerate(sys.argv[1:]): + if (arg[-1] == '--link'): + linkx = True + elif (arg[-1] == '--singularity'): + bool_usingSingularity == True + elif (arg[-1] == '--help' or arg[-1] == '-h'): + exceptions.printusage() + else: + exceptions.raiseuserexception("Command line arguemnt \"" + arg[-1] + "\" not \ + recognized. \nSee usage:\n" ) + exceptions.printusage() + + +####################################################################### +# Determine site +####################################################################### +envdict['node'] = platform.node() +envdict['arch'] = platform.system() +envdict['site'] = open(os.path.join(pathdict['etc'], 'SITE.rc'), 'r').read().split()[-1] + +####################################################################### +# Test for Compiler and MPI Setup +####################################################################### +# Extract BASEDIR tail +envdict['mpi'] = '@MPI_STACK@' + +answerdict = pq.process() + +####################################################################### +# Set Number of CPUs per Node +####################################################################### +if envdict['site'] == 'NCCS': + ''' + NCCS currently recommends that users do not run with + 48 cores per n_CPUs on SCU16 due to OS issues and + recommends that CPU-intensive works run with 46 or less + cores. As 45 is a multiple of 3, it's the best value + that doesn't waste too much + ''' + if answerdict['processor'].q_answer == 'cas': + envdict['n_CPUs'] = 40 + elif answerdict['processor'].q_answer == 'mil': + envdict['n_CPUs'] = 120 + +elif envdict['site'] == 'NAS': + if answerdict['processor'].q_answer == 'has': + envdict['n_CPUs'] = 24 + elif answerdict['processor'].q_answer == 'bro': + envdict['n_CPUs'] = 24 + elif answerdict['processor'].q_answer == 'sky': + answerdict['processor'].q_answer = 'sky_ele' + envdict['n_CPUs'] = 40 + elif answerdict['processor'].q_answer == 'cas': + answerdict['processor'].q_answer = 'cas_ait' + envdict['n_CPUs'] = 40 + elif answerdict['processor'].q_answer == 'rom' or answerdict['processor'].q_answer == 'mil': + answerdict['processor'].q_answer += '_ait' + envdict['n_CPUs'] = 120 + +elif envdict['site'] == 'AWS' or envdict['site'] == 'AZURE': + # Because we do not know the name of the model or the number of CPUs + # per node. We ask the user to set these variables in the script + print(color.RED + "\nSince you are running on ", envdict['site'], \ + " you must set the processor and # of CPUs yourself.") + # ASK FOR PROCESSOR TYPE <------------------------------------------------------------------------------- + envdict['n_CPUs'] = questionary.text("Enter the number of CPUs per node: ").ask() + +else: + envdict['site'] = 'UNKNOWN' + if envdict['arch'] == 'Linux': + # Get the number of CPU cores on Linux + try: + with open('/proc/cpuinfo') as f: + cpuinfo = f.read() + envdict['n_CPUs'] = cpuinfo.count('processor') + except IOError: + print(color.RED + "ERROR: Unable to retrieve the number of CPUs.") + sys.exit(1) + elif envdict['arch'] == 'Darwin': + # Get the number of CPU cores on macOS + try: + import multiprocessing + envdict['n_CPUs'] = multiprocessing.cpu_count() + except NotImplementedError: + print(color.RED + "ERROR: Unable to retrieve the number of CPUs.") + sys.exit(1) + else: + print(f"ERROR: Unknown architecture", envdict['arch']) + sys.exit(1) + +####################################################################### +# Build Directory Locations +####################################################################### +if envdict['arch'] == 'Darwin': + envdict['preload_command'] = 'DYLD_INSERT_LIBRARIES' + envdict['ld_library_path_command'] = 'DYLD_LIBRARY_PATH' + # On macOS we seem to need to call mpirun directly and not use esma_mpirun + # For some reason SIP does not let the libraries be preloaded + envdict['run_command'] = 'mpirun -np ' +else: + envdict['preload_command'] = 'LD_PRELOAD' + envdict['ld_library_path_command'] = 'LD_LIBRARY_PATH' + envdict['run_command'] = '$GEOSBIN/esma_mpirun -np ' + + diff --git a/gcmpy/scripts/gcm_setup.py b/gcmpy/scripts/gcm_setup.py new file mode 100755 index 00000000..f2e8c262 --- /dev/null +++ b/gcmpy/scripts/gcm_setup.py @@ -0,0 +1,972 @@ +#!/usr/bin/env python3 + +from ocean import ocean +from atmosphere import atmosphere as atmos +from land import land +from gocart import gocart +from env import answerdict, linkx +from utility import envdict, pathdict, color +import math, os, shutil, tempfile, yaml, re, glob +from pathlib import Path +from jinja2 import Environment, FileSystemLoader, Undefined + + +# combines all models (atmos, ocean, land, gocart) into one big one +class setup: + def __init__(self): + self.ocean = ocean() + self.atmos = atmos() + self.land = land() + self.gocart = gocart() + self.is_FCST = False + self.fv_cubed = '' + self.bcs_res = None + self.tile_data = None + self.tile_bin = None + self.interpolate_sst = None + self.job_sgmt = None + self.begin_date = '18910301 000000' + self.end_date = '29990302 210000' + self.n_oserver_nodes = None + self.n_backend_pes = None + self.n_nodes = None + self.exp_dir = answerdict['exp_dir'].q_answer + self.restart_by_oserver = 'NO' + self.several_tries = '' + self.gcm_version = Path(f"{pathdict['etc']}/.AGCM_VERSION").read_text() + self.file_list = ['gcm_run.j', + 'gcm_post.j', + 'gcm_archive.j', + 'gcm_regress.j', + 'gcm_plot.tmpl', + 'gcm_quickplot.csh', + 'gcm_moveplot.j', + 'gcm_forecast.tmpl', + 'gcm_forecast.setup', + 'gcm_emip.setup', + 'CAP.rc.tmpl', + 'AGCM.rc.tmpl', + 'logging.yaml', + 'fvcore_layout.rc', + 'linkbcs.tmpl'] + + def config_models(self): + self.ocean.config() + self.atmos.config(self.ocean.NX, self.ocean.NY) + self.land.config() + self.gocart.config() + self.file_list.append(self.ocean.history_template) + + + # setup some variables idk + def set_some_stuff(self): + if self.atmos.hist_im >= self.ocean.IM: + self.interpolate_sst = True + else: + self.interpolate_sst = False + self.bcs_res = f"{self.atmos.res}_{self.ocean.res}" + self.tile_data = f"{self.atmos.res}_{self.ocean.res}_Pfafstetter.til" + self.tile_bin = f"{self.atmos.res}_{self.ocean.res}_Pfafstetter.TIL" + self.job_sgmt = f"{self.atmos.job_sgmt} 000000" + + + # setup experiment nodes + def set_nodes(self): + model_npes = self.atmos.nx * self.atmos.ny + + # Calculate OSERVER nodes based on recommended algorithm + if answerdict['io_server'].q_answer == True: + + # First we calculate the number of model nodes + n_model_nodes = math.ceil(model_npes / envdict["n_CPUs"]) + + # Next the number of frontend PEs is 10% of the model PEs + n_frontend_pes = math.ceil(model_npes * 0.1) + + # Now we roughly figure out the number of collections in the HISTORY.rc + n_hist_collections = 0 + with open(f"{pathdict['etc']}/{answerdict['history_template'].q_answer}", 'r') as file: + in_collections = False + for line in file: + if line.split(' ', 1)[0] == "COLLECTIONS:": + in_collections = True + continue + if in_collections and line.split(' ', 1)[0] != "#": + n_hist_collections += 1 + if line.strip() == "::": + break + + # The total number of oserver PEs is frontend PEs plus number of history collections + n_oserver_pes = n_frontend_pes + n_hist_collections + + # calculate the number of oserver nodes + n_oserver_nodes = math.ceil(n_oserver_pes / envdict["n_CPUs"]) + + # The number of backend PEs is the number of history collections divided by the number of oserver nodes + n_backend_pes = math.ceil(n_hist_collections / n_oserver_nodes) + + # multigroup requires at least two backend pes + if (n_backend_pes < 2): n_backend_pes = 2 + + # Calculate the total number of nodes to request from batch + self.nodes = n_model_nodes + n_oserver_nodes + + else: + self.nodes = math.ceil(model_npes / envdict["n_CPUs"]) + self.n_oserver_nodes = 0 + self.n_backend_pes = 0 + + def set_stuff(self): + self.set_nodes() + # Longer job names are now supported with SLURM and PBS. Limits seem to be 1024 characters with SLURM + # and 230 with PBS. To be safe, we will limit to 200 + self.run_n = f"{answerdict['experiment_id'].q_answer[:200]}_RUN" # RUN Job Name + self.run_fn = f"{answerdict['experiment_id'].q_answer[:200]}_FCST" # Forecast Job Name + self.post_n = f"{answerdict['experiment_id'].q_answer[:200]}_POST" # POST Job Name + self.plot_n = f"{answerdict['experiment_id'].q_answer[:200]}_PLT" # PLOT Job Name + self.move_n = f"{answerdict['experiment_id'].q_answer[:200]}_MOVE" # MOVE Job Name + self.archive_n = f"{answerdict['experiment_id'].q_answer[:200]}_ARCH" # ARCHIVE Job Name + self.regress_n = f"{answerdict['experiment_id'].q_answer[:200]}_RGRS" # REGRESS Job Name + + # Here we need to convert POST_NDS to total tasks. Using 16 cores + # per task as a good default + post_npes = self.atmos.post_NDS * 16 + NPCUS = (post_npes + envdict["n_CPUs"] - 1)/envdict["n_CPUs"] + + ''' + Definition for each variable in the following if-else block: + + batch_cmd - PBS Batch command + batch_group - PBS Syntax for GROUP + batch_time - PBS Syntax for walltime + batch_jobname - PBS Syntax for job name + batch_outputname - PBS Syntax for job output name + batch_joinouterr - PBS Syntax for joining output and error + run_ft - Wallclock Time for gcm_forecast.j + run_ft - Wallclock Time for gcm_run.j + post_t - Wallclock Time for gcm_post.j + plot_t - Wallclock Time for gcm_plot.j + archive_t - Wallclock Time for gcm_archive.j + run_q - Batch queue name for gcm_run.j + run_p - PE Configuration for gcm_run.j + run_fp - PE Configuration for gcm_forecast.j + regress_p - PE Configuration for gcm_regress.j + post_q - Batch queue name for gcm_post.j + plot_q - Batch queue name for gcm_plot.j + move_q - Batch queue name for gcm_moveplot.j + archive_q - Batch queue name for gcm_archive.j + post_p - PE Configuration for gcm_post.j + plot_p - PE Configuration for gcm_plot.j + archive_p - PE Configuration for gcm_archive.j + move_p - PE Configuration for gcm_moveplot.j + bcs_dir - Location of Boundary Conditions + replay_ana_expID - Default Analysis Experiment for REPLAY + replay_ana_location - Default Analysis Location for REPLAY + M2_replay_ana_location - Default Analysis Location for M2 REPLAY + sst_dir - Location of SST Boundary Conditions + chem_dir - Locations of Aerosol Chemistry BCs + work_dir - User work directory <----------------- change this later + gwdrs_dir - Location of GWD_RIDGE files + coupled_dir - Coupled Ocean/Atmos Forcing + ''' + + if envdict['site'] == "NAS": + self.batch_cmd = "qsub" + self.batch_group = "PBS -W group_list=" + self.batch_time = "PBS -l walltime=" + self.batch_jobname = "PBS -N" + self.batch_outputname = "PBS -o " + self.batch_joinouterr = "PBS -j oe -k oed" + self.run_ft = "6:00:00" + self.run_t = "8:00:00" + self.post_t = "8:00:00" + self.plot_t = "8:00:00" + self.archive_t = "8:00:00" + self.run_q = f"PBS -q normal" + self.run_p = f"PBS -l select={self.nodes}:ncpus={envdict['n_CPUs']}:mpiprocs={envdict['n_CPUs']}:model={answerdict['processor'].q_answer}" + self.run_fp = f"PBS -l select=24:ncpus={envdict['n_CPUs']}:mpiprocs={envdict['n_CPUs']}:model={answerdict['processor'].q_answer}" + self.regress_p = f"PBS -l select={self.nodes * 2}:ncpus={envdict['n_CPUSs'] // 2}:mpiprocs={envdict['n_CPUs'] // 2}:model={answerdict['processor'].q_answer}" + self.post_q = "PBS -q normal" + self.plot_q = "PBS -q normal" + self.move_q = "PBS -q normal" + self.archive_q = "PBS -q normal" + self.post_p = f"PBS -l select={NPCUS}:ncpus={envdict['n_CPUs']}:mpiprocs={envdict['n_CPUs']}:model={answerdict['processor'].q_answer}" + self.plot_p = f"PBS -l select=1:ncpus={envdict['n_CPUs']}:mpiprocs=1:model={answerdict['processor'].q_answer}" + self.archive_p = f"PBS -l select=1:ncpus={envdict['n_CPUs']}:mpiprocs={envdict['n_CPUs']}:model={answerdict['processor'].q_answer}" + self.move_p = "PBS -l select=1:ncpus=1" + self.boundary_path = "/nobackup/gmao_SIteam/ModelData" + self.bc_base = f"{self.boundary_path}/bcs_shared/fvInput/ExtData/esm/tiles" + self.bcs_dir = f"{self.boundary_path}/bcs/{self.land.bcs}/{self.land.bcs}_{self.ocean.tag}" + self.replay_ana_expID = "ONLY_MERRA2_SUPPORTED" + self.replay_ana_location = "ONLY_MERRA2_SUPPORTED" + self.M2_replay_ana_location = f"{self.boundary_path}/merra2/data" + + # defines location of SST Boundary Conditions + oceanres = f"{self.ocean.IM}x{self.ocean.JM}" + if oceanres == "1440x720": + self.sst_dir = f"{self.boundary_path}/fvInput/g5gcm/bcs/SST/{oceanres}" + else: + self.sst_dir = f"{self.boundary_path}/fvInput/g5gcm/bcs/realtime/{self.ocean.sst_name}/{oceanres}" + if self.ocean.gridtyp == "LL": + self.sst_dir = "/nobackupp2/estrobac/geos5/SSTDIR" + + self.chem_dir = f"{self.boundary_path}/fvInput_nc3" + self.work_dir = f"/nobackup/{os.environ.get('LOGNAME')}" + self.gwdrs_dir = f"{self.boundary_path}/GWD_RIDGE" + + # Coupled Ocean/Atmos Forcing + if self.ocean.model == "MIT": + self.coupled_dir = "/nobackupp2/estrobac/geos5/GRIDDIR" + else: + self.coupled_dir = f"{self.boundary_path}/aogcm" + + + elif envdict['site'] == "NCCS": + self.batch_cmd = "sbatch" + self.batch_group = "SBATCH --account=" + self.batch_time = "SBATCH --time=" + self.batch_jobname = "SBATCH --job-name=" + self.batch_outputname = "SBATCH --output=" + self.batch_joinouterr = "DELETE" + self.run_ft = "06:00:00" + self.run_t = "12:00:00" + self.post_t = "8:00:00" + self.plot_t = "12:00:00" + self.archive_t = "2:00:00" + self.run_q = f"SBATCH --constraint={answerdict['processor'].q_answer}" + self.run_p = f"SBATCH --nodes={self.nodes} --ntasks-per-node={envdict['n_CPUs']}" + self.run_fp = f"SBATCH --nodes={self.nodes} --ntasks-per-node={envdict['n_CPUs']}" + self.regress_p = f"SBATCH --nodes={self.nodes * 2} --ntasks-per-node={envdict['n_CPUs'] // 2}" + self.post_q = f"SBATCH --constraint={answerdict['processor'].q_answer}" + self.plot_q = f"SBATCH --constraint={answerdict['processor'].q_answer}" + self.move_q = "SBATCH --partition=datamove" + self.archive_q = "SBATCH --partition=datamove" + self.post_p = f"SBATCH --nodes={NPCUS} --ntasks-per-node={envdict['n_CPUs']}" + self.plot_p = f"SBATCH --nodes=4 --ntasks=4" + self.archive_p = "SBATCH --ntasks=1" + self.move_p = "SBATCH --ntasks=1" + self.boundary_path = "/discover/nobackup/projects/gmao" + self.bc_base = f"{self.boundary_path}/bcs_shared/fvInput/ExtData/esm/tiles" + self.bcs_dir = f"{self.bc_base}/{self.land.bcs}" + self.replay_ana_expID = "x0039" + self.replay_ana_location = f"{self.boundary_path}/g6dev/ltakacs/x0039" + self.M2_replay_ana_location = f"{self.boundary_path}/merra2/data" + + + # define location of SST Boundary Conditions + oceanres = f"{self.ocean.IM}x{self.ocean.JM}" + if oceanres == "1440x720": + self.sst_dir = f"{os.environ.get('SHARE')}/gmao_ops/fvInput/g5gcm/bcs/SST/{oceanres}" + else: + self.sst_dir = f"{os.environ.get('SHARE')}/gmao_ops/fvInput/g5gcm/bcs/realtime/{self.ocean.sst_name}/{oceanres}" + if self.ocean.gridtyp == "LL": + self.sst_dir = "/discover/nobackup/estrobac/geos5/SSTDIR" + + self.chem_dir = f"{os.environ.get('SHARE')}/gmao_ops/fvInput_nc3" + self.work_dir = f"/discover/nobackup/{os.environ.get('LOGNAME')}" + self.gwdrs_dir = f"{self.boundary_path}/osse2/stage/BCS_FILES/GWD_RIDGE" + + # Coupled Ocean/Atmos Forcing + if self.ocean.model == "MIT": + self.coupled_dir = "/gpfsm/dnb32/estrobac/geos5/GRIDDIR" + else: + self.coupled_dir = f"{self.boundary_path}/bcs_shared/make_bcs_inputs/ocean" + + + elif envdict['site'] == "AWS" or envdict['site'] == "Azure": + self.batch_cmd = "sbatch" + self.batch_group = "#DELETE" + self.batch_time = "SBATCH --time=" + self.batch_jobname = "SBATCH --job-name=" + self.batch_outputname = "SBATCH --output=" + self.batch_joinouterr = "DELETE" + self.run_ft = "06:00:00" + self.run_t = "12:00:00" + self.post_t = "8:00:00" + self.plot_t = "12:00:00" + self.archive_t = "1:00:00" + self.run_q = f"SBATCH --constraint={answerdict['processor'].q_answer}" + self.run_p = f"SBATCH --nodes={self.nodes} --ntasks-per-node={envdict['n_CPUs']}" + self.run_fp = f"SBATCH --nodes={self.nodes} --ntasks-per-node={envdict['n_CPUs']}" + self.regress_p = f"SBATCH --nodes={self.nodes * 2} --ntasks-per-node={envdict['n_CPUs'] // 2}" + self.post_q = "NULL" + self.plot_q = "NULL" + self.move_q = "NULL" + self.archive_q = "NULL" + self.post_p = f"SBATCH --ntasks={post_npes}" + self.plot_p = f"SBATCH --nodes=4 --ntasks=4" + self.archive_p = "SBATCH --ntasks=1" + self.move_p = "SBATCH --ntasks=1" + self.boundary_path = "/ford1/share/gmao_SIteam/ModelData" + self.bc_base = f"{self.boundary_path}/bcs_shared/fvInput/ExtData/esm/tiles" + self.bcs_dir = f"{self.boundary_path}/bcs/{self.land.bcs}_{self.ocean.tag}" + self.replay_ana_expID = "REPLAY_UNSUPPORTED" + self.replay_ana_location = "REPLAY_UNSUPPORTED" + self.M2_replay_ana_location = "REPLAY_UNSUPPORTED" + self.sst_dir = f"{self.boundary_path}/{self.ocean.sst_name}/{self.ocean.IM}x{self.ocean.JM}" + self.chem_dir = f"{self.boundary_path}/fvInput_nc3" + self.work_dir = os.environ.get('HOME') + self.gwdrs_dir = f"{self.boundary_path}/GWD_RIDGE" + self.coupled_dir = f"{self.boundary_path}/aogcm" + + else: + # These are defaults for the desktop + self.batch_cmd = "sbatch" + self.batch_group = "SBATCH --account=" + self.batch_time = "SBATCH --time=" + self.batch_jobname = "SBATCH --job-name=" + self.batch_outputname = "SBATCH --output=" + self.batch_joinouterr = "DELETE" + self.run_ft = "06:00:00" + self.run_t = "12:00:00" + self.post_t = "8:00:00" + self.plot_t = "12:00:00" + self.archive_t = "1:00:00" + self.run_q = "NULL" + self.run_p = "NULL" + self.run_fp = "NULL" + self.regress_p = "NULL" + self.post_q = "NULL" + self.plot_q = "NULL" + self.move_q = "NULL" + self.archive_q = "NULL" + self.post_p = "NULL" + self.plot_p = "NULL" + self.archive_p = "NULL" + self.move_p = "NULL" + self.boundary_path = "/ford1/share/gmao_SIteam/ModelData" + self.bc_base = f"{self.boundary_path}/bcs_shared/fvInput/ExtData/esm/tiles" + self.bcs_dir = f"{self.boundary_path}/bcs/{self.land.bcs} /{self.land.bcs}_{self.ocean.tag}" + self.replay_ana_expID = "REPLAY_UNSUPPORTED" + self.replay_ana_location = "REPLAY_UNSUPPORTED" + self.M2_replay_ana_location = "REPLAY_UNSUPPORTED" + self.sst_dir = f"{self.boundary_path}/{self.ocean.sst_name}/{self.ocean.IM}x{self.ocean.JM}" + self.chem_dir = f"{self.boundary_path}/fvInput_nc3" + self.work_dir = os.environ.get('HOME') + self.gwdrs_dir = f"{self.boundary_path}/GWD_RIDGE" + self.coupled_dir = f"{self.boundary_path}/aogcm" + + if envdict['site'] == 'GMAO.desktop': + # By default on desktop, just ignore IOSERVER for now + self.atmos.NX = 1 + self.atmos.NY = 6 + answerdict["io_server"].q_answer = False + self.n_oserver_nodes = 0 + self.n_backend_pes = 0 + + + + # mainly used to create .{*}root files and/or populate them + def create_dotfile(self, path, content): + try: + path = Path(path) + path.parent.mkdir(parents=True, exist_ok=True) + path.touch() + with open(path, 'w') as file: + file.write(os.path.dirname(content)) + except Exception as e: + print(f"An error occurred while creating directory: {str(e)}") + exit(1) + + + ####################################################################### + # Copy Model Executable and RC Files to Experiment Directory + ####################################################################### + def RC_setup(self): + + # Make the experiment directory and the RC directory inside of it + RC_dir = os.path.join(self.exp_dir, 'RC') + + # Delete the directory if it exists already + if os.path.exists(RC_dir): + shutil.rmtree(RC_dir) + + # Copy over all files and subdirs in install/etc, keeping symlinks, and ignoring *.tmpl files + shutil.copytree(pathdict['etc'], RC_dir, symlinks=True, ignore=shutil.ignore_patterns('*.tmpl', 'fvcore.layout.rc')) + + # Copy or symlink GEOSgcm.x (((IGNORE SINGULARITY/NATIVE BUILDS FOR NOW!!))) + geosgcmx_path = os.path.join(pathdict['bin'], 'GEOSgcm.x') + if linkx == True: + os.symlink(geosgcmx_path, os.path.join(self.exp_dir, 'GEOSgcm.x')) + else: + shutil.copy(geosgcmx_path, self.exp_dir) + + + ####################################################################### + # Set Recommended MPI Stack Settings + ####################################################################### + def mpistacksettings(self): + + # load mpi config from YAML + with open('../yaml/mpi_config.yaml') as file: + mpidict = yaml.load(file, Loader=yaml.FullLoader) + + # retrieve config from correlating mpi setting being used + self.mpi_config = mpidict.get(envdict['mpi']) + + # restart by oserver if using openmpi or mvapich + if envdict['mpi'] == 'openmpi' or envdict['mpi'] == 'mvapich': + self.restart_by_oserver = 'YES' + + # NAS recommends several_tries for MPT job issues + # https://www.nas.nasa.gov/hecc/support/kb/mpt-startup-failures-workarounds_526.html + if envdict['mpi'] == 'mpt': + self.several_tries = '/u/scicon/tools/bin/several_tries' + # Testing at NAS shows that coupled runs *require* MPI_SHEPHERD=true + # to run. We believe this is due to LD_PRELOAD. For now we only set + # this for coupled runs. + if self.ocean.running_ocean == True: + self.ocean.mpt_shepherd = "setenv MPI_SHEPHERD true" + + if envdict['site'] == 'NCCS': + self.mpi_config += f"\n{mpidict.get('NCCS')}" + + # Check for gwd_internal for Ridge Scheme + # For ICA and NL3 the gwd files are in a non-bcs location + # and may or may not exist. If they don't we set NCAR_NRDG to 0 + self.NCAR_NRDG = 16 + if self.land.gwd_in_bcs == False and \ + not os.path.exists(f"{self.gwdrs_dir}/gwd_internal_c{self.atmos.im}"): + self.NCAR_NRDG = 0 + + + + ####################################################################### + # Create directories and copy files over + ####################################################################### + # A little helper function for copying files and displaying the info to the user + def copy_helper(self, src, destination, filename): + if os.path.exists(src): + shutil.copy(src, destination) + print(f"Creating {color.RED}{filename}{color.RESET} for Experiment: {answerdict['experiment_id'].q_answer}") + + def copy_files_into_exp(self): + print("\n\n\n") + + for file in self.file_list: + self.copy_helper(f"{pathdict['install']}/bin/{file}", f"{self.exp_dir}/{file}", file) + self.copy_helper(f"{pathdict['install']}/etc/{file}", f"{self.exp_dir}/{file}", file) + + self.copy_helper(f"{pathdict['install']}/post/plot.rc", f"{self.exp_dir}/plot.rc", "plot.rc") + self.copy_helper(f"{pathdict['install']}/post/post.rc", f"{self.exp_dir}/post.rc", "post.rc") + + # These files will be added if user chose to run coupled, regardless of ocean model selected. + if self.ocean.running_ocean == True and self.ocean.model != 'MIT': + self.copy_helper(f"{pathdict['install']}/coupled_diagnostics/g5lib/plotocn.j", f"{self.exp_dir}/plotocn.j", "plotocn.j") + self.copy_helper(f"{pathdict['install']}/coupled_diagnostics/g5lib/confocn.py", f"{self.exp_dir}/__init__.py", "confocn.py") + self.file_list.extend(['input.nml', 'diag_table','plotocn.j', '__init__.py']) + + if self.ocean.model == 'MOM5': + self.file_list.append('field_table') + self.copy_helper(f"{pathdict['etc']}/MOM5/geos5/{self.ocean.IM}x{self.ocean.JM}/INPUT/input.nml", f"{self.exp_dir}/input.nml", "input.nml") + MOM5_path = os.path.join(pathdict['etc'], 'MOM5', 'geos5', f"{self.ocean.IM}x{self.ocean.JM}", 'INPUT', '*table') + files = glob.glob(MOM5_path) + for file in files: + file_name = os.path.basename(file) + self.copy_helper(file, f"{self.exp_dir}/{file_name}", file_name) + elif self.ocean.model == 'MOM6': + self.file_list.extend(['MOM_input', 'MOM_override', 'data_table']) + + self.copy_helper(f"{pathdict['etc']}/MOM6/mom6_app/{self.ocean.IM}x{self.ocean.JM}/MOM_input", f"{self.exp_dir}/MOM_input", "MOM_input") + self.copy_helper(f"{pathdict['etc']}/MOM6/mom6_app/{self.ocean.IM}x{self.ocean.JM}/MOM_override", f"{self.exp_dir}/MOM_override", "MOM_override") + self.copy_helper(f"{pathdict['etc']}/MOM6/mom6_app/{self.ocean.IM}x{self.ocean.JM}/input.nml", f"{self.exp_dir}/input.nml", "input.nml") + MOM6_path = os.path.join(pathdict['etc'], 'MOM6', 'mom6_app', f"{self.ocean.IM}x{self.ocean.JM}", '*table') + files = glob.glob(MOM6_path) + for file in files: + file_name = os.path.basename(file) + self.copy_helper(file, f"{self.exp_dir}/{file_name}", file_name) + + if self.ocean.seaice_model == 'CICE6': + self.copy_helper(f"{pathdict['etc']}/CICE6/cice6_app/{self.ocean.IM}x{self.ocean.JM}/ice_in", f"{self.exp_dir}/ice_in", "ice_in") + self.file_list.append('ice_in') + + print(f"{color.GREEN}Done!{color.RESET}\n") + + + ####################################################################### + # Produce Final script and .rc files + ####################################################################### + + # THIS WHOLE SECTION IS WILDLY OUT OF DATE, HOWEVER I KEPT IT AS IT WAS + # IN THE ORIGINAL SCRIPT FOR NOW + def restarts(self): + # comment or un-comment restarts based on exp configuration + # --------------------------------------------------------- + rsnames = {'H2O': False, + 'MAM': False, + 'CARMA': False, + 'GMICHEM': False, + 'STRATCHEM': False} + rstypes = ['INTERNAL','IMPORT'] + + with open(f"{answerdict['exp_dir'].q_answer}/AGCM.rc.tmpl", 'r') as file: + file_content = file.read() + + # Template in a "#" if restart is set to false + for rst in rsnames: + for typ in rstypes: + rst_string = f"{rst}_{typ}" + comment = "" if rsnames[rst] else "#" + file_content = file_content.replace(rst_string, f"{comment}{rst_string}") + + with open(f"{answerdict['exp_dir'].q_answer}/AGCM.rc.tmpl", 'w') as file: + file.write(file_content) + + ####################################################################### + # Modify RC Directory for LM and GOCART.data/GOCART Options + ####################################################################### + def mod_RC_dir_for_pchem(self): + if self.atmos.lm == 72: + return + + rc_dir = f"{answerdict['exp_dir'].q_answer}/RC" + + # if atmospheric vertical resolution != 72, we loop through every + # file in the RC dir and modify the atmos.lm values + for file_name in os.listdir(rc_dir): + file_path = os.path.join(rc_dir, file_name) + + # ignore the subdirectories in RC/ + if not os.path.isfile(file_path): + continue + + with open(file_path, 'r') as file: + file_content = file.read() + + file_content = file_content.replace("/L72/", f"/L{self.atmos.lm}/") + file_content = file_content.replace("z72", f"z{self.atmos.lm}") + file_content = file_content.replace("_72_", f"_{self.atmos.lm}_") + + with open(file_path, 'w') as file: + file.write(file_content) + + # configure pchem and TR in GEOS_ChemGridComp.rc + def config_chemGridComp(self): + if self.gocart.rats_provider == 'PCHEM': + pchem = 'TRUE' + else: + pchem = 'FALSE' + + chemgridcomp = f"{answerdict['exp_dir'].q_answer}/RC/GEOS_ChemGridComp.rc" + with open(chemgridcomp, 'r') as file: + file_content = file.read() + + # we always enable TR and gocart + file_content = re.sub(r'(ENABLE_PCHEM:\s*\.).*(\.)', r'\1'+pchem+r'\2', file_content) + file_content = re.sub(r'(ENABLE_TR:\s*\.).*(\.)', r'\1TRUE\2', file_content) + file_content = re.sub(r'(ENABLE_GOCART_DATA:\s*\.).*(\.)', r'\1FALSE\2', file_content) + + with open(chemgridcomp, 'w') as file: + file.write(file_content) + + # update LAND_PARAMS choices + def config_surfaceGridComp(self): + surfacegridcomp = f"{answerdict['exp_dir'].q_answer}/RC/GEOS_SurfaceGridComp.rc" + with open(surfacegridcomp, 'r') as file: + file_content = file.read() + + file_content = re.sub(r'# GEOSagcm=>', r' ', file_content) + if self.land.model == 'CatchmentCN-CLM4.0': + file_content = re.sub(r'(LAND_PARAMS:\s*).*', r'\1CN_CLM40', file_content) + + if self.land.bcs == 'ICA': + file_content = re.sub(r'(LAND_PARAMS:\s*).*', r'\1Icarus', file_content) + file_content = re.sub(r'(Z0_FORMULATION:\s*).*', r'\1 2', file_content) + + with open(surfacegridcomp, 'w') as file: + file.write(file_content) + + # enable DATA_DRIVEN gocart2G + def config_gocartGridComp(self): + gocartgridcomp = f"{answerdict['exp_dir'].q_answer}/RC/GOCART2G_GridComp.rc" + with open(gocartgridcomp, 'r') as file: + file_content = file.read() + + if self.gocart.data_driven == True: + file_content = re.sub(r'(ACTIVE_INSTANCES_DU:\s*)DU', r'\1DU.data', file_content) + file_content = re.sub(r'(ACTIVE_INSTANCES_SS:\s*)SS', r'\1SS.data', file_content) + file_content = re.sub(r'(ACTIVE_INSTANCES_SU:\s*)SU', r'\1SU.data', file_content) + file_content = re.sub(r'(ACTIVE_INSTANCES_NI:\s*)NI', r'\1NI.data', file_content) + file_content = re.sub(r'(ACTIVE_INSTANCES_CA:\s*)CA.oc', r'\1CA.oc.data', file_content) + file_content = re.sub(r'(ACTIVE_INSTANCES_CA:\s*)CA.bc', r'\1CA.bc.data', file_content) + file_content = re.sub(r'(ACTIVE_INSTANCES_CA:\s*)CA.br', r'\1CA.br.data', file_content) + + with open(gocartgridcomp, 'w') as file: + file.write(file_content) + + + # Modify MOM input files to match HEARTBEAT + def config_heartbeat(self): + # With MOM5 we need to change dt lines in input.nml to + # use $OCEAN_DT instead. NOTE: This regex assumes integer followed by comma + if self.ocean.model == 'MOM5': + + with open(f"{answerdict['exp_dir'].q_answer}/input.nml", 'r') as file: + file_content = file.read() + + file_content = re.sub(r'dt_cpld\s*=\s*.*(,)', rf"dt_cpld = {self.atmos.dt_ocean}\1", file_content) + file_content = re.sub(r'dt_atmos\s*=\s*.*(,)', rf"dt_atmos = {self.atmos.dt_ocean}\1", file_content) + + with open(f"{answerdict['exp_dir'].q_answer}/input.nml", 'w') as file: + file.write(file_content) + + # We also need to change the dt in ice_in as well for CICE6 + if self.ocean.seaice_model == 'CICE6': + file_path = f"{answerdict['exp_dir'].q_answer}/icein" + with open(file_path, 'r') as file: + content = file.read() + + file_content = re.sub(r"^(\s*dt\s*=\s*)[0-9]+(\.[0-9]+)?", r"\1" + self.atmos.dt_ocean, content) + + with open(file_path, 'w') as file: + file.write(file_content) + + + # We also must change the MOM_override file to + # have consistent DTs with the AGCM. So we use OCEAN_DT + # and change MOM_override to match. NOTE: This assumes + # floating point number with a decimal + if self.ocean.model == 'MOM6': + with open(f"{answerdict['exp_dir'].q_answer}/MOM_override", 'r') as file: + file_content = file.read() + + file_content = re.sub(r'DT\s*=\s*.*', rf"DT = {self.atmos.dt_ocean}", file_content) + file_content = re.sub(r'DT_THERM\s*=\s*.*', rf"DT_THERM = {self.atmos.dt_ocean}", file_content) + + with open(f"{answerdict['exp_dir'].q_answer}/MOM_override", 'w') as file: + file.write(file_content) + + + ####################################################################### + # Copy over Source Tarfile + ####################################################################### + def copy_src_tarfile(self): + bool_install_tarfile = '@CFG_INSTALL_SOURCE_TARFILE@' + tarfile_name = '@CMAKE_PROJECT_NAME@.tar.gz' + + if bool_install_tarfile != 'TRUE': + return + + src_dir = f"{self.exp_dir}/src" + tarfile_path = f"{pathdict['install']}/src/{tarfile_name}" + + # remove and recreate src directory + if src_dir.exists(): + shutil.rmtree(src_dir) + src_dir.mkdir(parents=True) + print(f"Copying build source code into {color.GREEN}{src_dir}{color.RESET}") + + if os.path.exists(tarfile_path): + shutil.copy(tarfile_path, src_dir) + else: + print(f"{tarfile_path} not found, yet CMake was asked to make and install a tarfile") + print("Something went wrong.") + + + # We create a RESTART dir if running ocean + def make_RESTART_dir(self): + if self.ocean.running_ocean == True: + os.makedirs(f"{self.exp_dir}/RESTART", exist_ok=True) + + + # Templating helper function -- Removes lines marked with "#DELETE" + def cleanup(self, file_path): + with open(file_path, 'r') as file: + content = file.read() + + filtered_content = re.sub(r'(?m)^\s*#+DELETE\w*.*\n?', '', content) + + with open(file_path, 'w') as file: + file.write(filtered_content) + + + def template(self): + # this dictionary holds template values for the default jinja2 delimiter "{{ val }}" + jinja_dict = { + 'SETENVS': self.mpi_config, + 'GCMVER': self.gcm_version, + 'EXPSRC': self.gcm_version, + 'EXPID': answerdict['experiment_id'].q_answer, + 'RUN_N': self.run_n, + 'RUN_FN': self.run_fn, + 'RUN_FT': self.run_ft, + 'RUN_T': self.run_t, + 'RUN_P': self.run_p, + 'RUN_FP': self.run_fp, + 'REGRESS_P': self.regress_p, + 'RUN_Q': self.run_q, + 'POST_N': self.post_n, + 'POST_T': self.post_t, + 'POST_P': self.post_p, + 'POST_Q': self.post_q, + 'MOVE_N': self.move_n, + 'PLOT_N': self.plot_n, + 'PLOT_T': self.plot_t, + 'PLOT_P': self.plot_p, + 'PLOT_Q': self.plot_q, + 'MOVE_Q': self.move_q, + 'MOVE_P': self.move_p, + 'ARCHIVE_N': self.archive_n, + 'ARCHIVE_T': self.archive_t, + 'ARCHIVE_P': self.archive_p, + 'ARCHIVE_Q': self.archive_q, + 'REGRESS_N': self.regress_n, + 'BCSDIR': self.bcs_dir, + 'SSTDIR': self.sst_dir, + 'SSTNAME': self.ocean.sst_name, + 'OCEANOUT': self.ocean.out, + 'LSMBCS': self.land.bcs, + 'EMIP_BCS_IN': self.land.emip_bcs_in, + 'EMIP_MERRA2': self.land.emip_MERRA2, + 'BCSTAG': self.ocean.tag, + 'SSTFILE': self.ocean.sst_file, + 'ICEFILE': self.ocean.ice_file, + 'KPARFILE': self.ocean.kpar_file, + 'CHMDIR': self.chem_dir, + 'COUPLEDIR': self.coupled_dir, + 'GWDRSDIR': self.gwdrs_dir, + 'NCAR_NRDG': self.NCAR_NRDG, + 'EXPDIR': self.exp_dir, + 'EXPDSC': answerdict['experiment_description'].q_answer, + 'HOMDIR': self.exp_dir, + 'BATCH_GROUP': self.batch_group+answerdict['group_root'].q_answer, + 'BATCH_TIME': self.batch_time, + 'BATCH_CMD': self.batch_cmd, + 'BATCH_JOBNAME': self.batch_jobname, + 'BATCH_OUTPUTNAME': self.batch_outputname, + 'BATCH_JOINOUTERR': self.batch_joinouterr, + 'SITE': envdict['site'], + 'GEOSDIR': pathdict['install'], + 'GEOSSRC': pathdict['install'], + 'GEOSBIN': pathdict['bin'], + 'GEOSETC': pathdict['etc'], + 'GEOSUTIL': pathdict['install'], + 'SINGULARITY_BUILD': '#DELETE', + 'NATIVE_BUILD': '', + 'MPT_SHEPHERD': self.ocean.mpt_shepherd, + 'SINGULARITY_SANDBOX': '', + 'REAL_BIND_PATH': '', + 'BASE_BIND_PATH': '', + 'BC_BASE': self.bc_base, + 'BOUNDARY_DIR': self.boundary_path, + 'CHECKPOINT_TYPE': 'default', + 'OGCM_NX': self.ocean.NX, + 'OGCM_NY': self.ocean.NY, + 'OGCM_NPROCS': self.ocean.nprocs, + 'OBSERVER_FRQ': 0, + 'DASTUNING': '#', + 'COUPLED': self.ocean.coupled, + 'CLDMICRO': self.atmos.microphysics, + 'MOM5': self.ocean.MOM5, + 'MOM6': self.ocean.MOM6, + 'OCNMODEL': self.ocean.model, + 'CICE4': self.ocean.CICE4, + 'CICE6': self.ocean.CICE6, + 'HIST_CICE4': self.ocean.hist_CICE4, + 'MIT': self.ocean.MIT, + 'DATAOCEAN': self.ocean.data, + 'OPS_SPECIES': self.gocart.ops_species, + 'CMIP_SPECIES': self.gocart.cmip_species, + 'MERRA2OX_SPECIES': self.gocart.MERRA2OX_species, + 'HIST_GOCART': self.gocart.gocart_hist, + 'LSM_PARMS': self.land.parameters, + 'OCEAN_NAME': self.ocean.name, + 'OCEAN_PRELOAD': self.ocean.preload, + 'ana4replay.eta.%y4%m2%d2_%h2z.nc4': '/discover/nobackup/projects/gmao/merra2/data/ana/MERRA2_all/Y%y4/M%m2/MERRA2.ana.eta.%y4%m2%d2_%h2z.nc4?g', + 'REPLAY_ANA_EXPID': self.replay_ana_expID, + 'REPLAY_ANA_LOCATION': self.replay_ana_location, + 'M2_REPLAY_ANA_LOCATION': self.M2_replay_ana_location, + 'OX_RELAXTIME': self.gocart.ox_relaxtime, + 'PCHEM_CLIM_YEARS': self.gocart.pchem_clim_years, + 'RATS_PROVIDER': self.gocart.rats_provider, + 'AERO_PROVIDER': self.gocart.aero_provider, + 'OANA_PROVIDER': 'PCHEM', + 'EMISSIONS': self.gocart.emissions, + 'CH4_PROVIDER': self.gocart.ch4_provider, + 'CO2_PROVIDER': self.gocart.c02_provider, + 'DYCORE': 'FV3', + 'AGCM_GRIDNAME': self.atmos.gridname, + 'OGCM_GRIDNAME': self.ocean.gridname, + 'OGCM_IS_FCST': '0', + 'BOOT': 'YES', + 'BCSRES': self.bcs_res, + 'OCEANtag': self.ocean.res, + 'ATMOStag': self.atmos.res, + 'RES_DATELINE': self.atmos.res_dateline, + 'TILEDATA': self.tile_data, + 'TILEBIN': self.tile_bin, + 'DT': self.atmos.dt, + 'CONV_DT': self.atmos.conv_dt, + 'CHEM_DT': self.atmos.chem_dt, + 'SOLAR_DT': self.atmos.dt_solar, + 'IRRAD_DT': self.atmos.dt_irrad, + 'OCEAN_DT': self.atmos.dt_ocean, + 'NX': self.atmos.nx, + 'NY': self.atmos.ny, + 'USE_SHMEM': int(self.atmos.use_SHMEM), + 'USE_IOSERVER': int(answerdict['io_server'].q_answer), + 'NUM_OSERVER_NODES': self.n_oserver_nodes, + 'NUM_BACKEND_PES': self.n_backend_pes, + 'RESTART_BY_OSERVER': self.restart_by_oserver, + 'NCPUS_PER_NODE': envdict['n_CPUs'], + 'NUM_READERS': self.atmos.num_readers, + 'NUM_WRITERS': self.atmos.num_writers, + 'LATLON_AGCM': self.atmos.latlon, + 'LATLON_OGCM': self.ocean.latlon, + 'CUBE_AGCM': self.atmos.cube, + 'CUBE_OGCM': self.ocean.cube, + 'GRID_TYPE': 'Cubed-Sphere', + 'AGCM_NF': self.atmos.nf, + 'AGCM_IM': self.atmos.im, + 'AGCM_JM': self.atmos.jm, + 'AGCM_LM': self.atmos.lm, + 'OGCM_IM': self.ocean.IM, + 'OGCM_JM': self.ocean.JM, + 'OGCM_LM': self.ocean.LM, + 'OGCM_NF': self.ocean.NF, + 'OGCM_GRID_TYPE': self.ocean.grid_type, + 'BEG_DATE': self.begin_date, + 'END_DATE': self.end_date, + 'JOB_SGMT': self.job_sgmt, + 'NUM_SGMT': self.atmos.num_sgmt, + 'CONUS': self.atmos.conus, + 'CONVPAR_OPTION': self.atmos.convpar_option, + 'STRETCH_FACTOR': self.atmos.stretch_factor, + 'INTERPOLATE_SST': self.interpolate_sst, + 'HIST_IM': self.atmos.hist_im, + 'HIST_JM': self.atmos.hist_jm, + 'CLIM_IM': self.atmos.CLIM_IM, + 'CLIM_JM': self.atmos.CLIM_JM, + 'ISCCP_SATSIM': 1, + 'MODIS_SATSIM': 0, + 'RADAR_SATSIM': 0, + 'LIDAR_SATSIM': 0, + 'MISR_SATSIM': 0, + 'SATSIM': 0, + 'USE_SKIN_LAYER': 1, + 'ANALYZE_TS': 0, + 'LSM_CHOICE': self.land.model, + 'MP_TURN_OFF_WSUB_EXTDATA': self.atmos.mp_turn_off_wsub_extdata, + 'BACM_1M_': self.atmos.BACM_1M, + 'GFDL_1M_': self.atmos.GFDL_1M, + 'MGB2_2M_': self.atmos.MGB2_2M, + 'PRELOAD_COMMAND': envdict['preload_command'], + 'LD_LIBRARY_PATH_CMD': envdict['ld_library_path_command'], + 'RUN_CMD': envdict['run_command'], + 'MODELATM': self.ocean.modelatm, + 'USE_DATA_ATM4OCN': self.ocean.use_data_ATM4OCN, + 'FV_SCHMIDT': self.atmos.schmidt, + 'FV_STRETCH_FAC': self.atmos.FV_stretch_fac, + 'FV_TARGET_LON': self.atmos.target_lon, + 'FV_TARGET_LAT': self.atmos.target_lat, + 'FORCEDAS': self.atmos.force_das, + 'FORCEGCM': self.atmos.force_gcm, + 'FVCUBED': '', + 'HIST_CATCHCN': self.land.HIST_catchment, + 'GCMRUN_CATCHCN': self.land.GCMRUN_catchment, + 'EMIP_OLDLAND': self.land.emip_oldland, + 'EMIP_NEWLAND': self.land.emip_newland, + '_4DIAUDAS': '#DELETE', + 'SEVERAL_TRIES': self.several_tries, + 'REGULAR_REPLAY': '#', + 'REGULAR_REPLAY_GMAO': '#', + 'REGULAR_REPLAY_NCEP': '#DELETE', + 'REGULAR_REPLAY_ECMWF': '#DELETE' + } + + # this is an edge-case that can't be handled with jinja2 + for file in self.file_list: + with open(f"{self.exp_dir}/{file}", 'r') as tmpl: + file_content = tmpl.read() + + file_content = re.sub(r'[ \t]*RECORD_', r'#RECORD_', file_content) + + with open(f"{self.exp_dir}/{file}", 'w') as tmpl: + tmpl.write(file_content) + + # this block handles the default case for jinja templating + default_env = Environment( + loader=FileSystemLoader(self.exp_dir) + ) + for file in self.file_list: + template = default_env.get_template(file) + content = template.render(jinja_dict) + with open(f"{self.exp_dir}/{file}", 'w') as tmpl: + tmpl.write(content) + + # remove #DELETE lines + for file in self.file_list: + file_path = f"{self.exp_dir}/{file}" + self.cleanup(file_path) + + + # organize files into sub directories and update file permissions + def organize_exp_dir(self): + exp_dir = answerdict['exp_dir'].q_answer + + # make sub dirs + sub_dirs = ['archive', 'forecasts', 'plot', 'post' , 'regress'] + for i in sub_dirs: + os.makedirs(os.path.join(exp_dir, i), exist_ok=True) + self.copy_src_tarfile() + self.make_RESTART_dir() + + # archive dir + shutil.move(f"{exp_dir}/gcm_archive.j", f"{exp_dir}/archive/gcm_archive.j") + + # forecasts dir + shutil.move(f"{exp_dir}/gcm_forecast.setup", f"{exp_dir}/forecasts/gcm_forecast.setup") + shutil.move(f"{exp_dir}/gcm_forecast.tmpl", f"{exp_dir}/forecasts/gcm_forecast.tmpl") + + # plot dir + shutil.move(f"{exp_dir}/gcm_moveplot.j", f"{exp_dir}/plot/gcm_moveplot.j") + shutil.move(f"{exp_dir}/gcm_plot.tmpl", f"{exp_dir}/plot/gcm_plot.tmpl") + shutil.move(f"{exp_dir}/gcm_quickplot.csh", f"{exp_dir}/plot/gcm_quickplot.csh") + shutil.move(f"{exp_dir}/plot.rc", f"{exp_dir}/plot/plot.rc") + try: #only if using MOM ocean + shutil.move(f"{exp_dir}/plotocn.j", f"{exp_dir}/plot/plotocn.j") + except FileNotFoundError: + pass + + # post dir + shutil.move(f"{exp_dir}/gcm_post.j", f"{exp_dir}/post/gcm_post.j") + shutil.move(f"{exp_dir}/post.rc", f"{exp_dir}/post/post.rc") + + # regress dir + shutil.move(f"{exp_dir}/gcm_regress.j", f"{exp_dir}/regress/gcm_regress.j") + + # rename tmpl files + os.rename(f"{exp_dir}/CAP.rc.tmpl", f"{exp_dir}/CAP.rc") + os.rename(f"{exp_dir}/AGCM.rc.tmpl", f"{exp_dir}/AGCM.rc") + os.rename(f"{exp_dir}/{self.ocean.history_template}", f"{exp_dir}/HISTORY.rc") + os.rename(f"{exp_dir}/linkbcs.tmpl", f"{exp_dir}/linkbcs") + + # update file permissions + os.chmod(f"{exp_dir}/CAP.rc", 0o755) + os.chmod(f"{exp_dir}/fvcore_layout.rc", 0o755) + os.chmod(f"{exp_dir}/archive/gcm_archive.j", 0o755) + os.chmod(f"{exp_dir}/linkbcs", 0o755) + os.chmod(f"{exp_dir}/logging.yaml", 0o755) + os.chmod(f"{exp_dir}/forecasts/gcm_forecast.tmpl", 0o644) + os.chmod(f"{exp_dir}/plot/gcm_plot.tmpl", 0o644) + + +my_exp = setup() +my_exp.config_models() +#my_exp.print_all_vars() +my_exp.set_some_stuff() +my_exp.set_nodes() +my_exp.set_stuff() +my_exp.create_dotfile(f"{os.environ.get('HOME')}/.EXPDIRroot", answerdict['exp_dir'].q_answer) +my_exp.create_dotfile(f"{os.environ.get('HOME')}/.GROUProot", answerdict['group_root'].q_answer) +my_exp.RC_setup() +my_exp.mpistacksettings() +my_exp.copy_files_into_exp() +my_exp.restarts() +my_exp.mod_RC_dir_for_pchem() +my_exp.config_chemGridComp() +my_exp.config_surfaceGridComp() +my_exp.config_gocartGridComp() +my_exp.config_heartbeat() +my_exp.template() +my_exp.organize_exp_dir() diff --git a/gcmpy/scripts/generate_question.py b/gcmpy/scripts/generate_question.py new file mode 100755 index 00000000..7d34913e --- /dev/null +++ b/gcmpy/scripts/generate_question.py @@ -0,0 +1,59 @@ +import os +import questionary +from questionary import Validator, ValidationError + +''' +This class will generate questionary questions based on a set of +parameters specified in a YAML file. It is designed to be as modular +as possible, so keep it that way! (Handle specific cases in +process_questions) +''' +class generateQuestion: + def __init__(self, q_name, q_type, q_prompt, q_choices, q_default, q_follows_up): + self.q_name = q_name + self.q_type = q_type + self.q_prompt = q_prompt + self.q_choices = q_choices + self.q_default = q_default + self.q_follows_up = q_follows_up + self.q_answer = None + + + # Check if a question "follows_up" another and its conditions are met + # to determine whether it should be asked or not + def should_ask(self, answerdict): + if self.q_follows_up: + for prev_question, accepted_answers in self.q_follows_up: + if answerdict[prev_question].q_answer in accepted_answers or ('any' in accepted_answers and answerdict[prev_question].q_answer != None) or ('was_not_asked' in accepted_answers): + return True + return False + return True + + + # loads the questionary api based on yaml configurations + def load_question(self, question): + + # check if the yaml entry should be skipped + if not self.should_ask(question): + return + + # if should_ask() returns true, call correct questionary API + elif self.q_type == 'text': + answer = questionary.text(self.q_prompt, default=self.q_default, validate=qValidator.val_text).ask() + elif self.q_type == 'confirm': + answer = questionary.confirm(self.q_prompt, default=self.q_default).ask() + elif self.q_type == 'select': + answer = questionary.select(self.q_prompt, choices=self.q_choices).ask() + elif self.q_type == 'path': + answer = questionary.path(self.q_prompt, default=self.q_default).ask() + + self.q_answer = answer + +# input validation used for questionary library +class qValidator(): + def val_text(input): + if len(str(input)) == 0 or input.isspace(): + return "please answer the question!" + else: + return True + diff --git a/gcmpy/scripts/gocart.py b/gcmpy/scripts/gocart.py new file mode 100755 index 00000000..46133be6 --- /dev/null +++ b/gcmpy/scripts/gocart.py @@ -0,0 +1,58 @@ +from env import answerdict +from utility import color + +class gocart: + def __init__(self): + # Gocart questions are skipped if data atmosphere is turned on. Use defaults + if answerdict['OM_data_atmos'].q_answer == True: + self.aerosol = 'Actual' + self.emissions = 'OPS_EMISSIONS' + else: + self.aerosol = answerdict["gocart_aerosols"].q_answer + self.emissions = f"{answerdict['gocart_emission'].q_answer}_EMISSIONS" + self.data_driven = None + self.ops_species = '#' + self.cmip_species = '#' + self.MERRA2OX_species = '#' + self.pchem_clim_years = '' + self.ox_relaxtime = None + self.gocart = '' + self.gocart_hist = None + self.aero_provider = 'GOCART2G' + self.rats_provider = 'PCHEM' + + # Additional RATS settings for specific GHGs + self.ch4_provider = 'none' + self.c02_provider = 'none' + + # for debugging purposes + def print_vars(self): + all_vars = vars(self) + for var_name, var_value in all_vars.items(): + print(f"{color.BLUE}{var_name}: {var_value}{color.RESET}") + + def set_gocart(self): + if self.aerosol == 'Actual': + self.data_driven = False + self.gocart = '' + self.gocart_hist = '' + elif self.aerosol == 'Climatological': + self.data_driven = True + self.gocart = '#' + self.gocart_hist = '#DELETE' + + def set_emissions(self): + if self.emissions.split('_')[0] == 'OPS': + self.ops_species = '' + self.pchem_clim_years = 1 + self.ox_relaxtime = '0.00' + elif self.emissions.split('_')[0] == 'AMIP': + self.MERRA2OX_species = '' + self.pchem_clim_years = 39 + self.ox_relaxtime = '259200.' + + + def config(self): + self.set_gocart() + self.set_emissions() + diff --git a/gcmpy/scripts/land.py b/gcmpy/scripts/land.py new file mode 100755 index 00000000..dbcd0a5f --- /dev/null +++ b/gcmpy/scripts/land.py @@ -0,0 +1,71 @@ +from env import answerdict +from utility import color + +class land: + def __init__(self): + # If data atmosphere is enabled, land questions are skipped. Use default values. + if answerdict['OM_data_atmos'].q_answer == True: + self.model = "Catchment" + self.bcs = "NL3" + else: + self.model = answerdict["LS_model"].q_answer + self.bcs = answerdict["LS_boundary_conditions"].q_answer + self.parameters = '' + self.emip_bcs_in = '' + self.emip_oldland = '' + self.emip_newland = '' + self.emip_MERRA2 = '' + self.HIST_catchment = '' + self.GCMRUN_catchment = '' + + # for debugging purposes + def print_vars(self): + all_vars = vars(self) + for var_name, var_value in all_vars.items(): + print(f"{color.CYAN}{var_name}: {var_value}{color.RESET}") + + def set_bcs(self): + if self.bcs == "ICA": + self.parameters = "#DELETE" + self.emip_bcs_in = "GM4" + self.emip_oldland = "" + self.emip_newland = "#DELETE" + self.emip_MERRA2 = "MERRA2" + self.gwd_in_bcs = False + elif self.bcs == "NL3": + self.parameters = "" + self.emip_bcs_in = "NL3" + self.emip_oldland = "#DELETE" + self.emip_newland = "" + self.emip_MERRA2 = "MERRA2_NewLand" + self.gwd_in_bcs = False + elif self.bcs == "v12": + self.parameters = "" + self.emip_bcs_in = "NL3" + self.emip_oldland = "#DELETE" + self.emip_newland = "" + self.emip_MERRA2 = "MERRA2_NewLand" + self.gwd_in_bcs = True + + + def set_catchment(self): + if self.model == "Catchment": + self.model = 1 + self.HIST_catchment = "#DELETE" + self.GCMRUN_catchment = "#DELETE" + elif self.model == "CatchmentCN-CLM4.0": + self.model = 2 + self.HIST_catchment = "" + self.GCMRUN_catchment = "" + + def config(self): + self.set_bcs() + self.set_catchment() + + + + + + + + diff --git a/gcmpy/scripts/ocean.py b/gcmpy/scripts/ocean.py new file mode 100644 index 00000000..5bfe9371 --- /dev/null +++ b/gcmpy/scripts/ocean.py @@ -0,0 +1,263 @@ +from env import answerdict +from utility import color +from datetime import date + +class ocean: + def __init__(ocean): + ocean.running_ocean = answerdict['OM_coupled'].q_answer + ocean.model = answerdict['OM_name'].q_answer + ocean.seaice_model = answerdict['OM_seaice_model'].q_answer + ocean.history_template = answerdict['history_template'].q_answer + ocean.LM = answerdict['OM_vertical_res'].q_answer + ocean.data_atmos = answerdict['OM_data_atmos'].q_answer + ocean.name = '' + ocean.preload = '' + ocean.seaice_name = '' + ocean.seaice_preload = '' + ocean.gridtyp = '' + ocean.mpt_shepherd = '' + + + def config(ocean): + if ocean.running_ocean == True: + ocean.set_coupled() + ocean.set_seaice() + ocean.set_preload() + ocean.set_data_atmosphere() + else: + ocean.set_uncoupled() + ocean.set_data_atmosphere() + + + def set_coupled(ocean): + # NOTE: We use a CMake variable here because the shared library + # suffix is different on Linux and macOS. This is set by configure_file() + if ocean.model == 'MOM5': + ocean.name = 'MOM' + ocean.gridtyp = 'M5TP' + ocean.grid_type = 'Tripolar' + ocean.preload = 'env @PRELOAD_COMMAND=$GEOSDIR/lib/libmom@CMAKE_SHARED_LIBRARY_SUFFIX@' + ocean.MOM5 = '' + ocean.MOM6 = '#DELETE' + ocean.MIT = '#DELETE' + MOM5_warning = ( + "######################################################\n" + "You have chosen to set up a coupled model experiment with MOM5.\n" + "Be aware that such a set up is _known_ to have problems. See following for more details:\n" + "https://github.com/GEOS-ESM/MOM5/issues/19\n" + "If your intent is to help _fix_ above issue, your help is much appreciated. Thank you and good luck!\n" + "Otherwise, until this above issue is _fixed_ you are on your own with above choice.\n" + "######################################################" + ) + print(color.GREEN + MOM5_warning + color.RESET) + ocean.NX = 36 + ocean.NY = 10 + resolution = answerdict['OM_MOM_horizontal_res'].q_answer.split() + ocean.IM = int(resolution[0]) + ocean.JM = int(resolution[1]) + elif ocean.model == 'MOM6': + ocean.name = 'MOM6' + ocean.gridtyp = 'M6TP' + ocean.grid_type = 'Tripolar' + ocean.preload = 'env @PRELOAD_COMMAND=$GEOSDIR/lib/libmom6@CMAKE_SHARED_LIBRARY_SUFFIX@' + ocean.MOM5 = '#DELETE' + ocean.MOM6 = '' + ocean.MIT = '#DELETE' + ocean.set_MOM6_resolution() + elif ocean.model == 'MIT': + ocean.name = 'MIT' + ocean.grid_type = 'llc' + ocean.gridtyp = 'MITLLC' + ocean.MOM5 = '#DELETE' + ocean.MOM6 = '#DELETE' + ocean.MIT = '' + ocean.JM = 15 + ocean.IM = ocean.jm * 360 + ocean.NX = 360 + ocean.NY = 1 + #ocean.gridspec = 'mit.ascii' <-- dead code(?) + + ocean.coupled = '' + IMO = '%04d' % ocean.IM + JMO = '%04d' % ocean.JM + ocean.res = f"{ocean.gridtyp}{IMO}x{JMO}" + ocean.tag = 'Reynolds' + ocean.sst_name = '#DELETE' + ocean.sst_file = '#DELETE' + ocean.ice_file = '#DELETE' + ocean.kpar_file = f"SEAWIFS_KPAR_mon_clim.{ocean.IM}x{ocean.JM}" + ocean.ostia = '#DELETE' + ocean.out = '#DELETE' + ocean.latlon = '' + ocean.cube = '#DELETE' + ocean.data = '#DELETE' + ocean.NF = 1 + + ocean.nprocs = ocean.NX * ocean.NY # This might be bugged(!) + ocean.set_gridname() + + + def set_uncoupled(ocean): + #rename this to 'uncoupled_hres' + hr_code = answerdict['OM_horizontal_res'].q_answer + todays_date = date.today() + + if hr_code == 'o1': + ocean.IM = 360 + ocean.JM = 180 + ocean.grid_type = 'LatLon' + ocean.NF = 1 + ocean.tag = 'Reynolds' + ocean.sst_name = 'SST' + ocean.out = '360x180' + ocean.sst_file = f"dataoceanfile_MERRA_sst_1971-current.{ocean.IM}x{ocean.JM}.LE" + ocean.ice_file = f"dataoceanfile_MERRA_fraci_1971-current.{ocean.IM}x{ocean.JM}.LE" + ocean.kpar_file = f"SEAWIFS_KPAR_mon_clim.{ocean.IM}x{ocean.JM}" + ocean.gridtyp = 'DE' + ocean.latlon = '' + ocean.cube = '#DELETE' + ocean.ostia = '#DELETE' + ocean.data = '' + elif hr_code == 'o2': + ocean.IM = 1440 + ocean.JM = 720 + ocean.grid_type = 'LatLon' + ocean.NF = 1 + ocean.tag = 'MERRA-2' + ocean.sst_name = 'MERRA2' + ocean.out = '1440x720' + ocean.sst_file = f"dataoceanfile_MERRA2_SST.{ocean.IM}x{ocean.JM}.\\{todays_date.year}.data" + ocean.ice_file = f"dataoceanfile_MERRA2_ICE.{ocean.IM}x{ocean.JM}.\\{todays_date.year}.data" + ocean.kpar_file = f"SEAWIFS_KPAR_mon_clim.{ocean.IM}x{ocean.JM}" + ocean.gridtyp = 'DE' + ocean.latlon = '' + ocean.cube = '#DELETE' + ocean.ostia = '' + ocean.data = '' + elif hr_code == 'o3': + ocean.IM = 2880 + ocean.JM = 1440 + ocean.grid_type = 'LatLon' + ocean.NF = 1 + ocean.tag = 'Ostia' + ocean.sst_name = 'OSTIA_REYNOLDS' + ocean.out = '2880x1440' + ocean.sst_file = f"dataoceanfile_OSTIA_REYNOLDS_SST.{ocean.IM}x{ocean.JM}.\\{todays_date.year}.data" + ocean.ice_file = f"dataoceanfile_OSTIA_REYNOLDS_ICE.{ocean.IM}x{ocean.JM}.\\{todays_date.year}.data" + ocean.kpar_file = f"SEAWIFS_KPAR_mon_clim.{ocean.IM}x{ocean.JM}" + ocean.gridtyp = 'DE' + ocean.latlon = '' + ocean.cube = '#DELETE' + ocean.ostia = '' + ocean.data = '' + elif hr_code == 'CS': + # need to add input validation for this case + ocean.IM = int(answerdict['AM_horizontal_res'].q_answer[1:]) + ocean.JM = ocean.IM * 6 + ocean.grid_type = 'Cubed-Sphere' + ocean.NF = 6 + ocean.tag = 'Ostia' + ocean.sst_name = 'OSTIA_REYNOLDS' + ocean.out = 'CS' + ocean.sst_file = f"dataoceanfile_OSTIA_REYNOLDS_SST.{ocean.IM}x{ocean.JM}.\\{todays_date.year}.data" + ocean.ice_file = f"dataoceanfile_OSTIA_REYNOLDS_ICE.{ocean.IM}x{ocean.JM}.\\{todays_date.year}.data" + ocean.kpar_file = f"SEAWIFS_KPAR_mon_clim.{ocean.IM}x{ocean.JM}" + ocean.gridtyp = 'CF' + ocean.latlon = '#DELETE' + ocean.cube = '' + ocean.ostia = '' + ocean.data = '#DELETE' + + IMO = '%04d' % ocean.IM + JMO = '%04d' % ocean.JM + if hr_code == 'cs': + ocean.res = f"CF{IMO}x6C" + else: + ocean.res = f"DE{IMO}xPE{JMO}" + #ocean.data = #THIS IS WILL OVERWRITE THE BLOCK ABOVE + ocean.name = '' + ocean.preload = '' + ocean.LM = 34 + ocean.coupled = '#DELETE' + ocean.MOM5 = '#DELETE' + ocean.MOM6 = '#DELETE' + ocean.MIT = '#DELETE' + ocean.CICE4 = '#DELETE' + ocean.CICE6 = '#DELETE' + ocean.hist_CICE4 = '#DELETE' + ocean.model = f"Data Ocean ({hr_code})" + ocean.NX = '' + ocean.NY = '' + ocean.nprocs = '' + ocean.set_gridname() + + + + + def set_MOM6_resolution(ocean): + # For MOM6 we currently have only 3 allowed ocean resolutions based on the + # atmospheric resolution. The allowed are: + # + # Atm Res Atm NXxNY Atm IMxJM Ocean NXxNY Ocean IMxJM Ocean LM + # ------- --------- --------- ----------- ----------- -------- + # c12 1x6 12x72 3x2 72x36 50 + # c90 5x36 90x540 90x2 540x458 50 + # c180 30x36 180x1080 36x30 1440x1080 75 + # + # See https://github.com/GEOS-ESM/GEOSgcm/wiki/Coupled-model-configurations-(GEOS-MOM6) + + atmos_res = answerdict['AM_horizontal_res'].q_answer + + if atmos_res == 'c12': + ocean.NX = 3 + ocean.NY = 2 + ocean.IM = 72 + ocean.JM = 36 + ocean.LM = 50 + elif atmos_res == 'c90': + ocean.NX = 90 + ocean.NY = 2 + ocean.IM = 540 + ocean.JM = 458 + ocean.LM = 50 + elif atmos_res == 'c180': + ocean.NX = 36 + ocean.NY = 30 + ocean.IM = 1440 + ocean.JM = 1080 + ocean.LM = 75 + + def set_preload(ocean): + ocean.preload = f"{ocean.preload}:{ocean.seaice_preload}" + + + def set_seaice(ocean): + if ocean.seaice_model == 'CICE4': + ocean.seaice_preload = '$GEOSDIR/lib/libCICE4@CMAKE_SHARED_LIBRARY_SUFFIX@' + ocean.CICE4 = '' + ocean.CICE6 = '#DELETE' + ocean.hist_CICE4 = '' + elif ocean.seaice_model == 'CICE6': + ocean.seaice_preload = '$GEOSDIR/lib/libcice6@CMAKE_SHARED_LIBRARY_SUFFIX@' + ocean.CICE4 = '#DELETE' + ocean.CICE6 = '' + ocean.hist_CICE4 = '#DELETE' + + + def set_data_atmosphere(ocean): + if ocean.data_atmos == True: + ocean.modelatm = '#DELETE' + ocean.use_data_ATM4OCN = '.TRUE.' + else: + ocean.modelatm = '' + ocean.use_data_ATM4OCN = '.FALSE.' + + def set_gridname(ocean): + if ocean.gridtyp == 'CF': + ocean.gridname = f"OC{ocean.IM}x{ocean.JM}-{ocean.gridtyp}" + elif ocean.model == 'MIT': + ocean.gridname = f"{ocean.gridtyp}{ocean.IM}x{ocean.JM}-{ocean.gridtyp}" + else: + ocean.gridname = f"PE{ocean.IM}x{ocean.JM}-{ocean.gridtyp}" + + diff --git a/gcmpy/scripts/process_questions.py b/gcmpy/scripts/process_questions.py new file mode 100755 index 00000000..b7b5557d --- /dev/null +++ b/gcmpy/scripts/process_questions.py @@ -0,0 +1,264 @@ +import yaml, re, os, subprocess +from generate_question import generateQuestion +from utility import envdict, pathdict, color + +""" +This class handles special cases where a question"s properties need to be checked/dynamically +changed at runtime based on certain conditions (e.g. input validation) +""" +class handle: + + @staticmethod + def select_type(answerdict, i): + if answerdict[i].q_type == "select" and answerdict[i].q_answer != None: + # as of right now, we only want the first word of every select-type question. + # If that changes it's probably best to delete this function. + answerdict[i].q_answer = answerdict[i].q_answer.split(None, 1)[0] + + # Commenting this out for now until we know if we want to make sure + # the experiment description is different from the experiment ID. + ''' + @staticmethod + def experiment_desc(answerdict, i): + if i == "experiment_description" and answerdict[i].q_answer != None: + while answerdict["experiment_description"].q_answer == answerdict["experiment_id"].q_answer: + print(color.RED + "The experiment description must be different from the ID!") + answerdict[i].load_question(answerdict) + ''' + + @staticmethod + def io_server_defualt(answerdict, i): + if i != 'io_server': + return + match answerdict['AM_horizontal_res'].q_answer: + case 'c180' | 'c360' | 'c720' | 'c1120' | 'c1440' | 'c2880' | 'c5760' | 'c270' | 'c540' | 'c1080' | 'c1536' | 'c2160': + answerdict[i].q_default = True + case _: + answerdict[i].q_default = False + + + @staticmethod + def processor_choices(answerdict, i): + if i != "processor": + return + + if envdict["site"] == "NCCS": + answerdict[i].q_choices = ["mil", "cas"] + elif envdict["site"] == "NAS": + print(color.GREEN + "NOTE Due to how FV3 is compiled by default, Sandy Bridge\n" + \ + "and Ivy Bridge are not supported by current GEOS" + color.RESET) + + answerdict[i].q_choices = ["rom", "mil", "sky", "cas", "bro", "has"] + else: + exit(1) + + @staticmethod + def OM_horizontal_res_default(answerdict, i): + if i != 'OM_horizontal_res': + return + + # The default ocean resolution is based on the atmospheric resolution + match answerdict['AM_horizontal_res'].q_answer: + case 'c12' | 'c24' | 'c48': + answerdict[i].q_choices = ['o1 (1 -deg, 360x180 Reynolds)', \ + 'o2 (1/4-deg, 1440x720 MERRA-2)', \ + 'o3 (1/8-deg, 2880x1440 OSTIA)'] + case _: + answerdict[i].q_choices = ['CS (Cubed-Sphere OSTIA)', \ + 'o1 (1 -deg, 360x180 Reynolds)', \ + 'o2 (1/4-deg, 1440x720 MERRA-2)', \ + 'o3 (1/8-deg, 2880x1440 OSTIA)'] + + + @staticmethod + def MIT_hres_choices(answerdict, i): + if i != "OM_MIT_horizontal_res": + return + if answerdict["AM_horizontal_res"].q_answer == "c720": + answerdict[i].q_choices = ["llc1080 (1/12-deg, Lat-Lon-Cube)"] + elif answerdict["AM_horizontal_res"].q_answer == "c1440": + answerdict[i].q_choices = ["llc2160 (1/24-deg, Lat-Lon-Cube)"] + + @staticmethod + def MOM_hres_default(answerdict, i): + if i != "OM_MOM_horizontal_res": + return + if answerdict["OM_name"].q_answer == "MOM6" and answerdict["AM_horizontal_res"].q_answer == "c12": + answerdict[i].q_default = "72 36" + + @staticmethod + def seaice_choices(answerdict, i): + if i == 'OM_seaice_model' and answerdict['OM_name'] == 'MOM6': + answerdict[i].q_choices = ['CICE6'] + + + @staticmethod + def heartbeat_default(answerdict, i): + if i != "heartbeat": + return + ''' + Default heartbeat is determined by atmospheric resolution. + Of course, this just the recommended value. The user can + enter whatever value they like + ''' + heartbeat = "" + match answerdict["AM_horizontal_res"].q_answer: + case 'c12': + heartbeat = 3600 + case 'c24': + heartbeat = 1800 + case 'c48': + heartbeat = 1200 + case 'c90': + heartbeat = 900 + case 'c180' | 'c270': + heartbeat = 600 + case 'c360': + heartbeat = 450 + case 'c720' | 'c1120' | 'c540': + heartbeat = 300 + case 'c1440' | 'c1080': + heartbeat = 150 + case 'c2880' | 'c5760' | 'c1536' | 'c2160' | 'c4320': + heartbeat = 75 + + + # Per W. Putman recommendation, set heartbeat to 450s anytime BACM_1M is selected + if answerdict["AM_microphysics"].q_answer == "BACM_1M": + heartbeat = 450 + + # ((IMPORTANT: default must be type string due to some limitation in questionary)) + answerdict[i].q_default = str(heartbeat) + + + @staticmethod + def heartbeat_valid(answerdict, i): + if i != "heartbeat": + return + # input validation using regex + while not re.match(r"^\d+$", answerdict[i].q_answer): + print(f"{color.RED}please enter exactly 1 number!{color.RESET}") + answerdict[i].load_question(answerdict) + + @staticmethod + def history_template_default(answerdict, i): + if i != "history_template": + return + + if answerdict['OM_name'].q_answer == 'MOM5': + answerdict[i].q_default = 'HISTORY.AOGCM-MOM5.rc.tmpl' + elif answerdict['OM_name'].q_answer == "MOM6": + answerdict[i].q_default = 'HISTORY.AOGCM.rc.tmpl' + elif answerdict['OM_name'].q_answer == 'MIT': + answerdict[i].q_default = 'HISTORY.AOGCM_MITgcm.rc.tmpl' + elif answerdict['OM_data_atmos'].q_answer == True: + answerdict[i].q_default == 'HISTORY.DATAATM.rc.tmpl' + else: + answerdict[i].q_default = 'HISTORY.AGCM.rc.tmpl' + + @staticmethod + def exp_dir_default(answerdict, i): + if i != "exp_dir": + return + + root = f"{os.environ.get('HOME')}/.EXPDIRroot" + if os.path.exists(root): + try: + with open(root, "r") as file: + answerdict[i].q_default = f"{file.read().strip()}/{answerdict['experiment_id'].q_answer}" + except Exception as e: + print(f"An error occurred while reading {color.BLUE}.EXPDIRroot{color.RESET}: {str(e)}") + elif envdict['site'] in ['NAS','NCCS']: + answerdict[i].q_default = f"/{'discover/' if envdict['site'] == 'NCCS' else ''}nobackup/{os.environ.get('LOGNAME')}/{answerdict['experiment_id'].q_answer}" + else: + answerdict[i].q_default = f"{os.environ.get('HOME')}/{answerdict['experiment_id']}" + + + @staticmethod + def exp_dir_valid(answerdict, i): + if i != "home_dir" or i != "exp_dir": + return + while os.path.basename(answerdict[i].q_answer) != answerdict['experiment_id'].q_answer: + print(f"{color.RED}This directory MUST point to the experiment ID: {color.BLUE}{answerdict['experiment_id'].q_answer}{color.RED}!{color.RESET}") + answerdict[i].load_question(answerdict) + + + @staticmethod + def group_root_default(answerdict, i): + if i != "group_root": + return + groups_output = subprocess.check_output(["groups"], text=True) + group_root = groups_output.strip().split()[0] + answerdict[i].q_default = group_root + + + + + +# open yaml file and create dictionary from it's contents +def load_yamls(): + + # list of question files (*MAKE SURE THEY ARE IN THE ORDER YOU WANT THEM TO BE ASKED*) + file_list = ["../yaml/exp_setup.yaml", \ + "../yaml/atmospheric_model.yaml", \ + "../yaml/ocean_model.yaml", \ + "../yaml/land_model.yaml", \ + "../yaml/gocart.yaml", \ + "../yaml/directory_setup.yaml"] + all_yaml_questions = {} + + for filename in file_list: + try: + with open(filename, "r") as file: + yaml_questions = yaml.safe_load(file) + all_yaml_questions.update(yaml_questions) + except IOError: + print(f"{color.RED}YAML file '{filename}' could not be located. Exiting.") + exit(1) + + return all_yaml_questions + +# actual driver for questionary questions +def process(): + answerdict = {} + yaml_questions = load_yamls() + + # creates a dictionary of question:answer pairs + for i in yaml_questions: + temp = generateQuestion(i, yaml_questions[i]["type"], \ + yaml_questions[i]["prompt"], \ + yaml_questions[i]["choices"], \ + yaml_questions[i]["default_answer"],\ + yaml_questions[i]["follows_up"]) + + answerdict[i] = temp + + + # if the question properties need to dynamically change at + # runtime call handle function BEFORE load_question() + handle.io_server_defualt(answerdict, i) + handle.processor_choices(answerdict, i) + handle.OM_horizontal_res_default(answerdict, i) + handle.MIT_hres_choices(answerdict, i) + handle.MOM_hres_default(answerdict, i) + handle.seaice_choices(answerdict, i) + handle.heartbeat_default(answerdict, i) + handle.history_template_default(answerdict, i) + handle.exp_dir_default(answerdict, i) + handle.group_root_default(answerdict, i) + + # prompts the user with the question + answerdict[i].load_question(answerdict) + + # input validation and other post processing goes here, + # AFTER load_question() call + # handle.experiment_desc(answerdict, i) + # handle.OM_hres_valid(answerdict, i) + handle.heartbeat_valid(answerdict, i) + handle.exp_dir_valid(answerdict, i) + + # strips the first word from every select type question + handle.select_type(answerdict, i) + + return answerdict + diff --git a/gcmpy/scripts/utility.py b/gcmpy/scripts/utility.py new file mode 100755 index 00000000..64085b74 --- /dev/null +++ b/gcmpy/scripts/utility.py @@ -0,0 +1,67 @@ +import os, sys, platform + +# pretty font +class color: + PURPLE = '\033[95m' + CYAN = '\033[96m' + DARKCYAN = '\033[36m' + BLUE = '\033[94m' + GREEN = '\033[92m' + YELLOW = '\033[93m' + RED = '\033[91m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + END = '\033[0m' + RESET = '\033[0m' + + # accepts any string and styles it + def color_path(path): + return color.BLUE + color.BOLD + path + color.RESET + + def color_file(file): + return color.GREEN + color.BOLD + file + color.RESET + +# raises expections +class exceptions: + # Displays usage information to user + def print_usage(): + print(color.GREEN + pathdict['SCRIPTNAME'] + ", a setup script for the GEOS GCM\n\n" + \ + "\tUsage: " + pathdict['SCRIPTNAME'] + " [optional flag]\n\n" + \ + "\t --link Link GEOSgcm.x into experiment directory\n" + \ + "\t --singularity Set up Singularity experiment\n" + \ + "\t -h --help Show usage" + \ + "\n\nIf invoked alone, the script runs as normal." + \ + "\nFor more information, please contact Matt Thompson, Scott Rabenhorst, or Shayon Shakoorzadeh.\n") + exit(1) + + # Display misconfiguration messages to the user + def raise_user_exception(msg): + print(msg) + exit(1) + + def raise_fatal_exception(msg): + exceptions.raiseuserexception(msg) + exit(1) + + # This function will clean output files if script is interrupted + def cleanup(): + pass + + + +####################################################################### +# Directory and Environment Variable Locations Dictionaries +####################################################################### +# set up envirnoment dictionary for later +envdict = {} +pathdict = {} # Start empty - cannot reference self before initialization (<--what are you yapping about??) +pathdict['scripts'] = os.getcwd() +pathdict['gcmpy'] = os.path.dirname(pathdict['scripts']) +pathdict['yaml'] = os.path.join(pathdict['gcmpy'], 'yaml') +pathdict['bin'] = os.path.dirname(pathdict['gcmpy']) +pathdict['install'] = os.path.dirname(pathdict['bin']) +pathdict['etc'] = os.path.join(pathdict['install'], 'etc') +pathdict['GEOSgcm'] = os.path.dirname(pathdict['install']) +pathdict['build'] = os.path.join(pathdict['GEOSgcm'], 'build') +pathdict['GEOSgcm_App'] = os.path.join(pathdict['GEOSgcm'], 'src/Applications/@GEOSgcm_App') +pathdict['GEOS_Util'] = os.path.join(pathdict['GEOSgcm'], 'src/Shared/@GMAO_Shared/@GEOS_Util') diff --git a/gcmpy/yaml/CMakeLists.txt b/gcmpy/yaml/CMakeLists.txt new file mode 100644 index 00000000..78c46fc7 --- /dev/null +++ b/gcmpy/yaml/CMakeLists.txt @@ -0,0 +1,16 @@ +set (files + atmospheric_model.yaml + directory_setup.yaml + exp_setup.yaml + gocart.yaml + land_model.yaml + mpi_config.yaml + ocean_model.yaml + ) + +install ( + FILES ${files} + DESTINATION bin/gcmpy/yaml + ) + + diff --git a/gcmpy/yaml/atmospheric_model.yaml b/gcmpy/yaml/atmospheric_model.yaml new file mode 100755 index 00000000..2423b30a --- /dev/null +++ b/gcmpy/yaml/atmospheric_model.yaml @@ -0,0 +1,44 @@ +AM_horizontal_res: + type: 'select' + prompt: 'Select the atmospheric models HORIZONTAL resolution:' + choices: ['c12 -- 8 deg (750.0 km)', 'c24 -- 4 deg (375.0 km)', 'c48 -- 2 deg (187.5 km)', 'c90 -- 1 deg (100.0 km)', 'c180 -- 1/2 deg ( 50.0 km)', 'c360 -- 1/4 deg ( 25.0 km)', 'c720 -- 1/8 deg ( 12.5 km)', 'c1120 -- 1/12 deg ( 8.0 km)', 'c1440 - 1/16 deg ( 6.25 km)','c270 -- (16.0 -100 km)', 'c540 -- ( 8.0 - 50 km)', 'c1080 - ( 4.0 - 25 km)', 'c1536 - ( 2.0 - 20 km)', 'c2160 - ( 2.0 - 12 km)'] + default_answer: '' + follows_up: '' + answer: '' + +AM_vertical_res: + type: 'text' + prompt: 'Enter the atmospheric models VERTICAL resolution:' + choices: '' + default_answer: '181' + follows_up: '' + +AM_microphysics: + type: 'select' + prompt: 'Select the Atmospheric Model Microphysics:' + choices: ['GFDL_1M -- 6-phase 1-moment Geophysical Fluid Dynamics Laboratory', 'BACM_1M -- 3-phase 1-moment Bacmeister et al', 'MGB2_2M -- 5 or 6-phase 2-moment Morrison & Gettleman'] + default_answer: '' + follows_up: '' + +heartbeat: + type: 'text' + prompt: 'Enter a number (in seconds) for HEARTBEAT_DT (press ENTER for recommended value):' + choices: '' + default_answer: '' + follows_up: '' + +io_server: + type: 'confirm' + prompt: 'Would you like to IOSERVER?' + choices: '' + default_answer: '' + follows_up: '' + + +#combine these two questions and just change "choices:" based on site +processor: + type: 'select' + prompt: 'Enter the Processor Type you wish to run on:' + choices: '' + default_answer: '' + follows_up: '' diff --git a/gcmpy/yaml/directory_setup.yaml b/gcmpy/yaml/directory_setup.yaml new file mode 100755 index 00000000..68cd6f28 --- /dev/null +++ b/gcmpy/yaml/directory_setup.yaml @@ -0,0 +1,23 @@ +history_template: + type: 'text' + prompt: 'Enter the location of HISTORY template to use (press ENTER for recommended template):' + choices: '' + default_answer: '' + follows_up: '' + +exp_dir: + type: 'path' + prompt: 'Enter Desired Location for the EXPERIMENT Directory (to contain model output and restart files):' + choices: '' + default_answer: '' + follows_up: '' + +group_root: + type: 'text' + prompt: 'Enter your GROUP ID for Current EXP:' + choices: '' + default_answer: '' + follows_up: '' + + + diff --git a/gcmpy/yaml/exp_setup.yaml b/gcmpy/yaml/exp_setup.yaml new file mode 100755 index 00000000..a7d85a13 --- /dev/null +++ b/gcmpy/yaml/exp_setup.yaml @@ -0,0 +1,32 @@ +experiment_id: + type: 'text' + prompt: 'Enter the experiment ID:' + choices: '' + default_answer: '' + follows_up: '' + +experiment_description: + type: 'text' + prompt: 'Enter a 1-line Experiment Description:' + choices: '' + default_answer: '' + follows_up: '' + +clone_experiment: + type: 'confirm' + prompt: 'Would you like to CLONE an old experiment?' + choices: '' + default_answer: False + follows_up: '' + +clone_experiment_path: + type: 'path' + prompt: 'Enter the location of the experiment you wish to clone (where gcm_run.j is located):' + choices: '' + default_answer: '' + follows_up: + - ['clone_experiment', [True]] + + + + diff --git a/gcmpy/yaml/gocart.yaml b/gcmpy/yaml/gocart.yaml new file mode 100755 index 00000000..8c3e33c4 --- /dev/null +++ b/gcmpy/yaml/gocart.yaml @@ -0,0 +1,17 @@ +gocart_aerosols: + type: 'select' + prompt: 'Do you wish to run GOCART with Actual or Climatological Aersols?' + choices: ['Actual', 'Climatological'] + default_answer: '' + follows_up: + - ['OM_data_atmos', [False]] + - ['OM_data_atmos', ['was_not_asked']] + +gocart_emission: + type: 'select' + prompt: 'Select the GOCART Emission Files to use:' + choices: ['AMIP', 'OPS'] + default_answer: '' + follows_up: + - ['OM_data_atmos', [False]] + - ['OM_data_atmos', ['was_not_asked']] diff --git a/gcmpy/yaml/land_model.yaml b/gcmpy/yaml/land_model.yaml new file mode 100755 index 00000000..95f28d17 --- /dev/null +++ b/gcmpy/yaml/land_model.yaml @@ -0,0 +1,17 @@ +LS_boundary_conditions: + type: 'select' + prompt: 'Select the Land Surface Boundary Conditions:' + choices: ['v12', 'NL3', 'ICA'] + default_answer: '' + follows_up: + - ['OM_data_atmos', [False]] + - ['OM_data_atmos', ['was_not_asked']] + +LS_model: + type: 'select' + prompt: 'Select the Land Surface Model:' + choices: ['Catchment', 'CatchmentCN-CLM4.0 (CN_CLM40)'] + default_answer: '' + follows_up: + - ['OM_data_atmos', [False]] + - ['OM_data_atmos', ['was_not_asked']] diff --git a/gcmpy/yaml/mpi_config.yaml b/gcmpy/yaml/mpi_config.yaml new file mode 100755 index 00000000..f2aaed6a --- /dev/null +++ b/gcmpy/yaml/mpi_config.yaml @@ -0,0 +1,72 @@ +# Testing by Bill Putman determined some useful +# Open MPI parameters. Testing shows these work +# on both OSs at NCCS and on macOS +openmpi: | + # Turn off warning about TMPDIR on NFS + setenv OMPI_MCA_shmem_mmap_enable_nfs_warning 0 + # pre-connect MPI procs on mpi_init + setenv OMPI_MCA_mpi_preconnect_all 1 + setenv OMPI_MCA_coll_tuned_bcast_algorithm 7 + setenv OMPI_MCA_coll_tuned_scatter_algorithm 2 + setenv OMPI_MCA_coll_tuned_reduce_scatter_algorithm 3 + setenv OMPI_MCA_coll_tuned_allreduce_algorithm 3 + setenv OMPI_MCA_coll_tuned_allgather_algorithm 4 + setenv OMPI_MCA_coll_tuned_allgatherv_algorithm 3 + setenv OMPI_MCA_coll_tuned_gather_algorithm 1 + setenv OMPI_MCA_coll_tuned_barrier_algorithm 0 + # required for a tuned flag to be effective + setenv OMPI_MCA_coll_tuned_use_dynamic_rules 1 + # disable file locks + setenv OMPI_MCA_sharedfp "^lockedfile,individual" + +mvapich: | + setenv MV2_ENABLE_AFFINITY 0 + setenv SLURM_DISTRIBUTION block + setenv MV2_MPIRUN_TIMEOUT 100 + setenv MV2_GATHERV_SSEND_THRESHOLD 256 + +mpt: | + setenv MPI_COLL_REPRODUCIBLE + setenv SLURM_DISTRIBUTION block + + #setenv MPI_DISPLAY_SETTINGS 1 + #setenv MPI_VERBOSE 1 + + setenv MPI_MEMMAP_OFF + unsetenv MPI_NUM_MEMORY_REGIONS + setenv MPI_XPMEM_ENABLED yes + unsetenv SUPPRESS_XPMEM_TRIM_THRESH + + setenv MPI_LAUNCH_TIMEOUT 40 + + setenv MPI_COMM_MAX 1024 + setenv MPI_GROUP_MAX 1024 + setenv MPI_BUFS_PER_PROC 256 + + # For some reason, PMI_RANK is randomly set and interferes + # with binarytile.x and other executables. + unsetenv PMI_RANK + + # Often when debugging on MPT, the traceback from Intel Fortran + # is "absorbed" and only MPT's errors are displayed. To allow the + # compiler's traceback to be displayed, uncomment this environment + # variable + #setenv FOR_IGNORE_EXCEPTIONS false + +intelmpi: | + # This flag prints out the Intel MPI state. Uncomment if needed + #setenv I_MPI_DEBUG 9 + +# These are options determined to be useful at NCCS +# Not setting generally as they are more fabric/cluster +# specific compared to the above adjustments +# +NCCS: | + setenv I_MPI_ADJUST_ALLREDUCE 12 + setenv I_MPI_ADJUST_GATHERV 3 + + setenv I_MPI_FABRICS shm:ofi + setenv I_MPI_OFI_PROVIDER psm3 + + # This has been found to help with congestion + setenv FI_PSM3_CONN_TIMEOUT 120 diff --git a/gcmpy/yaml/ocean_model.yaml b/gcmpy/yaml/ocean_model.yaml new file mode 100755 index 00000000..aea5ecab --- /dev/null +++ b/gcmpy/yaml/ocean_model.yaml @@ -0,0 +1,82 @@ +# format - loads the questionary API +# +# question name: +# question type: 'text/confirm/select/path' +# question prompt: 'ask your question' +# choices: ['list', 'of', 'choices'] <----------(only for select type, otherwise leave blank) +# default answer: 'default' <----------(optional/can be left blank) +# follows_up: <----------(optional/can be left blank. If you want to +# -['prev question', ['answer1', 'answer2']] conditionally skip a question, add a list of +# -['or other prev question', ['any']] tuples containing the question(s) it will follow up +# and the answer the user has to give in order for +# this question to be asked. Multiple answers can be +# an ask condition, or you can set the answer to 'any' +# which will allow any answer given to show the question.) + +OM_coupled: + type: 'confirm' + prompt: 'Do you wish to run the COUPLED Ocean/Sea-Ice Model?' + choices: '' + default_answer: False + follows_up: '' + +# ------------------------------------- coupled == False -------------------------------------- +OM_horizontal_res: + type: 'select' + prompt: 'Select the Data_Ocean HORIZONTAL resolution:' + choices: ['o1 (1 -deg, 360x180 Reynolds)', 'o2 (1/4-deg, 1440x720 MERRA-2)', 'o3 (1/8-deg, 2880x1440 OSTIA)', 'CS (Cubed-Sphere OSTIA)'] + default_answer: '' + follows_up: + - ['OM_coupled', [False]] +# --------------------------------------------------------------------------------------------- + +# ------------------------------------- coupled == True --------------------------------------- +OM_name: + type: 'select' + prompt: 'Choose an Ocean Model:' + choices: ['MOM5', 'MOM6', 'MIT'] + default_answer: '' + follows_up: + - ['OM_coupled', [True]] + +OM_MOM_horizontal_res: + type: 'text' + prompt: 'Enter the Ocean Lat/Lon Horizontal Resolution (IM JM):' + choices: '' + default_answer: '360 200' + follows_up: + - ['OM_name', ['MOM5']] + +OM_MIT_horizontal_res: + type: 'select' + prompt: 'Select the Data_Ocean HORIZONTAL resolution:' + choices: ['llc90 (1-deg, Lat-Lon-Cube)', 'llc270 (1/3-deg, Lat-Lon-Cube)', 'cs32 (5-deg, cubed-sphere)'] + default_answer: '' + follows_up: + - ['OM_name', ['MIT']] + +OM_vertical_res: + type: 'text' + prompt: 'Enter the Ocean Model VERTICAL resolution (LM):' + choices: '' + default_answer: '50' + follows_up: + - ['OM_MOM_horizontal_res', ['any']] + - ['OM_MIT_horizontal_res', ['any']] + +OM_seaice_model: + type: 'select' + prompt: 'Choose a seaice model:' + choices: ['CICE6', 'CICE4'] + default_answer: '' + follows_up: + - ['OM_coupled', [True]] + +OM_data_atmos: + type: 'confirm' + prompt: 'Do you wish to run Data Atmosphere?' + choices: '' + default_answer: False + follows_up: + - ['OM_coupled', [True]] +# ---------------------------------------------------------------------------------------------- diff --git a/linkbcs.tmpl b/linkbcs.tmpl index 84653f75..355095a6 100644 --- a/linkbcs.tmpl +++ b/linkbcs.tmpl @@ -1,44 +1,43 @@ #!/bin/csh -f -setenv BCSDIR @BCSDIR -@DATAOCEANsetenv SSTDIR @SSTDIR -@COUPLEDsetenv CPLDIR @COUPLEDIR/@OCNMODEL -setenv CHMDIR @CHMDIR -setenv BCRSLV @ATMOStag_@OCEANtag +setenv BCSDIR {{ BCSDIR }} +{{ DATAOCEAN }}setenv SSTDIR {{ SSTDIR }} +{{ COUPLED }}setenv CPLDIR {{ COUPLEDIR }}/{{ OCNMODEL }} +setenv CHMDIR {{ CHMDIR }} +setenv BCRSLV {{ ATMOStag }}_{{ OCEANtag }} -@MOM5setenv SSTDIR @COUPLEDIR/SST/MERRA2/@OGCM_IMx@OGCM_JM/v1 -@MOM6setenv SSTDIR @COUPLEDIR/SST/MERRA2/@OGCM_IMx@OGCM_JM/v1 +{{ MOM5 }}setenv SSTDIR {{ COUPLEDIR }}/SST/MERRA2/{{ OGCM_IM }}x{{ OGCM_JM }}/v1 +{{ MOM6 }}setenv SSTDIR {{ COUPLEDIR }}/SST/MERRA2/{{ OGCM_IM }}x{{ OGCM_JM }}/v1 -@COUPLED /bin/mkdir -p RESTART +{{ COUPLED }} /bin/mkdir -p RESTART /bin/mkdir -p ExtData /bin/ln -sf $CHMDIR/* ExtData -@COUPLED/bin/ln -sf @COUPLEDIR/dataatm/* ExtData -@COUPLED/bin/ln -sf $CPLDIR/@OGCM_IMx@OGCM_JM/SEAWIFS_KPAR_mon_clim.@OGCM_IMx@OGCM_JM SEAWIFS_KPAR_mon_clim.data -@COUPLED/bin/ln -sf $BCSDIR/geometry/${BCRSLV}/${BCRSLV}-Pfafstetter.til tile.data -@COUPLED/bin/ln -sf $BCSDIR/geometry/${BCRSLV}/${BCRSLV}-Pfafstetter.TRN runoff.bin -@MOM5/bin/ln -sf $CPLDIR/@OGCM_IMx@OGCM_JM/MAPL_Tripolar.nc . -@MOM6/bin/ln -sf $CPLDIR/@OGCM_IMx@OGCM_JM/MAPL_Tripolar.nc . -@MIT/bin/ln -sf $BCSDIR/geometry/${BCRSLV}/mit.ascii -@MOM5/bin/ln -sf $CPLDIR/@OGCM_IMx@OGCM_JM/vgrid@OGCM_LM.ascii ./vgrid.ascii -@MOM6/bin/ln -sf $CPLDIR/@OGCM_IMx@OGCM_JM/vgrid@OGCM_LM.ascii ./vgrid.ascii -@MIT/bin/ln -sf $CPLDIR/DC0360xPC0181_LL5400x15-LL.bin DC0360xPC0181_LL5400x15-LL.bin +{{ COUPLED }}/bin/ln -sf $CPLDIR/{{ OGCM_IM }}x{{ OGCM_JM }}/SEAWIFS_KPAR_mon_clim.{{ OGCM_IM }}x{{ OGCM_JM }} SEAWIFS_KPAR_mon_clim.data +{{ COUPLED }}/bin/ln -sf $BCSDIR/geometry/${BCRSLV}/${BCRSLV}-Pfafstetter.til tile.data +{{ COUPLED }}/bin/ln -sf $BCSDIR/geometry/${BCRSLV}/${BCRSLV}-Pfafstetter.TRN runoff.bin +{{ MOM5 }}/bin/ln -sf $BCSDIR/geometry/${BCRSLV}/MAPL_Tripolar.nc . +{{ MOM6 }}/bin/ln -sf $BCSDIR/geometry/${BCRSLV}/MAPL_Tripolar.nc . +{{ MIT }}/bin/ln -sf $BCSDIR/geometry/${BCRSLV}/mit.ascii +{{ MOM5 }}/bin/ln -sf $CPLDIR/{{ OGCM_IM }}x{{ OGCM_JM }}/vgrid{{ OGCM_LM }}.ascii ./vgrid.ascii +{{ MOM6 }}/bin/ln -sf $CPLDIR/{{ OGCM_IM }}x{{ OGCM_JM }}/vgrid{{ OGCM_LM }}.ascii ./vgrid.ascii +{{ MIT }}/bin/ln -sf $CPLDIR/DC0360xPC0181_LL5400x15-LL.bin DC0360xPC0181_LL5400x15-LL.bin # Precip correction #/bin/ln -s /discover/nobackup/projects/gmao/share/gmao_ops/fvInput/merra_land/precip_CPCUexcludeAfrica-CMAP_corrected_MERRA/GEOSdas-2_1_4 ExtData/PCP -@DATAOCEAN/bin/ln -sf $BCSDIR/geometry/$BCRSLV/${BCRSLV}-Pfafstetter.til tile.data -@DATAOCEANif( -e $BCSDIR/geometry/$BCRSLV/${BCRSLV}-Pfafstetter.TIL) then -@DATAOCEAN/bin/ln -sf $BCSDIR/geometry/$BCRSLV/${BCRSLV}-Pfafstetter.TIL tile.bin -@DATAOCEANendif +{{ DATAOCEAN }}/bin/ln -sf $BCSDIR/geometry/$BCRSLV/${BCRSLV}-Pfafstetter.til tile.data +{{ DATAOCEAN }}if( -e $BCSDIR/geometry/$BCRSLV/${BCRSLV}-Pfafstetter.TIL) then +{{ DATAOCEAN }}/bin/ln -sf $BCSDIR/geometry/$BCRSLV/${BCRSLV}-Pfafstetter.TIL tile.bin +{{ DATAOCEAN }}endif # DAS or REPLAY Mode (AGCM.rc: pchem_clim_years = 1-Year Climatology) # -------------------------------------------------------------------- -@OPS_SPECIES/bin/ln -sf $BCSDIR/PCHEM/pchem.species.Clim_Prod_Loss.z_721x72.nc4 species.data +{{ OPS_SPECIES }}/bin/ln -sf $BCSDIR/PCHEM/pchem.species.Clim_Prod_Loss.z_721x72.nc4 species.data # CMIP-5 Ozone Data (AGCM.rc: pchem_clim_years = 228-Years) # ---------------------------------------------------------- -@CMIP_SPECIES/bin/ln -sf $BCSDIR/PCHEM/pchem.species.CMIP-5.1870-2097.z_91x72.nc4 species.data +{{ CMIP_SPECIES }}/bin/ln -sf $BCSDIR/PCHEM/pchem.species.CMIP-5.1870-2097.z_91x72.nc4 species.data # S2S pre-industrial with prod/loss of stratospheric water vapor # (AGCM.rc: pchem_clim_years = 3-Years, and H2O_ProdLoss: 1 ) @@ -47,43 +46,43 @@ setenv BCRSLV @ATMOStag_@OCEANtag # MERRA-2 Ozone Data (AGCM.rc: pchem_clim_years = 39-Years) # ---------------------------------------------------------- -@MERRA2OX_SPECIES/bin/ln -sf $BCSDIR/PCHEM/pchem.species.CMIP-5.MERRA2OX.197902-201706.z_91x72.nc4 species.data +{{ MERRA2OX_SPECIES }}/bin/ln -sf $BCSDIR/PCHEM/pchem.species.CMIP-5.MERRA2OX.197902-201706.z_91x72.nc4 species.data -/bin/ln -sf $BCSDIR/land/$BCRSLV/visdf_@AGCM_IMx@AGCM_JM.dat visdf.dat -/bin/ln -sf $BCSDIR/land/$BCRSLV/nirdf_@AGCM_IMx@AGCM_JM.dat nirdf.dat -/bin/ln -sf $BCSDIR/land/$BCRSLV/vegdyn_@AGCM_IMx@AGCM_JM.dat vegdyn.data -/bin/ln -sf $BCSDIR/land/$BCRSLV/lai_clim_@AGCM_IMx@AGCM_JM.data lai.data -/bin/ln -sf $BCSDIR/land/$BCRSLV/green_clim_@AGCM_IMx@AGCM_JM.data green.data -/bin/ln -sf $BCSDIR/land/$BCRSLV/ndvi_clim_@AGCM_IMx@AGCM_JM.data ndvi.data +/bin/ln -sf $BCSDIR/land/$BCRSLV/visdf_{{ AGCM_IM }}x{{ AGCM_JM }}.dat visdf.dat +/bin/ln -sf $BCSDIR/land/$BCRSLV/nirdf_{{ AGCM_IM }}x{{ AGCM_JM }}.dat nirdf.dat +/bin/ln -sf $BCSDIR/land/$BCRSLV/vegdyn_{{ AGCM_IM }}x{{ AGCM_JM }}.dat vegdyn.data +/bin/ln -sf $BCSDIR/land/$BCRSLV/lai_clim_{{ AGCM_IM }}x{{ AGCM_JM }}.data lai.data +/bin/ln -sf $BCSDIR/land/$BCRSLV/green_clim_{{ AGCM_IM }}x{{ AGCM_JM }}.data green.data +/bin/ln -sf $BCSDIR/land/$BCRSLV/ndvi_clim_{{ AGCM_IM }}x{{ AGCM_JM }}.data ndvi.data -@GCMRUN_CATCHCNif ( -f $BCSDIR/$BCRSLV/lnfm_clim_@AGCM_IMx@AGCM_JM.data ) /bin/ln -sf $BCSDIR/$BCRSLV/lnfm_clim_@AGCM_IMx@AGCM_JM.data lnfm.data -@GCMRUN_CATCHCN/bin/ln -s $BCSDIR/land/shared/CO2_MonthlyMean_DiurnalCycle.nc4 +{{ GCMRUN_CATCHCN }}if ( -f $BCSDIR/$BCRSLV/lnfm_clim_{{ AGCM_IM }}x{{ AGCM_JM }}.data ) /bin/ln -sf $BCSDIR/$BCRSLV/lnfm_clim_{{ AGCM_IM }}x{{ AGCM_JM }}.data lnfm.data +{{ GCMRUN_CATCHCN }}/bin/ln -s $BCSDIR/land/shared/CO2_MonthlyMean_DiurnalCycle.nc4 set MERRA2OX_SPECIES = "#" -/bin/ln -sf $BCSDIR/TOPO/TOPO_@ATMOStag/smoothed/topo_DYN_ave_@AGCM_IMx@AGCM_JM.data topo_dynave.data -/bin/ln -sf $BCSDIR/TOPO/TOPO_@ATMOStag/smoothed/topo_GWD_var_@AGCM_IMx@AGCM_JM.data topo_gwdvar.data -/bin/ln -sf $BCSDIR/TOPO/TOPO_@ATMOStag/smoothed/topo_TRB_var_@AGCM_IMx@AGCM_JM.data topo_trbvar.data +/bin/ln -sf $BCSDIR/TOPO/TOPO_{{ ATMOStag }}/smoothed/topo_DYN_ave_{{ AGCM_IM }}x{{ AGCM_JM }}.data topo_dynave.data +/bin/ln -sf $BCSDIR/TOPO/TOPO_{{ ATMOStag }}/smoothed/topo_GWD_var_{{ AGCM_IM }}x{{ AGCM_JM }}.data topo_gwdvar.data +/bin/ln -sf $BCSDIR/TOPO/TOPO_{{ ATMOStag }}/smoothed/topo_TRB_var_{{ AGCM_IM }}x{{ AGCM_JM }}.data topo_trbvar.data # Handle gwd_internal_rst -if ( -e $BCSDIR/TOPO/TOPO_@ATMOStag/smoothed/gwd_internal_rst ) then +if ( -e $BCSDIR/TOPO/TOPO_{{ ATMOStag }}/smoothed/gwd_internal_rst ) then echo "Found gwd_internal_rst in bcsdir. Copying to scratch directory" - /bin/cp -vf $BCSDIR/TOPO/TOPO_@ATMOStag/smoothed/gwd_internal_rst gwd_internal_rst -else if (-e @GWDRSDIR/gwd_internal_c@AGCM_IM) then - echo "Found gwd_internal_c@AGCM_IM. Copying to scratch directory" + /bin/cp -vf $BCSDIR/TOPO/TOPO_{{ ATMOStag }}/smoothed/gwd_internal_rst gwd_internal_rst +else if (-e {{ GWDRSDIR }}/gwd_internal_c{{ AGCM_IM }}) then + echo "Found gwd_internal_c{{ AGCM_IM }}. Copying to scratch directory" /bin/rm gwd_internal_rst - /bin/cp @GWDRSDIR/gwd_internal_c@AGCM_IM gwd_internal_rst + /bin/cp {{ GWDRSDIR }}/gwd_internal_c{{ AGCM_IM }} gwd_internal_rst endif -@COUPLEDcp $HOMDIR/*_table . -@COUPLEDcp $CPLDIR/@OGCM_IMx@OGCM_JM/INPUT/* INPUT -@CICE4/bin/ln -sf $CPLDIR/@OGCM_IMx@OGCM_JM/cice/kmt_cice.bin . -@CICE4/bin/ln -sf $CPLDIR/@OGCM_IMx@OGCM_JM/cice/grid_cice.bin . -@CICE6/bin/ln -sf $CPLDIR/@OGCM_IMx@OGCM_JM/cice6/cice6_grid.nc . -@CICE6/bin/ln -sf $CPLDIR/@OGCM_IMx@OGCM_JM/cice6/cice6_kmt.nc . -@CICE6/bin/ln -sf $CPLDIR/@OGCM_IMx@OGCM_JM/cice6/cice6_global.bathy.nc . +{{ COUPLED }}cp $HOMDIR/*_table . +{{ COUPLED }}cp $CPLDIR/{{ OGCM_IM }}x{{ OGCM_JM }}/INPUT/* INPUT +{{ CICE4 }}/bin/ln -sf $CPLDIR/{{ OGCM_IM }}x{{ OGCM_JM }}/cice/kmt_cice.bin . +{{ CICE4 }}/bin/ln -sf $CPLDIR/{{ OGCM_IM }}x{{ OGCM_JM }}/cice/grid_cice.bin . +{{ CICE6 }}/bin/ln -sf $CPLDIR/{{ OGCM_IM }}x{{ OGCM_JM }}/cice6/cice6_grid.nc . +{{ CICE6 }}/bin/ln -sf $CPLDIR/{{ OGCM_IM }}x{{ OGCM_JM }}/cice6/cice6_kmt.nc . +{{ CICE6 }}/bin/ln -sf $CPLDIR/{{ OGCM_IM }}x{{ OGCM_JM }}/cice6/cice6_global.bathy.nc . -@DATAOCEAN/bin/ln -sf $SSTDIR/@SSTFILE sst.data -@DATAOCEAN/bin/ln -sf $SSTDIR/@ICEFILE fraci.data -@DATAOCEAN/bin/ln -sf $SSTDIR/@KPARFILE SEAWIFS_KPAR_mon_clim.data +{{ DATAOCEAN }}/bin/ln -sf $SSTDIR/{{ SSTFILE }} sst.data +{{ DATAOCEAN }}/bin/ln -sf $SSTDIR/{{ ICEFILE }} fraci.data +{{ DATAOCEAN }}/bin/ln -sf $SSTDIR/{{ KPARFILE }} SEAWIFS_KPAR_mon_clim.data diff --git a/scm_run.j b/scm_run.j index 6a8ba010..39df1d49 100755 --- a/scm_run.j +++ b/scm_run.j @@ -1,24 +1,25 @@ #!/bin/tcsh -f -#@BATCH_TIME -#@BATCH_TASKS -#@BATCH_JOBNAME -#@BATCH_GROUP +#{{ BATCH_TIME }} +#{{ BATCH_TASKS }} +#{{ BATCH_JOBNAME }} +#{{ BATCH_GROUP }} umask 022 limit stacksize unlimited setenv ARCH `uname` -setenv SITE @SITE -setenv GEOSDIR @INSTALLDIR -setenv GEOSBIN @INSTALLDIR/bin -setenv GEOSETC @INSTALLDIR/etc -setenv GEOSUTIL @INSTALLDIR +setenv SITE {{ SITE }} +setenv GEOSDIR {{ INSTALLDIR }} +setenv GEOSBIN {{ INSTALLDIR }}/bin +setenv GEOSETC {{ INSTALLDIR }}/etc +setenv GEOSUTIL {{ INSTALLDIR }} source $GEOSBIN/g5_modules -setenv @LD_LIBRARY_PATH_CMD ${LD_LIBRARY_PATH}:${GEOSDIR}/lib -# We only add BASEDIR to the @LD_LIBRARY_PATH_CMD if BASEDIR is defined (i.e., not running with Spack) +setenv {{ LD_LIBRARY_PATH_CMD }} ${LD_LIBRARY_PATH}:${GEOSDIR}/lib +# We only add BASEDIR to the {{ LD_LIBRARY_PATH_CMD }} if BASEDIR is defined (i.e., not running with Spack) if ( $?BASEDIR ) then - setenv @LD_LIBRARY_PATH_CMD ${@LD_LIBRARY_PATH_CMD}:${BASEDIR}/${ARCH}/lib + setenv {{ LD_LIBRARY_PATH_CMD }} ${{'{'}}{{LD_LIBRARY_PATH_CMD}}{{'}'}}:${BASEDIR}/${ARCH}/lib + setenv PATH ${PATH}:${BASEDIR}/${ARCH}/bin endif setenv RUN_CMD "$GEOSBIN/esma_mpirun -np " @@ -26,7 +27,7 @@ setenv RUN_CMD "$GEOSBIN/esma_mpirun -np " setenv GCMVER `cat $GEOSETC/.AGCM_VERSION` echo VERSION: $GCMVER -setenv EXPDIR @EXPDIR +setenv EXPDIR {{ EXPDIR }} cd $EXPDIR diff --git a/scm_setup b/scm_setup index eb801075..4bb404d3 100755 --- a/scm_setup +++ b/scm_setup @@ -521,15 +521,15 @@ else fi cat > $expdir/sedfile << EOF -s?@EXPDIR?$expdir?g -s?@SITE?$SITE?g -s?@INSTALLDIR?$INSTALLDIR?g -s?@BATCH_TASKS?$BATCH_TASKS?g -s?@BATCH_TIME?$BATCH_TIME?g -s?@BATCH_GROUP?$BATCH_GROUP?g -s?@BATCH_JOBNAME?$BATCH_JOBNAME?g -s?@PRELOAD_COMMAND?$PRELOAD_COMMAND?g -s?@LD_LIBRARY_PATH_CMD?$LD_LIBRARY_PATH_CMD?g +s?{{ EXPDIR }}?$expdir?g +s?{{ SITE }}?$SITE?g +s?{{ INSTALLDIR }}?$INSTALLDIR?g +s?{{ BATCH_TASKS }}?$BATCH_TASKS?g +s?{{ BATCH_TIME }}?$BATCH_TIME?g +s?{{ BATCH_GROUP }}?$BATCH_GROUP?g +s?{{ BATCH_JOBNAME }}?$BATCH_JOBNAME?g +s?{{ PRELOAD_COMMAND }}?$PRELOAD_COMMAND?g +s?{{ LD_LIBRARY_PATH_CMD }}?$LD_LIBRARY_PATH_CMD?g EOF $ISED -f $expdir/sedfile $expdir/scm_run.j