Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch to data time cycling to support multiple models and multiple case studies or trials #765

Merged
merged 92 commits into from
Oct 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
b4c2e9d
Add multiple models to rose edit configuration
jfrost-mo Jul 29, 2024
03adedb
Add model name to rose edit conf
jfrost-mo Aug 9, 2024
0bc1c1a
Change how data is fetched to work on data time
jfrost-mo Aug 2, 2024
5cef3d2
Modify data fetching in workflow to fetch per model
jfrost-mo Aug 5, 2024
b76ea6f
Change recipe format to just use steps, and update infra for running …
jfrost-mo Aug 6, 2024
3d3ac43
Add cycling for trials
jfrost-mo Aug 9, 2024
ac584f5
Thread model name through to output
jfrost-mo Aug 9, 2024
9a5e1cc
Remove unneeded recipes
jfrost-mo Aug 20, 2024
2f88f13
Replace dots with p in task names, to support floats
jfrost-mo Aug 20, 2024
f8b4a08
Convert domain_mean_time_series include file
jfrost-mo Aug 20, 2024
d192622
Convert domain mean time series recipe
jfrost-mo Aug 20, 2024
9e820b6
Only pass WEB_DIR to tasks that need it
jfrost-mo Aug 20, 2024
528157e
Remove install_local_cset task from workflow
jfrost-mo Aug 20, 2024
9b50c42
Differentiate output directories for different case dates
jfrost-mo Aug 20, 2024
5089d69
Remove duplicated include file
jfrost-mo Aug 20, 2024
3e505e2
Convert more recipes and include files
jfrost-mo Aug 20, 2024
37a056e
Convert recipe and include file
jfrost-mo Aug 20, 2024
67c760a
Convert more recipes
jfrost-mo Aug 20, 2024
a513ad1
Split rose metadata into multiple files
jfrost-mo Aug 22, 2024
1f41b0f
Convert pressure-level recipes
jfrost-mo Aug 22, 2024
fe6e1d3
Squeeze scalar coords, and explain LFRic callbacks
jfrost-mo Aug 22, 2024
1ba222f
Convert more recipes and include files
jfrost-mo Aug 22, 2024
af985bd
Ajust metadata sort and remove unhelpful help
jfrost-mo Aug 22, 2024
e0852ce
Move model level plots under quicklook
jfrost-mo Aug 22, 2024
f454aea
Cast to string before sanitising cylc task names
jfrost-mo Aug 22, 2024
8fed534
Rename parallel to steps in recipes
jfrost-mo Aug 22, 2024
9dbc08d
Correct level coordinate read in recipe
jfrost-mo Aug 22, 2024
5a97d1f
Return CubeList from scatter plot operator
jfrost-mo Aug 23, 2024
c729b2c
Convert transect recipe
jfrost-mo Aug 23, 2024
cb12566
Fix CLI tests
jfrost-mo Aug 23, 2024
18bc8fd
Fix common and operator runner tests
jfrost-mo Aug 23, 2024
a2c84bc
Fix run_cset_recipe tests
jfrost-mo Aug 23, 2024
381ca53
Cover error case in cset graph
jfrost-mo Aug 23, 2024
024fe4f
Add some more tests
jfrost-mo Aug 23, 2024
394886a
Convert some references to parallel to steps
jfrost-mo Aug 23, 2024
cd6d125
Make recipe validation tests more specific
jfrost-mo Aug 23, 2024
3bec01a
Remove old version of fetch_data
jfrost-mo Aug 23, 2024
408fd4e
Add fetch_data tests
jfrost-mo Aug 23, 2024
4d2b034
Reference UTC timezone as datetime.timezone.utc
jfrost-mo Aug 23, 2024
a081c45
Add workaround for old python not supporting ISO 8601 datetimes
jfrost-mo Aug 23, 2024
f0ae9d5
Test a few corner cases of fetch_data
jfrost-mo Aug 23, 2024
97dccd8
Test area constraint edge case
jfrost-mo Aug 23, 2024
4f000f8
Fix typo in rose metadata
jfrost-mo Aug 27, 2024
280400c
Handle missing DATA_PERIOD for initiation time
jfrost-mo Aug 27, 2024
93b5a3e
Finish website on compute platform
jfrost-mo Aug 27, 2024
9c0c064
Remove outdated comment
jfrost-mo Aug 27, 2024
18e2ea1
Update cset bake CLI reference
jfrost-mo Aug 27, 2024
b04ad20
Remove parallel and collate steps
jfrost-mo Aug 27, 2024
cf85a57
Update documentation to reflect changes
jfrost-mo Aug 27, 2024
680e2c5
Open HTML output in tutorial
jfrost-mo Aug 27, 2024
1ed4c88
Make additional fields compulsory
jfrost-mo Aug 27, 2024
1e97a29
Update example rose-suite.conf
jfrost-mo Aug 27, 2024
54a9987
Update rose-meta.conf
Sylviabohnenstengel Aug 30, 2024
b216bdc
Update documentation.rst
Sylviabohnenstengel Aug 30, 2024
d929019
Change datetime examples to use YYYYMMDDThhmmZ format
jfrost-mo Sep 3, 2024
a311bac
Clarify help for CSET_CASE_DATES
jfrost-mo Sep 3, 2024
dd32563
Clarify that CSET_ANALYSIS_OFFSET
jfrost-mo Sep 3, 2024
68b6aba
Improve definitions of lead time and validity time
jfrost-mo Sep 3, 2024
2a84412
Number models from 0 to allow directly using as index
jfrost-mo Sep 3, 2024
657b421
Add assert message to disambiguate asserts
jfrost-mo Sep 3, 2024
1111d86
Rename FileRetriever to show it's an ABC
jfrost-mo Sep 3, 2024
134d10a
Clarify point being relative to the data CRS
jfrost-mo Sep 3, 2024
f8bd829
Clarify STASH code format
jfrost-mo Sep 3, 2024
f44bd60
Remove useless help text
jfrost-mo Sep 3, 2024
397e7e8
Clarify help text around rose edit quoting
jfrost-mo Sep 3, 2024
6ec9e16
Fix off-by-one error in model numbering
jfrost-mo Sep 11, 2024
40bd82f
Do full range of models
jfrost-mo Sep 11, 2024
48b96ba
Fix off-by-one vetween rose-suite.conf and list of models
jfrost-mo Sep 11, 2024
888ed06
Clarify coordinates that are in the model's CRS
jfrost-mo Sep 16, 2024
60a4244
Default to False when setting doesn't exist
jfrost-mo Sep 16, 2024
006b107
Make runahead limit an optional configuration
jfrost-mo Sep 16, 2024
f445831
Add some comments to flow.cylc
jfrost-mo Sep 16, 2024
075ebcc
Indent jinja code for readability
jfrost-mo Sep 16, 2024
1dac26d
Note that preprocessing is not yet implemented
jfrost-mo Sep 16, 2024
dcdfe75
Put all fetch_fcst options directly into rose-app.conf
jfrost-mo Sep 16, 2024
332a5ed
Move HTTPFileRetriever into fetch_data module
jfrost-mo Sep 16, 2024
581029d
Fix HTTPFileRetriever
jfrost-mo Sep 16, 2024
0d766b6
Simplify type signature
jfrost-mo Sep 16, 2024
d64afa1
Add a timeout to HTTP retriever
jfrost-mo Sep 16, 2024
3a61ecc
Test handling of missing data period env var
jfrost-mo Sep 17, 2024
7a2b86c
Use httpbin.org as the MO website just blocks the response
jfrost-mo Sep 17, 2024
3f0e22d
Use ROSE_DATAC to locate per-cycle data dir
jfrost-mo Sep 17, 2024
b153bfd
Remove extraneous )
jfrost-mo Sep 17, 2024
f5d43c6
Clarify model name should be reasonably short
jfrost-mo Sep 17, 2024
8ef8360
Bundle recipes and example data into documentation
jfrost-mo Sep 17, 2024
d1f89b9
Remove preprocessing settings
jfrost-mo Sep 17, 2024
22c1d67
Set ROSE_DATAC in data_directory test
jfrost-mo Sep 17, 2024
8a8cb48
Make area constraint much stricter, and handle date line
jfrost-mo Sep 17, 2024
02a7770
Test invalid arguments to area constraint
jfrost-mo Sep 17, 2024
dc344b9
Make fetch-data-http.py executable
jfrost-mo Sep 20, 2024
f1a6eb7
Remove extra space from rose-suite.conf.example
jfrost-mo Sep 26, 2024
64da0c0
Add more default values to rose-suite.conf.example
jfrost-mo Sep 26, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
Expand Down
3 changes: 0 additions & 3 deletions cset-workflow/Jinja2Globals/glob.py

