From 50b302b6d28895b518f1e2ed9bab8530fc153935 Mon Sep 17 00:00:00 2001 From: Jason English Date: Wed, 7 Jun 2023 22:57:53 +0000 Subject: [PATCH 01/23] initial AMDAR PBLH METexpress point-stat use case commit --- .github/parm/use_case_groups.json | 5 + ...intStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.png | Bin 0 -> 135709 bytes ...ointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py | 150 ++++++++++++ .../model_applications/pbl/README.rst | 3 + internal/tests/use_cases/all_use_cases.txt | 3 + ...ntStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 194 +++++++++++++++ .../calc_amdar_pblh.py | 220 ++++++++++++++++++ 7 files changed, 575 insertions(+) create mode 100644 docs/_static/pbl-PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.png create mode 100644 docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py create mode 100644 docs/use_cases/model_applications/pbl/README.rst create mode 100644 parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf create mode 100644 parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py diff --git a/.github/parm/use_case_groups.json b/.github/parm/use_case_groups.json index 0c927c2223..e2fe75cfe9 100644 --- a/.github/parm/use_case_groups.json +++ b/.github/parm/use_case_groups.json @@ -124,6 +124,11 @@ "index_list": "9", "run": false }, + { + "category": "pbl", + "index_list": "0", + "run": false + }, { "category": "precipitation", "index_list": "0", diff --git a/docs/_static/pbl-PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.png b/docs/_static/pbl-PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.png new file mode 100644 index 0000000000000000000000000000000000000000..cbfe08eb7ed246bec8f8263b7e9dcf05cd0d522f GIT binary patch literal 135709 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

m9V;DgOhli?6du|1dC^Q6Uy}JI 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%0D<; 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

