From 09cf3171d3298aad42770c6261eca8886f0ff985 Mon Sep 17 00:00:00 2001 From: George McCabe <23407799+georgemccabe@users.noreply.github.com> Date: Thu, 10 Nov 2022 17:28:04 -0700 Subject: [PATCH] Update Develop-ref after #1930, #1927, dtcenter/MET#2335 (#1933) Co-authored-by: Kathryn Newman Co-authored-by: j-opatz <59586397+j-opatz@users.noreply.github.com> Co-authored-by: Lisa Goodrich Co-authored-by: Julie Prestopnik Co-authored-by: johnhg Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com> Co-authored-by: Mrinal Biswas Co-authored-by: Julie Prestopnik Co-authored-by: Christina Kalb Co-authored-by: Hank Fisher Co-authored-by: jprestop Co-authored-by: cristianastan2 Co-authored-by: John Halley Gotway Co-authored-by: bikegeek Co-authored-by: Hank Fisher Co-authored-by: j-opatz Co-authored-by: Christina Kalb Co-authored-by: lisagoodrich <33230218+lisagoodrich@users.noreply.github.com> Co-authored-by: Howard Soh Co-authored-by: Molly Smith Co-authored-by: hsoh-u Co-authored-by: bikegeek <3753118+bikegeek@users.noreply.github.com> Co-authored-by: Will Mayfield <59745143+willmayfield@users.noreply.github.com> --- .github/jobs/docker_setup.sh | 2 +- .github/parm/use_case_groups.json | 7 +- ...nalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.png | Bin 0 -> 91555 bytes ...lysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.png | Bin 0 -> 29977 bytes ...Analysis_fcstGFS_HofX_obsIODAv2_PyEmbed.py | 155 +++++++++++++ .../unstructured_grids/README.rst | 4 + ...alysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.py | 160 ++++++++++++++ internal/scripts/docker_env/README.md | 18 ++ .../docker_env/scripts/geovista_env.sh | 32 +++ internal/tests/use_cases/all_use_cases.txt | 5 + ...alysis_fcstGFS_HofX_obsIODAv2_PyEmbed.conf | 85 ++++++++ .../read_iodav2_mpr.py | 103 +++++++++ ...ysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.conf | 85 ++++++++ .../ugrid_lfric_mpr.py | 203 ++++++++++++++++++ 14 files changed, 857 insertions(+), 2 deletions(-) mode change 100755 => 100644 .github/jobs/docker_setup.sh create mode 100644 docs/_static/data_assimilation-StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.png create mode 100644 docs/_static/unstructured_grids-StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.png create mode 100644 docs/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.py create mode 100644 docs/use_cases/model_applications/unstructured_grids/README.rst create mode 100644 docs/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.py create mode 100755 internal/scripts/docker_env/scripts/geovista_env.sh create mode 100644 parm/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.conf create mode 100644 parm/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed/read_iodav2_mpr.py create mode 100644 parm/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.conf create mode 100644 parm/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed/ugrid_lfric_mpr.py diff --git a/.github/jobs/docker_setup.sh b/.github/jobs/docker_setup.sh old mode 100755 new mode 100644 index ad20f64ecc..47116c0232 --- a/.github/jobs/docker_setup.sh +++ b/.github/jobs/docker_setup.sh @@ -67,7 +67,7 @@ fi # skip docker push if credentials are not set -if [ -z ${DOCKER_USERNAME+x} ] || [ -z ${DOCKER_PASSWORD+x} ]; then +if [ -z "${DOCKER_USERNAME}" ] || [ -z "${DOCKER_PASSWORD}" ]; then echo "DockerHub credentials not set. Skipping docker push" exit 0 fi diff --git a/.github/parm/use_case_groups.json b/.github/parm/use_case_groups.json index 2f6814059a..056013dd1b 100644 --- a/.github/parm/use_case_groups.json +++ b/.github/parm/use_case_groups.json @@ -56,7 +56,7 @@ }, { "category": "data_assimilation", - "index_list": "0", + "index_list": "0-1", "run": false }, { @@ -218,5 +218,10 @@ "category": "tc_and_extra_tc", "index_list": "3-5", "run": false + }, + { + "category": "unstructured_grids", + "index_list": "0", + "run": false } ] diff --git a/docs/_static/data_assimilation-StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.png b/docs/_static/data_assimilation-StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.png new file mode 100644 index 0000000000000000000000000000000000000000..633474d8683b9b8320b3f7bdafd894adddc1d599 GIT binary patch literal 91555 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 P8Gyjk)z4*}Q$iB}&-OxJ literal 0 HcmV?d00001 diff --git a/docs/_static/unstructured_grids-StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.png b/docs/_static/unstructured_grids-StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.png new file mode 100644 index 0000000000000000000000000000000000000000..4475eeac05cff148a0e7d230a34a56c6938d4ad9 GIT binary patch literal 29977 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 z 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 ZCj{q(` for more details. +# +# **YOU SHOULD NOT SET ANY OF THESE ENVIRONMENT VARIABLES YOURSELF! THEY WILL BE OVERWRITTEN BY METPLUS WHEN IT CALLS THE MET TOOLS!** +# +# If there is a setting in the MET configuration file that is currently not supported by METplus you'd like to control, please refer to: +# :ref:`Overriding Unsupported MET config file settings` +# +# .. note:: See the :ref:`StatAnalysis MET Configuration` section of the User's Guide for more information on the environment variables used in the file below: +# +# .. highlight:: bash +# .. literalinclude:: ../../../../parm/met_config/STATAnalysisConfig_wrapped + +############################################################################## +# Python Embedding +# ---------------- +# +# This use case uses a Python embedding script to read input data +# +# parm/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed/read_iodav2_mpr.py +# +# .. highlight:: python +# .. literalinclude:: ../../../../parm/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed/read_iodav2_mpr.py +# + +############################################################################## +# Running METplus +# --------------- +# +# It is recommended to run this use case by: +# +# Passing in StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.conf then a user-specific system configuration file:: +# +# run_metplus.py -c /path/to/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.conf -c /path/to/user_system.conf +# +# The following METplus configuration variables must be set correctly to run this example.: +# +# * **INPUT_BASE** - Path to directory where sample data tarballs are unpacked (See Datasets section to obtain tarballs). +# * **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 +# +# 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 +# +# **NOTE:** All of these items must be found under the [dir] section. +# + + +############################################################################## +# Expected Output +# --------------- +# +# A successful run will output the following both to the screen and to the logfile:: +# +# INFO: METplus has successfully finished running. +# +# Refer to the value set for **OUTPUT_BASE** to find where the output data was generated. +# Output for this use case will be found in StatAnalysis_IODAv2 (relative to **OUTPUT_BASE**) +# and will contain the following file: +# +# * dump.out + +############################################################################## +# Keywords +# -------- +# +# .. note:: +# +# * StatAnalysisToolUseCase +# * PythonEmbeddingFileUseCase +# * DataAssimilationUseCase +# +# Navigate to the :ref:`quick-search` page to discover other similar use cases. +# +# +# sphinx_gallery_thumbnail_path = '_static/data_assimilation-StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.png' diff --git a/docs/use_cases/model_applications/unstructured_grids/README.rst b/docs/use_cases/model_applications/unstructured_grids/README.rst new file mode 100644 index 0000000000..7b8d40d0f2 --- /dev/null +++ b/docs/use_cases/model_applications/unstructured_grids/README.rst @@ -0,0 +1,4 @@ +Unstructured Grids +------------------ + +Unstructured grids used by models for numerical weather prediction. diff --git a/docs/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.py b/docs/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.py new file mode 100644 index 0000000000..dd52057d21 --- /dev/null +++ b/docs/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.py @@ -0,0 +1,160 @@ +""" +StatAnalysis: UGRID +=========================================================================== + +model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.conf + +""" + +########################################### +# Scientific Objective +# -------------------- +# +# This use case demonstrates the use of python embedding to ingest and perform +# verification on an unstructured grid. This foregoes the need to interpolate +# to a regular grid as a step in the verification process, thereby avoiding +# any incurred interpolation error in the process. +# +# In particular, this use case ingests a UK MET Office LFRic forecast file in +# NetCDF format, which resides in the UGRID format of the cubed-sphere. The python +# library Iris was developed to perform analysis on various UGRID formats, and is +# employed here to ingest the file as well as perform direct interpolation +# from the native forecast grid to observation locations, thereby forming matched +# pairs to pass to stat_analysis. In order to perform the interpolation using a +# nearest-neighbors approach, the geovista python package is also used to form a +# KD tree to be used in identifying the interpolation points to be used. This +# package is located at https://github.com/bjlittle/geovista/ and can be installed +# from a development version. It is also required to install the pyvista python +# package. ASCII files containing observations are also ingested. +# +# The python embedding script itself performs the interpolation in time, and +# for this use case thins the observation data in order to reduce the run time. +# It is also noted that the observations for this use case were fabricated and +# correlated observation-forecast pairs are not expected. +# + +############################################################################## +# Datasets +# -------- +# +# +# | **Data source:** UK MET Office LFRic forecast files in UGRID NetCDF format and observations in ASCII format +# +# | **Location:** All of the input data required for this use case can be found in the met_test sample data tarball. Click here to the METplus releases page and download sample data for the appropriate release: https://github.com/dtcenter/METplus/releases +# | The tarball should be unpacked into the directory that you will set the value of INPUT_BASE. See `Running METplus`_ section for more information. +# | + +############################################################################## +# METplus Components +# ------------------ +# +# This use case utilizes the METplus StatAnalysis wrapper to search for +# files that are valid for the given case and generate a command to run +# the MET tool stat_analysis. + +############################################################################## +# METplus Workflow +# ---------------- +# +# StatAnalysis is the only tool called in this example. It processes the following +# run times: +# +# | **Valid:** 2021-05-05_00Z +# | **Forecast lead:** 12 hour +# | + +############################################################################## +# 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/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.conf +# +# .. highlight:: bash +# .. literalinclude:: ../../../../parm/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.conf + +############################################################################## +# MET Configuration +# ----------------- +# +# METplus sets environment variables based on user settings in the METplus configuration file. +# See :ref:`How METplus controls MET config file settings` for more details. +# +# **YOU SHOULD NOT SET ANY OF THESE ENVIRONMENT VARIABLES YOURSELF! THEY WILL BE OVERWRITTEN BY METPLUS WHEN IT CALLS THE MET TOOLS!** +# +# If there is a setting in the MET configuration file that is currently not supported by METplus you'd like to control, please refer to: +# :ref:`Overriding Unsupported MET config file settings` +# +# .. note:: See the :ref:`StatAnalysis MET Configuration` section of the User's Guide for more information on the environment variables used in the file below: +# +# .. highlight:: bash +# .. literalinclude:: ../../../../parm/met_config/STATAnalysisConfig_wrapped + +############################################################################## +# Python Embedding +# ---------------- +# +# This use case uses a Python embedding script to read input data +# +# parm/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed/ugrid_lfric_mpr.py +# +# .. highlight:: python +# .. literalinclude:: ../../../../parm/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed/ugrid_lfric_mpr.py +# + +############################################################################## +# Running METplus +# --------------- +# +# It is recommended to run this use case by: +# +# Passing in StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.conf then a user-specific system configuration file:: +# +# run_metplus.py -c /path/to/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.conf -c /path/to/user_system.conf +# +# The following METplus configuration variables must be set correctly to run this example.: +# +# * **INPUT_BASE** - Path to directory where sample data tarballs are unpacked (See Datasets section to obtain tarballs). +# * **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 +# +# 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 +# +# **NOTE:** All of these items must be found under the [dir] section. +# + + +############################################################################## +# Expected Output +# --------------- +# +# A successful run will output the following both to the screen and to the logfile:: +# +# INFO: METplus has successfully finished running. +# +# Refer to the value set for **OUTPUT_BASE** to find where the output data was generated. +# Output for this use case will be found in StatAnalysis_UGRID (relative to **OUTPUT_BASE**) +# and will contain the following file: +# +# * dump.out + +############################################################################## +# Keywords +# -------- +# +# .. note:: +# +# * StatAnalysisToolUseCase +# * PythonEmbeddingFileUseCase +# * UnstructureGridsUseCase +# +# Navigate to the :ref:`quick-search` page to discover other similar use cases. +# +# +# sphinx_gallery_thumbnail_path = '_static/unstructured_grids-StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.png' diff --git a/internal/scripts/docker_env/README.md b/internal/scripts/docker_env/README.md index 516a430613..4a46d422b3 100644 --- a/internal/scripts/docker_env/README.md +++ b/internal/scripts/docker_env/README.md @@ -306,6 +306,24 @@ needed to install the tools. It is not recommended to follow these instructions to install the GFDL Tracker using these steps. Please consult the documentation for the tool for installation instructions. +## geovista.v5 + +### Docker + +``` +docker build -t dtcenter/metplus-envs:geovista.v5 --build-arg ENV_NAME=geovista . +docker push dtcenter/metplus-envs:geovista.v5 +``` + +### Local + +``` +./scripts/geovista_env.sh + +cd /home/met_test/geovista +/home/met_test/.conda/envs/geovista.v5/bin/pip3 install --no-deps --editable . +``` + ## pytest.v5 (from metplus_base.v5) diff --git a/internal/scripts/docker_env/scripts/geovista_env.sh b/internal/scripts/docker_env/scripts/geovista_env.sh new file mode 100755 index 0000000000..4a885493b6 --- /dev/null +++ b/internal/scripts/docker_env/scripts/geovista_env.sh @@ -0,0 +1,32 @@ +#! /bin/sh + +################################################################################ +# Environment: geovista +# Last Updated: 2022-11-08 (mccabe@ucar.edu) +# Notes: Adds Python packages needed to run iris use case +# Requires development version of geovista package that is obtained +# from github.com/bjlittle/geovista +# Python Packages: +# geovista==0.1a1.dev462 +# xarray==2022.11.0 +# iris==3.3.1 +# +# Other Content: None +################################################################################ + +# Conda environment to create +ENV_NAME=geovista.v5 + +yum -y install git +git clone https://github.com/bjlittle/geovista.git +cd geovista +conda create -y -n ${ENV_NAME} --file requirements/locks/py310-lock-linux-64.txt + +# note: this command will not work on a local machine +# it is specific to docker +/usr/local/envs/${ENV_NAME}/bin/pip3 install --no-deps --editable . +cd - + +conda install -y --name ${ENV_NAME} -c conda-forge xarray==2022.11.0 +conda install -y --name ${ENV_NAME} -c conda-forge iris==3.3.1 + diff --git a/internal/tests/use_cases/all_use_cases.txt b/internal/tests/use_cases/all_use_cases.txt index ef633503aa..ca8f1cbc1c 100644 --- a/internal/tests/use_cases/all_use_cases.txt +++ b/internal/tests/use_cases/all_use_cases.txt @@ -73,6 +73,7 @@ Category: climate Category: data_assimilation 0::StatAnalysis_fcstHAFS_obsPrepBufr_JEDI_IODA_interface::model_applications/data_assimilation/StatAnalysis_fcstHAFS_obsPrepBufr_JEDI_IODA_interface.conf +0::StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed::model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.conf:: py_embed Category: marine_and_cryosphere @@ -166,3 +167,7 @@ Category: tc_and_extra_tc 3::GridStat_fcstHAFS_obsTDR_NetCDF:: model_applications/tc_and_extra_tc/GridStat_fcstHAFS_obsTDR_NetCDF.conf:: py_embed 4::TCPairs_TCStat_fcstADECK_obsBDECK_ATCF_BasicExample:: model_applications/tc_and_extra_tc/TCPairs_TCStat_fcstADECK_obsBDECK_ATCF_BasicExample.conf 5::TCGen_fcstGFS_obsBDECK_2021season:: model_applications/tc_and_extra_tc/TCGen_fcstGFS_obsBDECK_2021season.conf + + +Category: unstructured_grids +0::StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed:: model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.conf:: geovista_env, py_embed diff --git a/parm/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.conf b/parm/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.conf new file mode 100644 index 0000000000..c93fce9401 --- /dev/null +++ b/parm/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.conf @@ -0,0 +1,85 @@ +[config] + +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed.html + +# For additional information, please see the METplus Users Guide. +# https://metplus.readthedocs.io/en/latest/Users_Guide + +### +# Processes to run +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#process-list +### + +PROCESS_LIST = StatAnalysis + + +### +# Time Info +# LOOP_BY 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 +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### + +LOOP_BY = VALID + +VALID_TIME_FMT = %Y%m%d%H +VALID_BEG=2018041500 +VALID_END=2018041500 +VALID_INCREMENT = 12H + +LEAD_SEQ = 0 + + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +MODEL1_STAT_ANALYSIS_LOOKIN_DIR = python {PARM_BASE}/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed/read_iodav2_mpr.py {INPUT_BASE}/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed/sample_hofx_output_sondes.nc4 + +STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/StatAnalysis_IODAv2 +STAT_ANALYSIS_OUTPUT_TEMPLATE = job.out +MODEL1_STAT_ANALYSIS_DUMP_ROW_TEMPLATE = dump.out + + +### +# StatAnalysis Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#statanalysis +### + +MODEL1 = NA +MODEL1_OBTYPE = NA + +STAT_ANALYSIS_JOB_NAME = aggregate_stat +STAT_ANALYSIS_JOB_ARGS = -out_line_type CNT -dump_row [dump_row_file] -line_type MPR -by FCST_VAR + +MODEL_LIST = +DESC_LIST = +FCST_LEAD_LIST = +OBS_LEAD_LIST = +FCST_VALID_HOUR_LIST = +FCST_INIT_HOUR_LIST = +OBS_VALID_HOUR_LIST = +OBS_INIT_HOUR_LIST = +FCST_VAR_LIST = +OBS_VAR_LIST = +FCST_UNITS_LIST = +OBS_UNITS_LIST = +FCST_LEVEL_LIST = +OBS_LEVEL_LIST = +VX_MASK_LIST = +INTERP_MTHD_LIST = +INTERP_PNTS_LIST = +FCST_THRESH_LIST = +OBS_THRESH_LIST = +COV_THRESH_LIST = +ALPHA_LIST = +LINE_TYPE_LIST = + +GROUP_LIST_ITEMS = +LOOP_LIST_ITEMS = MODEL_LIST diff --git a/parm/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed/read_iodav2_mpr.py b/parm/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed/read_iodav2_mpr.py new file mode 100644 index 0000000000..de79edf64a --- /dev/null +++ b/parm/use_cases/model_applications/data_assimilation/StatAnalysis_fcstGFS_HofX_obsIODAv2_PyEmbed/read_iodav2_mpr.py @@ -0,0 +1,103 @@ +from __future__ import print_function + +import pandas as pd +import os +from glob import glob +import sys +import xarray as xr +import datetime as dt + +######################################################################## + +print('Python Script:\t', sys.argv[0]) + +# Input is .nc or .nc4 file + +if len(sys.argv) == 2: + # Read the input file as the first argument + input_path = os.path.expandvars(sys.argv[1]) + try: + print("Input File:\t" + repr(input_path)) + + # Read all the needed groups + ioda_data = xr.open_dataset(input_path, group = 'MetaData') + ioda_hofx_data = xr.open_dataset(input_path, group = 'hofx') + + hofx_vars = list(ioda_hofx_data.keys()) + + # use dataframes + ioda_df = ioda_data.to_dataframe() + ioda_data.close() + + for var_name in hofx_vars: + ioda_df[var_name + '@hofx'] = ioda_hofx_data[var_name] + + # Add columns for needed attributes, for each variable present for hofx + for attribute in ['ObsValue', 'ObsType', 'EffectiveQC']: + ioda_attr_data = xr.open_dataset(input_path, group = attribute) + for var_name in hofx_vars: + ioda_df[var_name + '@' + attribute] = ioda_attr_data[var_name] + + ioda_attr_data.close() + ioda_hofx_data.close() + + nlocs = len(ioda_df.index) + print('Number of locations in set: ' + str(nlocs)) + + # Decode strings + time = list(ioda_df['datetime']) + + for i in range(0,nlocs): + temp = dt.datetime.strptime(time[i], '%Y-%m-%dT%H:%M:%SZ') + time[i] = temp.strftime('%Y%m%d_%H%M%S') + + ioda_df['datetime'] = time + + #set up MPR data + mpr_data = [] + + for var_name in hofx_vars: + + # Set up the needed columns + ioda_df_var = ioda_df[['datetime','station_id',var_name+'@ObsType', + 'latitude','longitude','air_pressure', + var_name+'@hofx',var_name+'@ObsValue', + var_name+'@EffectiveQC']] + + # Cute down to locations with valid ObsValues + ioda_df_var = ioda_df_var[abs(ioda_df_var[var_name+'@ObsValue']) < 1e6] + nlocs = len(ioda_df_var.index) + print(var_name+' has '+str(nlocs)+' valid obs.') + + # Add additional columns + ioda_df_var['lead'] = '000000' + ioda_df_var['MPR'] = 'MPR' + ioda_df_var['nobs'] = nlocs + ioda_df_var['index'] = range(0,nlocs) + ioda_df_var['varname'] = var_name + ioda_df_var['na'] = 'NA' + + # Arrange columns in MPR format + cols = ['na','na','lead','datetime','datetime','lead','datetime', + 'datetime','varname','na','lead','varname','na','na', + var_name+'@ObsType','na','na','lead','na','na','na','na','MPR', + 'nobs','index','station_id','latitude','longitude', + 'air_pressure','na',var_name+'@hofx',var_name+'@ObsValue', + var_name+'@EffectiveQC','na','na'] + + ioda_df_var = ioda_df_var[cols] + + # Into a list and all to strings + mpr_data = mpr_data + [list( map(str,i) ) for i in ioda_df_var.values.tolist() ] + + print("Total Length:\t" + repr(len(mpr_data))) + + except NameError: + print("Can't find the input file.") + print("HofX variables in this file:\t" + repr(hofx_vars)) +else: + print("ERROR: read_iodav2_mpr.py -> Must specify input file.\n") + sys.exit(1) + +######################################################################## + diff --git a/parm/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.conf b/parm/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.conf new file mode 100644 index 0000000000..bbca987ddf --- /dev/null +++ b/parm/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.conf @@ -0,0 +1,85 @@ +[config] + +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed.html + +# For additional information, please see the METplus Users Guide. +# https://metplus.readthedocs.io/en/latest/Users_Guide + +### +# Processes to run +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#process-list +### + +PROCESS_LIST = StatAnalysis + + +### +# Time Info +# LOOP_BY 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 +# LEAD_SEQ is the list of forecast leads to process +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control +### + +LOOP_BY = VALID + +VALID_TIME_FMT = %Y%m%d%H +VALID_BEG=2021050500 +VALID_END=2021050500 +VALID_INCREMENT = 6H + +LEAD_SEQ = 0 + + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +MODEL1_STAT_ANALYSIS_LOOKIN_DIR = python {PARM_BASE}/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed/ugrid_lfric_mpr.py {INPUT_BASE}/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed/fcst_data/lfric_ver_20210505_0000.nc {INPUT_BASE}/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed/obs_data + +STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/StatAnalysis_UGRID +STAT_ANALYSIS_OUTPUT_TEMPLATE = job.out +MODEL1_STAT_ANALYSIS_DUMP_ROW_TEMPLATE = dump.out + + +### +# StatAnalysis Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#statanalysis +### + +MODEL1 = NA +MODEL1_OBTYPE = NA + +STAT_ANALYSIS_JOB_NAME = aggregate_stat +STAT_ANALYSIS_JOB_ARGS = -out_line_type CNT -dump_row [dump_row_file] -line_type MPR -by FCST_VAR + +MODEL_LIST = +DESC_LIST = +FCST_LEAD_LIST = +OBS_LEAD_LIST = +FCST_VALID_HOUR_LIST = +FCST_INIT_HOUR_LIST = +OBS_VALID_HOUR_LIST = +OBS_INIT_HOUR_LIST = +FCST_VAR_LIST = +OBS_VAR_LIST = +FCST_UNITS_LIST = +OBS_UNITS_LIST = +FCST_LEVEL_LIST = +OBS_LEVEL_LIST = +VX_MASK_LIST = +INTERP_MTHD_LIST = +INTERP_PNTS_LIST = +FCST_THRESH_LIST = +OBS_THRESH_LIST = +COV_THRESH_LIST = +ALPHA_LIST = +LINE_TYPE_LIST = + +GROUP_LIST_ITEMS = +LOOP_LIST_ITEMS = MODEL_LIST diff --git a/parm/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed/ugrid_lfric_mpr.py b/parm/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed/ugrid_lfric_mpr.py new file mode 100644 index 0000000000..d78e17e82c --- /dev/null +++ b/parm/use_cases/model_applications/unstructured_grids/StatAnalysis_fcstLFRIC_UGRID_obsASCII_PyEmbed/ugrid_lfric_mpr.py @@ -0,0 +1,203 @@ +from __future__ import print_function + +import math +import pandas as pd +import numpy as np +import os +from glob import glob +import sys +import xarray as xr +import datetime as dt +import iris +from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD +#geovista from https://github.com/bjlittle/geovista/ +import geovista as gv +import geovista.theme +from geovista.common import to_xyz +import netCDF4 +import pyvista as pv +from pykdtree.kdtree import KDTree + +from pathlib import Path +from typing import Optional + +import matplotlib.pyplot as plt + +print(f"{iris.__version__=}") +print(f"{gv.__version__=}") + +######################################################################## + +def read_ascii_obs(files): + paths = sorted(glob(files)) + datasets = [pd.read_table(p, header=None, delim_whitespace=True) for p in paths] + combined = pd.concat(datasets) + return combined + +def load_ugrid( + fname: str, + data: Optional[bool] = False, + constraint: Optional[str] = None, + verbose: Optional[bool] = False +) -> pv.PolyData: +# fname = BASE_DIR / fname + with PARSE_UGRID_ON_LOAD.context(): + cube = iris.load_cube(fname, constraint=constraint) + + if cube.ndim > 1: + cube = cube[(0,) * (cube.ndim - 1)] + + if verbose: + print(cube) + + data = cube.data if data else None + + face_node = cube.mesh.face_node_connectivity + indices = face_node.indices_by_location() + lons, lats = cube.mesh.node_coords + + mesh = gv.Transform.from_unstructured( + lons.points, + lats.points, + indices, + data=data, + start_index=face_node.start_index, + name=cube.name(), + ) + + if data is None: + mesh.active_scalars_name = None + + return mesh + +def info(mesh: pv.PolyData) -> None: + print(f"The mesh is a C{int(math.sqrt(mesh.n_cells / 6))}, with 6 panels, {int(mesh.n_cells / 6):,d} cells per panel, and {mesh.n_cells:,d} cells.") + +def find_nearest(tree, points, poi, k): + # lat/lon to xyz + xyz = to_xyz(*poi) + + # find the k nearest euclidean neighbours + dist, idxs = tree.query(xyz, k=k) + + if idxs.ndim > 1: + idxs = idxs[0] + + # retieve the associated xyz points of the k nearest neighbours + nearest = points[idxs] + + return xyz, nearest, idxs + +def to_centers(mesh: pv.PolyData) -> pv.PolyData: + tmp = mesh.copy() + tmp.clear_cell_data() + tmp.clear_point_data() + tmp.clear_field_data() + return tmp.cell_centers() + +######################################################################## +print('Python Script:\t', sys.argv[0]) + +# Input is directory of .nc lfric files and a directory of ascii obs filess + +if len(sys.argv) == 3: + # Read the input file as the first argument + input_fcst_dir = os.path.expandvars(sys.argv[1]) + input_obs_dir = os.path.expandvars(sys.argv[2]) + try: + print("Input Forecast Dir:\t" + repr(input_fcst_dir)) + print("Input Observations Dir:\t" + repr(input_obs_dir)) + + #Read all obs from directory + obs_data = read_ascii_obs(input_obs_dir+'/*.ascii') + print(obs_data.shape) + obs_data = obs_data.iloc[::1000, :]#thin for testing + obs_data = obs_data.rename(columns={0:'message_type', 1:'station_id', 2:'obs_valid_time', 3:'obs_lat', 4:'obs_lon', \ + 5:'elevation', 6:'var_name', 7:'level', 8:'height', 9:'qc_string', 10:'obs_value'}) + + obs_vars = ['UGRD', 'VGRD', 'TMP', 'RH'] + fcst_vars = ['u10m', 'v10m', 't1p5m', 'rh1p5m'] + + #open the netcdf forecast to access data values and list of times + fcst_data = xr.open_dataset(input_fcst_dir) + fcst_times = pd.to_datetime(fcst_data.coords['time_centered']) + + match_df = pd.DataFrame(columns=['message_type', 'station_id', 'obs_valid_time', 'obs_lat', 'obs_lon', \ + 'elevation', 'var_name', 'level', 'height', 'qc_string', 'obs_value', 'idx_nearest, fcst_value']) + + for idx1, (obs_var, fcst_var) in enumerate(zip(obs_vars, fcst_vars)): + + #load forecast as an iris cube + fcst_mesh = load_ugrid(input_fcst_dir, constraint=fcst_var) + info(fcst_mesh) + + #get indices of nearest cell center + fcst_centers = to_centers(fcst_mesh) + points = fcst_centers.points + tree = KDTree(points) + + #get the forecast data values loaded + fcst_df = fcst_data[fcst_var].to_dataframe() + print(fcst_df) + + #get obs data for variable + var_data = obs_data.loc[obs_data['var_name'] == obs_var].reset_index(drop=True) + + for idx2, row in var_data.iterrows(): + xyz, nearest, idx_nearest = find_nearest(tree, points, [row['obs_lat'], row['obs_lon']], k=1) + var_data.at[idx2,'idx_nearest'] = int(idx_nearest) + + #get the obs time, search for closest in the forecast data + time = dt.datetime.strptime(row['obs_valid_time'],'%Y%m%d_%H%M%S') + match_time = min(fcst_times, key=lambda d: abs(d - time)) + match_idx = np.argmin(np.abs(fcst_times - time)) + + #add matched fcst value to data + var_data.at[idx2, 'fcst_value'] = fcst_df.loc[(match_idx,int(idx_nearest)), fcst_var] + var_data.at[idx2, 'fcst_lat'] = fcst_df.loc[(match_idx,int(idx_nearest)), 'Mesh2d_face_x'] + var_data.at[idx2, 'fcst_lon'] = fcst_df.loc[(match_idx,int(idx_nearest)), 'Mesh2d_face_y'] + var_data.at[idx2, 'fcst_time'] = fcst_df.loc[(match_idx,int(idx_nearest)), 'time_centered'] + + #check results + #with pd.option_context('display.max_rows', None): + # print(var_data[['obs_lat','fcst_lat','obs_lon','fcst_lon','obs_value','fcst_value','obs_valid_time','fcst_time']]) + with pd.option_context('display.max_columns', 500, 'display.max_rows', 100, 'display.width', 500): + print(var_data) + ob_vals = var_data['obs_value'].values + f_vals = var_data['fcst_value'].values + + match_df = pd.concat([match_df, var_data], ignore_index=True) + + nlocs = len(match_df.index) + print('Number of locations in matched set: ' + str(nlocs)) + + # Add additional columns + match_df['lead'] = '000000' + match_df['MPR'] = 'MPR' + match_df['nobs'] = nlocs + match_df['index'] = range(0,nlocs) + match_df['na'] = 'NA' + match_df['QC'] = '0' + + # Arrange columns in MPR format + cols = ['na','na','lead','obs_valid_time','obs_valid_time','lead','obs_valid_time', + 'obs_valid_time','var_name','na','lead','var_name','na','na', + 'var_name','na','na','lead','na','na','na','na','MPR', + 'nobs','index','station_id','obs_lat','obs_lon', + 'level','na','fcst_value','obs_value', + 'QC','na','na'] + + match_df = match_df[cols] + + # Into a list and all to strings + mpr_data = [list( map(str,i) ) for i in match_df.values.tolist() ] + + except NameError: + print("Can't find the input files or the variables.") + print("Variables in this file:\t" + repr(var_list)) +else: + print("ERROR: ugrid_lfric_mpr.py -> Must specify directory of files.\n") + sys.exit(1) + +######################################################################## +