This file was deleted.

3 changes: 0 additions & 3 deletions cset-workflow/Jinja2Globals/zip.py

This file was deleted.

6 changes: 3 additions & 3 deletions cset-workflow/app/fetch_fcst/bin/fetch-data-filesystem.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#! /usr/bin/env python3

"""Retrieve the files from the filesystem for the current cycle point."""
"""Retrieve files from the filesystem."""

import CSET._workflow_utils.fetch_data_filesystem
from CSET._workflow_utils.fetch_data import FilesystemFileRetriever, fetch_data

CSET._workflow_utils.fetch_data_filesystem.run()
fetch_data(FilesystemFileRetriever)
7 changes: 7 additions & 0 deletions cset-workflow/app/fetch_fcst/bin/fetch-data-http.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#! /usr/bin/env python3

"""Retrieve files via HTTP."""

from CSET._workflow_utils.fetch_data import HTTPFileRetriever, fetch_data

fetch_data(HTTPFileRetriever)
2 changes: 0 additions & 2 deletions cset-workflow/app/fetch_fcst/opt/rose-app-filesystem.conf

This file was deleted.

2 changes: 0 additions & 2 deletions cset-workflow/app/fetch_fcst/opt/rose-app-mass.conf

This file was deleted.

5 changes: 4 additions & 1 deletion cset-workflow/app/fetch_fcst/rose-app.conf
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
[command]
default=echo "Please set FETCH_FCST_OPT_CONF to your storage system."; false
default=echo "Please set ROSE_APP_COMMAND_KEY to your storage system."; false
filesystem=app_env_wrapper fetch-data-filesystem.py
http=app_env_wrapper fetch-data-http.py
mass=app_env_wrapper restricted-fetch-data-mass.py
172 changes: 95 additions & 77 deletions cset-workflow/flow.cylc
jfrost-mo marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -4,138 +4,156 @@ title = CSET
description = Workflow for running CSET.
URL = https://metoffice.github.io/CSET

