From 6faee19dfc9d7c59b8bd1e39afe0bbb972e83095 Mon Sep 17 00:00:00 2001 From: Hank Fisher Date: Sat, 8 Jan 2022 15:34:25 -0700 Subject: [PATCH 01/26] Initial checkin for Meridial Mean use case --- .../s2s/Stratospheric_Metrics/README | 9 ++ .../Stratospheric_Metrics/meridial_mean.py | 83 +++++++++++++++++++ .../Stratospheric_Metrics/meridial_mean.yaml | 2 + 3 files changed, 94 insertions(+) create mode 100644 parm/use_cases/model_applications/s2s/Stratospheric_Metrics/README create mode 100755 parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.py create mode 100644 parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.yaml diff --git a/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/README b/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/README new file mode 100644 index 0000000000..de1e1d0abe --- /dev/null +++ b/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/README @@ -0,0 +1,9 @@ +These files are a use case to show how to compute meridial and zonal means + +You need METcalcpy and METdatadb in your python path or your conda environment +i.e. +export PYTHONPATH=/METdatadb:/METcalcpy + +The file SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc needs to be +on disk somewhere on your computer and referenced correctly in the file +meridial_mean.yaml diff --git a/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.py b/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.py new file mode 100755 index 0000000000..8639cd6fc2 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 + +""" +Create meridial mean statistics + +""" +import os +import sys +import logging +import yaml +import xarray as xr # http://xarray.pydata.org/ +import metplotpy.plots +import metcalcpy.util.read_env_vars_in_config as readconfig +import metcalcpy.pre_processing.directional_means as directional_means +import METreadnc.util.read_netcdf as read_netcdf + + +def main(): + """ + Use existing default meridial mean config file found in METcalcpy to + grab the test file + """ + + + """ + Read Meridial Mean YAML configuration file + user can use their own, if none specified at the command line, + use the "default" example YAML config file, spectra_plot_coh2.py + Using a custom YAML reader so we can use environment variables + """ + + try: + input_config_file = os.getenv("MERIDIAL_CONFIG_NAME","meridial_mean.yaml") + config = readconfig.parse_config(input_config_file) + logging.info(config) + except yaml.YAMLError as exc: + logging.error(exc) + + """ + Read METplus config file paramaters + """ + #input_file_name = os.environ.get("INPUT_FILE_NAME","SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc") + input_file = [config["input_filename"]] + + """ + Setup logging + """ + logfile = "meridial_mean.log" + logging_level = os.environ.get("LOG_LEVEL","logging.INFO") + logging.basicConfig(stream=logfile, level=logging_level) + + """ + Read dataset + """ + try: + logging.info('Opening ' + input_file[0]) + file_reader = read_netcdf.ReadNetCDF() + + #file_reader returns a list of xarrays even if there is only one file requested to be read + #so we change it from a list to a single + ds = file_reader.read_into_xarray(input_file)[0] + except IOError as exc: + logging.error('Unable to open ' + input_file) + logging.error(exc) + sys.exit(1) + logging.debug(ds) + ds = ds[['uwndFull_TS','vwndFull_TS','tempFull_TS','geopFull_TS']] + ds = ds.rename({'timeEv60':'time', + 'lat':'latitude', # pyzome currently expects dimensions named latitude and longitude + 'lon':'longitude', + 'uwndFull_TS':'u', + 'vwndFull_TS':'v', + 'tempFull_TS':'T', + 'geopFull_TS':'Z'}) + + uzm = directional_means.zonal_mean(ds.u) + Tzm = directional_means.zonal_mean(ds.T) + T_6090 = directional_means.meridional_mean(Tzm, 60, 90) + + print(T_6090) + +if __name__ == '__main__': + main() diff --git a/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.yaml b/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.yaml new file mode 100644 index 0000000000..8a0b51425b --- /dev/null +++ b/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.yaml @@ -0,0 +1,2 @@ +input_filename: + '/d1/personal/kalb/stratosphere/SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc' From 286c5c8f3df2dad42d6a5870d6cd5a813a8acfe5 Mon Sep 17 00:00:00 2001 From: Hank Fisher Date: Thu, 13 Jan 2022 07:03:55 -0700 Subject: [PATCH 02/26] Changed the name and directories --- ...serScript_obsERA_obsOnly_Stratosphere.conf | 58 +++++++++++++ .../README | 9 ++ .../meridonial_mean.py | 83 +++++++++++++++++++ .../meridonial_mean.yaml | 2 + 4 files changed, 152 insertions(+) create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/README create mode 100755 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf new file mode 100644 index 0000000000..f46cb76c94 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf @@ -0,0 +1,58 @@ + +[config] + +# time looping - options are INIT, VALID, RETRO, and REALTIME +# If set to INIT or RETRO: +# INIT_TIME_FMT, INIT_BEG, INIT_END, and INIT_INCREMENT must also be set +# If set to VALID or REALTIME: +# VALID_TIME_FMT, VALID_BEG, VALID_END, and VALID_INCREMENT must also be set +LOOP_BY = REALTIME + +# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. +# see www.strftime.org for more information +# %Y%m%d%H expands to YYYYMMDDHH +VALID_TIME_FMT = %Y%m%d%H + +# BLank for this usecase but the parameter still needs to be there +VALID_BEG = + +# BLank for this usecase but the parameter still needs to be there +VALID_END = + +# BLank for this usecase but the parameter still needs to be there +VALID_INCREMENT = + +# List of forecast leads to process for each run time (init or valid) +# In hours if units are not specified +# If unset, defaults to 0 (don't loop through forecast leads) +LEAD_SEQ = + +# Order of loops to process data - Options are times, processes +# Not relevant if only one item is in the PROCESS_LIST +# times = run all wrappers in the PROCESS_LIST for a single run time, then +# increment the run time and run all wrappers again until all times have +# been evaluated. +# processes = run the first wrapper in the PROCESS_LIST for all times +# specified, then repeat for the next item in the PROCESS_LIST until all +# wrappers have been run +LOOP_ORDER = processes + +PROCESS_LIST = UserScript + +USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE + +USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_means.py + + +[user_env_vars] + +# Difficulty index specific variables + +LOG_FILE = "Meridonial_means.log" + +LOG_LEVEL = "INFO" + +INPUT_FILE_NAME = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/precip.erai.sfc.1p0.2x.2014-2016.nc +YAML_CONFIG_NAME = {PARM_BASE}/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_means.yaml + +OUTPUT_DIR = {OUTPUT_BASE} diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/README b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/README new file mode 100644 index 0000000000..de1e1d0abe --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/README @@ -0,0 +1,9 @@ +These files are a use case to show how to compute meridial and zonal means + +You need METcalcpy and METdatadb in your python path or your conda environment +i.e. +export PYTHONPATH=/METdatadb:/METcalcpy + +The file SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc needs to be +on disk somewhere on your computer and referenced correctly in the file +meridial_mean.yaml diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py new file mode 100755 index 0000000000..aff310e36b --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 + +""" +Create meridonial mean statistics + +""" +import os +import sys +import logging +import yaml +import xarray as xr # http://xarray.pydata.org/ +import metplotpy.plots +import metcalcpy.util.read_env_vars_in_config as readconfig +import metcalcpy.pre_processing.directional_means as directional_means +import METreadnc.util.read_netcdf as read_netcdf + + +def main(): + """ + Use existing default meridonial mean config file found in METcalcpy to + grab the test file + """ + + + """ + Read Meridial Mean YAML configuration file + user can use their own, if none specified at the command line, + use the "default" example YAML config file, spectra_plot_coh2.py + Using a custom YAML reader so we can use environment variables + """ + + try: + input_config_file = os.getenv("MERIDIAL_CONFIG_NAME","meridonial_mean.yaml") + config = readconfig.parse_config(input_config_file) + logging.info(config) + except yaml.YAMLError as exc: + logging.error(exc) + + """ + Read METplus config file paramaters + """ + #input_file_name = os.environ.get("INPUT_FILE_NAME","SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc") + input_file = [config["input_filename"]] + + """ + Setup logging + """ + logfile = "meridonial_mean.log" + logging_level = os.environ.get("LOG_LEVEL","logging.INFO") + logging.basicConfig(stream=logfile, level=logging_level) + + """ + Read dataset + """ + try: + logging.info('Opening ' + input_file[0]) + file_reader = read_netcdf.ReadNetCDF() + + #file_reader returns a list of xarrays even if there is only one file requested to be read + #so we change it from a list to a single + ds = file_reader.read_into_xarray(input_file)[0] + except IOError as exc: + logging.error('Unable to open ' + input_file) + logging.error(exc) + sys.exit(1) + logging.debug(ds) + ds = ds[['uwndFull_TS','vwndFull_TS','tempFull_TS','geopFull_TS']] + ds = ds.rename({'timeEv60':'time', + 'lat':'latitude', # pyzome currently expects dimensions named latitude and longitude + 'lon':'longitude', + 'uwndFull_TS':'u', + 'vwndFull_TS':'v', + 'tempFull_TS':'T', + 'geopFull_TS':'Z'}) + + uzm = directional_means.zonal_mean(ds.u) + Tzm = directional_means.zonal_mean(ds.T) + T_6090 = directional_means.meridional_mean(Tzm, 60, 90) + + print(T_6090) + +if __name__ == '__main__': + main() diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml new file mode 100644 index 0000000000..8a0b51425b --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml @@ -0,0 +1,2 @@ +input_filename: + '/d1/personal/kalb/stratosphere/SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc' From 811699472d6133741d850f195a5881a84a619622 Mon Sep 17 00:00:00 2001 From: Hank Fisher Date: Thu, 13 Jan 2022 07:22:02 -0700 Subject: [PATCH 03/26] Added some documentation --- .../UserScript_obsERA_obsOnly_Stratosphere.py | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.py diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.py new file mode 100644 index 0000000000..cc9690998b --- /dev/null +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.py @@ -0,0 +1,137 @@ +""" +UserScript: Make zonal and meridonial means +======================================================================== + +model_applications/ +s2s/ +UserScript_obsERA_obsOnly_Stratosphere.py + +""" + +############################################################################## +# Scientific Objective +# -------------------- +# +# This use case calls functions in METcalcpy to create zonal and meridonial +# means +# + +############################################################################## +# Datasets +# -------- +# +# SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc + +############################################################################## +# METplus Components +# ------------------ +# +# This use case runs the UserScript wrapper tool to run a user provided script, +# in this case, meridonial.py. +# + +############################################################################## +# METplus Workflow +# ---------------- +# +# This use case does not loop but plots the entire time period of data +# +# UserScript +# This uses data from 20130106,20121107,20130307,20160701 +# +# + +############################################################################## +# METplus Configuration +# --------------------- +# +# METplus first loads all of the configuration files found in parm/metplus_config, +# then it loads any configuration files passed to METplus via the command line +# with the -c option, i.e. -c parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf +# +# .. highlight:: bash +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf +# + +############################################################################# +# MET Configuration +# --------------------- +# +# There are no MET tools used in this use case. +# + +############################################################################## +# Python Embedding +# ---------------- +# +# There is no python embedding in this use case +# + +############################################################################## +# Running METplus +# --------------- +# +# This use case can be run two ways: +# +# 1) Passing in meridonial_means.conf, +# then a user-specific system configuration file:: +# +# run_metplus.py \ +# -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf \ +# -c /path/to/user_system.conf +# +# 2) Modifying the configurations in parm/metplus_config, then passing in meridonial.conf:: +# +# run_metplus.py \ +# -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf +# +# The former method is recommended. Whether you add them to a user-specific configuration file or modify the metplus_config files, the following variables must be set correctly: +# +# * **INPUT_BASE** - Path to directory where sample data tarballs are unpacked (See Datasets section to obtain tarballs). This is not required to run METplus, but it is required to run the examples in parm/use_cases +# * **OUTPUT_BASE** - Path where METplus output will be written. This must be in a location where you have write permissions +# * **MET_INSTALL_DIR** - Path to location where MET is installed locally +# +# and for the [exe] section, you will need to define the location of NON-MET executables. +# If the executable is in the user's path, METplus will find it from the name. +# If the executable is not in the path, specify the full path to the executable here (i.e. RM = /bin/rm) +# The following executables are required for performing series analysis use cases: +# +# Example User Configuration File:: +# +# [dir] +# INPUT_BASE = /path/to/sample/input/data +# OUTPUT_BASE = /path/to/output/dir +# MET_INSTALL_DIR = /path/to/met-X.Y +# +# [exe] +# RM = /path/to/rm +# CUT = /path/to/cut +# TR = /path/to/tr +# NCAP2 = /path/to/ncap2 +# CONVERT = /path/to/convert +# NCDUMP = /path/to/ncdump +# + +############################################################################## +# Expected Output +# --------------- +# +# A successful run will output the following both to the screen and to the logfile:: +# +# INFO: METplus has successfully finished running. +# + +############################################################################## +# Keywords +# -------- +# +# .. note:: +# +# * UserScriptUseCase +# * S2SAppUseCase +# +# Navigate to the :ref:`quick-search` page to discover other similar use cases. +# +# +# +# sphinx_gallery_thumbnail_path = '_static/tbd.png' From 9067afc1f77e35f04e7dbcf4e7d2a4c75b8d6ae8 Mon Sep 17 00:00:00 2001 From: Hank Fisher Date: Thu, 13 Jan 2022 08:05:31 -0700 Subject: [PATCH 04/26] Fixed config variables --- .../s2s/UserScript_obsERA_obsOnly_Stratosphere.conf | 4 ++-- .../UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py | 4 ++-- .../meridonial_mean.yaml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf index f46cb76c94..6c63c041ab 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf @@ -41,7 +41,7 @@ PROCESS_LIST = UserScript USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE -USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_means.py +USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py [user_env_vars] @@ -53,6 +53,6 @@ LOG_FILE = "Meridonial_means.log" LOG_LEVEL = "INFO" INPUT_FILE_NAME = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/precip.erai.sfc.1p0.2x.2014-2016.nc -YAML_CONFIG_NAME = {PARM_BASE}/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_means.yaml +YAML_CONFIG_NAME = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml OUTPUT_DIR = {OUTPUT_BASE} diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py index aff310e36b..5c431d3487 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py @@ -30,7 +30,7 @@ def main(): """ try: - input_config_file = os.getenv("MERIDIAL_CONFIG_NAME","meridonial_mean.yaml") + input_config_file = os.getenv("YAML_CONFIG_NAME","meridonial_mean.yaml") config = readconfig.parse_config(input_config_file) logging.info(config) except yaml.YAMLError as exc: @@ -40,7 +40,7 @@ def main(): Read METplus config file paramaters """ #input_file_name = os.environ.get("INPUT_FILE_NAME","SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc") - input_file = [config["input_filename"]] + input_file = config["input_filename"] """ Setup logging diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml index 8a0b51425b..0a73362e7e 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml @@ -1,2 +1,2 @@ input_filename: - '/d1/personal/kalb/stratosphere/SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc' +- !ENV '${INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc' From 8fa83b8b923125927a9e65c4d5fbfb53d1323fb8 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Tue, 18 Jan 2022 14:31:27 -0700 Subject: [PATCH 05/26] Issue 1230 Stratospheric metrics (zonal/meridional use case) put INPUT_BASE in the user_env_vars so the user doesn't need to set the INPUT_BASE environment in the current working shell --- .../s2s/UserScript_obsERA_obsOnly_Stratosphere.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf index 6c63c041ab..822b4b97ff 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf @@ -52,6 +52,7 @@ LOG_FILE = "Meridonial_means.log" LOG_LEVEL = "INFO" +INPUT_BASE = /d1/projects/METplus/METplus_Data/ INPUT_FILE_NAME = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/precip.erai.sfc.1p0.2x.2014-2016.nc YAML_CONFIG_NAME = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml From 14982f679a344dcf4c3c933b4c075bcf4d4aedff Mon Sep 17 00:00:00 2001 From: Minna Win Date: Tue, 18 Jan 2022 14:33:35 -0700 Subject: [PATCH 06/26] Issue #1230 remove import of metplotpy-this isn't called --- .../UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py | 1 - 1 file changed, 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py index 5c431d3487..777be36ea6 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py @@ -9,7 +9,6 @@ import logging import yaml import xarray as xr # http://xarray.pydata.org/ -import metplotpy.plots import metcalcpy.util.read_env_vars_in_config as readconfig import metcalcpy.pre_processing.directional_means as directional_means import METreadnc.util.read_netcdf as read_netcdf From c9dfaeb3eb883c7b6354a00e0f18fdb990e2ecb2 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Tue, 18 Jan 2022 14:43:07 -0700 Subject: [PATCH 07/26] Issue #1230_stratosphere_metric Add use case to the list of use cases to be run for testing --- internal_tests/use_cases/all_use_cases.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 2582f198e9..1036a489c8 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -129,6 +129,7 @@ Category: s2s 9:: UserScript_obsERA_obsOnly_OMI:: model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf:: spacetime_env, metdatadb 10:: UserScript_obsERA_obsOnly_RMM:: model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf:: spacetime_env, metdatadb 11:: UserScript_fcstGFS_obsERA_WeatherRegime:: model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.conf:: weatherregime_env,cartopy,metplus +11:: UserScript_obsERA_obsOnly_Stratosphere:: model_applications/s2s/UserScript_fcstGFS_obsERA_Stratosphere.conf:: metplotpy_env,metplus Category: space_weather 0::GridStat_fcstGloTEC_obsGloTEC_vx7:: model_applications/space_weather/GridStat_fcstGloTEC_obsGloTEC_vx7.conf From d2947443b859efff1524f7114f808adba85e48a6 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Tue, 18 Jan 2022 17:10:22 -0700 Subject: [PATCH 08/26] Issue 1230 Remove the INPUT_BASE from the user_env_vars section --- .../s2s/UserScript_obsERA_obsOnly_Stratosphere.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf index 822b4b97ff..6c63c041ab 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf @@ -52,7 +52,6 @@ LOG_FILE = "Meridonial_means.log" LOG_LEVEL = "INFO" -INPUT_BASE = /d1/projects/METplus/METplus_Data/ INPUT_FILE_NAME = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/precip.erai.sfc.1p0.2x.2014-2016.nc YAML_CONFIG_NAME = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml From 3375c7420a0294862cfc77df2ab27d9b1fd534d4 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Tue, 18 Jan 2022 19:22:53 -0700 Subject: [PATCH 09/26] Issue #1230 redundant files --- .../model_applications/s2s/Stratospheric_Metrics/README | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 parm/use_cases/model_applications/s2s/Stratospheric_Metrics/README diff --git a/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/README b/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/README deleted file mode 100644 index de1e1d0abe..0000000000 --- a/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/README +++ /dev/null @@ -1,9 +0,0 @@ -These files are a use case to show how to compute meridial and zonal means - -You need METcalcpy and METdatadb in your python path or your conda environment -i.e. -export PYTHONPATH=/METdatadb:/METcalcpy - -The file SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc needs to be -on disk somewhere on your computer and referenced correctly in the file -meridial_mean.yaml From eae66878e7ede524e8151aab5bfacba0fe90d403 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Tue, 18 Jan 2022 19:23:06 -0700 Subject: [PATCH 10/26] Issue #1230 redundant files --- .../Stratospheric_Metrics/meridial_mean.py | 83 ------------------- 1 file changed, 83 deletions(-) delete mode 100755 parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.py diff --git a/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.py b/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.py deleted file mode 100755 index 8639cd6fc2..0000000000 --- a/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env python3 - -""" -Create meridial mean statistics - -""" -import os -import sys -import logging -import yaml -import xarray as xr # http://xarray.pydata.org/ -import metplotpy.plots -import metcalcpy.util.read_env_vars_in_config as readconfig -import metcalcpy.pre_processing.directional_means as directional_means -import METreadnc.util.read_netcdf as read_netcdf - - -def main(): - """ - Use existing default meridial mean config file found in METcalcpy to - grab the test file - """ - - - """ - Read Meridial Mean YAML configuration file - user can use their own, if none specified at the command line, - use the "default" example YAML config file, spectra_plot_coh2.py - Using a custom YAML reader so we can use environment variables - """ - - try: - input_config_file = os.getenv("MERIDIAL_CONFIG_NAME","meridial_mean.yaml") - config = readconfig.parse_config(input_config_file) - logging.info(config) - except yaml.YAMLError as exc: - logging.error(exc) - - """ - Read METplus config file paramaters - """ - #input_file_name = os.environ.get("INPUT_FILE_NAME","SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc") - input_file = [config["input_filename"]] - - """ - Setup logging - """ - logfile = "meridial_mean.log" - logging_level = os.environ.get("LOG_LEVEL","logging.INFO") - logging.basicConfig(stream=logfile, level=logging_level) - - """ - Read dataset - """ - try: - logging.info('Opening ' + input_file[0]) - file_reader = read_netcdf.ReadNetCDF() - - #file_reader returns a list of xarrays even if there is only one file requested to be read - #so we change it from a list to a single - ds = file_reader.read_into_xarray(input_file)[0] - except IOError as exc: - logging.error('Unable to open ' + input_file) - logging.error(exc) - sys.exit(1) - logging.debug(ds) - ds = ds[['uwndFull_TS','vwndFull_TS','tempFull_TS','geopFull_TS']] - ds = ds.rename({'timeEv60':'time', - 'lat':'latitude', # pyzome currently expects dimensions named latitude and longitude - 'lon':'longitude', - 'uwndFull_TS':'u', - 'vwndFull_TS':'v', - 'tempFull_TS':'T', - 'geopFull_TS':'Z'}) - - uzm = directional_means.zonal_mean(ds.u) - Tzm = directional_means.zonal_mean(ds.T) - T_6090 = directional_means.meridional_mean(Tzm, 60, 90) - - print(T_6090) - -if __name__ == '__main__': - main() From bfd27c3d32d6945b6b416b69c01b1958d62d2174 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Tue, 18 Jan 2022 19:23:19 -0700 Subject: [PATCH 11/26] Issue #1230 redundant files --- .../s2s/Stratospheric_Metrics/meridial_mean.yaml | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.yaml diff --git a/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.yaml b/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.yaml deleted file mode 100644 index 8a0b51425b..0000000000 --- a/parm/use_cases/model_applications/s2s/Stratospheric_Metrics/meridial_mean.yaml +++ /dev/null @@ -1,2 +0,0 @@ -input_filename: - '/d1/personal/kalb/stratosphere/SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc' From 87af9f3fc182fe88a7562e04e9593ec221b5080b Mon Sep 17 00:00:00 2001 From: Minna Win Date: Tue, 18 Jan 2022 19:25:38 -0700 Subject: [PATCH 12/26] Issue #120 replace INPUT_BASE with INPUT_FILE_NAME --- .../UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml index 0a73362e7e..3286f87440 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml @@ -1,2 +1,2 @@ input_filename: -- !ENV '${INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc' +- !ENV '${INPUT_FILE_NAME}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc' From ca61d9c39f1017d5c37c8270f108e0c302c89ea7 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Tue, 18 Jan 2022 19:38:36 -0700 Subject: [PATCH 13/26] Issue #1230 remove entry for INPUT_FILE_NAME, this goes in the system.conf --- .../s2s/UserScript_obsERA_obsOnly_Stratosphere.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf index 6c63c041ab..261df53b63 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf @@ -52,7 +52,6 @@ LOG_FILE = "Meridonial_means.log" LOG_LEVEL = "INFO" -INPUT_FILE_NAME = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/precip.erai.sfc.1p0.2x.2014-2016.nc YAML_CONFIG_NAME = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml OUTPUT_DIR = {OUTPUT_BASE} From 820d0c18b02cfeef2fd2df4eb19a9d418672fa2e Mon Sep 17 00:00:00 2001 From: bikegeek <3753118+bikegeek@users.noreply.github.com> Date: Wed, 19 Jan 2022 09:07:38 -0700 Subject: [PATCH 14/26] Update all_use_cases.txt Copy and pasted #11 from s2s use case for the Stratosphere use case but forgot to update the index to 12. --- internal_tests/use_cases/all_use_cases.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 1036a489c8..8d8ce2d88f 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -129,7 +129,7 @@ Category: s2s 9:: UserScript_obsERA_obsOnly_OMI:: model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf:: spacetime_env, metdatadb 10:: UserScript_obsERA_obsOnly_RMM:: model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf:: spacetime_env, metdatadb 11:: UserScript_fcstGFS_obsERA_WeatherRegime:: model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.conf:: weatherregime_env,cartopy,metplus -11:: UserScript_obsERA_obsOnly_Stratosphere:: model_applications/s2s/UserScript_fcstGFS_obsERA_Stratosphere.conf:: metplotpy_env,metplus +12:: UserScript_obsERA_obsOnly_Stratosphere:: model_applications/s2s/UserScript_fcstGFS_obsERA_Stratosphere.conf:: metplotpy_env,metplus Category: space_weather 0::GridStat_fcstGloTEC_obsGloTEC_vx7:: model_applications/space_weather/GridStat_fcstGloTEC_obsGloTEC_vx7.conf From bb03c37dffb4e62d7f86d1085c900e97862a4b57 Mon Sep 17 00:00:00 2001 From: bikegeek <3753118+bikegeek@users.noreply.github.com> Date: Wed, 19 Jan 2022 09:10:02 -0700 Subject: [PATCH 15/26] Update use_case_groups.json added use case #12 from s2s to test stratosphere use case --- .github/parm/use_case_groups.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/parm/use_case_groups.json b/.github/parm/use_case_groups.json index 5413a364c3..94168f71fe 100644 --- a/.github/parm/use_case_groups.json +++ b/.github/parm/use_case_groups.json @@ -154,6 +154,11 @@ "index_list": "11", "run": false }, + { + "category": "s2s", + "index_list": "12", + "run": true + }, { "category": "space_weather", "index_list": "0-1", From a861c1367f233161c1e3582281848717edb78098 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Wed, 19 Jan 2022 10:55:58 -0700 Subject: [PATCH 16/26] Issue #1230 put INPUT_FILE_NAME back under the user_env_vars --- .../s2s/UserScript_obsERA_obsOnly_Stratosphere.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf index 261df53b63..beff028e83 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf @@ -48,6 +48,8 @@ USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/model_applications/s2s/UserScript_ob # Difficulty index specific variables +INPUT_FILE_NAME = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere + LOG_FILE = "Meridonial_means.log" LOG_LEVEL = "INFO" From 32a6c1636e73913753b311ca7991647283a5e0c2 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Wed, 19 Jan 2022 11:01:30 -0700 Subject: [PATCH 17/26] Issue #1230 forgot to include the filename --- .../s2s/UserScript_obsERA_obsOnly_Stratosphere.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf index beff028e83..ee5a91ff88 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf @@ -48,7 +48,7 @@ USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/model_applications/s2s/UserScript_ob # Difficulty index specific variables -INPUT_FILE_NAME = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere +INPUT_FILE_NAME = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc LOG_FILE = "Meridonial_means.log" From acd0cfe8e666e9476d94da24a49367bfd9e3cfd4 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Wed, 19 Jan 2022 11:32:24 -0700 Subject: [PATCH 18/26] Issue #1230 clean up config file, remove uneccessary comments, group related entries in the user_env_vars --- .../s2s/UserScript_obsERA_obsOnly_Stratosphere.conf | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf index ee5a91ff88..ced3ba8e79 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf @@ -45,15 +45,12 @@ USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/model_applications/s2s/UserScript_ob [user_env_vars] - -# Difficulty index specific variables - INPUT_FILE_NAME = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc +YAML_CONFIG_NAME = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml + LOG_FILE = "Meridonial_means.log" LOG_LEVEL = "INFO" -YAML_CONFIG_NAME = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml - OUTPUT_DIR = {OUTPUT_BASE} From fba8e42e95c5da24e5fd55a5a3f182ac4b4957af Mon Sep 17 00:00:00 2001 From: Minna Win Date: Wed, 19 Jan 2022 11:33:54 -0700 Subject: [PATCH 19/26] Issue #1230 remove extraneous and incorrect path to the input_filename setting --- .../meridonial_mean.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml index 3286f87440..6cadc5160b 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml @@ -1,2 +1,2 @@ -input_filename: -- !ENV '${INPUT_FILE_NAME}/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc' +input_filename: +- !ENV '${INPUT_FILE_NAME}' From 2f4836eae67072e2ce9b27972d739552c227cff4 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Wed, 19 Jan 2022 14:54:33 -0700 Subject: [PATCH 20/26] Removed pingouin dependency --- ci/docker/docker_env/scripts/metplotpy_env.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/ci/docker/docker_env/scripts/metplotpy_env.sh b/ci/docker/docker_env/scripts/metplotpy_env.sh index 1db44769ee..d82880a8fe 100755 --- a/ci/docker/docker_env/scripts/metplotpy_env.sh +++ b/ci/docker/docker_env/scripts/metplotpy_env.sh @@ -34,7 +34,6 @@ conda create -y --clone ${BASE_ENV} --name ${ENV_NAME} conda install -y --name ${ENV_NAME} -c conda-forge matplotlib==3.3.0 conda install -y --name ${ENV_NAME} -c conda-forge scipy==1.5.1 conda install -y --name ${ENV_NAME} -c conda-forge plotly==4.9.0 -conda install -y --name ${ENV_NAME} -c conda-forge pingouin==0.3.8 conda install -y --name ${ENV_NAME} -c conda-forge cartopy==0.18.0 conda install -y --name ${ENV_NAME} -c conda-forge eofs==1.3.0 conda install -y --name ${ENV_NAME} -c conda-forge cmocean==2.0 From ba0cbc78a9f295d046eecbb69616fc7b8e6e6530 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Wed, 19 Jan 2022 15:09:30 -0700 Subject: [PATCH 21/26] Issue #1230 another cut and paste error fixed for the Stratosphere use case --- internal_tests/use_cases/all_use_cases.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 8d8ce2d88f..432a8569a3 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -129,7 +129,7 @@ Category: s2s 9:: UserScript_obsERA_obsOnly_OMI:: model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf:: spacetime_env, metdatadb 10:: UserScript_obsERA_obsOnly_RMM:: model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf:: spacetime_env, metdatadb 11:: UserScript_fcstGFS_obsERA_WeatherRegime:: model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.conf:: weatherregime_env,cartopy,metplus -12:: UserScript_obsERA_obsOnly_Stratosphere:: model_applications/s2s/UserScript_fcstGFS_obsERA_Stratosphere.conf:: metplotpy_env,metplus +12:: UserScript_obsERA_obsOnly_Stratosphere:: model_applications/s2s/UserScript_obsERA_obs_Only_Stratosphere.conf:: metplotpy_env,metplus Category: space_weather 0::GridStat_fcstGloTEC_obsGloTEC_vx7:: model_applications/space_weather/GridStat_fcstGloTEC_obsGloTEC_vx7.conf From ead149dda0cbd59f8e3fae75a7e4d8a75875574f Mon Sep 17 00:00:00 2001 From: Minna Win Date: Wed, 19 Jan 2022 16:48:39 -0700 Subject: [PATCH 22/26] Issue #1230 type in name, obs_Only should be obsOnly --- internal_tests/use_cases/all_use_cases.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 432a8569a3..1de2e78106 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -129,7 +129,7 @@ Category: s2s 9:: UserScript_obsERA_obsOnly_OMI:: model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf:: spacetime_env, metdatadb 10:: UserScript_obsERA_obsOnly_RMM:: model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf:: spacetime_env, metdatadb 11:: UserScript_fcstGFS_obsERA_WeatherRegime:: model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.conf:: weatherregime_env,cartopy,metplus -12:: UserScript_obsERA_obsOnly_Stratosphere:: model_applications/s2s/UserScript_obsERA_obs_Only_Stratosphere.conf:: metplotpy_env,metplus +12:: UserScript_obsERA_obsOnly_Stratosphere:: model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf:: metplotpy_env,metplus Category: space_weather 0::GridStat_fcstGloTEC_obsGloTEC_vx7:: model_applications/space_weather/GridStat_fcstGloTEC_obsGloTEC_vx7.conf From 215dca927b4ec5c3f7390c8c49aa798f0240d768 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Thu, 20 Jan 2022 10:04:30 -0700 Subject: [PATCH 23/26] Issue #1230 added the metdatadb to the env, code imports metdatadb and may require some of these dependencies --- internal_tests/use_cases/all_use_cases.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 1de2e78106..c132f89a48 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -129,7 +129,7 @@ Category: s2s 9:: UserScript_obsERA_obsOnly_OMI:: model_applications/s2s/UserScript_obsERA_obsOnly_OMI.conf:: spacetime_env, metdatadb 10:: UserScript_obsERA_obsOnly_RMM:: model_applications/s2s/UserScript_obsERA_obsOnly_RMM.conf:: spacetime_env, metdatadb 11:: UserScript_fcstGFS_obsERA_WeatherRegime:: model_applications/s2s/UserScript_fcstGFS_obsERA_WeatherRegime.conf:: weatherregime_env,cartopy,metplus -12:: UserScript_obsERA_obsOnly_Stratosphere:: model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf:: metplotpy_env,metplus +12:: UserScript_obsERA_obsOnly_Stratosphere:: model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf:: metplotpy_env,metdatadb,metplus Category: space_weather 0::GridStat_fcstGloTEC_obsGloTEC_vx7:: model_applications/space_weather/GridStat_fcstGloTEC_obsGloTEC_vx7.conf From ef4883786248ac0f29594c8501b65813f040eda4 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Thu, 20 Jan 2022 12:14:52 -0700 Subject: [PATCH 24/26] issue #1230 removed pingouin dependency from comment to reduce any confusion --- ci/docker/docker_env/scripts/metplotpy_env.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/ci/docker/docker_env/scripts/metplotpy_env.sh b/ci/docker/docker_env/scripts/metplotpy_env.sh index d82880a8fe..914c1b074b 100755 --- a/ci/docker/docker_env/scripts/metplotpy_env.sh +++ b/ci/docker/docker_env/scripts/metplotpy_env.sh @@ -10,7 +10,6 @@ # matplotlib==3.3.0 # scipy==1.5.1 # plotly==4.9.0 -# pingouin==0.3.8 # cartopy==0.18.0 # eofs==1.3.0 # cmocean==2.0 From 9dba59af857ad7527908aa69f11585990c02f15d Mon Sep 17 00:00:00 2001 From: Minna Win Date: Thu, 20 Jan 2022 12:34:30 -0700 Subject: [PATCH 25/26] issue #1230 turn off the test for the Stratosphere metrics use case --- .github/parm/use_case_groups.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/parm/use_case_groups.json b/.github/parm/use_case_groups.json index 94168f71fe..4889a92727 100644 --- a/.github/parm/use_case_groups.json +++ b/.github/parm/use_case_groups.json @@ -157,7 +157,7 @@ { "category": "s2s", "index_list": "12", - "run": true + "run": false }, { "category": "space_weather", From 1b8df6a0556513a483fb71dc15f3d531970c4103 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Fri, 21 Jan 2022 10:52:58 -0700 Subject: [PATCH 26/26] Added use case image --- docs/_static/s2s-zonal_means.png | Bin 0 -> 26841 bytes .../UserScript_obsERA_obsOnly_Stratosphere.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100755 docs/_static/s2s-zonal_means.png diff --git a/docs/_static/s2s-zonal_means.png b/docs/_static/s2s-zonal_means.png new file mode 100755 index 0000000000000000000000000000000000000000..3e5ab96dc491306227d6acb7dc71062a5734858b GIT binary patch literal 26841 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

6iwz1ux-INc2FaXv}R>^It)Q&Pnu93|+ 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 d@Tg9&*e)xucMQ6