0TNnczueBcFldnOh98EF+nI|- z$7kbQSGJ}7k$EBV-z4bTJ6T3gq~?+Z&23gkmbdk~t2x${5MMR{gvcZ-lIkrvpZu{3 z>YTT848r$7@J+#?ldGg^&Zr(!Gf_6oDlP@#&!1DTfUQdhwTQGGt;Z#2%M|duP`sM2 zas)|^eH!l>%XH!Ns(DY(AC44Z{Z2ODemVD9`-*-j^Vz8JyJLW`kox3RsE47FM_MqQ z+G2OgN2rvx5+4RgDovGjX>b{uujgC(Yyh->lK0v>>}Vgg$=HF$cCqndN!frh?~TDi z;2J&I{Rkd35Q$H2o$S|;me^&e#O2%}L{fYbM9$p{WeUe9Kj^Y{eMT`Ffnhx1j(%DD zdK=#fyiMx0eeETVKBKJinGf?a6p5WiU|k?7OvO#yaP*aD)jGG zp~H6XT4U{G)3*l&MxVu~bM9|(2)KlepIrN$>0eQyBL6%I@&IkfzXEq653Y2VF8qNi zm&h#qeol=ro42he7HqpxetM$JesgG4B=APIRHEo~k^I5k)QeIXi2LN8s}Yawb1so{ zJrtpoQC0XRPF{$itlh0iPa_&)j{KC;F6q-K7Qs{vL%SNh(wAMEDwnaaBkR01Q$6^R z`BCs#MacSna%&TFn8@k~yU9Qw2oo2NJtuK~9|!m`K<+{PCHPrE@c z$dxi#FD74M=}nfbz0%77A|LEhe&JXcgYsdOIMS$+KZ`3zB91pKCdNd!In4SSW7-#q zZ^Dilh$kX3+v$ltsWZ}m2^BW%a|2cb}J1dbJ-n}sgQoVuo$;Rce zYR{Fpums2I^pUhG$>tw}`9|TBSn)3N7#8`2)WSs{>x__@%i9hzd{-YjFl4n$jyk>= zFE`3>OWZE~`p5H*Jw;3fpOSa~eZs24{z?b$*7m&Wx37HFT}hnWn9F((_!oR%?+4GR zD*rsW%VqB87yHUqFM`)`gQk=^%Y%h&9YKA}aIl?w+X6Znsx)$?ow*}O#(fI3>Qk{c zFqV!V1c}bmAoI~#60Z9i%OH@IJ}AgxP4TfJ{2kcM@xeNX75w<~)!E9R;zaXyyO`a* z!Hpq2ng!Cjm^bMK@Oi1y^@i(KsfC$SW7a&Wn^`Pg@rA5 z-P1fa2^@2u@G(T2_N0c+W31U}YOhgXe&QWpdl{cQ zZx6Ecjm1AMn}DCny{hgV(eMWwwq>jSbVb&dKlAMkLa` 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:`PointStat 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/PointStatConfig_wrapped +# + +############################################################################## +# Python Embedding +# ----------------- +# +# This use case uses a Python embedding script to read input data +# +# parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py +# +# .. highlight:: python +# .. literalinclude:: ../../../../parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py +# + +############################################################################## +# Running METplus +# --------------- +# +# It is recommended to run this use case by: +# +# Passing in PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf then a user-specific system configuration file:: +# +# run_metplus.py -c /path/to/PointStat_fcstHRRR_obsAMDAR_PBLH_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 point_stat_pblh (relative to **OUTPUT_BASE**) +# with subdirectories for valid time (YYYYMMDD) and will contain .stat files with the following naming convention: +# +# convention: point_stat_{AIRPORT}_{SOUNDING_FLAG}_{PT_DELTA}_{LEADTIME}L_{VALIDTIME}.stat +# example: point_stat_DENVER_ALL_1.25_120000L_20220701_200000V.stat + +############################################################################## +# Keywords +# -------- +# +# .. note:: +# +# * GenVxMaskToolUseCase +# * PointStatToolUseCase +# * PythonEmbeddingFileUseCase +# * pblAppUseCase +# +# Navigate to the :ref:`quick-search` page to discover other similar use cases. +# +# sphinx_gallery_thumbnail_path = '_static/pbl-PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.png' diff --git a/docs/use_cases/model_applications/pbl/README.rst b/docs/use_cases/model_applications/pbl/README.rst new file mode 100644 index 0000000000..507a364efc --- /dev/null +++ b/docs/use_cases/model_applications/pbl/README.rst @@ -0,0 +1,3 @@ +Planetary Boundary Layer +------------------------ +Planetary Boundary Layer (PBL) applications diff --git a/internal/tests/use_cases/all_use_cases.txt b/internal/tests/use_cases/all_use_cases.txt index 82d761688a..b9b702cbfd 100644 --- a/internal/tests/use_cases/all_use_cases.txt +++ b/internal/tests/use_cases/all_use_cases.txt @@ -105,6 +105,9 @@ Category: medium_range 9::GridStat_fcstGEFS_obsCADB_BinaryObsPOE:: model_applications/medium_range/GridStat_fcstGEFS_obsCADB_BinaryObsPOE.conf:: netcdf4_env +Category: pbl +0::PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed:: model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf + Category: precipitation 0::GenEnsProd_fcstHRRRE_FcstOnly_NetCDF:: model_applications/precipitation/GenEnsProd_fcstHRRRE_FcstOnly_NetCDF.conf 1::GridStat_fcstHREFmean_obsStgIV_Gempak:: model_applications/precipitation/GridStat_fcstHREFmean_obsStgIV_Gempak.conf:: gempak_env diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf new file mode 100644 index 0000000000..abd6174e64 --- /dev/null +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -0,0 +1,194 @@ +[config] + +# Documentation for this use case can be found at +# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PointStat/PointStat_python_embedding_obs.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 = GenVxMask, PointStat + +### +# 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 = INIT +INIT_TIME_FMT = %Y%m%d%H +INIT_BEG = 2022070108 +INIT_END = 2022070108 +#INIT_BEG = 2022070701 +#INIT_END = 2022073123 +INIT_INCREMENT = 1H + +LEAD_SEQ = 12 +#LEAD_SEQ = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 + +# USER SETTINGS HERE +# CUSTOM_LOOP_LIST = DENVER, DALLAS, BOSTON, MINNEAPOLIS [list of airports sepearated by commas; each needs a mask file] +# PY_SOUNDING_FLAG = ALL, ASC, DESC [only one value here] +# PY_PT_DELTA = Potential Temperature delta setting (K) [usually 1.0-2.5] +# Valid_Time(YYYYMMDD_HHMMSS) +CUSTOM_LOOP_LIST = DENVER +PY_SOUNDING_FLAG = ALL +PY_PT_DELTA = 1.25 +PY_VAL_TIME = {valid?fmt=%Y%m%d_%H0000} + +### +# File I/O +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info +### + +GEN_VX_MASK_INPUT_DIR = {INPUT_BASE}/model_applications/pbl +GEN_VX_MASK_INPUT_TEMPLATE = pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} +GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/pbl +GEN_VX_MASK_INPUT_MASK_TEMPLATE = met_mask_{custom?fmt=%s}.txt + +GEN_VX_MASK_OUTPUT_DIR = {INPUT_BASE}/model_applications/pbl +GEN_VX_MASK_OUTPUT_TEMPLATE = {INPUT_BASE}/model_applications/pbl/met_mask_{custom?fmt=%s}_100km.nc + +FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/pbl +FCST_POINT_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} + +OBS_POINT_STAT_INPUT_DIR = +OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py {INPUT_BASE}/model_applications/pbl/22{valid?fmt=%j}{valid?fmt=%H}00q.cdf + +POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/point_stat_pblh +POINT_STAT_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d} + +POINT_STAT_CLIMO_MEAN_INPUT_DIR = +POINT_STAT_CLIMO_MEAN_INPUT_TEMPLATE = + +POINT_STAT_CLIMO_STDEV_INPUT_DIR = +POINT_STAT_CLIMO_STDEV_INPUT_TEMPLATE = + + +### +# Field Info +# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info +### + +POINT_STAT_ONCE_PER_FIELD = False + +#POINT_STAT_FCST_FILE_TYPE = +#POINT_STAT_OBS_FILE_TYPE = + +FCST_VAR1_NAME = HPBL +FCST_VAR1_LEVELS = L0 +FCST_VAR1_THRESH = <=0, >10000 +OBS_VAR1_NAME = HPBL +OBS_VAR1_LEVELS = L0 +OBS_VAR1_THRESH = <=0, >10000 +OBS_VAR1_OPTIONS = set_attr_units = "m" + + +### +# GenVxMask Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#genvxmask +### + +GEN_VX_MASK_SKIP_IF_OUTPUT_EXISTS = True +GEN_VX_MASK_OPTIONS = -type "circle" -thresh le50 + +# PointStat Settings +# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pointstat +### + +LOG_POINT_STAT_VERBOSITY = 4 + +POINT_STAT_CONFIG_FILE ={PARM_BASE}/met_config/PointStatConfig_wrapped + +#POINT_STAT_OBS_QUALITY_INC = 1, 2, 3 +#POINT_STAT_OBS_QUALITY_EXC = + +POINT_STAT_CLIMO_MEAN_TIME_INTERP_METHOD = NEAREST +#POINT_STAT_CLIMO_STDEV_TIME_INTERP_METHOD = + +#POINT_STAT_INTERP_VLD_THRESH = +#POINT_STAT_INTERP_SHAPE = +POINT_STAT_INTERP_TYPE_METHOD = BILIN +POINT_STAT_INTERP_TYPE_WIDTH = 2 + +#POINT_STAT_OUTPUT_FLAG_FHO = +#POINT_STAT_OUTPUT_FLAG_CTC = +#POINT_STAT_OUTPUT_FLAG_CTS = +#POINT_STAT_OUTPUT_FLAG_MCTC = +#POINT_STAT_OUTPUT_FLAG_MCTS = +#POINT_STAT_OUTPUT_FLAG_CNT = +POINT_STAT_OUTPUT_FLAG_SL1L2 = STAT +#POINT_STAT_OUTPUT_FLAG_SAL1L2 = +POINT_STAT_OUTPUT_FLAG_VL1L2 = STAT +#POINT_STAT_OUTPUT_FLAG_VAL1L2 = +#POINT_STAT_OUTPUT_FLAG_VCNT = +#POINT_STAT_OUTPUT_FLAG_PCT = +#POINT_STAT_OUTPUT_FLAG_PSTD = +#POINT_STAT_OUTPUT_FLAG_PJC = +#POINT_STAT_OUTPUT_FLAG_PRC = +#POINT_STAT_OUTPUT_FLAG_ECNT = +#POINT_STAT_OUTPUT_FLAG_RPS = +#POINT_STAT_OUTPUT_FLAG_ECLV = +POINT_STAT_OUTPUT_FLAG_MPR = STAT +#POINT_STAT_OUTPUT_FLAG_ORANK = + +#POINT_STAT_CLIMO_CDF_BINS = 1 +#POINT_STAT_CLIMO_CDF_CENTER_BINS = False +#POINT_STAT_CLIMO_CDF_WRITE_BINS = True +#POINT_STAT_CLIMO_CDF_DIRECT_PROB = + +#POINT_STAT_HSS_EC_VALUE = + +OBS_POINT_STAT_WINDOW_BEGIN = -3600 +OBS_POINT_STAT_WINDOW_END = 3600 + +POINT_STAT_OFFSETS = 0 + +MODEL = HRRR + +POINT_STAT_DESC = {PY_SOUNDING_FLAG}_{PY_PT_DELTA} +OBTYPE = + +POINT_STAT_REGRID_TO_GRID = NONE +POINT_STAT_REGRID_METHOD = BILIN +POINT_STAT_REGRID_WIDTH = 2 + +POINT_STAT_OUTPUT_PREFIX = {custom?fmt=%s}_{PY_SOUNDING_FLAG}_{PY_PT_DELTA} + +#POINT_STAT_OBS_VALID_BEG = {valid?fmt=%Y%m%d_%H} +#POINT_STAT_OBS_VALID_END = {valid?fmt=%Y%m%d_%H} + +#POINT_STAT_MASK_GRID = FULL +#POINT_STAT_MASK_POLY = +POINT_STAT_MASK_GRID = +POINT_STAT_MASK_POLY = {INPUT_BASE}/model_applications/pbl/met_mask_{custom?fmt=%s}_100km.nc +POINT_STAT_MASK_SID = +#POINT_STAT_MASK_LLPNT = + +POINT_STAT_MESSAGE_TYPE = ADPSFC + +#POINT_STAT_HIRA_FLAG = +#POINT_STAT_HIRA_WIDTH = +#POINT_STAT_HIRA_VLD_THRESH = +#POINT_STAT_HIRA_COV_THRESH = +#POINT_STAT_HIRA_SHAPE = +#POINT_STAT_HIRA_PROB_CAT_THRESH = + +#POINT_STAT_MESSAGE_TYPE_GROUP_MAP = + +# INFO TO PASS TO PYTHON SCRIPT +[user_env_vars] + +AIRPORT = {custom?fmt=%s} +SOUNDING_FLAG = {PY_SOUNDING_FLAG} +PT_DELTA = {PY_PT_DELTA} +VAL_TIME = {PY_VAL_TIME} diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py new file mode 100644 index 0000000000..51daecb048 --- /dev/null +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py @@ -0,0 +1,220 @@ +''' +This script reads AMDAR hourly netcdf files, computes PBLH, and sends 11-column ascii table to MET for point-stat +See accompanying PointStat_python_embedding_obs_amdar_pblh.conf for settings and passing in env variables here +Jason M. English, May 2023 +''' + +import os +import sys +import pandas as pd +import numpy as np +import netCDF4 as nc +from met_point_obs import convert_point_data + +# silence this annoying warning about numpy bool being deprecated in favor of python bool +from warnings import filterwarnings +filterwarnings(action='ignore', category=DeprecationWarning, message='`np.bool` is a deprecated alias') + +######################################################################## + +print("Python Script:\t" + repr(sys.argv[0])) + +## +## input file specified on the command line +## load the data into the numpy array +## + +loc_name = os.environ.get('AIRPORT') # "DENVER", "DALLAS", "BOSTON", "MINNEAPOLIS" # airport, not city +sf_include = os.environ.get('SOUNDING_FLAG') # what sounding flags to include: ASC or DESC +pt_delta = float(os.environ.get('PT_DELTA')) #1.25 # potential temperature delta that triggers PBLH calculation (K) +val_time = os.environ.get('VAL_TIME') # valid time for this call (nearest hour) +rbox = 2.0 # +/- deg; set bigger than you need so MET mask can cut from that later +alt_base = 200. # highest altitude where the alt min is looked for to get base potential temperature +gap_max = 400. # maximum allowable altitude gap (m) between the computed PBLH and the altitude of the data point below it (gap_max + pblh/20) +alt_dp = 4 # minimum number of data points for the flight to be considered +alt_adj = "yes" # adjust minimum altitude to be >= 0 yes or no +out_rej = 2 # number of sigmas to trigger outlier reject + +if loc_name == "DENVER": + gnd0 = 5300.*0.3048 # surface elevation at location (msl); DIA is at 5430ft but up to 300 feet lower than that within 500m of the airport + lat0 = 39.856 + lon0 = -104.6764 +elif loc_name == "DALLAS": + gnd0 = 550.*0.3048 + lat0 = 32.8998 + lon0 = -97.0403 +elif loc_name == "MINNEAPOLIS": + gnd0 = 840.*0.3048 + lat0 = 44.8848 + lon0 = -93.2223 +elif loc_name == "BOSTON": + gnd0 = 20.*0.3048 + lat0 = 42.3656 + lon0 = -71.0096 + +# convert tail number array to readable character string +def get_tn(tn): + tnc = tn.astype(str) # convert to character string + tnc = np.char.array(tnc) # removes whitespace and allows vectorized string operations + tnc_splice = tnc[:,0]+tnc[:,1]+tnc[:,2]+tnc[:,3]+tnc[:,4]+tnc[:,5]+tnc[:,6]+tnc[:,7]+tnc[:,8] # tail number spliced into a single string + return tnc_splice + +if len(sys.argv) != 2: + print("ERROR: calc_amdar_pblh.py -> Must specify exactly one input file.") + sys.exit(1) + +# Read the input file as the first argument +input_file = os.path.expandvars(sys.argv[1]) +try: + print("Input File:\t" + repr(input_file)) + ncf = nc.Dataset(input_file) + + tn = ncf['tailNumber'][:] + sf = ncf['sounding_flag'][:] # -1=descent, 0=cruising, 1=ascent + t = ncf['temperature'][:] + alt = ncf['altitude'][:] - gnd0 # subtract surface height to get AGL + lat = ncf['latitude'][:] + lon = ncf['longitude'][:] + ncf.close() + + # set to NaN if cruising flight (not ascent or descent) + t = np.where(sf == 0, np.nan, t) + if sf_include == "ASC": + t = np.where(sf == -1, np.nan, t) # discard descents + if sf_include == "DESC": + t = np.where(sf == 1, np.nan, t) # discard ascents + + # set to NaN if outside alt, lat/lon bounds + t = np.where((lat > lat0-rbox) & (lat < lat0+rbox) & (lon > lon0-rbox ) & (lon < lon0+rbox), t, np.nan) + + # convert tail number array to readable character string + tns = get_tn(tn) + + # set tail number array to NaN wherever temperature array is NaN + tns = np.where(np.isnan(t), np.nan, tns) + + # get unique tail numbers within the specified lat/lon range + tn_list = np.unique(tns) + nflight = tn_list.size + + # Create arrays for saving PBLH and other fields for each flight + pblh = np.full([nflight],np.nan) + pblh_o = np.full([nflight],np.nan) #pblh interpolated with outliers excluded + pt_min = np.full([nflight],np.nan) # potential temperature minimum + lat_avg = np.full([nflight],np.nan) + lon_avg = np.full([nflight],np.nan) + + for i,tn_name in enumerate(tn_list): #loop through tail numbers + + if tn_name != "nan": + tn_arr = np.where(tns == tn_name, tns, 'null') # set array to null if it doesn't this tail number + tn_ind = np.where(tns == tn_arr) # get list of indices + + # take the elements from each array ing only this flight (via the specified indices) + tn_i = np.squeeze(np.take(tn_arr, tn_ind)) + sf_i = np.squeeze(np.take(sf, tn_ind)) + t_i = np.squeeze(np.take(t, tn_ind)) + alt_i = np.squeeze(np.take(alt, tn_ind)) + lat_i = np.squeeze(np.take(lat, tn_ind)) + lon_i = np.squeeze(np.take(lon, tn_ind)) + + # only include ascents/descents that have enough altitude/temperature data + if (np.amin(alt_i) < alt_base) & (np.amax(alt_i) > alt_base) & (alt_i.size >= alt_dp): + + # sort altitude and temperature arrays to be ascending + sort_inds = np.argsort(alt_i) + t_d = np.copy(t_i[sort_inds]) + alt_d = np.copy(alt_i[sort_inds]) + lat_d = np.copy(lat_i[sort_inds]) + lon_d = np.copy(lon_i[sort_inds]) + + # adjust altitude minimum to zero if it's negative + if alt_adj == "yes": + if np.nanmin(alt_d) < 0: + alt_d[:] = alt_d[:] - np.nanmin(alt_d) + + # convert altitude to pressure + slp = 101325. # Sea level pressure (Pa) + expon = (-9.80665 *0.0289644) / (8.31432 * -0.0065) + p_d = slp * (1. - (alt_d + gnd0)/44307.694)**expon # needs to be pressure altitude (add ground ht) + + # convert temperature to potential temperature + pt_d = np.copy(t_d) + pt_d[:] = t_d[:] * (slp/p_d[:])**0.286 + + # Find minimum potential temperature that occurs below the specified altitude alt_base + pt_min[i] = np.nanmin(np.where(alt_d < alt_base, pt_d, np.nan)) + pt_min_ind = np.where(pt_d == pt_min[i])[0][0] # find array indexing that value + + # Only move forward if minimum PT is within a reasonable range + if (pt_min[i] > 0) & (pt_min[i] < 3040): + + # consider only potential temperature values above where pt_min was found when searching for pblh + alt_d[:pt_min_ind] = np.nan + pt_d[:pt_min_ind] = np.nan + pt_dif = np.copy(pt_d) + pt_dif[:] = pt_d[:] - pt_min[i] + + # determine lowest height that exceeds the specified pt_delta (K) + if np.nanmax(pt_d) >= (pt_min[i]+pt_delta): # make sure it exists in this profile + pblh_alt = np.nanmin(np.where(pt_d >= (pt_min[i]+pt_delta),alt_d, np.nan)) + pblh_ind = np.where(alt_d == pblh_alt)[0][0] # altitude index where pblh is found + + # only include pblh if the altitude below it isn't too big of a gap + if pblh_ind.size == 1: # make sure only 1 index was found + alt_gap = alt_d[pblh_ind]-alt_d[pblh_ind-1] + + if alt_gap < (gap_max + alt_d[pblh_ind]/20.): + pblh[i] = alt_d[pblh_ind] + + # linear interpolate PBLH between this data point and the one below it + pblh[i] = np.interp((pt_min[i]+pt_delta), pt_d[pblh_ind-1:pblh_ind+1], alt_d[pblh_ind-1:pblh_ind+1]) + + # compute lat/lon for this flight by taking the avg lat/lon coordiantes over the flight + lat_avg[i] = np.average(lat_i) + lon_avg[i] = np.average(lon_i) + + print("tn=", tn_i[0], ", sf=", sf_include, ", n=", pt_d.size, ", pt_min (K)=", np.array2string(pt_min[i]), + ", pblh interp (m)=", np.array2string(pblh[i]), ", pblh closest (m)=", np.array2string(pblh[i])) + +######################################################################## + + # Now that all flights at this hour have been computed, conduct statistics and averaging on them + if np.count_nonzero(~np.isnan(pblh)) > 0: + pblh_o[:] = np.where((pblh >= np.nanmean(pblh)-float(out_rej)*np.nanstd(pblh)) & + (pblh <= np.nanmean(pblh)+float(out_rej)*np.nanstd(pblh)), pblh, np.nan) + + # only include flights with a computed PBLH value + lat_avg[np.isnan(pblh_o)] = np.nan + lon_avg[np.isnan(pblh_o)] = np.nan + pblh_o = pblh_o[~np.isnan(pblh_o)] + lat_avg= lat_avg[~np.isnan(lat_avg)] + lon_avg= lon_avg[~np.isnan(lon_avg)] + + # Read and format the input 11-column observations: + # (1) string: Message_Type ('ADPSFC') + # (2) string: Station_ID (AIRPORT) + # (3) string: Valid_Time(YYYYMMDD_HHMMSS) + # (4) numeric: Lat(Deg North) + # (5) numeric: Lon(Deg East) + # (6) numeric: Elevation(msl) + # (7) string: Var_Name(or GRIB_Code) + # (8) numeric: Level + # (9) numeric: Height(msl or agl) + # (10) string: QC_String + # (11) numeric: Observation_Value + + point_data = pd.DataFrame({'typ':'ADPSFC', 'sid':loc_name, 'vld':val_time, + 'lat':lat_avg, 'lon':lon_avg, 'elv':gnd0, 'var':'HPBL', + 'lvl':0, 'hgt':0, 'qc':'AMDAR', 'obs':pblh_o}) + + print(point_data) + print(" point_data: Data Length:\t" + repr(len(point_data))) + print(" point_data: Data Type:\t" + repr(type(point_data))) + print(point_data.values.tolist()) + met_point_data = convert_point_data(point_data.values.tolist()) + print(" met_point_data: Data Type:\t" + repr(type(met_point_data))) + +except NameError: + print("Can't find the input file") + sys.exit(1) From dd13e9f8cd730adaaacf659defd80ac24755b0ae Mon Sep 17 00:00:00 2001 From: Jason English Date: Thu, 8 Jun 2023 00:33:47 +0000 Subject: [PATCH 02/23] adding quicksearch --- docs/Users_Guide/quicksearch.rst | 2 ++ .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/Users_Guide/quicksearch.rst b/docs/Users_Guide/quicksearch.rst index 7fca01c204..da97828504 100644 --- a/docs/Users_Guide/quicksearch.rst +++ b/docs/Users_Guide/quicksearch.rst @@ -78,6 +78,7 @@ Use Cases by Application: | `Land Surface <../search.html?q=LandSurfaceAppUseCase&check_keywords=yes&area=default>`_ | `Marine and Cryosphere <../search.html?q=MarineAndCryosphereAppUseCase&check_keywords=yes&area=default>`_ | `Medium Range <../search.html?q=MediumRangeAppUseCase&check_keywords=yes&area=default>`_ + | `PBL <../search.html?q=PBLAppUseCase&check_keywords=yes&area=default>`_ | `Precipitation <../search.html?q=PrecipitationAppUseCase&check_keywords=yes&area=default>`_ | `Space Weather <../search.html?q=SpaceWeatherAppUseCase&check_keywords=yes&area=default>`_ | `Subseasonal to Seasonal <../search.html?q=S2SAppUseCase&check_keywords=yes&area=default>`_ @@ -95,6 +96,7 @@ Use Cases by Application: | **LandSurface**: *LandSurfaceAppUseCase* | **Marine and Cryosphere**: *MarineAndCryosphereAppUseCase* | **Medium Range**: *MediumRangeAppUseCase* + | **PBL**: *PBLAppUseCase* | **Precipitation**: *PrecipitationAppUseCase* | **Space Weather**: *SpaceWeatherAppUseCase* | **Subseasonal to Seasonal**: *S2SAppUseCase* diff --git a/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py b/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py index 362c053c96..be99c36daf 100644 --- a/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py +++ b/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py @@ -143,7 +143,7 @@ # * GenVxMaskToolUseCase # * PointStatToolUseCase # * PythonEmbeddingFileUseCase -# * pblAppUseCase +# * PBLAppUseCase # # Navigate to the :ref:`quick-search` page to discover other similar use cases. # From 606bc1b573a3a6c44657df5e8d2b595bed128b6c Mon Sep 17 00:00:00 2001 From: Jason English Date: Thu, 8 Jun 2023 18:02:32 +0000 Subject: [PATCH 03/23] fixed underline length in doc file --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py b/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py index be99c36daf..e6e2b5372e 100644 --- a/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py +++ b/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py @@ -1,6 +1,6 @@ """ GenVxMask and Point-Stat: Computing PBLH from AMDAR data using "Theta-increase" method -============================================== +====================================================================================== model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf From 98d355c2defae52044a81b6e9f31e5cb167a9867 Mon Sep 17 00:00:00 2001 From: Jason English Date: Thu, 8 Jun 2023 21:19:26 +0000 Subject: [PATCH 04/23] fixed error in default masking radius --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index abd6174e64..a723e2aafb 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -99,7 +99,7 @@ OBS_VAR1_OPTIONS = set_attr_units = "m" ### GEN_VX_MASK_SKIP_IF_OUTPUT_EXISTS = True -GEN_VX_MASK_OPTIONS = -type "circle" -thresh le50 +GEN_VX_MASK_OPTIONS = -type "circle" -thresh le100 # PointStat Settings # https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pointstat From ada08e94fa0061289e448eb58cbbc853f1563f5d Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Thu, 8 Jun 2023 16:49:08 -0600 Subject: [PATCH 05/23] Setting the new use case to run in the automated tests for now. --- .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 e2fe75cfe9..096dddd6d9 100644 --- a/.github/parm/use_case_groups.json +++ b/.github/parm/use_case_groups.json @@ -127,7 +127,7 @@ { "category": "pbl", "index_list": "0", - "run": false + "run": true }, { "category": "precipitation", From 1798cdb2ffca8557fc84c42fc4d8eb3abe29e205 Mon Sep 17 00:00:00 2001 From: Jason English Date: Fri, 9 Jun 2023 15:28:16 +0000 Subject: [PATCH 06/23] changed OBS path in conf file --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index a723e2aafb..60dcae91cb 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -62,7 +62,7 @@ FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/pbl FCST_POINT_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} OBS_POINT_STAT_INPUT_DIR = -OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py {INPUT_BASE}/model_applications/pbl/22{valid?fmt=%j}{valid?fmt=%H}00q.cdf +OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/22{valid?fmt=%j}{valid?fmt=%H}00q.cdf POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/point_stat_pblh POINT_STAT_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d} From 226dd4820828f2cc377505011848cb222e0fbc12 Mon Sep 17 00:00:00 2001 From: Jason English Date: Fri, 9 Jun 2023 16:45:42 +0000 Subject: [PATCH 07/23] fixed FCST and mask subdirectories too --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index 60dcae91cb..270679ec4e 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -50,15 +50,15 @@ PY_VAL_TIME = {valid?fmt=%Y%m%d_%H0000} # https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info ### -GEN_VX_MASK_INPUT_DIR = {INPUT_BASE}/model_applications/pbl +GEN_VX_MASK_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed GEN_VX_MASK_INPUT_TEMPLATE = pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/pbl GEN_VX_MASK_INPUT_MASK_TEMPLATE = met_mask_{custom?fmt=%s}.txt -GEN_VX_MASK_OUTPUT_DIR = {INPUT_BASE}/model_applications/pbl +GEN_VX_MASK_OUTPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed GEN_VX_MASK_OUTPUT_TEMPLATE = {INPUT_BASE}/model_applications/pbl/met_mask_{custom?fmt=%s}_100km.nc -FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/pbl +FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed FCST_POINT_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} OBS_POINT_STAT_INPUT_DIR = @@ -170,7 +170,7 @@ POINT_STAT_OUTPUT_PREFIX = {custom?fmt=%s}_{PY_SOUNDING_FLAG}_{PY_PT_DELTA} #POINT_STAT_MASK_GRID = FULL #POINT_STAT_MASK_POLY = POINT_STAT_MASK_GRID = -POINT_STAT_MASK_POLY = {INPUT_BASE}/model_applications/pbl/met_mask_{custom?fmt=%s}_100km.nc +POINT_STAT_MASK_POLY = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/met_mask_{custom?fmt=%s}_100km.nc POINT_STAT_MASK_SID = #POINT_STAT_MASK_LLPNT = From 8b83ebef4b4f3a4759c1de606577060793679295 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 9 Jun 2023 11:32:01 -0600 Subject: [PATCH 08/23] Missing file suffix for NetCDF file for GenVxMask ci-skip-unit-tests ci-skip-use-cases. --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index 270679ec4e..4fecb09520 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -51,7 +51,7 @@ PY_VAL_TIME = {valid?fmt=%Y%m%d_%H0000} ### GEN_VX_MASK_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed -GEN_VX_MASK_INPUT_TEMPLATE = pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} +GEN_VX_MASK_INPUT_TEMPLATE = pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH}.nc GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/pbl GEN_VX_MASK_INPUT_MASK_TEMPLATE = met_mask_{custom?fmt=%s}.txt From 872548f15c54d9f1d8491e6e57ac3fa63c5e803f Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 9 Jun 2023 11:54:26 -0600 Subject: [PATCH 09/23] Missing dated subdirectory for GenVxMask input file. --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index 4fecb09520..9e097ed6db 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -50,7 +50,7 @@ PY_VAL_TIME = {valid?fmt=%Y%m%d_%H0000} # https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info ### -GEN_VX_MASK_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed +GEN_VX_MASK_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/{init?fmt=%Y%m%d%H} GEN_VX_MASK_INPUT_TEMPLATE = pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH}.nc GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/pbl GEN_VX_MASK_INPUT_MASK_TEMPLATE = met_mask_{custom?fmt=%s}.txt From a06897b86a4a120d4f04f296b92c3acb985aaf0f Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 9 Jun 2023 13:43:30 -0600 Subject: [PATCH 10/23] Mistakenly thought the file suffix was missing but in reality a subdirectory was missing. Trying again. --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index 9e097ed6db..9451d5e0a5 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -51,7 +51,7 @@ PY_VAL_TIME = {valid?fmt=%Y%m%d_%H0000} ### GEN_VX_MASK_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/{init?fmt=%Y%m%d%H} -GEN_VX_MASK_INPUT_TEMPLATE = pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH}.nc +GEN_VX_MASK_INPUT_TEMPLATE = pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/pbl GEN_VX_MASK_INPUT_MASK_TEMPLATE = met_mask_{custom?fmt=%s}.txt From 7780ecfc070ccdce2e61b42fe0fce66018c30269 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Mon, 12 Jun 2023 08:20:38 -0600 Subject: [PATCH 11/23] More changes to try and get GenVxMask to work. --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index 9451d5e0a5..7c841e84bd 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -52,11 +52,11 @@ PY_VAL_TIME = {valid?fmt=%Y%m%d_%H0000} GEN_VX_MASK_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/{init?fmt=%Y%m%d%H} GEN_VX_MASK_INPUT_TEMPLATE = pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} -GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/pbl +GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed GEN_VX_MASK_INPUT_MASK_TEMPLATE = met_mask_{custom?fmt=%s}.txt GEN_VX_MASK_OUTPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed -GEN_VX_MASK_OUTPUT_TEMPLATE = {INPUT_BASE}/model_applications/pbl/met_mask_{custom?fmt=%s}_100km.nc +GEN_VX_MASK_OUTPUT_TEMPLATE = {OUTPUT_BASE}/gen_vx_mas_pblh/met_mask_{custom?fmt=%s}_100km.nc FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed FCST_POINT_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} @@ -170,7 +170,7 @@ POINT_STAT_OUTPUT_PREFIX = {custom?fmt=%s}_{PY_SOUNDING_FLAG}_{PY_PT_DELTA} #POINT_STAT_MASK_GRID = FULL #POINT_STAT_MASK_POLY = POINT_STAT_MASK_GRID = -POINT_STAT_MASK_POLY = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/met_mask_{custom?fmt=%s}_100km.nc +POINT_STAT_MASK_POLY = {OUTPUT_BASE}/gen_vx_mask_pblh/met_mask_{custom?fmt=%s}_100km.nc POINT_STAT_MASK_SID = #POINT_STAT_MASK_LLPNT = From a4ce0ac6641c1bf6a5127366b27479de279875ad Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Mon, 12 Jun 2023 08:42:15 -0600 Subject: [PATCH 12/23] Typo in GEN_VX_MASK_OUTPUT_TEMPLATE. --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index 7c841e84bd..d25e870f30 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -56,7 +56,7 @@ GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstH GEN_VX_MASK_INPUT_MASK_TEMPLATE = met_mask_{custom?fmt=%s}.txt GEN_VX_MASK_OUTPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed -GEN_VX_MASK_OUTPUT_TEMPLATE = {OUTPUT_BASE}/gen_vx_mas_pblh/met_mask_{custom?fmt=%s}_100km.nc +GEN_VX_MASK_OUTPUT_TEMPLATE = {OUTPUT_BASE}/gen_vx_mask_pblh/met_mask_{custom?fmt=%s}_100km.nc FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed FCST_POINT_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} From 4eeb44225e0307fb63f13ec6a0a540ef8ae1f923 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Mon, 12 Jun 2023 09:18:33 -0600 Subject: [PATCH 13/23] We don't need to import the met_point_obs class anymore. --- .../PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py index 51daecb048..c25a1e9bb2 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py @@ -9,7 +9,7 @@ import pandas as pd import numpy as np import netCDF4 as nc -from met_point_obs import convert_point_data +#from met_point_obs import convert_point_data # silence this annoying warning about numpy bool being deprecated in favor of python bool from warnings import filterwarnings From f58cccbc338fbe71824db66eff6946907f017650 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Tue, 13 Jun 2023 10:48:14 -0600 Subject: [PATCH 14/23] Changes the Python Embedding script to point to the one for the use case, and not in the data directory. The one from the sample data tarball has been removed. --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index d25e870f30..90b64b9b69 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -62,7 +62,7 @@ FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHR FCST_POINT_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} OBS_POINT_STAT_INPUT_DIR = -OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/22{valid?fmt=%j}{valid?fmt=%H}00q.cdf +OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {PARM_BASE}/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/22{valid?fmt=%j}{valid?fmt=%H}00q.cdf POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/point_stat_pblh POINT_STAT_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d} From f436d82db9cd134b8e86ccf0c2fd4c5763616566 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Tue, 13 Jun 2023 12:14:48 -0600 Subject: [PATCH 15/23] point_stat should work with an object named point_data and convert it if needed. --- .../calc_amdar_pblh.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py index c25a1e9bb2..b9d767c14b 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py @@ -212,8 +212,8 @@ def get_tn(tn): print(" point_data: Data Length:\t" + repr(len(point_data))) print(" point_data: Data Type:\t" + repr(type(point_data))) print(point_data.values.tolist()) - met_point_data = convert_point_data(point_data.values.tolist()) - print(" met_point_data: Data Type:\t" + repr(type(met_point_data))) + #met_point_data = convert_point_data(point_data.values.tolist()) + #print(" met_point_data: Data Type:\t" + repr(type(met_point_data))) except NameError: print("Can't find the input file") From 8390c11d3332755347c399ace119edfb0050b8a5 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Tue, 13 Jun 2023 12:26:45 -0600 Subject: [PATCH 16/23] Convert to proper object. --- .../PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py index b9d767c14b..d487c78cfd 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py @@ -206,7 +206,7 @@ def get_tn(tn): point_data = pd.DataFrame({'typ':'ADPSFC', 'sid':loc_name, 'vld':val_time, 'lat':lat_avg, 'lon':lon_avg, 'elv':gnd0, 'var':'HPBL', - 'lvl':0, 'hgt':0, 'qc':'AMDAR', 'obs':pblh_o}) + 'lvl':0, 'hgt':0, 'qc':'AMDAR', 'obs':pblh_o}).values.tolist() print(point_data) print(" point_data: Data Length:\t" + repr(len(point_data))) From 5074c08839e8d925dfc20807494358d1dbd5a5ad Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Tue, 13 Jun 2023 12:38:51 -0600 Subject: [PATCH 17/23] Forgot to remove print statement for wrong object. --- .../PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py index d487c78cfd..bee6235a60 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py @@ -211,7 +211,7 @@ def get_tn(tn): print(point_data) print(" point_data: Data Length:\t" + repr(len(point_data))) print(" point_data: Data Type:\t" + repr(type(point_data))) - print(point_data.values.tolist()) + #print(point_data.values.tolist()) #met_point_data = convert_point_data(point_data.values.tolist()) #print(" met_point_data: Data Type:\t" + repr(type(met_point_data))) From cd77e9b282f8965ba92a7a582e524e5b36d11dba Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Tue, 13 Jun 2023 13:37:16 -0600 Subject: [PATCH 18/23] Removes old code not needed with the latest version of MET. --- .../calc_amdar_pblh.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py index bee6235a60..7c4a810caa 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py @@ -9,7 +9,6 @@ import pandas as pd import numpy as np import netCDF4 as nc -#from met_point_obs import convert_point_data # silence this annoying warning about numpy bool being deprecated in favor of python bool from warnings import filterwarnings @@ -211,9 +210,6 @@ def get_tn(tn): print(point_data) print(" point_data: Data Length:\t" + repr(len(point_data))) print(" point_data: Data Type:\t" + repr(type(point_data))) - #print(point_data.values.tolist()) - #met_point_data = convert_point_data(point_data.values.tolist()) - #print(" met_point_data: Data Type:\t" + repr(type(met_point_data))) except NameError: print("Can't find the input file") From fbaf765309fbf2e0e0c9db1e9fb7b3c8d2d3ee91 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 16 Jun 2023 12:35:35 -0600 Subject: [PATCH 19/23] Moves time formatting into a template configuration item instead of a dir configuration item. --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index 90b64b9b69..c73a696018 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -50,8 +50,8 @@ PY_VAL_TIME = {valid?fmt=%Y%m%d_%H0000} # https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info ### -GEN_VX_MASK_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/{init?fmt=%Y%m%d%H} -GEN_VX_MASK_INPUT_TEMPLATE = pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} +GEN_VX_MASK_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed +GEN_VX_MASK_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed GEN_VX_MASK_INPUT_MASK_TEMPLATE = met_mask_{custom?fmt=%s}.txt From 3bc07c99420d59f2811396c55ba67e59daf262e5 Mon Sep 17 00:00:00 2001 From: Jason English Date: Wed, 5 Jul 2023 21:25:47 +0000 Subject: [PATCH 20/23] docs typos and cleaned up conf file including new mask radius variable --- ...ointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py | 4 +- ...ntStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 63 ++----------------- 2 files changed, 8 insertions(+), 59 deletions(-) diff --git a/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py b/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py index e6e2b5372e..16facb9de8 100644 --- a/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py +++ b/docs/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.py @@ -34,8 +34,8 @@ # # This use case utilizes GenVxMask and the METplus PointStat tool to compare PBLH # from AMDAR data to model output. The python embedding script "calc_amdar_pblh.py" -# computes PBLH and sends ascii table to MET. The configuration file also filters -# output through statics geographic masks generated by GenVxMask. +# computes PBLH and sends data MET via python embedding. The configuration file also filters +# output through static geographic masks generated by GenVxMask. # ############################################################################## diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index c73a696018..a65d30d31b 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -1,7 +1,7 @@ [config] # Documentation for this use case can be found at -# https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/PointStat/PointStat_python_embedding_obs.html +# https://metplus.readthedocs.io/en/latest/generated/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.html#sphx-glr-generated-model-applications-pbl-pointstat-fcsthrrr-obsamdar-pblh-pyembed-py # For additional information, please see the METplus Users Guide. # https://metplus.readthedocs.io/en/latest/Users_Guide @@ -28,18 +28,16 @@ LOOP_BY = INIT INIT_TIME_FMT = %Y%m%d%H INIT_BEG = 2022070108 INIT_END = 2022070108 -#INIT_BEG = 2022070701 -#INIT_END = 2022073123 INIT_INCREMENT = 1H LEAD_SEQ = 12 -#LEAD_SEQ = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 # USER SETTINGS HERE # CUSTOM_LOOP_LIST = DENVER, DALLAS, BOSTON, MINNEAPOLIS [list of airports sepearated by commas; each needs a mask file] # PY_SOUNDING_FLAG = ALL, ASC, DESC [only one value here] # PY_PT_DELTA = Potential Temperature delta setting (K) [usually 1.0-2.5] # Valid_Time(YYYYMMDD_HHMMSS) +GEN_VX_MASK_AIRPORT_RADIUS_KM = 100 CUSTOM_LOOP_LIST = DENVER PY_SOUNDING_FLAG = ALL PY_PT_DELTA = 1.25 @@ -56,13 +54,13 @@ GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstH GEN_VX_MASK_INPUT_MASK_TEMPLATE = met_mask_{custom?fmt=%s}.txt GEN_VX_MASK_OUTPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed -GEN_VX_MASK_OUTPUT_TEMPLATE = {OUTPUT_BASE}/gen_vx_mask_pblh/met_mask_{custom?fmt=%s}_100km.nc +GEN_VX_MASK_OUTPUT_TEMPLATE = {OUTPUT_BASE}/gen_vx_mask_pblh/met_mask_{custom?fmt=%s}_{GEN_VX_MASK_AIRPORT_RADIUS_KM}km.nc FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed FCST_POINT_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} OBS_POINT_STAT_INPUT_DIR = -OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {PARM_BASE}/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/22{valid?fmt=%j}{valid?fmt=%H}00q.cdf +OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/22{valid?fmt=%j}{valid?fmt=%H}00q.cdf POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/point_stat_pblh POINT_STAT_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d} @@ -81,9 +79,6 @@ POINT_STAT_CLIMO_STDEV_INPUT_TEMPLATE = POINT_STAT_ONCE_PER_FIELD = False -#POINT_STAT_FCST_FILE_TYPE = -#POINT_STAT_OBS_FILE_TYPE = - FCST_VAR1_NAME = HPBL FCST_VAR1_LEVELS = L0 FCST_VAR1_THRESH = <=0, >10000 @@ -99,7 +94,7 @@ OBS_VAR1_OPTIONS = set_attr_units = "m" ### GEN_VX_MASK_SKIP_IF_OUTPUT_EXISTS = True -GEN_VX_MASK_OPTIONS = -type "circle" -thresh le100 +GEN_VX_MASK_OPTIONS = -type "circle" -thresh le{GEN_VX_MASK_AIRPORT_RADIUS_KM} # PointStat Settings # https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pointstat @@ -109,44 +104,13 @@ LOG_POINT_STAT_VERBOSITY = 4 POINT_STAT_CONFIG_FILE ={PARM_BASE}/met_config/PointStatConfig_wrapped -#POINT_STAT_OBS_QUALITY_INC = 1, 2, 3 -#POINT_STAT_OBS_QUALITY_EXC = - POINT_STAT_CLIMO_MEAN_TIME_INTERP_METHOD = NEAREST -#POINT_STAT_CLIMO_STDEV_TIME_INTERP_METHOD = - -#POINT_STAT_INTERP_VLD_THRESH = -#POINT_STAT_INTERP_SHAPE = POINT_STAT_INTERP_TYPE_METHOD = BILIN POINT_STAT_INTERP_TYPE_WIDTH = 2 -#POINT_STAT_OUTPUT_FLAG_FHO = -#POINT_STAT_OUTPUT_FLAG_CTC = -#POINT_STAT_OUTPUT_FLAG_CTS = -#POINT_STAT_OUTPUT_FLAG_MCTC = -#POINT_STAT_OUTPUT_FLAG_MCTS = -#POINT_STAT_OUTPUT_FLAG_CNT = POINT_STAT_OUTPUT_FLAG_SL1L2 = STAT -#POINT_STAT_OUTPUT_FLAG_SAL1L2 = POINT_STAT_OUTPUT_FLAG_VL1L2 = STAT -#POINT_STAT_OUTPUT_FLAG_VAL1L2 = -#POINT_STAT_OUTPUT_FLAG_VCNT = -#POINT_STAT_OUTPUT_FLAG_PCT = -#POINT_STAT_OUTPUT_FLAG_PSTD = -#POINT_STAT_OUTPUT_FLAG_PJC = -#POINT_STAT_OUTPUT_FLAG_PRC = -#POINT_STAT_OUTPUT_FLAG_ECNT = -#POINT_STAT_OUTPUT_FLAG_RPS = -#POINT_STAT_OUTPUT_FLAG_ECLV = POINT_STAT_OUTPUT_FLAG_MPR = STAT -#POINT_STAT_OUTPUT_FLAG_ORANK = - -#POINT_STAT_CLIMO_CDF_BINS = 1 -#POINT_STAT_CLIMO_CDF_CENTER_BINS = False -#POINT_STAT_CLIMO_CDF_WRITE_BINS = True -#POINT_STAT_CLIMO_CDF_DIRECT_PROB = - -#POINT_STAT_HSS_EC_VALUE = OBS_POINT_STAT_WINDOW_BEGIN = -3600 OBS_POINT_STAT_WINDOW_END = 3600 @@ -164,27 +128,12 @@ POINT_STAT_REGRID_WIDTH = 2 POINT_STAT_OUTPUT_PREFIX = {custom?fmt=%s}_{PY_SOUNDING_FLAG}_{PY_PT_DELTA} -#POINT_STAT_OBS_VALID_BEG = {valid?fmt=%Y%m%d_%H} -#POINT_STAT_OBS_VALID_END = {valid?fmt=%Y%m%d_%H} - -#POINT_STAT_MASK_GRID = FULL -#POINT_STAT_MASK_POLY = POINT_STAT_MASK_GRID = -POINT_STAT_MASK_POLY = {OUTPUT_BASE}/gen_vx_mask_pblh/met_mask_{custom?fmt=%s}_100km.nc +POINT_STAT_MASK_POLY = {OUTPUT_BASE}/gen_vx_mask_pblh/met_mask_{custom?fmt=%s}_{GEN_VX_MASK_AIRPORT_RADIUS_KM}km.nc POINT_STAT_MASK_SID = -#POINT_STAT_MASK_LLPNT = POINT_STAT_MESSAGE_TYPE = ADPSFC -#POINT_STAT_HIRA_FLAG = -#POINT_STAT_HIRA_WIDTH = -#POINT_STAT_HIRA_VLD_THRESH = -#POINT_STAT_HIRA_COV_THRESH = -#POINT_STAT_HIRA_SHAPE = -#POINT_STAT_HIRA_PROB_CAT_THRESH = - -#POINT_STAT_MESSAGE_TYPE_GROUP_MAP = - # INFO TO PASS TO PYTHON SCRIPT [user_env_vars] From 00d086ccb407d2c117b06400bf5ea2fac5a9ee08 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Wed, 5 Jul 2023 16:06:00 -0600 Subject: [PATCH 21/23] Changed INPUT_BASE back to PARM_BASE for Python script, and removed erroneous URL info from copying from the web browser. --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index a65d30d31b..9f27e8856c 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -1,7 +1,7 @@ [config] # Documentation for this use case can be found at -# https://metplus.readthedocs.io/en/latest/generated/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.html#sphx-glr-generated-model-applications-pbl-pointstat-fcsthrrr-obsamdar-pblh-pyembed-py +# https://metplus.readthedocs.io/en/latest/generated/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.html # For additional information, please see the METplus Users Guide. # https://metplus.readthedocs.io/en/latest/Users_Guide @@ -60,7 +60,7 @@ FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHR FCST_POINT_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} OBS_POINT_STAT_INPUT_DIR = -OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/22{valid?fmt=%j}{valid?fmt=%H}00q.cdf +OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {PARM_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/22{valid?fmt=%j}{valid?fmt=%H}00q.cdf POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/point_stat_pblh POINT_STAT_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d} From 01b39c600b168db6ec443b45fcd1016236b0d0f2 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Thu, 6 Jul 2023 08:12:41 -0600 Subject: [PATCH 22/23] Adding missing subdirectory. --- .../pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf index 9f27e8856c..48a34b122b 100644 --- a/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf +++ b/parm/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed.conf @@ -60,7 +60,7 @@ FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/pbl/PointStat_fcstHR FCST_POINT_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/pblh_22{init?fmt=%j}{init?fmt=%H}0000{lead?fmt=%HH} OBS_POINT_STAT_INPUT_DIR = -OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {PARM_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/22{valid?fmt=%j}{valid?fmt=%H}00q.cdf +OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {PARM_BASE}/use_cases/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/calc_amdar_pblh.py {INPUT_BASE}/model_applications/pbl/PointStat_fcstHRRR_obsAMDAR_PBLH_PyEmbed/22{valid?fmt=%j}{valid?fmt=%H}00q.cdf POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/point_stat_pblh POINT_STAT_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d} From feef26e98288868b233a5d4411e6d16db512d80a Mon Sep 17 00:00:00 2001 From: George McCabe <23407799+georgemccabe@users.noreply.github.com> Date: Thu, 6 Jul 2023 13:47:32 -0600 Subject: [PATCH 23/23] turn off use case group for all runs --- .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 b1f1e48e5d..4ed26c5ba8 100644 --- a/.github/parm/use_case_groups.json +++ b/.github/parm/use_case_groups.json @@ -92,7 +92,7 @@ { "category": "pbl", "index_list": "0", - "run": true + "run": false }, { "category": "precipitation",