[scheduler]
UTC mode = True
# Import all of our Jinja utilities for use in the workflow.
{% from "jinja_utils" import get_models, glob, max, min, zip, restructure_field_list, sanitise_task_name %}
# Load a list a model detail dictionaries.
{% set models = get_models(ROSE_SUITE_VARIABLES) %}


[scheduling]
runahead limit = P{{CSET_RUNAHEAD_LIMIT}}
initial cycle point = {{CSET_INITIAL_CYCLE_POINT}}
final cycle point = {{CSET_FINAL_CYCLE_POINT}}
# There is rarely a reason to manually set the runahead limit, as we will
# usually be limited by number of concurrent jobs.
{% if CSET_RUNAHEAD_LIMIT|default(False) %}
runahead limit = P{{CSET_RUNAHEAD_LIMIT}}
{% endif %}

# Initial and final cycle points cover the entire period of interest.
{% if CSET_CYCLING_MODE == "case_study" %}
initial cycle point = {{ min(CSET_CASE_DATES) }}
final cycle point = {{ max(CSET_CASE_DATES) }}
{% elif CSET_CYCLING_MODE == "trial" %}
initial cycle point = {{CSET_TRIAL_START_DATE}}
# End date can be blank.
{% if CSET_TRIAL_END_DATE|default(False) %}
final cycle point = {{CSET_TRIAL_END_DATE}}
{% endif %}
{% endif %}

[[graph]]
# Only runs on the first cycle.
R1/^ = """
build_conda & install_website_skeleton => FETCH_DATA
"""

# Only runs on the final cycle.
R1/$ = """
process_finish => COLLATE:succeed-all =>
finish_website => send_email => housekeeping_full
build_conda => install_website_skeleton => setup_complete
"""

