diff --git a/cset-workflow/includes/basic_qq_plot.cylc b/cset-workflow/includes/basic_qq_plot.cylc index ae792ff8e..15d9d4f21 100644 --- a/cset-workflow/includes/basic_qq_plot.cylc +++ b/cset-workflow/includes/basic_qq_plot.cylc @@ -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-1]["name"]}}' + """ + MODEL_NUMBER = {{model_number}} +{% endfor %} +{% endfor %} +#} diff --git a/cset-workflow/includes/mlevel_transect.cylc b/cset-workflow/includes/mlevel_transect.cylc new file mode 100644 index 000000000..710074830 --- /dev/null +++ b/cset-workflow/includes/mlevel_transect.cylc @@ -0,0 +1,21 @@ +{% if EXTRACT_MLEVEL_TRANSECT %} +{% for equivalent_field in restructure_field_list(MODEL_LEVEL_MODEL_FIELDS) %} +{% for model_number, field in equivalent_field.items() %} +[runtime] + [[mlevel_transect_m{{model_number}}_{{sanitise_task_name(field)}}]] + inherit = PROCESS + # Transect calculation can take a while, so increase the time limit. + execution time limit = PT60M + [[[environment]]] + CSET_RECIPE_NAME = "transect.yaml" + CSET_ADDOPTS = """ + --VARNAME='{{field}}' + --VERTICAL_COORDINATE='model_level_number' + --MODEL_NAME='{{models[model_number-1]["name"]}}' + --START_COORDS='{{MLEVEL_TRANSECT_STARTCOORDS}}' + --FINISH_COORDS='{{MLEVEL_TRANSECT_FINISHCOORDS}}' + """ + MODEL_NUMBER = {{model_number}} +{% endfor %} +{% endfor %} +{% endif %} diff --git a/cset-workflow/includes/plevel_transect.cylc b/cset-workflow/includes/plevel_transect.cylc new file mode 100644 index 000000000..18b99f71f --- /dev/null +++ b/cset-workflow/includes/plevel_transect.cylc @@ -0,0 +1,21 @@ +{% if EXTRACT_PLEVEL_TRANSECT %} +{% for equivalent_field in restructure_field_list(PRESSURE_LEVEL_MODEL_FIELDS) %} +{% for model_number, field in equivalent_field.items() %} +[runtime] + [[plevel_transect_m{{model_number}}_{{sanitise_task_name(field)}}]] + inherit = PROCESS + # Transect calculation can take a while, so increase the time limit. + execution time limit = PT60M + [[[environment]]] + CSET_RECIPE_NAME = "transect.yaml" + CSET_ADDOPTS = """ + --VARNAME='{{field}}' + --VERTICAL_COORDINATE='pressure' + --MODEL_NAME='{{models[model_number-1]["name"]}}' + --START_COORDS='{{PLEVEL_TRANSECT_STARTCOORDS}}' + --FINISH_COORDS='{{PLEVEL_TRANSECT_FINISHCOORDS}}' + """ + MODEL_NUMBER = {{model_number}} +{% endfor %} +{% endfor %} +{% endif %} diff --git a/cset-workflow/includes/transect.cylc b/cset-workflow/includes/transect.cylc deleted file mode 100644 index 69ab854fa..000000000 --- a/cset-workflow/includes/transect.cylc +++ /dev/null @@ -1,18 +0,0 @@ -{% if EXTRACT_TRANSECT %} -{% for var in CS_VARS %} -[runtime] - [[parallel_transect_{{var}}]] - inherit = PARALLEL - execution time limit = PT60M - [[[environment]]] - CSET_RECIPE_NAME = "transect.yaml" - CSET_ADDOPTS = "--CS_STARTCOORDS='{{CS_STARTCOORDS}}' --CS_FINISHCOORDS='{{CS_FINISHCOORDS}}' --CS_VAR='{{var}}' --CS_VERTLEV='{{CS_VERTLEV}}'" - - [[collate_transect_{{var}}]] - inherit = COLLATE - execution time limit = PT60M - [[[environment]]] - CSET_RECIPE_NAME = "transect.yaml" - CSET_ADDOPTS = "--CS_STARTCOORDS='{{CS_STARTCOORDS}}' --CS_FINISHCOORDS='{{CS_FINISHCOORDS}}' --CS_VAR='{{var}}' --CS_VERTLEV='{{CS_VERTLEV}}'" -{% endfor %} -{% endif %} diff --git a/cset-workflow/meta/diagnostics/rose-meta.conf b/cset-workflow/meta/diagnostics/rose-meta.conf index cb2f69fa5..e3d672d1a 100644 --- a/cset-workflow/meta/diagnostics/rose-meta.conf +++ b/cset-workflow/meta/diagnostics/rose-meta.conf @@ -42,6 +42,42 @@ type=python_boolean compulsory=true sort-key=0surface4 +[template variables=SURFACE_SINGLE_POINT_TIME_SERIES] +ns=Diagnostics/Quicklook +description=Plot a time series at a single specified location in a surface field. +help=Include values of desired longitude and latitude. +type=python_boolean +compulsory=true +trigger=template variables=LATITUDE_POINT: True; + template variables=LONGITUDE_POINT: True; + template variables=SINGLE_POINT_METHOD: True; +sort-key=0surface5 + +[template variables=LATITUDE_POINT] +ns=Diagnostics/Quicklook +description=Latitude of selected point. Note that this could be rotated or not, depending on the data provided. +help=The latitude must exist within the domain. Value should be a float: for example, -1.5. +type=real +compulsory=true +sort-key=0surface6 + +[template variables=LONGITUDE_POINT] +ns=Diagnostics/Quicklook +description=Longitude of selected point. Note that this could be rotated or not, depending on the data provided. +help=The longitude must exist within the domain. Value should be a float: for example, 0.8. +type=real +compulsory=true +sort-key=0surface6 + +[template variables=SINGLE_POINT_METHOD] +ns=Diagnostics/Quicklook +description=Method used to map model data onto selected gridpoints. +help=Method used to map model data onto selected gridpoints. These are regrid methods available in Iris. +values="Nearest", "Linear" +compulsory=true +sort-key=0surface6 + + # Pressure level fields. [template variables=PRESSURE_LEVEL_MODEL_FIELDS] ns=Diagnostics/Quicklook @@ -97,6 +133,44 @@ values="step","barstacked","stepfilled" compulsory=true sort-key=1pressure4b +[template variables=EXTRACT_PLEVEL_TRANSECT] +ns=Diagnostics/Quicklook +description=Plot a cross section of pressure for variables. +help=This functionality extracts data for each variable and extracts a column + along each point of the transect. The number of points along the transect + is determined by calculating the length of the transect in degrees, and + dividing this by the minimum grid spacing within the domain. Additional + dimensions (time, ensemble) are accepted and returned as a cross section. + This allows the user to compute slices through features of meteorological + interest, such as transects through valleys, or through a front as it + passes through. +type=python_boolean +trigger=template variables=PLEVEL_TRANSECT_STARTCOORDS: True; + template variables=PLEVEL_TRANSECT_FINISHCOORDS: True; +compulsory=true +sort-key=1pressure5 + +[template variables=PLEVEL_TRANSECT_STARTCOORDS] +ns=Diagnostics/Quicklook +description=Start latitude, longitude of the cross section. +help=The latitude, longitude coordinate with respect to the model grid where the + cross section will start i.e. the furthest left hand point of the plot, + where the x axis is distance along transect, and y axis is pressure level). +type=real,real +compulsory=true +sort-key=1pressure6 + +[template variables=PLEVEL_TRANSECT_FINISHCOORDS] +ns=Diagnostics/Quicklook +description=Finish latitude, longitude of the cross section. +help=The latitude, longitude coordinate with respect to the model grid where the + cross section will finish i.e. the furthest right hand point of the plot, + where the x axis is distance along transect, and y axis is pressure level). +type=real,real +compulsory=true +sort-key=1pressure6 + + # Model-level fields. [template variables=MODEL_LEVEL_MODEL_FIELDS] ns=Diagnostics/Quicklook @@ -136,6 +210,43 @@ type=python_boolean compulsory=true sort-key=2modellevel4 +[template variables=EXTRACT_