# Runs every cycle to process the data in parallel.
{{CSET_CYCLE_PERIOD}} = """
install_website_skeleton[^] & build_conda[^] =>
FETCH_DATA:succeed-all => PARALLEL:succeed-all =>
process_finish => housekeeping_raw

# Intercycle dependence with this task ensures the collate step waits for
# the required data.
process_finish[-{{CSET_CYCLE_PERIOD}}] => process_finish
"""
{% if CSET_CYCLING_MODE == "case_study" %}
# Runs for every forecast initiation time to process the data in parallel.
{% for date in CSET_CASE_DATES %}
R1/{{date}} = """
setup_complete[^] => FETCH_DATA:succeed-all => fetch_complete
fetch_complete => PROCESS:finish-all => housekeeping_raw
"""
{% endfor %}
{% elif CSET_CYCLING_MODE == "trial" %}
# Analyse from each forecast.
{{CSET_TRIAL_CYCLE_PERIOD}} = """
setup_complete[^] => FETCH_DATA:succeed-all => fetch_complete
fetch_complete => PROCESS:finish-all => housekeeping_raw
"""
{% endif %}

{% if CSET_INCREMENTAL_OUTPUT %}
# Runs every so often to update output plots during runtime.
{{CSET_INCREMENTAL_OUTPUT_PERIOD}} = """
COLLATE[-{{CSET_INCREMENTAL_OUTPUT_PERIOD}}]:finish-all &
process_finish => COLLATE
"""
# Can only run tasks on final cycle point if it exists, so skip for
# continuous trials.
{% if CSET_CYCLING_MODE != "trial" or CSET_TRIAL_END_DATE|default(False) %}
# Only runs on the final cycle.
R1/$ = """
housekeeping_raw => finish_website => send_email
housekeeping_raw => housekeeping_full
"""
{% endif %}


[runtime]
[[root]]
script = rose task-run -v
execution time limit = PT15M
[[[environment]]]
CSET_ENV_USE_MODULES = {{CSET_ENV_USE_MODULES}}
{% if CSET_ENV_USE_MODULES %}
MODULES_LIST = {{MODULES_LIST}}
MODULES_PURGE = {{MODULES_PURGE}}
# As these variables are used in the environment script, they must be
# defined.
CSET_ENV_USE_MODULES = {{CSET_ENV_USE_MODULES|default(False)}}
{% if CSET_ENV_USE_MODULES|default(False) %}
MODULES_LIST = {{MODULES_LIST}}
MODULES_PURGE = {{MODULES_PURGE}}
{% endif %}

CSET_ENV_USE_CONDA = {{CSET_ENV_USE_CONDA}}
{% if CSET_ENV_USE_CONDA %}
CONDA_PATH = {{CONDA_PATH}}
CONDA_VENV_LOCATION = {{CONDA_VENV_LOCATION}}
CSET_ENV_USE_CONDA = {{CSET_ENV_USE_CONDA|default(False)}}
{% if CSET_ENV_USE_CONDA|default(False) %}
CONDA_PATH = {{CONDA_PATH}}
CONDA_VENV_LOCATION = {{CONDA_VENV_LOCATION}}
{% endif %}

CSET_ENV_SEPARATE_MET = {{CSET_ENV_SEPARATE_MET}}
{% if CSET_ENV_SEPARATE_MET %}
CONDA_METPLUS_VENV_LOCATION = {{CONDA_METPLUS_VENV_LOCATION}}
MET_INSTALL_DIR = {{MET_INSTALL_DIR}}
MET_BUILD_BASE = {{MET_BUILD_BASE}}
METPLUS_BASE = {{METPLUS_BASE}}
MET_LIBRARIES = {{MET_LIBRARIES}}
CSET_ENV_SEPARATE_MET = {{CSET_ENV_SEPARATE_MET|default(False)}}
{% if CSET_ENV_SEPARATE_MET|default(False) %}
CONDA_METPLUS_VENV_LOCATION = {{CONDA_METPLUS_VENV_LOCATION}}
MET_INSTALL_DIR = {{MET_INSTALL_DIR}}
MET_BUILD_BASE = {{MET_BUILD_BASE}}
METPLUS_BASE = {{METPLUS_BASE}}
MET_LIBRARIES = {{MET_LIBRARIES}}
{% endif %}

LOGLEVEL = {{LOGLEVEL}}
WEB_DIR = {{WEB_DIR}}
COLORBAR_FILE = {{COLORBAR_FILE}}
PLOT_RESOLUTION = {{PLOT_RESOLUTION}}
PLOT_RESOLUTION = {{PLOT_RESOLUTION|default(100)}}

[[PARALLEL]]
[[PROCESS]]
script = rose task-run -v --app-key=run_cset_recipe
[[[environment]]]
CSET_BAKE_MODE = parallel

[[COLLATE]]
script = rose task-run -v --app-key=run_cset_recipe
[[[environment]]]
CSET_BAKE_MODE = collate
execution time limit = PT1H

[[FETCH_DATA]]
script = rose task-run -v --app-key=fetch_fcst
execution time limit = PT1H
[[[environment]]]
CSET_ANALYSIS_OFFSET = {{CSET_ANALYSIS_OFFSET}}
CSET_ANALYSIS_PERIOD = {{CSET_ANALYSIS_PERIOD}}

[[METPLUS]]
[[[environment]]]
{% if METPLUS_GRID_STAT %}
{% if METPLUS_GRID_STAT|default(False) %}
METPLUS_ANA_DIR = {{METPLUS_ANA_DIR}}
METPLUS_FCST_DIR = {{METPLUS_FCST_DIR}}
METPLUS_OBS_DIR = {{METPLUS_OBS_DIR}}
ROSE_APP_OPT_CONF_KEYS = {{METPLUS_OPT_CONFIG_KEYS}}
{% endif %}
{% endif %}

# Dummy tasks needed for workflow scheduling.
[[process_finish]]
[[DUMMY_TASK]]
script = true
platform = localhost
execution time limit = PT1M

[[dummy_collate]]
inherit = COLLATE
script = true
platform = localhost
[[setup_complete]]
inherit = DUMMY_TASK

[[dummy_parallel]]
inherit = PARALLEL
script = true
platform = localhost
[[fetch_complete]]
inherit = DUMMY_TASK

[[build_conda]]
# Create the conda environment if it does not yet exist, possibly installing
# CSET from source.
execution time limit = PT30M
[[[environment]]]
CONDA_VENV_CREATE = {{CONDA_VENV_CREATE}}
CSET_ENV_USE_LOCAL_CSET = {{CSET_ENV_USE_LOCAL_CSET}}
{% if CSET_ENV_USE_LOCAL_CSET %}
CSET_LOCAL_CSET_PATH = {{CSET_LOCAL_CSET_PATH}}
CSET_ENV_USE_LOCAL_CSET = {{CSET_ENV_USE_LOCAL_CSET|default(False) }}
{% if CSET_ENV_USE_LOCAL_CSET|default(False) %}
CSET_LOCAL_CSET_PATH = {{CSET_LOCAL_CSET_PATH}}
{% endif %}

[[install_website_skeleton]]
# Copies the static files that make up the web interface.
[[[environment]]]
WEB_DIR = {{WEB_DIR}}

[[fetch_fcst]]
{% for model in models %}
[[fetch_fcst_m{{model["number"]}}]]
# Fetch data from disk or a file based archival system.
inherit = FETCH_DATA
[[[environment]]]
ROSE_APP_OPT_CONF_KEYS = {{FETCH_FCST_OPT_CONF}}
CSET_INPUT_FILE_PATH = {{CSET_INPUT_FILE_PATH}}
{% if CSET_INCREMENTAL_DATA_FETCH %}
CSET_FILE_NAME_METADATA_PATTERN = {{CSET_FILE_NAME_METADATA_PATTERN}}
CSET_CYCLE_PERIOD = {{CSET_CYCLE_PERIOD}}
CSET_TIMES_PER_FILE = {{CSET_TIMES_PER_FILE}}
CSET_FILE_TIME_OFFSET = {{CSET_FILE_TIME_OFFSET}}
MODEL_NUMBER = {{model["number"]}}
ROSE_APP_COMMAND_KEY = {{model["data_source"]}}
DATA_PATH = {{model["data_path"]}}
DATE_TYPE = {{model["date_type"]}}
{% if model["date_type"] != "initiation" %}
DATA_PERIOD = {{model["data_period"]}}
{% endif %}
{% endfor %}

[[housekeeping_raw]]
# Housekeep unprocessed data files.
Expand All @@ -151,13 +169,13 @@ URL = https://metoffice.github.io/CSET

[[finish_website]]
# Updates the workflow info in the web interface.
platform = localhost

[[send_email]]
# Send email to notify that the workflow is complete.
platform = localhost
[[[environment]]]
WEB_ADDR = {{WEB_ADDR}}
WEB_DIR = {{WEB_DIR}}


# Include files bring their own graph and runtime sections.
jfrost-mo marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
19 changes: 18 additions & 1 deletion cset-workflow/includes/basic_qq_plot.cylc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{% if BASIC_QQ_PLOT %}
{% if BASIC_QQ_PLOT|default(False) %}
[runtime]
{% for model_field_A, model_field_B, coord_A, coord_B in zip(MODEL_FIELDS_A, MODEL_FIELDS_B,VERTICAL_COORDINATE_A, VERTICAL_COORDINATE_B) %}
[[generic_basic_qq_plot_{{model_field_A}}_{{model_field_B}}_parallel]]
Expand Down Expand Up @@ -31,3 +31,20 @@
"""
{% endfor %}
{% endif %}

{# Example code to use as basis for multi-model cycling:
{% for equivalent_field in restructure_field_list(PRESSURE_LEVEL_MODEL_FIELDS) %}
{% for model_number, field in equivalent_field.items() %}
[runtime]
[[generic_basic_qq_plot_m{{model_number}}_{{sanitise_task_name(field)}}]]
inherit = PROCESS
[[[environment]]]
CSET_RECIPE_NAME = "generic_basic_qq_plot.yaml"
CSET_ADDOPTS = """
--VARNAME='{{field}}'
--MODEL_NAME='{{models[model_number]["name"]}}'
"""
MODEL_NUMBER = {{model_number}}
{% endfor %}
{% endfor %}
#}
27 changes: 15 additions & 12 deletions cset-workflow/includes/deterministic_domain_histogram_series.cylc
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
{% if DOMAIN_HISTOGRAM_SERIES_FIELD %}
{% if DOMAIN_HISTOGRAM_SERIES|default(False) %}
{% for equivalent_field in restructure_field_list(PRESSURE_LEVEL_MODEL_FIELDS) %}
{% for model_number, field in equivalent_field.items() %}
{% for plevel in PRESSURE_LEVELS %}
[runtime]
{% for model_field in MODEL_LEVEL_MODEL_FIELDS %}
[[pre_process_deterministic_domain_histogram_series_{{model_field}}]]
inherit = PARALLEL
[[generic_plevel_histogram_series_m{{model_number}}_{{sanitise_task_name(field)}}_lv{{sanitise_task_name(plevel)}}]]
inherit = PROCESS
[[[environment]]]
CSET_RECIPE_NAME = "generic_histogram_series.yaml"
CSET_ADDOPTS = "--VARNAME='{{model_field}}' --MLEVEL='{{UM_MODEL_LEVELS}}'"

[[collate_deterministic_domain_histogram_series_{{model_field}}]]
inherit = COLLATE
[[[environment]]]
CSET_RECIPE_NAME = "generic_histogram_series.yaml"
CSET_ADDOPTS = "--VARNAME='{{model_field}}' --MLEVEL='{{UM_MODEL_LEVELS}}'"
CSET_RECIPE_NAME = "generic_plevel_histogram_series.yaml"
CSET_ADDOPTS = """
--VARNAME='{{field}}'
--PLEVEL='{{plevel}}'
--MODEL_NAME='{{models[model_number]["name"]}}'
"""
MODEL_NUMBER = {{model_number}}
{% endfor %}
{% endfor %}
{% endfor %}
{% endif %}
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
{% if DOMAIN_MEAN_SURFACE_TIME_SERIES %}
{% for model_field in SURFACE_MODEL_FIELDS %}
{% if DOMAIN_MEAN_SURFACE_TIME_SERIES|default(False) %}
{% for equivalent_field in restructure_field_list(SURFACE_MODEL_FIELDS) %}
{% for model_number, field in equivalent_field.items() %}
[runtime]
[[pre_process_domain_mean_surface_time_series_{{model_field}}]]
inherit = PARALLEL
[[generic_surface_domain_mean_time_series_m{{model_number}}_{{sanitise_task_name(field)}}]]
inherit = PROCESS
[[[environment]]]
CSET_RECIPE_NAME = "generic_surface_domain_mean_time_series.yaml"
CSET_ADDOPTS = "--VARNAME={{model_field}}"

[[collate_domain_mean_surface_time_series_{{model_field}}]]
inherit = COLLATE
[[[environment]]]
CSET_RECIPE_NAME = "generic_surface_domain_mean_time_series.yaml"
CSET_ADDOPTS = "--VARNAME={{model_field}}"
CSET_ADDOPTS = """
--VARNAME='{{field}}'
--MODEL_NAME='{{models[model_number]["name"]}}'
"""
MODEL_NUMBER = {{model_number}}
{% endfor %}
{% endfor %}
{% endif %}
Loading