diff --git a/.coveragerc b/.coveragerc index d561722b1f..4c62180950 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,3 +1,5 @@ [run] relative_files = True source = metplus +omit = + metplus/wrappers/cyclone_plotter_wrapper.py diff --git a/.github/jobs/docker_utils.py b/.github/jobs/docker_utils.py index a40d6b2e56..edf0b00167 100644 --- a/.github/jobs/docker_utils.py +++ b/.github/jobs/docker_utils.py @@ -39,7 +39,7 @@ def get_dockerhub_url(branch_name): def docker_get_volumes_last_updated(current_branch): import requests dockerhub_url = get_dockerhub_url(current_branch) - dockerhub_request = requests.get(dockerhub_url) + dockerhub_request = requests.get(dockerhub_url, timeout=60) if dockerhub_request.status_code != 200: print(f"Could not find DockerHub URL: {dockerhub_url}") return None @@ -61,7 +61,7 @@ def docker_get_volumes_last_updated(current_branch): volumes_last_updated[repo_name] = repo['last_updated'] if not page['next']: break - page = requests.get(page['next']).json() + page = requests.get(page['next'], timeout=60).json() attempts += 1 return volumes_last_updated diff --git a/.github/jobs/free_disk_space.sh b/.github/jobs/free_disk_space.sh index cfe30cf06d..9c9902a602 100755 --- a/.github/jobs/free_disk_space.sh +++ b/.github/jobs/free_disk_space.sh @@ -13,3 +13,25 @@ sudo rm -rf "$AGENT_TOOLSDIRECTORY" printf "\nChecking disk usage after cleanup" df -h + +echo Pruning docker files + +cmd="docker images" +printf "\nBEFORE CLEANUP: $cmd" +$cmd + +cmd="docker image prune -af" +printf "\nRunning $cmd" +$cmd + +cmd=docker system prune -af +printf "\nRunning $cmd" +$cmd + +cmd="docker images" +printf "\nAFTER CLEANUP: $cmd" +$cmd + +printf "\nChecking disk usage after Docker cleanup" + +df -h diff --git a/.github/jobs/get_data_volumes.py b/.github/jobs/get_data_volumes.py index 5c568577a1..e492711710 100755 --- a/.github/jobs/get_data_volumes.py +++ b/.github/jobs/get_data_volumes.py @@ -40,7 +40,7 @@ def main(args): branch_name = get_branch_name() if not branch_name: print("Could not get current branch. Exiting.") - sys.exit(1) + return None # remove -ref from end of branch name if found if branch_name.endswith('-ref'): @@ -88,7 +88,7 @@ def main(args): # use it, otherwise use develop version of data volume elif (metplus_version == 'develop' and f'{branch_name}-{model_app_name}' in available_volumes): - volume_name = f'{branch_name}-{model_app_name}' + volume_name = f'{branch_name}-{model_app_name}' else: volume_name = f'{metplus_version}-{model_app_name}' @@ -97,13 +97,15 @@ def main(args): cmd = (f'docker create --name {model_app_name} ' f'{full_volume_name}') if not run_commands(cmd): - continue + print(f'ERROR: Could not create data volume for {full_volume_name}') + return None # add name to volumes from list to pass to docker build volume_list.append(f'--volumes-from {model_app_name}') return ' '.join(volume_list) + if __name__ == "__main__": # split up command line args that have commas before passing into main args = [] @@ -111,4 +113,7 @@ def main(args): for arg in sys.argv[1:]: args.extend(arg.split(',')) out = main(args) + if out is None: + print("ERROR: Something went wrong") + sys.exit(1) print(out) diff --git a/.github/jobs/setup_and_run_diff.py b/.github/jobs/setup_and_run_diff.py index 1a4c908b14..59c5be37ed 100755 --- a/.github/jobs/setup_and_run_diff.py +++ b/.github/jobs/setup_and_run_diff.py @@ -43,6 +43,9 @@ output_category = f"output-{output_data_branch}-{artifact_name}" VOLUMES_FROM = get_data_volumes.main([output_category]) +if VOLUMES_FROM is None: + print("ERROR: Could not get truth data to run diff") + sys.exit(1) print(f"Output Volumes: {VOLUMES_FROM}") diff --git a/.github/jobs/setup_and_run_use_cases.py b/.github/jobs/setup_and_run_use_cases.py index 931a79d76d..d65cf247c5 100755 --- a/.github/jobs/setup_and_run_use_cases.py +++ b/.github/jobs/setup_and_run_use_cases.py @@ -49,6 +49,10 @@ def main(): ) # get input data volumes volumes_from = get_data_volumes.main(categories_list) + if volumes_from is None: + print('ERROR: Could not get input data to run use cases') + sys.exit(1) + print(f"Input Volumes: {volumes_from}") # build Docker image with conda environment and METplus branch image diff --git a/.github/parm/use_case_groups.json b/.github/parm/use_case_groups.json index 041b000b2c..1752f76df0 100644 --- a/.github/parm/use_case_groups.json +++ b/.github/parm/use_case_groups.json @@ -277,6 +277,6 @@ { "category": "unstructured_grids", "index_list": "0", - "run": true + "run": false } ] diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 239189fb1c..e08aac81e4 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -145,8 +145,10 @@ jobs: env: METPLUS_TEST_OUTPUT_BASE: ${{ runner.workspace }}/pytest_output - name: Generate coverage report - run: coverage report -m + run: | + coverage report -m --fail-under=90 || echo "::error file=coverage,line=1,col=1::Code coverage is below 90%" if: always() + continue-on-error: true - name: Run Coveralls uses: AndreMiras/coveralls-python-action@8799c9f4443ac4201d2e2f2c725d577174683b99 if: always() diff --git a/docs/Contributors_Guide/.DS_Store b/docs/Contributors_Guide/.DS_Store new file mode 100644 index 0000000000..fd1c14a87a Binary files /dev/null and b/docs/Contributors_Guide/.DS_Store differ diff --git a/docs/Contributors_Guide/conda_env.rst b/docs/Contributors_Guide/conda_env.rst index 8a33023eff..8395c38fc6 100644 --- a/docs/Contributors_Guide/conda_env.rst +++ b/docs/Contributors_Guide/conda_env.rst @@ -1,10 +1,11 @@ .. _conda_env: +************************************** Instructions for the Conda Environment -====================================== +************************************** -Overview: Replicating the Python 3.6.3 environment for running METplus -_______________________________________________________________________ +Overview: Replicating the Python 3.6.3 environment for Running METplus +======================================================================= If the host (i.e. the computer on which the METplus and MET tools are running) doesn't already have all the necessary packages installed, it is @@ -19,8 +20,8 @@ METplus source code: *METplus/environment.yml* -Pre-condition- installing the conda package manager if it doesn't exist -_______________________________________________________________________ +Pre-condition- Installing the Conda Package Manager If It Doesn't Exist +======================================================================= **These instructions only need to be followed once.** @@ -72,7 +73,7 @@ _______________________________________________________________________ Creating the METplus conda env -______________________________ +============================== **These instructions only need to be implemented once.** @@ -127,8 +128,8 @@ to end the application. conda deactivate -Activating and deactivating the METplus conda env -_________________________________________________ +Activating and Deactivating the METplus conda env +================================================= Once the user has followed the instructions under the "Creating the METplus conda env", follow these instructions to start running METplus : @@ -163,8 +164,8 @@ conda env", follow these instructions to start running METplus : -Optional: Checking for missing packages and mismatched version -______________________________________________________________ +Optional: Checking for Missing Packages and Mismatched Version +============================================================== To check for missing and mismatched packages run the **check_python.py** script in the METplus directory: @@ -192,7 +193,7 @@ The results are sent to stdout (screen) and three files are created: Link Conda Directory to Data Disk (RAL Linux Machines) -______________________________________________________ +====================================================== By default, Conda environments are stored in a directory called ".conda" that is found in the user's home directory, i.e. /home/user/.conda (Note that the dot at the beginning of the directory name is a hidden directory that does not always show up in a directory listing). Conda environments can take up a lot of disk space which can quickly fill up the /home disk. It is recommended that you create a directory on a data disk that has more disk space and create a symbolic link from the .conda directory so the environments will be stored on the data disk. Keep in mind that deleting the directory on the data disk will delete all of your conda environments and they cannot be easily recovered. diff --git a/docs/Contributors_Guide/create_wrapper.rst b/docs/Contributors_Guide/create_wrapper.rst index f5280e3a16..287ffa0ea7 100644 --- a/docs/Contributors_Guide/create_wrapper.rst +++ b/docs/Contributors_Guide/create_wrapper.rst @@ -1,11 +1,12 @@ +*************************** How to Create a New Wrapper -=========================== +*************************** Naming ------- +====== File Name -^^^^^^^^^ +--------- Create the new wrapper in the *metplus/wrappers* directory and name it to reflect the wrapper's function, e.g.: new_tool_wrapper.py is @@ -13,14 +14,14 @@ a wrapper around an application named "new_tool." Copy the **example_wrapper.py** to start the process. Class Name -^^^^^^^^^^ +---------- The name of the class should match the wrapper's function without underscores and with the first letter of each word capitalized followed by "Wrapper." For example, the new_tool wrapper would be named **NewToolWrapper**. Add Entry to LOWER_TO_WRAPPER_NAME Dictionary ---------------------------------------------- +============================================= In *metplus/util/constants.py*, add entries to the LOWER_TO_WRAPPER_NAME dictionary so that the wrapper can be found in the PROCESS_LIST even if @@ -57,12 +58,12 @@ More than one entry is rarely needed, but they will not hurt anything as long as they do not cause any conflicts. Wrapper Components ------------------- +================== Open the wrapper file for editing the new class. Naming -^^^^^^ +------ Rename the class to match the wrapper's class from the above sections. Most wrappers should be a subclass of the RuntimeFreqWrapper:: @@ -80,7 +81,7 @@ To create EnsembleStat wrapper from GridStat, replace **GridStat** with **EnsembleStat**. Parent Class -^^^^^^^^^^^^ +------------ If the new tool falls under one of the existing tool categories, then make the tool a subclass of one of the existing classes. @@ -91,7 +92,7 @@ See :ref:`bc_class_hierarchy` for more information on existing classes to determine which class to use as the parent class. Class Variables for Runtime Frequency -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------- **RUNTIME_FREQ_DEFAULT** and **RUNTIME_FREQ_SUPPORTED** should be set for all wrappers that inherit from **RuntimeFreqWrapper**. @@ -99,7 +100,7 @@ wrappers that inherit from **RuntimeFreqWrapper**. See :ref:`bc_class_vars` for more information. Init Function -^^^^^^^^^^^^^ +------------- Modify the init function to initialize NewTool from its base class to set the self.app_name variable to the name of the application. @@ -114,7 +115,7 @@ See the Basic Components :ref:`bc_init_function` section for more information:: super().__init__(config, instance=instance) Read Configuration Variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +---------------------------- The create_c_dict function is called during the initialization step of each wrapper. It is where values from the self.config object are read. @@ -132,13 +133,13 @@ The function should also always return the c_dict variable:: return c_dict File Input/Output -""""""""""""""""" +^^^^^^^^^^^^^^^^^ METplus configuration variables that end with _DIR and _TEMPLATE are used to define the criteria to search for input files. Allow Multiple Files -"""""""""""""""""""" +^^^^^^^^^^^^^^^^^^^^ If the application can take more than one file as input for a given category (i.e. FCST, OBS, ENS, etc.) then ALLOW_MULTIPLE_FILES must be set to True:: @@ -151,7 +152,7 @@ If it is set to False and a list of files are found for an input then the wrapper will produce an error and not build the command. Run Functions -^^^^^^^^^^^^^ +------------- * The **run_at_time_once** function or some the functions that it calls will need to be overridden in the wrapper. @@ -240,7 +241,7 @@ Refer to the :ref:`basic_components_of_wrappers` section of the Contributor's Guide for more information on what should be added. Documentation -------------- +============= * Add a section for the new wrapper in the 'Python Wrappers' section of the User's Guide. This includes a list of all configuration variables specific diff --git a/docs/Contributors_Guide/deprecation.rst b/docs/Contributors_Guide/deprecation.rst index 1703d7a2cc..ec42976d77 100644 --- a/docs/Contributors_Guide/deprecation.rst +++ b/docs/Contributors_Guide/deprecation.rst @@ -1,12 +1,14 @@ +********************************** Deprecating an Old Config Variable -================================== +********************************** If a config variable changes names, an alert is needed to let the user know that they need to update the config files if they are using a deprecated variable. Example -------- +======= + :: [exe] @@ -25,7 +27,8 @@ read and the user will have no way to know that they are setting the wrong variable and it is using WGRIB2 = wgrib2. check_for_deprecated_config() ------------------------------ +============================= + In **metplus/util/constants.py** there is a dictionary called DEPRECATED_DICT that specifies the old config name as the key. The value is a dictionary of info that is used to help users update their diff --git a/docs/Contributors_Guide/documentation.rst b/docs/Contributors_Guide/documentation.rst index c383a8617a..c60ed1f65d 100644 --- a/docs/Contributors_Guide/documentation.rst +++ b/docs/Contributors_Guide/documentation.rst @@ -1,43 +1,1135 @@ -Documentation -============= +************************************** +Documentation Overview and Conventions +************************************** -Viewing METplus documentation -_____________________________ +Overview +======== The METplus documentation (beginning with version 3.0) is available -`online `_. +`online `_. The majority of the documentation +is created using the Sphinx documentation generator tool, which was originally +created for Python documentation. The METplus documentation is created using +`reStructuredText (RST) `_. +This link provides a brief introduction to RST concepts and syntax. It is +intended to give authors enough information to create and modify the documents +productively. + +Conventions +=========== + +We follow the conventions outlined in the +`reStructuredText Primer `_, +along with some additional METplus component specific conventions. + +.. _create-chapters: + +Defining Chapters and Sections +------------------------------ + +The METplus documentation uses the +`reStructured Text Primer `_ +documentation for defining section formatting:: + + # with overline, for parts (e.g. the RTD documentation for the component + (i.e. docs/index.rst), each guide (e.g. User's Guide, Contributor's Guide) + (i.e. docs/Users_Guide/index.rst, docs/Contributors_Guide/index.rst)) + * with overline, for chapters + = for sections + - for subsections (this is a dash, not an underline) + ^ for subsubsections + " for the final level of headers + +Part (e.g. User's Guide, Contributor's Guide) and chapter (e.g. Overview, +Coding Standards) headers are created by underlining and overlining the +header name using the appropriate character as described above. When using +the underline and overline formatting, their lengths must be identical and +should be the same length as the header text. If the overline and +underline are not the same length there will be a error +message:: + + CRITICAL: Title overline & underline mismatch + +When formatting headers, the length of the underline must be at least as +long as the title itself or there will be a warning message:: + + WARNING: Title underline too short + +Here is an example of a chapter title:: + + ************* + Chapter Title + ************* + +Include one line of whitespace below the last line of asterisks or it won't be +formatted properly. + + +Updating index.rst for Numbering Chapters and Sections +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Use the `:numbered:` option in the **index.rst** file under the "toctree" +directive in order to add numbers to the chapters and sections. +`:numbered:` needs to be added at the index level to keep the numbers +from restarting for each chapter. Example:: + + .. toctree:: + :hidden: + :caption: Table of Contents + :numbered: + +Remember to delineate chapters and sections using the formatting in +:ref:`create-chapters`. + +To limit the number of sections visible in the table of +contents to four:: + + :numbered: 4 + +The METplus team has decided to allow four levels of depth in the +table of contents, but the number can be changed to get the desired +number of visible levels. + + +See +`Sphinx table of contents `_ +for more information on the toctree directive. + +Numbered and Bulleted Lists +--------------------------- + +It is possible to use actual numbers or `#.` to create a numbered list. +Here are some examples:: + + 1. + Start the text section below for no indentation. + + #. This text block will be indented. + +resulting in the following displayed text: + +1. +Start the text section below for no indentation. + +#. This text block will be indented. + + +Use asterisks for bullets. If a subsection is needed, +include a blank line and indents. Example:: + + * Item 1 + * Item 2 + + * First nested item + * Second nested item + + * Item 3 + +resulting in the following displayed text: + +* Item 1 +* Item 2 + + * First nested item + * Second nested item + +* Item 3 + +Please note, if there are extra spaces before or after the asterisk, +it will change how the list looks. Be careful. + +See +`Lists and Quote-Like blocks `_ +for more information. + +Code Blocks +----------- + +Code blocks are a quick and easy way to bring attention to code snippets. +Start the code snippet below the code-block directive and indent two +spaces for the actual code. The blank lines above and below are necessary +or it won't be formatted correctly. +Example:: + + (blank line above) + .. code-block:: ini + + cd example + ./run_something.py + (blank line below) + +resulting in the following: + + .. code-block:: ini + + cd example + ./run_something.py + +In the example above, `ini` is used as the language specified for the code +block. Other examples of languages that can be used are, for example, +`yaml`, `javascript`, `html`, `shell`, `xml`, and `none`. + +See +`Sphinx code blocks `_ +for more information. + +Bold +---- + +**How to bold:** + +To make text bold use two asterisks before and after the text. Example:: + + **Bolded text** + +Results in the following displayed text: + +**Bolded text** + +Note that if an asterisk is needed within a bolded section, use a backslash +to escape the asterisk. +Example:: + + **Name_everything\*.txt** + +Results in the following displayed text: **Name_everything\*.txt** + +See +`Sphinx documentation for bolding and inline text `_ +for more information. + +**What to bold:** + + * Variables (e.g. **MET_INSTALL_DIR, INPUT_BASE, METCALCPY_HOME**, etc.) + * Filenames (**line_defaults.yaml, contour_defaults.yaml, defaults.conf**, etc.) + +Italics +------- + +**How to italicize:** + +To italicize text use an asterisk before and after the text. Example:: + + *Italicized text* + +Results in the following displayed text: *Italicized text* + +See +`Sphinx documentation for italicizing and inline text `_. +for more information. + +**What to italicize:** + + * Paths and directories are italicized. + * If the path includes a file name, use italics. + This was used a lot in METplotpy, + Example: *$METPLOTPY_SOURCE/METplotpy/test/ens_ss/ens_ss.data* + + +Underline +--------- + +The use of underlines is not recommended. Underlining is not part of +Sphinx's reStructuredText specifications. Underlines can be used as +transition markers. See the :ref:`transition_marker` section. + +.. _transition_marker: + +Transition Markers +------------------ + +The syntax for a transition marker is a horizontal line of four or more +repeated punctuation characters. The syntax is the same as section title +underlines without title text. Transition markers require blank lines +before and after:: + + ___________________ + +resulting in the following: + +_________________ + + +Footnotes +--------- + +*Footnote references* consist of a set of square-brackets followed by a trailing +underscore. + +Each *footnote* consists of an explicit markup start (".. "), a left square +bracket, the footnote label, a right square bracket, and whitespace, +followed by indented body elements. + +Footnote labels are one of: + + #. one of more digits (i.e. a number), + #. a single "#" (denoting auto-numbered footnotes), + #. a "#" followed by a simple reference name, or + #. a single "*" (denoting auto-symbol footnotes) + +METplus has typically used only the third instance described above. + +An example of the `#` followed by a simple reference name footnote label is:: + + * PersonA [#NCAR]_ + * PersonB [#UCAR]_ + * PersonC [#NCAR]_ + + .. [#NCAR] National Center for Atmospheric Research + .. [#UCAR] University Center for Atmospheric Research + +resulting in the following displayed text: + + * PersonA [#NCAR]_ + * PersonB [#UCAR]_ + * PersonC [#NCAR]_ + + .. [#NCAR] National Center for Atmospheric Research + .. [#UCAR] University Center for Atmospheric Research + +An example of the usage of footnotes in reStructured text can be seen in the +`METplus docs/index.rst file `_ +and displayed in ReadTheDocs `here `_. + +See +`Sphinx footnotes `_ +for more information. + + +Comments +-------- + +If comments need to be made within RST, use a blank line above and a ".. " to +comment out text. +Example:: + + add blank line here + .. Text you’d like commented out. + +See +`Sphinx comments `_ +for more information. + +Math Equations, Symbols, and Matrices +------------------------------------- + +Support for math equations, symbols, and matrices is provided by the math +role: `:math:`. + +Support is provided for +`mathematical content `_ +with the input format being LaTeX math syntax with support for Unicode symbols. + +See the +`Sphinx math directive documentation `_ +and +`Math support in Sphinx `_ for additional information. + +There are quite a few examples in +`MET Appendix C `_. + + +Equations +^^^^^^^^^ + +To create math equations with an option to bold use `:math:\mathbf`. Then put +what is to be bolded in between 2 sets of asterisks"\*\*". +Example:: + + :math:\mathbf **1, 2, 3, 4, ...** :math:`mathbf{2^{n-1}}` + +resulting in the following displayed text: **1, 2, 3, 4, ...** :math:`mathbf{2^{n-1}}` + +Symbols +^^^^^^^ + +To create a math symbol, in this example the Delta symbol, use the following +notation:: + + :math:`Delta` + +resulting in the following displayed symbol: :math:`\Delta` + +Matrices +^^^^^^^^ + +Matrices are not frequently used in the METplus documentation, however there +is an example in the +`MET documentation for Stable Equitable Error in Probability Space (SEEPS) +`_. +Example:: + + .. math:: \{S^{S}_{vf}\} = \frac{1}{2} + \begin{Bmatrix} + 0 & \frac{1}{1-p_1} & \frac{1}{p_3} + \frac{1}{1-p_1}\\ + \frac{1}{p_1} & 0 & \frac{1}{p_3}\\ + \frac{1}{p_1} + \frac{1}{1-p_3} & \frac{1}{1-p_3} & 0 + \end{Bmatrix} + +resulting in the following displayed text: + +.. math:: \{S^{S}_{vf}\} = \frac{1}{2} + \begin{Bmatrix} + 0 & \frac{1}{1-p_1} & \frac{1}{p_3} + \frac{1}{1-p_1}\\ + \frac{1}{p_1} & 0 & \frac{1}{p_3}\\ + \frac{1}{p_1} + \frac{1}{1-p_3} & \frac{1}{1-p_3} & 0 + \end{Bmatrix} + +See `Overleaf's Guide - Matrices `_ for more information. + + +Literal Blocks +-------------- + +Literal blocks are usually used for showing command line syntax and are +typically rendered in a monospaced font. Literal blocks are introduced +by ending a paragraph with the special marker `::`. + +The literal block must be indented and separated by the surrounding text +with a blank line above and below the text. Example:: + + Some text:: + + Write my command here + (blank line below) + + +resulting in the following displayed text, noting that one of the two +colons has been removed: + + Some text:: + + Write my command here + +See +`Sphinx literal blocks `_ +and +`literal blocks `_ +for more information. + +Line Blocks +----------- + +Line blocks can be used where the structure of lines is significant. For +example, as a way of preserving line breaks or to preserve indents. + +Having text on separate lines may be desired. For example: + + | This text will + | Be + | Rendered + | All on a single + | Line like this + +but if typed on separate lines in a RST file, the resulting displayed +text would be: + +This text will Be Rendered All on a single Line like this + +Note that the text is not formatted in the desired manner. + +To keep the text on separate lines, use the vertical bar "| " prefix. Each +vertical bar prefix with a space after, indicates a new line, so line breaks are +preserved. Include one line of blank space above and below text. +Example:: + + blank line above + | This text will + | Be + | Rendered + | On separate lines + | Like this + blank line below + +resulting in the following displayed text: + + | This text will + | Be + | Rendered + | On separate lines + | Like this + +See line blocks under +`Lists and Quote-like blocks `_ +and the `line blocks `_ +section from the reStructuredText Markup Specification for more information. + +Links +----- + +Internal Links +^^^^^^^^^^^^^^ + +To support cross-referencing to locations within the same set of documentation, +standard RST labels are used. For this to work properly, label names +**must be unique** throughout the entire document. + +To link to a section, the section being linked to will need a label name +formatted in the following way: + +| .. _label-name: + +so that it can be referenced in a different section. + +To reference the section with the label name in a different section, use +the `:ref:` role. For example:: + + :ref:`label-name` + +For example, in the :ref:`running-metplus` section of the METplus User's Guide +under "Example Wrapper Use Case" it states: + +* Create a :ref:`user_configuration_file` (named user_system.conf in this example). + +The link to "User Configuration File" is an internal link referenced in the +following way in the .rst file:: + + * Create a :ref:`user_configuration_file` (named user_system.conf in this example). + +The syntax for the label name can be seen in the +`systemconfiguration.rst `_ +and looks like this:: + + .. _user_configuration_file: + + User Configuration File + ======================= + +If the link exists in another chapter or document, and a different name +or title would be more appropriate, use the example below. +Please note, there is no space between text and the less than symbol `<`. +Example:: + + :ref:`Text to show up ` + +resulting in the following displayed text: + +:ref:`Text to show up ` + +See the +`Internal links documentation `_ +and +`Cross-referencing arbitrary locations `_ +for more information. + +External Links +^^^^^^^^^^^^^^ + +To link to an external web page, use the following syntax:: + + `Link text `_ + +The example below uses the DTC website:: + + `DTC `_ + +resulting in the following displayed text: + +`DTC `_ + +The link can also be separated from the target definition. +Example:: + + Get the latest news at `DTC`_. + .. _DTC: https://dtcenter.org + +resulting in the following displayed text: +Get the latest news at `DTC`_. + +See the +`External links documentation `_ +for more information. + +Linking Using Reference Numbers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To use a number for sections, tables, figures etc. instead of the title +use the `:numref:` role. + +Example:: + + Please refer to :numref:`user_configuration_file`. + +resulting in the following displayed text, which shows the +numbered section, not the name: + +Please refer to :numref:`user_configuration_file`. + +See +`Cross-referencing figures by figure number `_ +for more information. + + +Linking to METplus Use Case +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Linking to METplus Use Cases must be done with an external web link. Since the +HTML file is generated from a Python script, the `:ref:` role can’t be used. + +The example below will use the METplus Use Case which has the following URL: +https://metplus.readthedocs.io/en/latest/generated/met_tool_wrapper/StatAnalysis/StatAnalysis.html#sphx-glr-generated-met-tool-wrapper-statanalysis-statanalysis-\py + +The full URL is being shown above so it can be edited below. This example will +be called "StatAnalysis: Basic Use Case". +To make sure the web address is correct: + + * Remove everything in the URL above, before the text “generated”. + In this example, remove: `https://metplus.readthedocs.io/en/latest` + * Put a `../` in front of “generated” + * Also remove anything after `#`. In this example: + `#sphx-glr-generated-met-tool-wrapper-statanalysis-statanalysis-py` + * The web link should look like this example:: + + `StatAnalysis: Basic Use Case <../generated/met_tool_wrapper/StatAnalysis/StatAnalysis.html>`_ + + * resulting in the following displayed text: + + `StatAnalysis: Basic Use Case <../generated/met_tool_wrapper/StatAnalysis/StatAnalysis.html>`_ + +Examples of the links can be seen in this +`table `_ +in the far right column. Please note, it may be necessary to scroll down to +use the horizontal scroll bar to see the far right **Use Cases** column. + + +Linking to a Table +^^^^^^^^^^^^^^^^^^ + +Linking to a table is similar to linking to an internal link. +See the example below:: + + .. _example_table: + + .. list-table:: example table + +To link to this "example table" use the following syntax:: + + :ref:`Example Table ` + +which will result in the following displayed text: + +:ref:`Example Table ` + +Linking to a Variable in the Glossary +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To reference a variable in the :ref:`METplus_glossary`, use the term +role `:term:`. In the example below the variable name, USER_SCRIPT_COMMAND +will be used:: + + :term:`USER_SCRIPT_COMMAND` + +resulting in the following displayed text and link to the USER_SCRIPT_COMMAND +variable: + +:term:`USER_SCRIPT_COMMAND` + +See the documentation on the +`term role `_ +for more information. + + +Images +------ + +To add an image use the +`image directive `_: +`.. image::`. In the example below, an image called **doc_image_example.png** +will be added, which is located in the *figure* directory. +Example:: + + .. image:: figure/doc_image_example.png + +resulting in the following displayed image: + +.. image:: figure/doc_image_example.png + :width: 400 + +Please note, all of the images are stored in a *figure* directory, separate +from the RST files. For this Contributor's Guide, the *figure* directory is +located at *METplus/docs/Contributors_Guide/figure/*. + +See +`images `_ +and +`Images and Figures `_ +for more information. + +Figures +------- + +A figure is an image with caption and optional legend. To add a figure, use the +`figure directive `_: +`.. figure::`. In the example below a figure called +**1Issue-before-created.png** will be added, which is located in the *figure* directory. +Example:: + + .. figure:: figure/1Issue-before-created.png + +Please note, the figures are stored in a separate directory from the RST files. +In this case, in the *figure* directory located at +*METplus/docs/Contributors_Guide/figure/*. + +We will use the image **1Issue-before-created.png**, +located in the figure directory. This is an example +from the +`GitHub Workflow Chapter `_. +Below is an example:: + + .. figure:: figure/1Issue-before-created.png + + (Return and tab over). This is the caption for the figure. + +resulting in the following displayed text and image: + +.. figure:: figure/1Issue-before-created.png + + This is the caption for the figure. + +See +`Images and Figures `_ +for more information. + + +Automatically Number Figures +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To automatically number figures, the following needs to be added to the +**conf.py** file in the *docs* subdirectory:: + + # -- Intersphinx control ----------------------------------------------------- + intersphinx_mapping = {'numpy':("https://docs.scipy.org/doc/numpy/", None)} + + numfig = True + + numfig_format = { + 'figure': 'Figure %s', + } + +Please note, the automatic numbering of figures is NOT set up in the METplus +**docs/conf.py** file, but it is set up in the MET **docs/conf.py** file. + +.. _creating-tables: + +Tables +------ + +There are a variety of +`table formats `_. +The METplus components frequently use +`list tables `_. + +List Tables +^^^^^^^^^^^ + +Below is an example of list table formatting:: + + .. list-table:: Title # Adding a title is optional. + :widths: 25 25 # Adding the widths is optional. + :header-rows: 1 # Adding a header row is also optional. + + * - Heading row 1, column 1 + - Heading row 1, column 2 + * - Row 1, column 1 + - + * - Row 2, column 1 + - Row 2, column 2 + +Please note that Row 1, column 2 is blank. A blank cell must still be +accounted for in the formatting of the table. + +The table will be displayed in the following way: + +.. list-table:: Title + :widths: 25 25 + :header-rows: 1 + + * - Heading row 1, column 1 + - Heading row 1, column 2 + * - Row 1, column 1 + - + * - Row 2, column 1 + - Row 2, column 2 + + +Converting an Existing Table into a List Table +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +If a table already exists it can be converted into a Sphinx list table by +copying the existing table into a Google Sheet and using formulas to +restructure it into a list table format. An example of how to do this is +described below. This +`spreadsheet `_ +is used as an example. + +The first step is to copy the table into the first cell (A1) of the +spreadsheet. + +.. image:: figure/example_table_1.png + +Next, using a cell in a column that is not used by the +existing table (in this example column D or a column further to the right +could be used), paste in the formula below to reformat the existing table:: + + =ArrayFormula(transpose(split(concatenate(A1:C&char(9)),char(9)))) + +.. note:: + + In the formula above "C" is used. The "C" represents the last + column used by the table and should be modified if a column + past "C" is used. + +In the formula above, the following functions are used and documentation +describing each function is linked below: + + * `char `_ - + Converts a number into a character according to the current Unicode table. + + * `split `_ - + Divides text around a specified character or string and puts each + fragment into a separate cell in the row. + + * `transpose `_ - + Transposes the rows and columns of an array or range of cells. + + * `ArrayFormula `_ - + Enables the display of values returned from an array formula into + multiple rows and/or columns and the use of non-array functions with + arrays. + +In this example, the formula lives in cell E6 and the resulting reformatted +data is in column E. This reformatted data will be used to create the +formatting for a list table in an adjacent column. + +.. image:: figure/example_table_2.png + +Next, the metadata information for the table will be listed in cells F1 - F4:: + + .. list-table:: Example Table + :widths: auto + :header-rows: 1 + (leave a blank line below) + +to match the format that is needed for RST. + +.. image:: figure/example_table_3.png + +Now, the necessary formatting for a list-table will be added, in a new column, +to the reformatted data in column E. An asterisk represents the start of a +row. It is important that the asterisk be lined up with the first colon +under the metadata information described above (e.g. the first colon in +":width:" and ":header-rows:"). Note that in the example below, there are three +spaces before the asterisk. Starting with the adjacent cell to the +first cell of the reformatted data (in this case cell F6), add the following +formula to the cell, updating the cell number E6 if necessary:: + + =" * - "&E6 + +In the two cells below (in this case, cells F7 and F8), add the following +formulas, updating the cell numbers E7 and E8, if necessary:: + + =" - "&E7 + =" - "&E8 + +Note that in the example above there are five spaces before the dash for proper +alignment. + +To copy this formatting to the other cells, simply highlight the cells with +the newly added formulas, click and hold your mouse on the blue dot in the +lower right corner, and drag down to the last cell in the reformatted data +(Column E, in this example). + +.. image:: figure/example_table_4.png + +Now, copy and paste the contents of the latest reformatted column (in this +example, from column F):: + + .. list-table:: Example Table + :widths: auto + :header-rows: 1 + + * - Subject + - Professor + - Number of Students + * - Math + - Patel + - 16 + * - English + - Smith + - 18 + * - Science + - Zhou + - 17 + * - History + - Hayashi + - 19 + +ensuring that the data is properly aligned as shown in this +`List Table `_ +example. If it is not properly aligned, it will need to be realigned. + +Below is the resulting displayed table: + +.. _example_table: + +.. list-table:: Example Table + :widths: auto + :header-rows: 1 + + * - Subject + - Professor + - Number of Students + * - Math + - Patel + - 16 + * - English + - Smith + - 18 + * - Science + - Zhou + - 17 + * - History + - Hayashi + - 19 + + +PrettyTable +^^^^^^^^^^^ + +`PrettyTable `_ is a simple Python +library for easily displaying tabular data in a visually appealing ASCII +table format. PrettyTable formats tables in an attractive ASCII form. + +A PrettyTable was used to create this +`message_type `_ +table. The formatting for this table looks like:: + + +------------------+---------------------------------------------+ + | Old (Incorrect): | message_type = [ "ADPSFC" ]; | + +------------------+---------------------------------------------+ + | New (Correct): | message_type = [ "ADPUPA" ]; | + +------------------+---------------------------------------------+ + | METplus Config: | :term:`ENSEMBLE_STAT_MESSAGE_TYPE` = ADPSFC | + +------------------+---------------------------------------------+ + +resulting in the following displayed table: + ++------------------+---------------------------------------------+ +| Old (Incorrect): | message_type = [ "ADPSFC" ]; | ++------------------+---------------------------------------------+ +| New (Correct): | message_type = [ "ADPUPA" ]; | ++------------------+---------------------------------------------+ +| METplus Config: | :term:`ENSEMBLE_STAT_MESSAGE_TYPE` = ADPSFC | ++------------------+---------------------------------------------+ + + +Dropdown Menus +-------------- + +Dropdown menus, also known as accordions or collapsable lists are used +extensively in the :ref:`release-notes` to make the Release Notes easier +to read. An example of how to use a dropdown menu is shown below. + +Example:: + + .. dropdown:: Title for the Dropdown Box + + Text in the dropdown box + +resulting in the following display: + +.. dropdown:: Title for the Dropdown Box + + Text in the dropdown box + +See +`Dropdowns `_ +documentation page for more information. + +In order to use this functionality, changes need to be made to add the +sphinx-design extension. These changes are described on the sphinx-design +`Getting Started `_ +page. + +"sphinx_design" needs to be added to the **extension** list in the **docs/conf.py** +file and "sphinx-design" needs to be added to the **docs/requirements.txt** file. + +Please note that a search for a word will work even when the dropdown text isn’t +expanded. + + +Notes and Warnings +------------------ + +Use notes and warnings to make a sentence stand out visually. + +Notes +^^^^^ + +Use a note for information you want the user to pay particular attention to. + +Below is an example of formatting for a note:: + + .. note:: + This is a note. + + If note text is long, ensure the lines are indented at the same level as + the note tag. If the formatting is incorrect, the note will not be + displayed properly. + + Notes can have more than one paragraph. Each paragraph must be + indented at the same level as the rest of the note. + +resulting in the following displayed text: + +.. note:: + This is a note. + + If note text is long, ensure the lines are indented at the same level as + the note tag. If the formatting is incorrect, the note will not be + displayed properly. + + Notes can have more than one paragraph. Each paragraph must be + indented at the same level as the rest of the note. + + + +Warnings +^^^^^^^^ + +Use a warning for information the user must understand to avoid negative consequences. + +Below is an example of formatting for a warning:: + + .. warning:: + This is a warning. + + Warnings are formatted in the same way as notes (see above). In the same way, + the lines must be indented at the same level as the warning tag. + +resulting in the following displayed text: + +.. warning:: + This is warning text. Use a warning for information the user must + understand to avoid negative consequences. + + Warnings are formatted in the same way as notes. In the same way, + lines must be broken and indented under the warning tag. + + +Below is an example from the :ref:`METplus_glossary`. +Example:: + + ADECK_FILE_PREFIX + .. warning:: **DEPRECATED:** Please use TC_PAIRS_ADECK_TEMPLATE. + +resulting in the following displayed text: + +ADECK_FILE_PREFIX + .. warning:: **DEPRECATED:** Please use TC_PAIRS_ADECK_TEMPLATE. + + +Troubleshooting +--------------- + +Testing RST Formatting in an Online Editor +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +It can be time consuming to wait for ReadTheDocs to build. To quickly test how +something will display formatting, this +`Online Sphinx Editor `_ +can be used. Please note that in order to use this editor, users must have +access to the machine **seneca** and the UCAR VPN. This is not a secure +website (note that it begins with "http" and not "https"). A user must be +logged into the UCAR VPN to use this editor. If the editor is not displayed, +please try using a different browser. + +Thank you to +`livesphinx `_ +for providing our team with the code to run this Online Sphinx Editor. + +Escape Characters +^^^^^^^^^^^^^^^^^ + +Some characters have special meanings in RST. This requires an escaping +mechanism to override the default meaning of the desired character. In +reStructuredText the backslash is used as the escape mechanism and is +commonly used as an escaping character in other domains. + +See +`Escaping Mechanism `_ +for further information. + +Dashes +"""""" + +At times it is necessary to display more than one dash. For example, +in displaying options to Python commands. In order to display more +than one dash, the dash must be escaped with a backslash character. + +Example:: + + run_program.py \-\-help + +resulting in the following displayed test: + +run_program.py \-\-help + + +Underscores +""""""""""" + +Variable names often include an underscore. For instance, "FNNN\_". +The following formatting:: + + FNNN_ + +results in a warning in the documentation. To correctly format the +underscored variable name, it is necessary to escape the underscore +with the backslash character as shown below:: + + FNNN\_ + +resulting in the following displayed text: + +FNNN\_ + + +Asterisks +""""""""" + +Asterisks are used for italicizing and bolding and are used in +bulleted lists. + +If asterisks appear in running text and could be confused with a +special function, it is necessary to use a backslash to escape the +asterisk. +For example:: -Doxygen Source Code Documentation -_________________________________ + \* -The source code documentation is coming soon. +results in the displayed asterisk, as expected: +\* -Documentation Overview -______________________ -The majority of the documentation is created using the Sphinx documentation -generator tool, which was originally created for Python documentation. -The documentation is created using -`reStructuredText (rst) `_. +Sphinx Modules +-------------- -The following Sphinx modules are required to generate the necessary +The following Sphinx modules are required to generate the described documentation: - * sphinx-2.2.0 - * sphinx-gallery-0.7 - * sphinx_rtd_theme-0.4.3 + * sphinx-gallery + * sphinx + * sphinx-rtd-theme + * sphinx-design -Which versions are being used by the current METplus release can be viewed -by looking at either **environment.yml** or **requirements.txt**, both of which -are found in the *METplus/* directory. If the desire is to replicate all the -packages employed by METplus, please refer to :numref:`conda_env` of the -Contributor's Guide. +The versions being used by the current METplus release can be viewed +in the **docs/requirements.txt** file in the +`METplus GitHub Repository `_. Description of Documentation Directories -________________________________________ +======================================== Core documentation is divided into four sections: User's Guide, Contributor's Guide, Release Guide, and Verification Datasets Guide all of which reside @@ -61,7 +1153,7 @@ section for more information on documenting a new use case. Adding New Documentation -________________________ +======================== To determine where to add new documentation: @@ -81,7 +1173,7 @@ To determine where to add new documentation: User's Guide: -~~~~~~~~~~~~~ +------------- * To add/modify any content that affects METplus users. * Modify any of the affected sections from the @@ -94,7 +1186,7 @@ User's Guide: * **wrappers.rst** (METplus wrappers) Contributor's Guide: -~~~~~~~~~~~~~~~~~~~~ +-------------------- * To add/modify any content that affects METplus contributors. * Modify any of the affected sections from the @@ -118,7 +1210,7 @@ Contributor's Guide: wrapper code) Release Guide: -~~~~~~~~~~~~~~ +-------------- * To add/modify the instructions for creating software releases for any METplus component, including official, bugfix, and development @@ -154,7 +1246,7 @@ Release Guide: Verification Datasets Guide: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------- * To add/modify any relevant datasets in an attempt to create a centralized catalog of verification datasets to provide the model @@ -165,7 +1257,7 @@ Verification Datasets Guide: .. _read-the-docs: Read the Docs METplus Documentation -___________________________________ +=================================== The METplus components use `Read the Docs `_ to build and display the documentation. Read the Docs simplifies the @@ -217,7 +1309,7 @@ Documentation for each METplus component can be found at the links below: Building Sphinx Documentation Manually -______________________________________ +====================================== Documentation does not have to be built manually as it is automatically generated by Read The Docs. See the @@ -246,7 +1338,7 @@ This script does the following: * Removes unwanted text from use case documentation * Copies doxygen files into* _build/html* for easy deployment * Creates symbolic links under Users_Guide to the directories under - 'generated' to preserve old URL paths + "generated" to preserve old URL paths The html files that are created can be found in the *METplus/docs/_build/html* directory. The web browser can point to this directory by entering @@ -259,7 +1351,7 @@ will direct to the home page of the documentation. Click on the links to navigate to the desired information. Relevant Documentation for Contributors -_______________________________________ +======================================= The Doxygen tool is employed to create documentation from the source code. This documentation is useful in generating details about the METplus wrapper diff --git a/docs/Contributors_Guide/figure/doc_image_example.png b/docs/Contributors_Guide/figure/doc_image_example.png new file mode 100644 index 0000000000..208576e392 Binary files /dev/null and b/docs/Contributors_Guide/figure/doc_image_example.png differ diff --git a/docs/Contributors_Guide/figure/example_table_1.png b/docs/Contributors_Guide/figure/example_table_1.png new file mode 100644 index 0000000000..cd1bd17927 Binary files /dev/null and b/docs/Contributors_Guide/figure/example_table_1.png differ diff --git a/docs/Contributors_Guide/figure/example_table_2.png b/docs/Contributors_Guide/figure/example_table_2.png new file mode 100644 index 0000000000..509e98f208 Binary files /dev/null and b/docs/Contributors_Guide/figure/example_table_2.png differ diff --git a/docs/Contributors_Guide/figure/example_table_3.png b/docs/Contributors_Guide/figure/example_table_3.png new file mode 100644 index 0000000000..037c891552 Binary files /dev/null and b/docs/Contributors_Guide/figure/example_table_3.png differ diff --git a/docs/Contributors_Guide/figure/example_table_4.png b/docs/Contributors_Guide/figure/example_table_4.png new file mode 100644 index 0000000000..92ce3986db Binary files /dev/null and b/docs/Contributors_Guide/figure/example_table_4.png differ diff --git a/docs/Contributors_Guide/figure/practice_table.png b/docs/Contributors_Guide/figure/practice_table.png new file mode 100644 index 0000000000..82d7db8837 Binary files /dev/null and b/docs/Contributors_Guide/figure/practice_table.png differ diff --git a/docs/Contributors_Guide/github_workflow.rst b/docs/Contributors_Guide/github_workflow.rst index 4b623a69c7..ab0be1b3b0 100644 --- a/docs/Contributors_Guide/github_workflow.rst +++ b/docs/Contributors_Guide/github_workflow.rst @@ -1,10 +1,11 @@ .. _github-workflow: +*************** GitHub Workflow -=============== +*************** -How METplus releases are created --------------------------------- +How METplus Releases are Created +================================ The branching model employed by the METplus GitHub repository is similar to that described in @@ -24,8 +25,8 @@ which includes data tarballs for use in running use cases. .. _wo-development-project: -GitHub Projects to manage development -------------------------------------- +GitHub Projects to Manage Development +===================================== Software development for official METplus releases is organized into development cycles. While the length a development cycle can vary widely, they are nominally 6 weeks long. @@ -171,8 +172,8 @@ are required to perform the following steps. .. _wo-support-project: -GitHub Projects to manage support ---------------------------------- +GitHub Projects to Manage Support +================================= Support for coordinated METplus releases is managed using a *single* GitHub project for all components. Bugfix issues and the corresponding pull request fixes are added @@ -297,7 +298,7 @@ required to perform the following steps. - Click the **Link a project** button and find/select this newly created support project. Sequence of Events - Contributing Code --------------------------------------- +====================================== *Prerequisite:* @@ -308,7 +309,7 @@ to the GitHub Documentation on Workflow Overview -~~~~~~~~~~~~~~~~~ +----------------- Contributors will follow these instructions for new development. Detailed instructions for each item can be found below or by clicking the link. @@ -378,7 +379,7 @@ Find or Create a GitHub Issue .. _wo-fork-repo: -Fork the dtcenter/METplus repository +Fork the dtcenter/METplus Repository ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * **If the contributor has write access to the dtcenter/METplus repository, @@ -409,7 +410,7 @@ Fork the dtcenter/METplus repository .. _wo-clone-repo: -Clone the repository locally +Clone the Repository Locally ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Change directories to a working directory. From the command line, @@ -432,7 +433,7 @@ Clone the repository locally .. _wo-set-upstream: -Set upstream remote +Set Upstream Remote ^^^^^^^^^^^^^^^^^^^ * **If working from the dtcenter/METplus repository, skip this step.** @@ -464,7 +465,7 @@ Set upstream remote .. _wo-feature-branch: -Create a feature branch +Create a Feature Branch ^^^^^^^^^^^^^^^^^^^^^^^ * Generate a feature branch from the *develop* branch for new development @@ -534,7 +535,7 @@ Create a feature branch .. _wo-make-changes: -Make changes to code in the feature branch +Make Changes to Code in the Feature Branch ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Users should make changes to their feature branch and commit changes to their @@ -589,7 +590,7 @@ local repository. .. _wo-commit-changes: -Commit changes to feature branch +Commit Changes to Feature Branch ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * View all files that have changed since the last commit: @@ -647,7 +648,7 @@ Commit changes to feature branch .. _wo-push-changes: -Push the feature branch to GitHub +Push the Feature Branch to GitHub ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Pushing changes up to GitHub periodically is recommended to avoid losing @@ -664,7 +665,7 @@ progress by relying on the local copy of the changes. .. _pull-request-browser: -Open a pull request +Open a Pull Request ^^^^^^^^^^^^^^^^^^^ * To request to have the changes be incorporated into the remote repository @@ -745,8 +746,8 @@ Open a pull request everything meets acceptance criteria) and merge the code into the remote repository's develop branch. -Approve a pull request using a browser -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Approve a Pull Request Using a Browser +-------------------------------------- Submitting a pull request allows a user to propose changes, request a review of the contributions and have the proposed changes merged into a @@ -761,7 +762,7 @@ sub-tasks to be complete, then it may be best to wait to create a pull request until the other sub-tasks are also complete. -Reviewing a pull request +Reviewing a Pull Request ^^^^^^^^^^^^^^^^^^^^^^^^ 1. Click on the “Pull requests” tab in the GitHub repository and @@ -838,7 +839,7 @@ Reviewing a pull request been made, approve the request. -Merging pull requests +Merging Pull Requests ^^^^^^^^^^^^^^^^^^^^^ Once the pull request has been approved it is ready to be merged. **As permissions allow, the requestor is responsible for merging the pull request @@ -860,7 +861,7 @@ If the requestor wishes to delete the “compare” branch, the “Delete branch button should be selected and the corresponding GitHub issue should be closed. -Clean up after a successfully merged pull request +Clean Up After a Successfully Merged Pull Request ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * After an authorized METplus developer has accepted the changes and merged @@ -904,17 +905,3 @@ Clean up after a successfully merged pull request replacing appropriately. Under the 'Branch' pulldown menu, the feature branch name should no longer be seen as an option. - - - - - - - - - - - - - - diff --git a/docs/Contributors_Guide/index.rst b/docs/Contributors_Guide/index.rst index 4dd87bb41c..2dabc2a162 100644 --- a/docs/Contributors_Guide/index.rst +++ b/docs/Contributors_Guide/index.rst @@ -1,7 +1,6 @@ - -=================== +################### Contributor's Guide -=================== +################### .. toctree:: :titlesonly: diff --git a/docs/Contributors_Guide/testing.rst b/docs/Contributors_Guide/testing.rst index f0e10804d4..f40f37ec4f 100644 --- a/docs/Contributors_Guide/testing.rst +++ b/docs/Contributors_Guide/testing.rst @@ -1,5 +1,6 @@ +******* Testing -======= +******* Test scripts are found in the GitHub repository in the internal/tests directory. @@ -7,7 +8,7 @@ directory. .. _cg-unit-tests: Unit Tests ----------- +========== Unit tests are run with pytest. They are found in the *internal/tests/pytests* directory under the *wrappers* @@ -15,7 +16,7 @@ and *util* directories. Each tool has its own subdirectory containing its test files. Pytest Requirements -^^^^^^^^^^^^^^^^^^^ +------------------- The following Python packages are required to run the tests. @@ -27,7 +28,7 @@ The following Python packages are required to run the tests. * **pdf2image** (optional): Only used if running diff utility tests Running -^^^^^^^ +------- To run the unit tests, set the environment variable **METPLUS_TEST_OUTPUT_BASE** to a path where the user running has write @@ -43,7 +44,7 @@ To view verbose test output, add the **-vv** argument:: pytest internal/tests/pytests -vv Code Coverage -^^^^^^^^^^^^^ +------------- If the *pytest-cov* package is installed, the code coverage report can be generated from the tests by running:: @@ -54,7 +55,7 @@ In addition to the pass/fail report, the code coverage information will be displayed including line numbers that are not covered by any test. Subsetting Tests by Directory -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +----------------------------- A subset of the unit tests can be run by adjusting the path. Be sure to include the *--cov-append* argument so the results of the run @@ -65,7 +66,7 @@ To run only the GridStat unit tests:: Subsetting Tests by Marker -^^^^^^^^^^^^^^^^^^^^^^^^^^ +-------------------------- Pytest allows contributors to use markers on test functions. Markers are used to set various features/attributes to test functions so that users can easily @@ -126,10 +127,10 @@ Multiple marker groups can be run by using the *or* keyword:: pytest internal/tests/pytests -m " or " Writing Unit Tests -^^^^^^^^^^^^^^^^^^ +------------------ metplus_config fixture -"""""""""""""""""""""" +^^^^^^^^^^^^^^^^^^^^^^ Many unit tests utilize a pytest fixture named **metplus_config**. This is defined in the **conftest.py** file in internal/tests/pytests. diff --git a/docs/Release_Guide/coordinated.rst b/docs/Release_Guide/coordinated.rst index 4abd404a18..c4260f3d8c 100644 --- a/docs/Release_Guide/coordinated.rst +++ b/docs/Release_Guide/coordinated.rst @@ -1,6 +1,5 @@ -******************* Coordinated Release -******************* +=================== .. |projectRepo| replace:: Coordinated @@ -19,5 +18,6 @@ component releases. .. include:: release_steps/coordinated/update_dtc_website.rst .. include:: release_steps/coordinated/finalize_release_on_github.rst +.. include:: release_steps/coordinated/release_acceptance_testing.rst .. include:: release_steps/coordinated/update_zenodo.rst .. include:: release_steps/coordinated/announce_release.rst diff --git a/docs/Release_Guide/index.rst b/docs/Release_Guide/index.rst index bde0abc8d8..37fb437c19 100644 --- a/docs/Release_Guide/index.rst +++ b/docs/Release_Guide/index.rst @@ -1,6 +1,6 @@ -============= +############# Release Guide -============= +############# This METplus Release Guide provides detailed instructions for METplus developers for creating software releases for the METplus component @@ -11,11 +11,12 @@ repositories. .. _releaseTypes: +************* Release Types -============= +************* Coordinated Release -------------------- +=================== A METplus coordinated release is a group of official or bugfix releases for each of the METplus components that have been developed and tested in parallel. @@ -27,7 +28,7 @@ coordinated release announcement is updated to link to the most recent bugfix version. Official Release ----------------- +================ An official release is a stable release of a METplus component and typically matches the release candidate, which has passed all tests. It is the version of the @@ -35,17 +36,17 @@ code that has been tested as thoroughly as possible and is reliable enough to be used in production. Bugfix Release --------------- +============== A bugfix release for a METplus component introduces no new features, but fixes bugs in previous official releases and targets the most critical bugs affecting users. Development Release -------------------- +=================== Beta -^^^^ +---- Beta releases are a pre-release of a METplus software component to give a larger group of users the opportunity to test the recently incorporated new @@ -55,7 +56,7 @@ possible configurations of hardware and software that exist and installation of beta releases allow for testing of potential conflicts. Release Candidate (rc) -^^^^^^^^^^^^^^^^^^^^^^ +---------------------- A release candidate is a version of a METplus software component that is nearly ready for official release but may still have a few bugs. At this stage, all @@ -65,8 +66,9 @@ new source code will be added to this release. There may still be source code changes to fix bugs, changes to documentation, and changes to test cases or utilities. +********************** Release Support Policy -====================== +********************** The METplus developers officially provide bug fix support for the latest official release and for the developmental releases as described above. This @@ -80,8 +82,9 @@ software team and the respective funding institutions. For further inquiries or to report any bugs, please contact our dedicated support team in the `METplus GitHub Discussions Forum `_. +******************** Instructions Summary -==================== +******************** Instructions are provided for the following types of software releases: @@ -97,7 +100,7 @@ The instructions that are common to all components are documented only once and in the release steps for all components. However some instructions are specific to individual repositories and documented separately. -Release instructions are described in the following chapters. +Release instructions are described in the following sections. .. toctree:: :titlesonly: diff --git a/docs/Release_Guide/met.rst b/docs/Release_Guide/met.rst index 9bc68a6a80..3e7657d6c5 100644 --- a/docs/Release_Guide/met.rst +++ b/docs/Release_Guide/met.rst @@ -1,6 +1,5 @@ -*********** MET Release -*********** +=========== .. toctree:: :titlesonly: diff --git a/docs/Release_Guide/met_bugfix.rst b/docs/Release_Guide/met_bugfix.rst index 7dcaa0b308..6861bc8b76 100644 --- a/docs/Release_Guide/met_bugfix.rst +++ b/docs/Release_Guide/met_bugfix.rst @@ -1,5 +1,5 @@ MET Bugfix Release -================== +------------------ .. |projectRepo| replace:: MET diff --git a/docs/Release_Guide/met_development.rst b/docs/Release_Guide/met_development.rst index 3690a94682..df04a8b900 100644 --- a/docs/Release_Guide/met_development.rst +++ b/docs/Release_Guide/met_development.rst @@ -1,5 +1,5 @@ MET Development Release -======================= +----------------------- .. |projectRepo| replace:: MET @@ -17,3 +17,4 @@ Create a new vX.Y.Z-betaN or vX.Y.Z-rcN development release from the develop bra .. include:: release_steps/create_release_extra.rst .. include:: release_steps/met/update_dtc_website.rst .. include:: release_steps/finalize_release_on_github_development.rst +.. include:: release_steps/release_acceptance_testing.rst diff --git a/docs/Release_Guide/met_official.rst b/docs/Release_Guide/met_official.rst index 21242298ac..0a4549cdf5 100644 --- a/docs/Release_Guide/met_official.rst +++ b/docs/Release_Guide/met_official.rst @@ -1,5 +1,5 @@ MET Official Release -==================== +-------------------- .. |projectRepo| replace:: MET diff --git a/docs/Release_Guide/metcalcpy.rst b/docs/Release_Guide/metcalcpy.rst index ea6ec5b929..6794fa2b25 100644 --- a/docs/Release_Guide/metcalcpy.rst +++ b/docs/Release_Guide/metcalcpy.rst @@ -1,6 +1,5 @@ -***************** METcalcpy Release -***************** +================= .. toctree:: :titlesonly: diff --git a/docs/Release_Guide/metcalcpy_bugfix.rst b/docs/Release_Guide/metcalcpy_bugfix.rst index 0d34c9942f..b224fdb209 100644 --- a/docs/Release_Guide/metcalcpy_bugfix.rst +++ b/docs/Release_Guide/metcalcpy_bugfix.rst @@ -1,6 +1,5 @@ -========================== - METcalcpy Bugfix Release -========================== +METcalcpy Bugfix Release +------------------------ .. |projectRepo| replace:: METcalcpy diff --git a/docs/Release_Guide/metcalcpy_development.rst b/docs/Release_Guide/metcalcpy_development.rst index 936a9c9ce7..bf9aaa635a 100644 --- a/docs/Release_Guide/metcalcpy_development.rst +++ b/docs/Release_Guide/metcalcpy_development.rst @@ -1,5 +1,5 @@ METcalcpy Development Release -============================= +----------------------------- .. |projectRepo| replace:: METcalcpy @@ -17,4 +17,5 @@ Create a new vX.Y.Z-betaN or vX.Y.Z-rcN development release from the develop bra .. include:: release_steps/create_release_extra.rst .. include:: release_steps/update_dtc_website.rst .. include:: release_steps/finalize_release_on_github_development.rst +.. include:: release_steps/release_acceptance_testing.rst .. include:: release_steps/metcalcpy/update_version_on_develop.rst diff --git a/docs/Release_Guide/metcalcpy_official.rst b/docs/Release_Guide/metcalcpy_official.rst index f5b5ef3d40..7a554eebc2 100644 --- a/docs/Release_Guide/metcalcpy_official.rst +++ b/docs/Release_Guide/metcalcpy_official.rst @@ -1,5 +1,5 @@ METcalcpy Official Release -========================== +-------------------------- .. |projectRepo| replace:: METcalcpy diff --git a/docs/Release_Guide/metdataio.rst b/docs/Release_Guide/metdataio.rst index b74b470916..419bcafc8d 100644 --- a/docs/Release_Guide/metdataio.rst +++ b/docs/Release_Guide/metdataio.rst @@ -1,6 +1,5 @@ -***************** METdataio Release -***************** +================= .. toctree:: :titlesonly: diff --git a/docs/Release_Guide/metdataio_bugfix.rst b/docs/Release_Guide/metdataio_bugfix.rst index af60a91cbd..096e9c260a 100644 --- a/docs/Release_Guide/metdataio_bugfix.rst +++ b/docs/Release_Guide/metdataio_bugfix.rst @@ -1,5 +1,5 @@ METdataio Bugfix Release -======================== +------------------------ .. |projectRepo| replace:: METdataio .. |projectName| replace:: |projectRepo| diff --git a/docs/Release_Guide/metdataio_development.rst b/docs/Release_Guide/metdataio_development.rst index 810725ccf6..e7f3b4a184 100644 --- a/docs/Release_Guide/metdataio_development.rst +++ b/docs/Release_Guide/metdataio_development.rst @@ -1,5 +1,5 @@ METdataio Development Release -============================= +----------------------------- .. |projectRepo| replace:: METdataio .. |projectName| replace:: |projectRepo| @@ -20,4 +20,5 @@ Create a new vX.Y.Z-betaN or vX.Y.Z-rcN development release from the develop bra .. include:: release_steps/create_release_extra.rst .. include:: release_steps/common/update_dtc_website.rst .. include:: release_steps/finalize_release_on_github_development.rst +.. include:: release_steps/release_acceptance_testing.rst .. include:: release_steps/metdataio/update_version_on_develop.rst diff --git a/docs/Release_Guide/metdataio_official.rst b/docs/Release_Guide/metdataio_official.rst index d0b54155f3..a3e16ee72e 100644 --- a/docs/Release_Guide/metdataio_official.rst +++ b/docs/Release_Guide/metdataio_official.rst @@ -1,5 +1,5 @@ METdataio Official Release -========================== +-------------------------- .. |projectRepo| replace:: METdataio .. |projectName| replace:: |projectRepo| diff --git a/docs/Release_Guide/metexpress.rst b/docs/Release_Guide/metexpress.rst index 158db343c2..35b24c5c9a 100644 --- a/docs/Release_Guide/metexpress.rst +++ b/docs/Release_Guide/metexpress.rst @@ -1,6 +1,5 @@ -****************** METexpress Release -****************** +================== .. toctree:: :titlesonly: diff --git a/docs/Release_Guide/metexpress_development.rst b/docs/Release_Guide/metexpress_development.rst index 84a3551144..60e7179bab 100644 --- a/docs/Release_Guide/metexpress_development.rst +++ b/docs/Release_Guide/metexpress_development.rst @@ -1,5 +1,5 @@ METexpress Development Release -============================== +------------------------------ .. |projectRepo| replace:: METexpress @@ -11,3 +11,4 @@ Create a new vX.Y.Z-betaN or vX.Y.Z-rcN development release from the develop bra .. include:: release_steps/metexpress/merge_feature_branch.rst .. include:: release_steps/metexpress/update_dtc_website.rst .. include:: release_steps/metexpress/finalize_release_on_github_development.rst +.. include:: release_steps/release_acceptance_testing.rst diff --git a/docs/Release_Guide/metexpress_official.rst b/docs/Release_Guide/metexpress_official.rst index 2b09f50d63..256c143a68 100644 --- a/docs/Release_Guide/metexpress_official.rst +++ b/docs/Release_Guide/metexpress_official.rst @@ -1,5 +1,5 @@ METexpress Official Release -=========================== +--------------------------- .. |projectRepo| replace:: METexpress diff --git a/docs/Release_Guide/metplotpy.rst b/docs/Release_Guide/metplotpy.rst index 9e6d89ba15..d2509ef4bb 100644 --- a/docs/Release_Guide/metplotpy.rst +++ b/docs/Release_Guide/metplotpy.rst @@ -1,6 +1,5 @@ -***************** METplotpy Release -***************** +================= .. toctree:: :titlesonly: diff --git a/docs/Release_Guide/metplotpy_bugfix.rst b/docs/Release_Guide/metplotpy_bugfix.rst index 25611b260a..ec177ee9b9 100644 --- a/docs/Release_Guide/metplotpy_bugfix.rst +++ b/docs/Release_Guide/metplotpy_bugfix.rst @@ -1,5 +1,5 @@ METplotpy Bugfix Release -======================== +------------------------ .. |projectRepo| replace:: METplotpy diff --git a/docs/Release_Guide/metplotpy_development.rst b/docs/Release_Guide/metplotpy_development.rst index 3e78b5c84d..50ad0368c8 100644 --- a/docs/Release_Guide/metplotpy_development.rst +++ b/docs/Release_Guide/metplotpy_development.rst @@ -1,5 +1,5 @@ METplotpy Development Release -============================= +----------------------------- .. |projectRepo| replace:: METplotpy @@ -17,6 +17,7 @@ Create a new vX.Y.Z-betaN or vX.Y.Z-rcN development release from the develop bra .. include:: release_steps/create_release_extra.rst .. include:: release_steps/update_dtc_website.rst .. include:: release_steps/finalize_release_on_github_development.rst +.. include:: release_steps/release_acceptance_testing.rst .. include:: release_steps/metplotpy/update_version_on_develop.rst diff --git a/docs/Release_Guide/metplotpy_official.rst b/docs/Release_Guide/metplotpy_official.rst index 2f6a68f1f3..f16a82c753 100644 --- a/docs/Release_Guide/metplotpy_official.rst +++ b/docs/Release_Guide/metplotpy_official.rst @@ -1,5 +1,5 @@ METplotpy Official Release -========================== +-------------------------- .. |projectRepo| replace:: METplotpy diff --git a/docs/Release_Guide/metplus.rst b/docs/Release_Guide/metplus.rst index 070b004c8f..1ca3083130 100644 --- a/docs/Release_Guide/metplus.rst +++ b/docs/Release_Guide/metplus.rst @@ -1,6 +1,5 @@ -*************** METplus Release -*************** +=============== .. toctree:: :titlesonly: diff --git a/docs/Release_Guide/metplus_bugfix.rst b/docs/Release_Guide/metplus_bugfix.rst index d2184bbf27..f4635dae4c 100644 --- a/docs/Release_Guide/metplus_bugfix.rst +++ b/docs/Release_Guide/metplus_bugfix.rst @@ -1,5 +1,5 @@ METplus Bugfix Release -====================== +---------------------- .. |projectRepo| replace:: METplus diff --git a/docs/Release_Guide/metplus_development.rst b/docs/Release_Guide/metplus_development.rst index 6dd1b4b1f2..7754a7759b 100644 --- a/docs/Release_Guide/metplus_development.rst +++ b/docs/Release_Guide/metplus_development.rst @@ -1,5 +1,5 @@ METplus Development Release -=========================== +--------------------------- .. |projectRepo| replace:: METplus @@ -18,3 +18,4 @@ Create a new vX.Y.Z-betaN or vX.Y.Z-rcN development release from the develop bra .. include:: release_steps/metplus/update_version_on_develop.rst .. include:: release_steps/metplus/update_dtc_website.rst .. include:: release_steps/finalize_release_on_github_development.rst +.. include:: release_steps/release_acceptance_testing.rst diff --git a/docs/Release_Guide/metplus_official.rst b/docs/Release_Guide/metplus_official.rst index a2d77cac9d..4b996155e7 100644 --- a/docs/Release_Guide/metplus_official.rst +++ b/docs/Release_Guide/metplus_official.rst @@ -1,5 +1,5 @@ METplus Official Release -======================== +------------------------ .. |projectRepo| replace:: METplus @@ -20,7 +20,7 @@ Create a new vX.Y.Z official release from the develop branch. .. include:: release_steps/create_release_on_github.rst .. include:: release_steps/metplus/create_release_extra.rst .. include:: release_steps/metplus/update_dtc_website.rst -.. include:: release_steps/finalize_release_on_github_official.rst +.. include:: release_steps/finalize_release_on_github_official.rst .. include:: release_steps/metplus/update_version_on_develop.rst .. include:: release_steps/update_docs_official.rst .. include:: release_steps/metplus/update_web_server_data.rst diff --git a/docs/Release_Guide/metviewer.rst b/docs/Release_Guide/metviewer.rst index e8ce2be607..63b91b78d1 100644 --- a/docs/Release_Guide/metviewer.rst +++ b/docs/Release_Guide/metviewer.rst @@ -1,6 +1,5 @@ -***************** METviewer Release -***************** +================= .. toctree:: :titlesonly: diff --git a/docs/Release_Guide/metviewer_bugfix.rst b/docs/Release_Guide/metviewer_bugfix.rst index 24bd900f18..e8f5a35c1d 100644 --- a/docs/Release_Guide/metviewer_bugfix.rst +++ b/docs/Release_Guide/metviewer_bugfix.rst @@ -1,5 +1,5 @@ METviewer Bugfix Release -======================== +------------------------ .. |projectRepo| replace:: METviewer diff --git a/docs/Release_Guide/metviewer_development.rst b/docs/Release_Guide/metviewer_development.rst index 6b2cea9e8b..b1af85e12e 100644 --- a/docs/Release_Guide/metviewer_development.rst +++ b/docs/Release_Guide/metviewer_development.rst @@ -1,5 +1,5 @@ METviewer Development Release -============================= +----------------------------- .. |projectRepo| replace:: METviewer @@ -17,4 +17,5 @@ Create a new vX.Y.Z-betaN or vX.Y.Z-rcN development release from the develop bra .. include:: release_steps/create_release_extra.rst .. include:: release_steps/update_dtc_website.rst .. include:: release_steps/finalize_release_on_github_development.rst +.. include:: release_steps/release_acceptance_testing.rst .. include:: release_steps/metviewer/update_version_on_develop.rst diff --git a/docs/Release_Guide/metviewer_official.rst b/docs/Release_Guide/metviewer_official.rst index 624195d6d1..15a2e385db 100644 --- a/docs/Release_Guide/metviewer_official.rst +++ b/docs/Release_Guide/metviewer_official.rst @@ -1,5 +1,5 @@ METviewer Official Release -========================== +-------------------------- .. |projectRepo| replace:: METviewer diff --git a/docs/Release_Guide/recreate_release.rst b/docs/Release_Guide/recreate_release.rst index 0b3d847ac8..520a1f733f 100644 --- a/docs/Release_Guide/recreate_release.rst +++ b/docs/Release_Guide/recreate_release.rst @@ -1,5 +1,5 @@ Recreate an Existing Release ----------------------------- +============================ To recreate an existing development, bugfix, or official release: diff --git a/docs/Release_Guide/release_steps/checkout_develop_branch.rst b/docs/Release_Guide/release_steps/checkout_develop_branch.rst index ffad2b1264..1f46eb0426 100644 --- a/docs/Release_Guide/release_steps/checkout_develop_branch.rst +++ b/docs/Release_Guide/release_steps/checkout_develop_branch.rst @@ -1,5 +1,5 @@ Checkout the Develop Branch ---------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Checkout the develop branch: diff --git a/docs/Release_Guide/release_steps/checkout_main_branch.rst b/docs/Release_Guide/release_steps/checkout_main_branch.rst index 19b692a21e..4b53593fe7 100644 --- a/docs/Release_Guide/release_steps/checkout_main_branch.rst +++ b/docs/Release_Guide/release_steps/checkout_main_branch.rst @@ -1,5 +1,5 @@ Checkout the Main Branch ------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^ Checkout the main branch for the X.Y release. If you are creating the |projectRepo|-X.Y.Z bugfix release, checkout main_vX.Y. diff --git a/docs/Release_Guide/release_steps/clone_project_repository.rst b/docs/Release_Guide/release_steps/clone_project_repository.rst index 7ab668a426..1003da4f57 100644 --- a/docs/Release_Guide/release_steps/clone_project_repository.rst +++ b/docs/Release_Guide/release_steps/clone_project_repository.rst @@ -1,5 +1,5 @@ Clone the Project Repository ----------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Create and work in a new directory to ensure a fresh environment: diff --git a/docs/Release_Guide/release_steps/common/update_dtc_website.rst b/docs/Release_Guide/release_steps/common/update_dtc_website.rst index 7f8b1be69a..240474c168 100644 --- a/docs/Release_Guide/release_steps/common/update_dtc_website.rst +++ b/docs/Release_Guide/release_steps/common/update_dtc_website.rst @@ -1,70 +1,74 @@ Update DTC Website ------------------- +^^^^^^^^^^^^^^^^^^ -* Navigate to https://dtcenter.org and sign in to the Drupal interface. +METplus software releases are announced on the `DTC website `_. +Add or update information about software releases on the website. -* Navigate to the downloads page for the |projectRepo| repository at - https://dtcenter.org/community-code/metplus/download +.. dropdown:: Instructions -* Click on the **Edit** button to edit the Downloads page. + * Navigate to https://dtcenter.org and sign in to the Drupal interface. -* Create a new **Software Release** for the newly released version by clicking - on **Add New Release**. + * Navigate to the downloads page for the |projectRepo| repository at + https://dtcenter.org/community-code/metplus/download - * For **Full Title of Release** type "|projectRepo| Version X.Y.Z". + * Click on the **Edit** button to edit the Downloads page. - * For **Related Community Code** select both the "METplus" and the "|projectName|" - options (For Macs, hold the Command key to select both). + * Create a new **Software Release** for the newly released version by clicking + on **Add New Release**. - * For **Version Label** type "|projectRepo| X.Y.Z-betaN". + * For **Full Title of Release** type "|projectRepo| Version X.Y.Z". - * Select the **Release Type** ("Recommended" for official or bugfix releases or - "Development" for development versions). + * For **Related Community Code** select both the "METplus" and the "|projectName|" + options (For Macs, hold the Command key to select both). - * Enter the **Release Date**. + * For **Version Label** type "|projectRepo| X.Y.Z-betaN". - * Click on **Add Code Download** then click **Add Link** to add links for each of the following: + * Select the **Release Type** ("Recommended" for official or bugfix releases or + "Development" for development versions). - * Add Link: |addTarfileStep| + * Enter the **Release Date**. - * Add Link: Link text should be "User's Guide" and the URL should be the top - level directory of the User's Guide hosted on the web. Beta releases can - use "develop" in the URL, but for official releases, please ensure the - link uses the branch name (e.g. main_vX.Y) as opposed to the tag name - (e.g. vX.Y.Z). For example, use - "https://metplus.readthedocs.io/en/main_vX.Y/Users_Guide/" and NOT - "https://metplus.readthedocs.io/en/vX.Y.Z/Users_Guide/" + * Click on **Add Code Download** then click **Add Link** to add links for each of the following: - * Add Link: Link text should be "Existing Builds and Docker" and the URL - should be the latest Existing Builds page, i.e. - https://dtcenter.org/community-code/metplus/metplus-X-Y-existing-builds - (If creating a new official release, be sure to add a new *Existing Builds - and Docker* page, if one was not already created.) + * Add Link: |addTarfileStep| + + * Add Link: Link text should be "User's Guide" and the URL should be the top + level directory of the User's Guide hosted on the web. Beta releases can + use "develop" in the URL, but for official releases, please ensure the + link uses the branch name (e.g. main_vX.Y) as opposed to the tag name + (e.g. vX.Y.Z). For example, use + "https://metplus.readthedocs.io/en/main_vX.Y/Users_Guide/" and NOT + "https://metplus.readthedocs.io/en/vX.Y.Z/Users_Guide/" + + * Add Link: Link text should be "Existing Builds and Docker" and the URL + should be the latest Existing Builds page, i.e. + https://dtcenter.org/community-code/metplus/metplus-X-Y-existing-builds + (If creating a new official release, be sure to add a new *Existing Builds + and Docker* page, if one was not already created.) - * In the **Release Notes** text box provide a direct link to the - *release-notes.html* file in the User's Guide. + * In the **Release Notes** text box provide a direct link to the + *release-notes.html* file in the User's Guide. - * Click on **Create Release**. + * Click on **Create Release**. - * Update the existing releases, as needed. + * Update the existing releases, as needed. - * For a development release, ensure the "Release Type" is set to - **Development** and change any previous **Development** versions to - **Other**. + * For a development release, ensure the "Release Type" is set to + **Development** and change any previous **Development** versions to + **Other**. - * For a bugfix or official release, change any previous - **Recommended** versions to **Other**. + * For a bugfix or official release, change any previous + **Recommended** versions to **Other**. - * For an official release, remove the corresponding development - releases. + * For an official release, remove the corresponding development + releases. - * Edit the "Coordinated METplus Version X.Y" software release. + * Edit the "Coordinated METplus Version X.Y" software release. - * For a bugfix release, update the existing link and text in - the "Coordinated METplus-X.Y" release section with the - X.Y.Z+1 information. - - * |otherWebsiteUpdates| + * For a bugfix release, update the existing link and text in + the "Coordinated METplus-X.Y" release section with the + X.Y.Z+1 information. - * Click on **Save** at the bottom of the page. + * |otherWebsiteUpdates| + * Click on **Save** at the bottom of the page. diff --git a/docs/Release_Guide/release_steps/coordinated/release_acceptance_testing.rst b/docs/Release_Guide/release_steps/coordinated/release_acceptance_testing.rst new file mode 100644 index 0000000000..492aac550e --- /dev/null +++ b/docs/Release_Guide/release_steps/coordinated/release_acceptance_testing.rst @@ -0,0 +1,19 @@ +Release Acceptance Testing +-------------------------- + +A single +`Release Acceptance Testing `_ +discussion in the METplus repository summarizes the external testing for all development +cycles of the METplus components included in a coordinated release. + +.. dropdown:: Instructions + + * Navigate to the + `Release Acceptance Testing `_ + discussion for this coordinated release. + * Review the repository testing tables for the METplus components within the body of the discussion by clicking on the dropdown icon "Repository Testing" for the appropriate METplus component to expand the hidden table. + * Check the **Status** column in these tables and look for entries still marked as **OPEN** or **FAIL**. + For a coordinated release, the status for all table entries should be **PASS**. + * Click on the **Close discussion** button at the bottom discussion. + * Do *not* **Lock conversation** on this discussion to allow external testers + to provide additional comments, as needed. diff --git a/docs/Release_Guide/release_steps/coordinated/update_dtc_website.rst b/docs/Release_Guide/release_steps/coordinated/update_dtc_website.rst index 6082e88ca5..6674195c66 100644 --- a/docs/Release_Guide/release_steps/coordinated/update_dtc_website.rst +++ b/docs/Release_Guide/release_steps/coordinated/update_dtc_website.rst @@ -1,66 +1,71 @@ Update DTC Website ------------------ -* Navigate to https://dtcenter.org and sign in to the Drupal interface. +METplus software releases are announced on the `DTC website `_. +Add or update information about software releases on the website. -* Navigate to the METplus downloads page at - https://dtcenter.org/community-code/metplus/download +.. dropdown:: Instructions -* Click on the **Edit** button to edit the Downloads page. + * Navigate to https://dtcenter.org and sign in to the Drupal interface. -* Create a new **Software Release** for the new coordinated release by clicking - on **Add New Release**. + * Navigate to the METplus downloads page at + https://dtcenter.org/community-code/metplus/download - * For **Full Title of Release** type "Coorindated METplus X.Y". + * Click on the **Edit** button to edit the Downloads page. - * For **Related Community Code** select only the "METplus" option. + * Create a new **Software Release** for the new coordinated release by clicking + on **Add New Release**. - * For **Version Label** type "Coordinated METplus X.Y". + * For **Full Title of Release** type "Coorindated METplus X.Y". - * Select the **Release Type** as "Recommended". + * For **Related Community Code** select only the "METplus" option. - * Select the **Release Options** as "Coordinated". + * For **Version Label** type "Coordinated METplus X.Y". - * Enter the **Release Date**. + * Select the **Release Type** as "Recommended". - * Click on **Add Code Download** then click **Add Link** to add links for each of the following: + * Select the **Release Options** as "Coordinated". - * Add Link: Link text should be "METplus X.Y.Z" and the URL should be a link to the METplus component DTC release page. + * Enter the **Release Date**. - * Add Link: Link text should be "MET X.Y.Z" and the URL should be a link to the MET component DTC release page. + * Click on **Add Code Download** then click **Add Link** to add links for each of the following: - * Add Link: Link text should be "METviewer X.Y.Z" and the URL should be a link to the METviewer component DTC release page. + * Add Link: Link text should be "METplus X.Y.Z" and the URL should be a link to the METplus component DTC release page. - * Add Link: Link text should be "METexpress X.Y.Z" and the URL should be a link to the METexpress component DTC release page. + * Add Link: Link text should be "MET X.Y.Z" and the URL should be a link to the MET component DTC release page. - * Add Link: Link text should be "METplotpy X.Y.Z" and the URL should be a link to the METplotpy component DTC release page. + * Add Link: Link text should be "METviewer X.Y.Z" and the URL should be a link to the METviewer component DTC release page. - * Add Link: Link text should be "METcalcpy X.Y.Z" and the URL should be a link to the METcalcpy component DTC release page. + * Add Link: Link text should be "METexpress X.Y.Z" and the URL should be a link to the METexpress component DTC release page. - * Add Link: Link text should be "METdataio X.Y.Z" and the URL should be a link to the METdataio component DTC release page. + * Add Link: Link text should be "METplotpy X.Y.Z" and the URL should be a link to the METplotpy component DTC release page. - * Add Link: Link text should be "Documentation" and the URL should be the top - level directory of the main_vX.Y branch of the METplus User's Guide hosted on the web. - For example, use - "https://metplus.readthedocs.io/en/main_vX.Y/Users_Guide/" and NOT - "https://metplus.readthedocs.io/en/vX.Y.Z/Users_Guide/" + * Add Link: Link text should be "METcalcpy X.Y.Z" and the URL should be a link to the METcalcpy component DTC release page. - * Add Link: Link text should be "Existing Builds and Docker" and the URL - should be the latest Existing Builds page, i.e. - https://dtcenter.org/community-code/metplus/metplus-X-Y-existing-builds + * Add Link: Link text should be "METdataio X.Y.Z" and the URL should be a link to the METdataio component DTC release page. - * In the **Release Notes** text box provide direct links to the *release-notes.html* - files on the main_vX.Y branch of the User's Guide for each component. + * Add Link: Link text should be "Documentation" and the URL should be the top + level directory of the main_vX.Y branch of the METplus User's Guide hosted on the web. + For example, use + "https://metplus.readthedocs.io/en/main_vX.Y/Users_Guide/" and NOT + "https://metplus.readthedocs.io/en/vX.Y.Z/Users_Guide/" - * Click on **Create Release**. + * Add Link: Link text should be "Existing Builds and Docker" and the URL + should be the latest Existing Builds page, i.e. + https://dtcenter.org/community-code/metplus/metplus-X-Y-existing-builds - * Update any existing coordinated releases by changing the **Release Type** from - "Recommended" to "Other" and click the **Update Release** button. + * In the **Release Notes** text box provide direct links to the *release-notes.html* + files on the main_vX.Y branch of the User's Guide for each component. - * Review the existing component releases and remove any remaining development - releases (e.g. beta and rc) for any of the official releases included in this - coordinated release. + * Click on **Create Release**. - * Click on **Save** at the bottom of the page. + * Update any existing coordinated releases by changing the **Release Type** from + "Recommended" to "Other" and click the **Update Release** button. -* Create a new **Existing Builds and Docker** page for the next coordinated release. + * Review the existing component releases and remove any remaining development + releases (e.g. beta and rc) for any of the official releases included in this + coordinated release. + + * Click on **Save** at the bottom of the page. + + * Create a new **Existing Builds and Docker** page for the next coordinated release. diff --git a/docs/Release_Guide/release_steps/create_release_branch.rst b/docs/Release_Guide/release_steps/create_release_branch.rst index b220d69bcd..737420a9c0 100644 --- a/docs/Release_Guide/release_steps/create_release_branch.rst +++ b/docs/Release_Guide/release_steps/create_release_branch.rst @@ -1,5 +1,5 @@ Create Release Branch ---------------------- +^^^^^^^^^^^^^^^^^^^^^ * Create a branch from the develop branch for the new official release and push it to GitHub. diff --git a/docs/Release_Guide/release_steps/create_release_extra.rst b/docs/Release_Guide/release_steps/create_release_extra.rst index a5aea726b5..51830cdcce 100644 --- a/docs/Release_Guide/release_steps/create_release_extra.rst +++ b/docs/Release_Guide/release_steps/create_release_extra.rst @@ -1,3 +1,3 @@ -* If this is a development release, check the box that says "This is a pre-release" +* If this is a development release, check the box that says "This is a pre-release". * Click on "Publish release". diff --git a/docs/Release_Guide/release_steps/create_release_feature_branch.rst b/docs/Release_Guide/release_steps/create_release_feature_branch.rst index 72931767ff..5d44877dc6 100644 --- a/docs/Release_Guide/release_steps/create_release_feature_branch.rst +++ b/docs/Release_Guide/release_steps/create_release_feature_branch.rst @@ -1,5 +1,5 @@ Create Release Feature Branch ------------------------------ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Create a feature branch in which to update the version number and add release notes being sure to include the GitHub issue number for the new release. diff --git a/docs/Release_Guide/release_steps/create_release_on_github.rst b/docs/Release_Guide/release_steps/create_release_on_github.rst index 4d47237290..c9818ed653 100644 --- a/docs/Release_Guide/release_steps/create_release_on_github.rst +++ b/docs/Release_Guide/release_steps/create_release_on_github.rst @@ -1,5 +1,5 @@ Create Release on GitHub ------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^ * Go to Releases on GitHub and click 'Draft a new release' diff --git a/docs/Release_Guide/release_steps/finalize_release_on_github_bugfix.rst b/docs/Release_Guide/release_steps/finalize_release_on_github_bugfix.rst index 0f0289a16c..91dcb15ead 100644 --- a/docs/Release_Guide/release_steps/finalize_release_on_github_bugfix.rst +++ b/docs/Release_Guide/release_steps/finalize_release_on_github_bugfix.rst @@ -1,8 +1,16 @@ Finalize Release on GitHub --------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^ -* Close the GitHub issue for creating this bugfix release. -* Edit the milestone for the current release by updating the *Due date* with the actual release date. -* Create a new milestone for the next bugfix release (e.g. '|projectRepo| X.Y.{Z+1} (bugfix)'). -* If necessary, reassign any remaining issues for the current bugfix milestone to the next one. -* Close the current bugfix milestone. +Return to GitHub to finalize the details of this release. + +.. dropdown:: Instructions + + * Close the GitHub issue for creating this bugfix release. + + * Edit the milestone for the current release by updating the *Due date* with the actual release date. + + * Create a new milestone for the next bugfix release (e.g. '|projectRepo| X.Y.{Z+1} (bugfix)'). + + * If necessary, reassign any remaining issues for the current bugfix milestone to the next one. + + * Close the current bugfix milestone. diff --git a/docs/Release_Guide/release_steps/finalize_release_on_github_development.rst b/docs/Release_Guide/release_steps/finalize_release_on_github_development.rst index 194b758c04..ca9c123eb5 100644 --- a/docs/Release_Guide/release_steps/finalize_release_on_github_development.rst +++ b/docs/Release_Guide/release_steps/finalize_release_on_github_development.rst @@ -1,7 +1,20 @@ Finalize Release on GitHub --------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^ -* Close the GitHub issue for creating this development release. -* Edit the date of the development cycle for the current release to indicate the actual release date. -* Review the remaining development cycles, and if neccessary, adjust dates and/or add new cycles. -* If necessary, reassign any remaining issues for the current development cycle to the next one. +Return to GitHub to finalize the details of this release. + +.. dropdown:: Instructions + + * Close the GitHub issue for creating this development release. + + * Review the development cycles and adjust their begin and end dates, as needed. + + * From the GitHub development project, click in the top-right corner to locate and edit the "Settings". + + * From the list of "Custom fields", select "Cycle". + + * Shift the *next* "Active" development cycle forward to begin the day after the current release, if applicable. + + * Find the recently "Completed" development cycle for the current release and modify the end date to match the actual date of the current release, if applicable. + + * If necessary, reassign any remaining issues for the current development cycle to the next one. diff --git a/docs/Release_Guide/release_steps/finalize_release_on_github_official.rst b/docs/Release_Guide/release_steps/finalize_release_on_github_official.rst index 0fd714ccfe..e3d4018ffd 100644 --- a/docs/Release_Guide/release_steps/finalize_release_on_github_official.rst +++ b/docs/Release_Guide/release_steps/finalize_release_on_github_official.rst @@ -1,40 +1,43 @@ Finalize Release on GitHub --------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^ -* Update milestones: +Return to GitHub to finalize the details of this release. - * Edit the milestone for the current release by updating the *Due date* with the actual release date. +.. dropdown:: Instructions - * Close the current milestone. + * Update milestones: - * Create a new milestone for the first bugfix release (e.g. first vX.Y.1 (bugfix) release). + * Edit the milestone for the current release by updating the *Due date* with the actual release date. - * If necessary, create a new milestone for the next official release (e.g. next vX.Y.Z release). + * Close the current milestone. -* Update issues: + * Create a new milestone for the first bugfix release (e.g. first vX.Y.1 (bugfix) release). - * Close the GitHub issue for creating this official release. + * If necessary, create a new milestone for the next official release (e.g. next vX.Y.Z release). - * If necessary, reassign any remaining issues for the current milestone to other milestones. + * Update issues: -* Update projects: + * Close the GitHub issue for creating this official release. - * Close the existing development project for the current milestone. + * If necessary, reassign any remaining issues for the current milestone to other milestones. - * If necessary, see :ref:`wo-development-project` to create a development project for the - next milestone. + * Update projects: -* Update branches: + * Close the existing development project for the current milestone. - * Remove any remaining stale development branches from the new release. + * If necessary, see :ref:`wo-development-project` to create a development project for the next milestone. - * Update the repository settings by resetting the *Default branch* to the new main_vX.Y branch: + * Update branches: -.. parsed-literal:: + * Remove any remaining stale development branches from the new release. - https://github.com/dtcenter/|projectRepo| - -> Settings - -> Scroll down to the *Default branch* section - -> Click the stacked arrows button next to default branch name - -> Select the new default branch from the dropdown list - -> Click the *Update* button + * Update the repository settings by resetting the *Default branch* to the new main_vX.Y branch: + + .. parsed-literal:: + + https://github.com/dtcenter/|projectRepo| + -> Settings + -> Scroll down to the *Default branch* section + -> Click the stacked arrows button next to default branch name + -> Select the new default branch from the dropdown list + -> Click the *Update* button diff --git a/docs/Release_Guide/release_steps/merge_release_issue.rst b/docs/Release_Guide/release_steps/merge_release_issue.rst index da554f4da3..6b9ec261bf 100644 --- a/docs/Release_Guide/release_steps/merge_release_issue.rst +++ b/docs/Release_Guide/release_steps/merge_release_issue.rst @@ -1,5 +1,5 @@ Merge Release Issue -------------------- +^^^^^^^^^^^^^^^^^^^ * After updating the release-specific content on a release feature branch, submit a pull request to merge those changes back into the source branch. diff --git a/docs/Release_Guide/release_steps/met/create_release_reference_branch.rst b/docs/Release_Guide/release_steps/met/create_release_reference_branch.rst index c4018922da..5f4f7000cd 100644 --- a/docs/Release_Guide/release_steps/met/create_release_reference_branch.rst +++ b/docs/Release_Guide/release_steps/met/create_release_reference_branch.rst @@ -1,5 +1,5 @@ Create Release Reference Branch -------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Create a branch from the develop branch for the reference branch for the new official release and push it to GitHub. The branch name should match @@ -13,7 +13,7 @@ Create Release Reference Branch git checkout -b main_vX.Y-ref Push Reference Branch to GitHub -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""""""""""""" :: @@ -25,7 +25,7 @@ data. These data will be used to verify that any bugfixes applied to the main_vX.Y branch does not break any of existing logic. Monitor GitHub Actions Workflow -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""""""""""""" Navigate to https://github.com/dtcenter/MET/actions and verify that a *Testing* workflow was triggered on the *main_vX.Y-ref* branch. diff --git a/docs/Release_Guide/release_steps/met/update_version_bugfix.rst b/docs/Release_Guide/release_steps/met/update_version_bugfix.rst index 05184f526c..c432ce3407 100644 --- a/docs/Release_Guide/release_steps/met/update_version_bugfix.rst +++ b/docs/Release_Guide/release_steps/met/update_version_bugfix.rst @@ -1,5 +1,5 @@ Update Version Number ---------------------- +^^^^^^^^^^^^^^^^^^^^^ * Update the version in the code and documentation: diff --git a/docs/Release_Guide/release_steps/met/update_version_development.rst b/docs/Release_Guide/release_steps/met/update_version_development.rst index 70db799c41..82fc66e793 100644 --- a/docs/Release_Guide/release_steps/met/update_version_development.rst +++ b/docs/Release_Guide/release_steps/met/update_version_development.rst @@ -1,5 +1,5 @@ Update Version Number ---------------------- +^^^^^^^^^^^^^^^^^^^^^ * Prior to creating the first development release (e.g. beta1) for a new version, the official release version number should have already been updated. diff --git a/docs/Release_Guide/release_steps/met/update_version_official.rst b/docs/Release_Guide/release_steps/met/update_version_official.rst index bd0efe94fe..cd9f86fc1d 100644 --- a/docs/Release_Guide/release_steps/met/update_version_official.rst +++ b/docs/Release_Guide/release_steps/met/update_version_official.rst @@ -1,6 +1,7 @@ -Update Version Number ---------------------- .. _update_version_official: + +Update Version Number +^^^^^^^^^^^^^^^^^^^^^ * Update the version in the code and documentation: diff --git a/docs/Release_Guide/release_steps/met/update_web_server_data.rst b/docs/Release_Guide/release_steps/met/update_web_server_data.rst index 05274dbcda..7552a6642e 100644 --- a/docs/Release_Guide/release_steps/met/update_web_server_data.rst +++ b/docs/Release_Guide/release_steps/met/update_web_server_data.rst @@ -1,8 +1,8 @@ Update DTC Web Server Data --------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^ Create Directory for This Release -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""""""""""""""" On the DTC web server where the sample input data for unit tests is hosted, create a new directory for this official major/minor release. diff --git a/docs/Release_Guide/release_steps/met/update_zenodo.rst b/docs/Release_Guide/release_steps/met/update_zenodo.rst index fdf7735c9d..138aea830b 100644 --- a/docs/Release_Guide/release_steps/met/update_zenodo.rst +++ b/docs/Release_Guide/release_steps/met/update_zenodo.rst @@ -1,5 +1,5 @@ Update Zenodo -------------- +^^^^^^^^^^^^^ In the `MET GitHub repository `_ scroll down to the README file and check the diff --git a/docs/Release_Guide/release_steps/metcalcpy/update_version.rst b/docs/Release_Guide/release_steps/metcalcpy/update_version.rst index 22e0ddc4a8..2f14f2278f 100644 --- a/docs/Release_Guide/release_steps/metcalcpy/update_version.rst +++ b/docs/Release_Guide/release_steps/metcalcpy/update_version.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Remove **-dev** from the version number: diff --git a/docs/Release_Guide/release_steps/metcalcpy/update_version_bugfix.rst b/docs/Release_Guide/release_steps/metcalcpy/update_version_bugfix.rst index e069da58c3..d4ebf5eb71 100644 --- a/docs/Release_Guide/release_steps/metcalcpy/update_version_bugfix.rst +++ b/docs/Release_Guide/release_steps/metcalcpy/update_version_bugfix.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Update the version number for the bugfix release: diff --git a/docs/Release_Guide/release_steps/metcalcpy/update_version_official.rst b/docs/Release_Guide/release_steps/metcalcpy/update_version_official.rst index 0d315b4fe0..2f2796b5c1 100644 --- a/docs/Release_Guide/release_steps/metcalcpy/update_version_official.rst +++ b/docs/Release_Guide/release_steps/metcalcpy/update_version_official.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Remove **-dev** from the version number: diff --git a/docs/Release_Guide/release_steps/metcalcpy/update_version_on_develop.rst b/docs/Release_Guide/release_steps/metcalcpy/update_version_on_develop.rst index 48f393083b..99318b7cdd 100644 --- a/docs/Release_Guide/release_steps/metcalcpy/update_version_on_develop.rst +++ b/docs/Release_Guide/release_steps/metcalcpy/update_version_on_develop.rst @@ -1,5 +1,5 @@ Update Version on Develop Branch --------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Change METcalcpy/docs/version __version__ value to the next release after this one with -dev added to the end. Releases will loosely following these names, but are subject to diff --git a/docs/Release_Guide/release_steps/metdataio/update_version.rst b/docs/Release_Guide/release_steps/metdataio/update_version.rst index 55ab9b89d6..2f14f2278f 100644 --- a/docs/Release_Guide/release_steps/metdataio/update_version.rst +++ b/docs/Release_Guide/release_steps/metdataio/update_version.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Remove **-dev** from the version number: @@ -9,4 +9,4 @@ Remove **-dev** from the version number: * Remove **-dev** from the version number so that it matches the release you are creating. -* Commit changes and push to GitHub. \ No newline at end of file +* Commit changes and push to GitHub. diff --git a/docs/Release_Guide/release_steps/metdataio/update_version_bugfix.rst b/docs/Release_Guide/release_steps/metdataio/update_version_bugfix.rst index 8b3c78f6c6..86120b0378 100644 --- a/docs/Release_Guide/release_steps/metdataio/update_version_bugfix.rst +++ b/docs/Release_Guide/release_steps/metdataio/update_version_bugfix.rst @@ -1,8 +1,8 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Update the version number for the bugfix release: * For |projectRepo|, the file containing the version number is located at docs/version. * If the current release is listed as X.Y.Z (major.minor.micro), the bugfix version should be X.Y.Z+1 - (i.e. increment the micro value by 1: 1.1.0 becomes 1.1.1) \ No newline at end of file + (i.e. increment the micro value by 1: 1.1.0 becomes 1.1.1) diff --git a/docs/Release_Guide/release_steps/metdataio/update_version_official.rst b/docs/Release_Guide/release_steps/metdataio/update_version_official.rst index 45c1e9e9d5..442b4cbf6d 100644 --- a/docs/Release_Guide/release_steps/metdataio/update_version_official.rst +++ b/docs/Release_Guide/release_steps/metdataio/update_version_official.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Remove **-dev** from the version number: diff --git a/docs/Release_Guide/release_steps/metdataio/update_version_on_develop.rst b/docs/Release_Guide/release_steps/metdataio/update_version_on_develop.rst index 0822719c00..11632a7893 100644 --- a/docs/Release_Guide/release_steps/metdataio/update_version_on_develop.rst +++ b/docs/Release_Guide/release_steps/metdataio/update_version_on_develop.rst @@ -1,5 +1,5 @@ Update Version on Develop Branch --------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Change |projectRepo|/docs/version value to the next release after this one with -dev added to the end. Releases will loosely follow these names, but are subject to @@ -17,4 +17,4 @@ change: | X.Y.Z-rc1 | X.Y.Z-dev | +-------------------+-----------------------+ | X.Y.Z | (X+1).0.0-beta1-dev | -+-------------------+-----------------------+ \ No newline at end of file ++-------------------+-----------------------+ diff --git a/docs/Release_Guide/release_steps/metexpress/announce_release.rst b/docs/Release_Guide/release_steps/metexpress/announce_release.rst index 570cd0949f..5307df36ec 100644 --- a/docs/Release_Guide/release_steps/metexpress/announce_release.rst +++ b/docs/Release_Guide/release_steps/metexpress/announce_release.rst @@ -1,5 +1,5 @@ Announce Release -------------------- +^^^^^^^^^^^^^^^^ * Add a link for the latest production containers on https://dtcenter.org/community-code/metexpress/download. * Select both METplus and METexpress in the multi-selector box. diff --git a/docs/Release_Guide/release_steps/metexpress/checkout_development_branch.rst b/docs/Release_Guide/release_steps/metexpress/checkout_development_branch.rst index 4f6fabb194..b621bd5912 100644 --- a/docs/Release_Guide/release_steps/metexpress/checkout_development_branch.rst +++ b/docs/Release_Guide/release_steps/metexpress/checkout_development_branch.rst @@ -1,5 +1,5 @@ Checkout the Development Branch ----------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Checkout the development branch: diff --git a/docs/Release_Guide/release_steps/metexpress/checkout_development_branch_submodules.rst b/docs/Release_Guide/release_steps/metexpress/checkout_development_branch_submodules.rst index 8e4a314e08..33549a8b2c 100644 --- a/docs/Release_Guide/release_steps/metexpress/checkout_development_branch_submodules.rst +++ b/docs/Release_Guide/release_steps/metexpress/checkout_development_branch_submodules.rst @@ -1,5 +1,5 @@ Checkout the Development Branch ----------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Checkout the development branch: diff --git a/docs/Release_Guide/release_steps/metexpress/checkout_main_branch.rst b/docs/Release_Guide/release_steps/metexpress/checkout_main_branch.rst index b27a8cd7fd..aab8e4a430 100644 --- a/docs/Release_Guide/release_steps/metexpress/checkout_main_branch.rst +++ b/docs/Release_Guide/release_steps/metexpress/checkout_main_branch.rst @@ -1,5 +1,5 @@ Checkout the Main Branch --------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^ Checkout the main branch of the METexpress repo. diff --git a/docs/Release_Guide/release_steps/metexpress/clone_project_repository.rst b/docs/Release_Guide/release_steps/metexpress/clone_project_repository.rst index c00d239997..becf56747d 100644 --- a/docs/Release_Guide/release_steps/metexpress/clone_project_repository.rst +++ b/docs/Release_Guide/release_steps/metexpress/clone_project_repository.rst @@ -1,5 +1,5 @@ Clone the Project Repository ------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Create and work in a new directory to ensure a fresh environment: diff --git a/docs/Release_Guide/release_steps/metexpress/create_development_feature_branch.rst b/docs/Release_Guide/release_steps/metexpress/create_development_feature_branch.rst index 2a1cf13ee0..6fac5f7b4c 100644 --- a/docs/Release_Guide/release_steps/metexpress/create_development_feature_branch.rst +++ b/docs/Release_Guide/release_steps/metexpress/create_development_feature_branch.rst @@ -1,5 +1,5 @@ Create Development Feature Branch ------------------------------------ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Create a feature branch in which to perform any required development work. diff --git a/docs/Release_Guide/release_steps/metexpress/deploy_AWS_apps.rst b/docs/Release_Guide/release_steps/metexpress/deploy_AWS_apps.rst index df8ddf6d8f..17010885b5 100644 --- a/docs/Release_Guide/release_steps/metexpress/deploy_AWS_apps.rst +++ b/docs/Release_Guide/release_steps/metexpress/deploy_AWS_apps.rst @@ -1,5 +1,5 @@ Deploy AWS apps -------------------- +^^^^^^^^^^^^^^^ * On metexpress.nws.noaa.gov (VPN and permissions required), go to the container_deployment directory. diff --git a/docs/Release_Guide/release_steps/metexpress/deploy_beta_apps.rst b/docs/Release_Guide/release_steps/metexpress/deploy_beta_apps.rst index ecb64e5aad..cacd1260b8 100644 --- a/docs/Release_Guide/release_steps/metexpress/deploy_beta_apps.rst +++ b/docs/Release_Guide/release_steps/metexpress/deploy_beta_apps.rst @@ -1,5 +1,5 @@ Deploy Beta Apps ------------------ +^^^^^^^^^^^^^^^^ * After the apps build, which usually takes about 20 minutes, they should be installed on the dedicated beta server (mats-docker-int) for third party testing. diff --git a/docs/Release_Guide/release_steps/metexpress/deploy_production_apps.rst b/docs/Release_Guide/release_steps/metexpress/deploy_production_apps.rst index dbc4cf8495..d6f71f1097 100644 --- a/docs/Release_Guide/release_steps/metexpress/deploy_production_apps.rst +++ b/docs/Release_Guide/release_steps/metexpress/deploy_production_apps.rst @@ -1,5 +1,5 @@ Deploy Production Apps ------------------------ +^^^^^^^^^^^^^^^^^^^^^^ * If the beta tester approves the apps, deploy them to the production server (mats-docker). diff --git a/docs/Release_Guide/release_steps/metexpress/finalize_release_on_github_development.rst b/docs/Release_Guide/release_steps/metexpress/finalize_release_on_github_development.rst index 9c84f4e3b9..bdfe7fc4ff 100644 --- a/docs/Release_Guide/release_steps/metexpress/finalize_release_on_github_development.rst +++ b/docs/Release_Guide/release_steps/metexpress/finalize_release_on_github_development.rst @@ -1,5 +1,10 @@ Finalize Release on GitHub ----------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^ -* Close the GitHub issue for creating this development release. -* Any code changes will be automatically incorporated into METexpress development container builds once the pull request is approved. +Return to GitHub to finalize the details of this release. + +.. dropdown:: Instructions + + * Close the GitHub issue for creating this development release. + + * Any code changes will be automatically incorporated into METexpress development container builds once the pull request is approved. diff --git a/docs/Release_Guide/release_steps/metexpress/merge_development_to_main.rst b/docs/Release_Guide/release_steps/metexpress/merge_development_to_main.rst index c6bad193dc..f94228f831 100644 --- a/docs/Release_Guide/release_steps/metexpress/merge_development_to_main.rst +++ b/docs/Release_Guide/release_steps/metexpress/merge_development_to_main.rst @@ -1,5 +1,5 @@ Merge Development Changes to Main Branch ------------------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * ONLY PROCEED TO THIS STEP IF ALL OF THE AUTOMATED TESTS PASS FOR THE LATEST NIGHTLY DEVELOPMENT BUILD AT mats-docker-dev.gsd.esrl.noaa.gov (VPN required). diff --git a/docs/Release_Guide/release_steps/metexpress/merge_feature_branch.rst b/docs/Release_Guide/release_steps/metexpress/merge_feature_branch.rst index 74b7d9f084..7f1b765d1c 100644 --- a/docs/Release_Guide/release_steps/metexpress/merge_feature_branch.rst +++ b/docs/Release_Guide/release_steps/metexpress/merge_feature_branch.rst @@ -1,4 +1,4 @@ Merge Feature Branch ----------------------- +^^^^^^^^^^^^^^^^^^^^ * After making the desired code changes on a feature branch, submit a pull request to merge those changes back into the development branch. diff --git a/docs/Release_Guide/release_steps/metexpress/pull_changes_and_merge_to_dev.rst b/docs/Release_Guide/release_steps/metexpress/pull_changes_and_merge_to_dev.rst index 71544dc0d3..e8e2b875c6 100644 --- a/docs/Release_Guide/release_steps/metexpress/pull_changes_and_merge_to_dev.rst +++ b/docs/Release_Guide/release_steps/metexpress/pull_changes_and_merge_to_dev.rst @@ -1,5 +1,5 @@ Pull Changes, Create Release Branch, And Merge To Development ---------------------------------------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * On your system, pull any build-related code changes. diff --git a/docs/Release_Guide/release_steps/metexpress/tag_app_version_and_build.rst b/docs/Release_Guide/release_steps/metexpress/tag_app_version_and_build.rst index 11b2c83d67..5fa31c1ca3 100644 --- a/docs/Release_Guide/release_steps/metexpress/tag_app_version_and_build.rst +++ b/docs/Release_Guide/release_steps/metexpress/tag_app_version_and_build.rst @@ -1,5 +1,5 @@ Tag App Version and Build ---------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^ * METexpress apps are versioned as major.minor.patch. To trigger the build of a specific version, you will need to tag the current main branch in all the repositories with the version number. diff --git a/docs/Release_Guide/release_steps/metexpress/update_dates_and_versions.rst b/docs/Release_Guide/release_steps/metexpress/update_dates_and_versions.rst index 8584573a97..210b41f4bd 100644 --- a/docs/Release_Guide/release_steps/metexpress/update_dates_and_versions.rst +++ b/docs/Release_Guide/release_steps/metexpress/update_dates_and_versions.rst @@ -1,5 +1,5 @@ Update Release Notes ----------------------- +^^^^^^^^^^^^^^^^^^^^ You can refer to the GitHub Issues page to see what has changed for this release. Open the following URLs in a browser: diff --git a/docs/Release_Guide/release_steps/metplotpy/update_readme.rst b/docs/Release_Guide/release_steps/metplotpy/update_readme.rst deleted file mode 100644 index 30481b63ef..0000000000 --- a/docs/Release_Guide/release_steps/metplotpy/update_readme.rst +++ /dev/null @@ -1,6 +0,0 @@ -Update README -------------- -- Change 'METplotpy_develop' to replace develop with the release branch name, - i.e. 'METplotpy_main_v1.0' -- Change 'branch=develop' to replace develop with the release branch name, - i.e. 'branch=main_v4.0' diff --git a/docs/Release_Guide/release_steps/metplotpy/update_version.rst b/docs/Release_Guide/release_steps/metplotpy/update_version.rst index 536a9bba15..4fe3d30a5e 100644 --- a/docs/Release_Guide/release_steps/metplotpy/update_version.rst +++ b/docs/Release_Guide/release_steps/metplotpy/update_version.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Create the version number diff --git a/docs/Release_Guide/release_steps/metplotpy/update_version_bugfix.rst b/docs/Release_Guide/release_steps/metplotpy/update_version_bugfix.rst index e9a5704372..69d259dbc1 100644 --- a/docs/Release_Guide/release_steps/metplotpy/update_version_bugfix.rst +++ b/docs/Release_Guide/release_steps/metplotpy/update_version_bugfix.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Update the version number for the bugfix release: diff --git a/docs/Release_Guide/release_steps/metplotpy/update_version_official.rst b/docs/Release_Guide/release_steps/metplotpy/update_version_official.rst index 0d315b4fe0..2f2796b5c1 100644 --- a/docs/Release_Guide/release_steps/metplotpy/update_version_official.rst +++ b/docs/Release_Guide/release_steps/metplotpy/update_version_official.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Remove **-dev** from the version number: diff --git a/docs/Release_Guide/release_steps/metplotpy/update_version_on_develop.rst b/docs/Release_Guide/release_steps/metplotpy/update_version_on_develop.rst index ff744d7bbe..1c382af054 100644 --- a/docs/Release_Guide/release_steps/metplotpy/update_version_on_develop.rst +++ b/docs/Release_Guide/release_steps/metplotpy/update_version_on_develop.rst @@ -1,5 +1,5 @@ Update Version on Develop Branch --------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Change METplotpy/docs/version __version__ value to the next release after this one with -dev added to the end. Releases will loosely following these names, but are subject to diff --git a/docs/Release_Guide/release_steps/metplus/create_release_extra.rst b/docs/Release_Guide/release_steps/metplus/create_release_extra.rst index 1257ed86ba..1a30f2322c 100644 --- a/docs/Release_Guide/release_steps/metplus/create_release_extra.rst +++ b/docs/Release_Guide/release_steps/metplus/create_release_extra.rst @@ -4,6 +4,6 @@ Refer to a previous release to easily copy and modify this information. * If this is a development release, check the box that says "This is a pre-release" - and uncheck "Set as latest release" + and uncheck "Set as latest release". * Click on "Publish release". diff --git a/docs/Release_Guide/release_steps/metplus/create_release_reference_branch.rst b/docs/Release_Guide/release_steps/metplus/create_release_reference_branch.rst index db2a4db7ec..c52a3fc716 100644 --- a/docs/Release_Guide/release_steps/metplus/create_release_reference_branch.rst +++ b/docs/Release_Guide/release_steps/metplus/create_release_reference_branch.rst @@ -1,5 +1,5 @@ Create Release Reference Branch -------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * For METplus, the corresponding MET release must be created before starting this step. Specifically, a DockerHub tag on dtcenter/met that is named @@ -20,7 +20,7 @@ Create Release Reference Branch git checkout -b main_vX.Y-ref Update the version number -^^^^^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""""""" Update the content that should go into the release version but remain unchanged in the develop branch. @@ -39,7 +39,7 @@ Remove **-dev** from the version number: Commit these changes. Push Reference Branch to GitHub -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""""""""""""" :: @@ -51,7 +51,7 @@ data. These data will be used to verify that any bugfixes applied to the main_vX.Y branch does not break any of existing logic. Monitor GitHub Actions Workflow -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""""""""""""" Navigate to https://github.com/dtcenter/METplus/actions and verify that a *Testing* workflow was triggered on the *main_vX.Y-ref* branch. @@ -64,7 +64,7 @@ Navigate to https://github.com/dtcenter/METplus/actions and verify that a of these volumes start with *output-*. Create main branch and push to GitHub -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""""""""""""""""""" * After the truth data volumes have been generated, create the main_vX.Y branch off of the -ref branch. diff --git a/docs/Release_Guide/release_steps/metplus/update_manage_externals.rst b/docs/Release_Guide/release_steps/metplus/update_manage_externals.rst index 850a55ae2a..adc564a516 100644 --- a/docs/Release_Guide/release_steps/metplus/update_manage_externals.rst +++ b/docs/Release_Guide/release_steps/metplus/update_manage_externals.rst @@ -1,5 +1,5 @@ Update the version numbers in the manage externals files --------------------------------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are a few .cfg files used by Manage Externals that should include the correct tag or branch that corresponds to the @@ -38,7 +38,7 @@ For the METplus **5.0**.0 release: When in doubt, check the components' repository or ask another developer. Update build_components/Externals_stable.cfg -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +"""""""""""""""""""""""""""""""""""""""""""" Ensure the *tag* for each component is correct. It should match the format **vX.Y.Z** where X.Y.Z is the version of that component. @@ -46,14 +46,14 @@ For example, MET should be **v11.0.0** for METplus 5.0.0. Update .github/parm/Externals_metdataio_stable.cfg -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +"""""""""""""""""""""""""""""""""""""""""""""""""" Ensure the *branch* value is correct. It should match the format **main_vX.Y** where X.Y is the version of that component. For example, METdataio should be **main_v2.0** for METplus 5.0.0. Update .github/parm/Externals_metplotcalcpy_stable.cfg -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +"""""""""""""""""""""""""""""""""""""""""""""""""""""" Ensure the *branch* for each component is correct. It should match the format **main_vX.Y** where X.Y is the version of that component. diff --git a/docs/Release_Guide/release_steps/metplus/update_release_date.rst b/docs/Release_Guide/release_steps/metplus/update_release_date.rst index 0154d383f7..b04c5b677b 100644 --- a/docs/Release_Guide/release_steps/metplus/update_release_date.rst +++ b/docs/Release_Guide/release_steps/metplus/update_release_date.rst @@ -1,5 +1,5 @@ Update Release Date -------------------- +^^^^^^^^^^^^^^^^^^^ * The release date is stored in *metplus/RELEASE_DATE* in YYYYMMDD format. * Change the value stored in this file to match the current date. diff --git a/docs/Release_Guide/release_steps/metplus/update_version.rst b/docs/Release_Guide/release_steps/metplus/update_version.rst index 419e487b63..c62860d3f5 100644 --- a/docs/Release_Guide/release_steps/metplus/update_version.rst +++ b/docs/Release_Guide/release_steps/metplus/update_version.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Remove **-dev** from the version number: diff --git a/docs/Release_Guide/release_steps/metplus/update_version_bugfix.rst b/docs/Release_Guide/release_steps/metplus/update_version_bugfix.rst index 4b76d9d713..105ae74d8b 100644 --- a/docs/Release_Guide/release_steps/metplus/update_version_bugfix.rst +++ b/docs/Release_Guide/release_steps/metplus/update_version_bugfix.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Update the version number for the bugfix release: diff --git a/docs/Release_Guide/release_steps/metplus/update_version_on_develop.rst b/docs/Release_Guide/release_steps/metplus/update_version_on_develop.rst index cbad49ae5c..a34a1dc016 100644 --- a/docs/Release_Guide/release_steps/metplus/update_version_on_develop.rst +++ b/docs/Release_Guide/release_steps/metplus/update_version_on_develop.rst @@ -1,5 +1,5 @@ Update Version on Develop Branch --------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Switch to the develop branch and change metplus/VERSION value to the next release after this one with -dev added to the end. diff --git a/docs/Release_Guide/release_steps/metplus/update_web_server_data.rst b/docs/Release_Guide/release_steps/metplus/update_web_server_data.rst index c606b92328..8f7d664bf4 100644 --- a/docs/Release_Guide/release_steps/metplus/update_web_server_data.rst +++ b/docs/Release_Guide/release_steps/metplus/update_web_server_data.rst @@ -1,8 +1,8 @@ Update DTC Web Server Data --------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^ Create Directory for Next Release -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""""""""""""""" On the DTC web server where the sample input data for use cases is hosted, run the setup_next_release_data.py script for the next upcoming release diff --git a/docs/Release_Guide/release_steps/metviewer/update_version.rst b/docs/Release_Guide/release_steps/metviewer/update_version.rst index f55a9408d6..a184af6f36 100644 --- a/docs/Release_Guide/release_steps/metviewer/update_version.rst +++ b/docs/Release_Guide/release_steps/metviewer/update_version.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Create the version number diff --git a/docs/Release_Guide/release_steps/metviewer/update_version_bugfix.rst b/docs/Release_Guide/release_steps/metviewer/update_version_bugfix.rst index e10fa8adb0..7c1b59ec5c 100644 --- a/docs/Release_Guide/release_steps/metviewer/update_version_bugfix.rst +++ b/docs/Release_Guide/release_steps/metviewer/update_version_bugfix.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Update the version number for the bugfix release: diff --git a/docs/Release_Guide/release_steps/metviewer/update_version_official.rst b/docs/Release_Guide/release_steps/metviewer/update_version_official.rst index 35a584da59..cfc694bfb1 100644 --- a/docs/Release_Guide/release_steps/metviewer/update_version_official.rst +++ b/docs/Release_Guide/release_steps/metviewer/update_version_official.rst @@ -1,5 +1,5 @@ Update Version Number for Release ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Remove **-dev** from the version number: diff --git a/docs/Release_Guide/release_steps/metviewer/update_version_on_develop.rst b/docs/Release_Guide/release_steps/metviewer/update_version_on_develop.rst index 5488628e10..8171373ec4 100644 --- a/docs/Release_Guide/release_steps/metviewer/update_version_on_develop.rst +++ b/docs/Release_Guide/release_steps/metviewer/update_version_on_develop.rst @@ -1,5 +1,5 @@ Update Version on Develop Branch --------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Change METviewer/docs/version __version__ value to the next release after this one with -dev added to the end. Releases will loosely following these names, but are subject to diff --git a/docs/Release_Guide/release_steps/open_release_issue.rst b/docs/Release_Guide/release_steps/open_release_issue.rst index 46cdc15d83..35042da089 100644 --- a/docs/Release_Guide/release_steps/open_release_issue.rst +++ b/docs/Release_Guide/release_steps/open_release_issue.rst @@ -1,5 +1,5 @@ Open Release Issue ------------------- +^^^^^^^^^^^^^^^^^^ * Define a new issue in the |projectRepo| repository to create the new release. diff --git a/docs/Release_Guide/release_steps/push_release_branch.rst b/docs/Release_Guide/release_steps/push_release_branch.rst index afacac78c3..589670b333 100644 --- a/docs/Release_Guide/release_steps/push_release_branch.rst +++ b/docs/Release_Guide/release_steps/push_release_branch.rst @@ -1,5 +1,5 @@ Push Release Branch to GitHub ------------------------------ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Push the release branch to GitHub:: diff --git a/docs/Release_Guide/release_steps/release_acceptance_testing.rst b/docs/Release_Guide/release_steps/release_acceptance_testing.rst new file mode 100644 index 0000000000..d46e10c64b --- /dev/null +++ b/docs/Release_Guide/release_steps/release_acceptance_testing.rst @@ -0,0 +1,54 @@ +Release Acceptance Testing +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A single +`Release Acceptance Testing `_ +discussion in the METplus repository summarizes the external testing for all development +cycles of the METplus components included in a coordinated release. + +.. dropdown:: Instructions + + * If creating a release for the first development cycle (e.g. beta1 release), + check to see if the + `Release Acceptance Testing `_ + discussion for the next coordinated release has already been created. + * If not, create a new one to summarize external testing for all development + cycles of the METplus components. + + * Locate the **Release Acceptance Testing** discussion for the last + coordinated release. + * Copy and paste its contents into a new discussion, being sure to update + the title of the discussion and empty the contents of repository testing + tables for each of the METplus components. + * Carefully review the contents and links and update them as needed. + * If needed, create a new label for the next **METplus X.Y Coordinated Release** + in the METplus repository and add that label to this discussion. + + * Update the contents of the **Release Acceptance Testing** discussion for + each |projectRepo| development release. + + * Locate the |projectRepo| repository testing table within the body of the discussion. + * For issues for which no external testing is required: + + * Create a *single table entry* for this development cycle. + * Set the "Status" column to **PASS**. + * Set the "|projectRepo| Issue" column to a list of links for all of the issues. + * Set the "Dev Cycle" column to the current development cycle name (e.g. beta1, beta2, beta3, rc1). + * Leave the "Tester" column empty. + * Set the "Acceptance Testing Comment Link" column to **No external testing required**. + + * For issues that do require external testing: + + * Create a *separate table entry* for each issue. + * Set the "Status" column to **OPEN**. + * Set the "|projectRepo| Issue" column to link to the issue. + * Set the "Dev Cycle" column to the current development cycle name (e.g. beta1, beta2, beta3, rc1). + * Set the "Tester" column to a list of GitHub user name(s) to solicit their feedback. + * Leave the "Acceptance Testing Comment Link" column empty. + + * Save your edits to the discussion. + + * External testers are instructed to add comments to the discussion to summarize + the status of their testing. The METplus team monitors those comments and, as needed, + updates the "Status" and "Acceptance Testing Comment Link" columns of the repository + testing table for each METplus component. diff --git a/docs/Release_Guide/release_steps/rotate_authorship.rst b/docs/Release_Guide/release_steps/rotate_authorship.rst index 69bebee816..bd7d57016c 100644 --- a/docs/Release_Guide/release_steps/rotate_authorship.rst +++ b/docs/Release_Guide/release_steps/rotate_authorship.rst @@ -1,5 +1,5 @@ Rotate Authorship ------------------ +^^^^^^^^^^^^^^^^^ The METplus team rotates the list of authors in the citation instructions for each official release: diff --git a/docs/Release_Guide/release_steps/set_beta_deletion_reminder_official.rst b/docs/Release_Guide/release_steps/set_beta_deletion_reminder_official.rst index ef97006389..bf60ed0ea2 100644 --- a/docs/Release_Guide/release_steps/set_beta_deletion_reminder_official.rst +++ b/docs/Release_Guide/release_steps/set_beta_deletion_reminder_official.rst @@ -1,5 +1,5 @@ Set up Reminder to Delete Beta/RC Tags and Releases ---------------------------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Help keep the GitHub repositories and DockerHub clean by removing beta/rc tags and releases. diff --git a/docs/Release_Guide/release_steps/update_docs_official.rst b/docs/Release_Guide/release_steps/update_docs_official.rst index cd4a698588..9250763b1a 100644 --- a/docs/Release_Guide/release_steps/update_docs_official.rst +++ b/docs/Release_Guide/release_steps/update_docs_official.rst @@ -1,5 +1,5 @@ Update the Documentation on the Web ------------------------------------ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Because Read the Docs is configured to automate the building of new "main" branches in the METplus components' repositories, nothing needs to be done diff --git a/docs/Release_Guide/release_steps/update_release_notes_bugfix.rst b/docs/Release_Guide/release_steps/update_release_notes_bugfix.rst index 7fe434deae..bbdebb7680 100644 --- a/docs/Release_Guide/release_steps/update_release_notes_bugfix.rst +++ b/docs/Release_Guide/release_steps/update_release_notes_bugfix.rst @@ -1,5 +1,5 @@ Update Release Notes --------------------- +^^^^^^^^^^^^^^^^^^^^ You can refer to the GitHub Project board to see what has changed for this release. Open the following URL in a browser: diff --git a/docs/Release_Guide/release_steps/update_release_notes_development.rst b/docs/Release_Guide/release_steps/update_release_notes_development.rst index 72c2d1ce25..1baf3ef0f6 100644 --- a/docs/Release_Guide/release_steps/update_release_notes_development.rst +++ b/docs/Release_Guide/release_steps/update_release_notes_development.rst @@ -1,5 +1,5 @@ Update Release Notes --------------------- +^^^^^^^^^^^^^^^^^^^^ You can refer to the GitHub Project board to see what has changed for this release. Open the following URL in a browser: diff --git a/docs/Release_Guide/release_steps/update_release_notes_official.rst b/docs/Release_Guide/release_steps/update_release_notes_official.rst index d9e39e954d..d7509609a8 100644 --- a/docs/Release_Guide/release_steps/update_release_notes_official.rst +++ b/docs/Release_Guide/release_steps/update_release_notes_official.rst @@ -1,5 +1,5 @@ Update Release Notes --------------------- +^^^^^^^^^^^^^^^^^^^^ You can refer to the GitHub Project board to see what has changed for this release. Open the following URL in a browser: diff --git a/docs/Release_Guide/release_steps/update_upgrade_instructions.rst b/docs/Release_Guide/release_steps/update_upgrade_instructions.rst index bb28f258b2..4a8bf6c5a0 100644 --- a/docs/Release_Guide/release_steps/update_upgrade_instructions.rst +++ b/docs/Release_Guide/release_steps/update_upgrade_instructions.rst @@ -1,5 +1,5 @@ Update Upgrade Instructions ---------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^ Occasionally, changes will be made to software that will require users to make changes to their configuration files in order to use the latest release. For diff --git a/docs/Users_Guide/glossary.rst b/docs/Users_Guide/glossary.rst index 8c86a7645e..ef14ea48bc 100644 --- a/docs/Users_Guide/glossary.rst +++ b/docs/Users_Guide/glossary.rst @@ -1,3 +1,5 @@ +.. _METplus_glossary: + ****************************** METplus Configuration Glossary ****************************** @@ -2287,7 +2289,15 @@ METplus Configuration Glossary LOG_METPLUS Path to the METplus log file. Control the timestamp appended to the filename with :term:`LOG_TIMESTAMP_TEMPLATE`. - Set this variable to an empty string to turn off all logging. + Set this variable to an empty string or set :term:`LOG_TO_TERMINAL_ONLY` + = True to turn off all file logging and write all logs to the screen. + + | *Used by:* All + + LOG_TO_TERMINAL_ONLY + Set to True to skip writing any log files and instead send all log output + to the screen. Sets :term:`LOG_METPLUS` to an empty string if True. + Defaults to False. | *Used by:* All @@ -3391,7 +3401,7 @@ METplus Configuration Glossary POINT_STAT_GRID Specify the grid to use with the MET point_stat tool. - .. note:: please use :term:`POINT_STAT_MASK_GRID` + .. warning:: **DEPRECATED:** please use :term:`POINT_STAT_MASK_GRID` | *Used by:* PointStat @@ -3418,12 +3428,12 @@ METplus Configuration Glossary POINT_STAT_POLY Specify a polygon to use with the MET PointStat tool. - .. note:: please use :term:`POINT_STAT_MASK_POLY` + .. warning:: **DEPRECATED:** Please use :term:`POINT_STAT_MASK_POLY` | *Used by:* PointStat PB2NC_POLY - .. note:: please use :term:`PB2NC_MASK_POLY` + .. warning:: **DEPRECATED:** Please use :term:`PB2NC_MASK_POLY` | *Used by:* PB2NC @@ -10392,6 +10402,11 @@ METplus Configuration Glossary | *Used by:* TCDiag + TC_DIAG_ONE_TIME_PER_FILE_FLAG + Specify the value for 'one_time_per_file_flag' in the MET configuration file for TCDiag. + + | *Used by:* TCDiag + TC_DIAG_NC_RNG_AZI_FLAG Specify the value for 'nc_rng_azi_flag' in the MET configuration file for TCDiag. @@ -11108,3 +11123,8 @@ METplus Configuration Glossary See :term:`SKIP_VALID_TIMES` for formatting information. | *Used by:* UserScript + + GRID_STAT_CAT_THRESH + Specify the value for 'cat_thresh' in the MET configuration file for GridStat. + + | *Used by:* GridStat diff --git a/docs/Users_Guide/installation.rst b/docs/Users_Guide/installation.rst index 0d3225e7f0..3910bdca95 100644 --- a/docs/Users_Guide/installation.rst +++ b/docs/Users_Guide/installation.rst @@ -9,7 +9,7 @@ Introduction This chapter describes how to download and set up METplus Wrappers. -Supported architectures +Supported Architectures ======================= METplus Wrappers was developed on Debian Linux and is supported on this @@ -20,8 +20,9 @@ The METplus team supports the installation of the METplus components on several operational and research high performance computing platforms, including those at NCAR, NOAA, and other community machines. Pre-built METplus images on DockerHub are also provided. +See :ref:`metplus-docker` for information on running METplus using Docker. -Programming/scripting languages +Programming/Scripting Languages =============================== METplus Wrappers is written in Python. It is intended to be a tool @@ -109,14 +110,14 @@ Cartopy, one of the dependencies of CyclonePlotter, attempts to download shapefi .. _getcode: -Getting the METplus Wrappers source code +Getting the METplus Wrappers Source Code ======================================== The METplus Wrappers source code is available for download from the public GitHub repository. The source code can be retrieved either through a web browser or the command line. -Get the source code via Web Browser +Get the Source Code via Web Browser ----------------------------------- - Create a directory where the METplus Wrappers will be installed @@ -155,7 +156,7 @@ Tar File:: - Uncompress the source code (on Linux/Unix\ *: gunzip* for zip file or *tar xvfz* for the tar.gz file) -Get the source code via Command Line +Get the Source Code via Command Line ------------------------------------ - Open a shell terminal @@ -172,7 +173,7 @@ HTTPS:: .. _obtain_sample_input_data: -Obtain sample input data +Obtain Sample Input Data ======================== The use cases provided with the METplus release have sample input data @@ -200,7 +201,7 @@ the example use cases, which illustrate how the wrappers work. have already been obtained with a previous release. -METplus Wrappers directory structure +METplus Wrappers Directory Structure ==================================== The METplus Wrappers source code contains the following directory structure:: @@ -254,7 +255,7 @@ External Components .. _external-components-gfdl-tracker: -GFDL Tracker (optional) +GFDL Tracker (Optional) ----------------------- - The standalone Geophysical Fluid Dynamics Laboratory (GFDL) vortex tracker @@ -276,7 +277,7 @@ GFDL Tracker (optional) - Instructions on how to configure and use the GFDL tracker are found here https://dtcenter.org/sites/default/files/community-code/gfdl/standalone_tracker_UG_v3.9a.pdf -Disable UserScript wrapper (optional) +Disable UserScript Wrapper (Optional) ===================================== The UserScript wrapper allows any shell command or script to be run as part @@ -293,7 +294,7 @@ Please note that use cases provided with the METplus repository that utilize the UserScript wrapper will fail if attempted to run after it has been disabled. -Add ush directory to shell path (optional) +Add ush Directory to Shell Path (Optional) ========================================== To call the run_metplus.py script from any directory, add the ush directory diff --git a/docs/Users_Guide/release-notes.rst b/docs/Users_Guide/release-notes.rst index a07a77b894..c00627a35e 100644 --- a/docs/Users_Guide/release-notes.rst +++ b/docs/Users_Guide/release-notes.rst @@ -1,9 +1,9 @@ +.. _release-notes: + *************************** METplus Release Information *************************** -.. _release-notes: - Users can view the :ref:`releaseTypes` section of the Release Guide for descriptions of the development releases (including beta releases and release candidates), official releases, and bugfix @@ -76,6 +76,365 @@ METplus Version 6.0.0 Beta 1 Release Notes (2023-09-15) METplus Wrappers Upgrade Instructions ===================================== -No upgrade instructions are needed for this release. +Deprecated Wrapped MET Configuration Files +------------------------------------------ + +Background +^^^^^^^^^^ + +The METplus wrappers utilize *wrapped* MET configuration files that reference +environment variables that are set by the wrappers to override MET settings. +METplus v4.0.0 introduced a more efficient approach to overriding values in +MET configuration files through the METplus wrappers. +See :ref:`metplus-control-met` for more information. + +Prior to the v4.0.0 release, overriding MET settings that were not yet +supported by METplus configuration variables required users to copy an +existing *wrapped* MET config file, make the desired modifications, +then update their METplus config file to use the user-defined MET +configuration file. + +The new approach removes the need to maintain multiple *wrapped* MET +configuration files by using the *wrapped* MET configuration files that +are provided with the METplus wrappers. +This allows any new METplus configuration variables that set MET variables +to automatically be supported when moving to a new version of METplus. +Any MET configuration settings that are not yet controlled by a corresponding +METplus configuration variable can easily be set in a METplus configuration +file by using the MET config overrides variables. +See :ref:`met-config-overrides` for more information. + +How to tell if upgrade is needed +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If the wrapped MET config file used by a use case is the version provided +with the METplus wrappers, then no changes to the use case are needed. +The wrapped MET config files provided with the wrappers are found in the +parm/met_config directory. + +Search for variables that end with **_CONFIG_FILE** in the use case +configuration file. + +If the value looks like this:: + + GRID_STAT_CONFIG_FILE = {PARM_BASE}/met_config/GridStatConfig_wrapped + +or the variable it not found, then no changes are needed. + +Prior to v6.0.0, a use case that uses a wrapped MET config file that is +out-of-date from the version provided with the METplus wrappers will report a +warning in the log output alerting the user that an expected environment +variable is not found:: + + WARNING: Environment variable ${METPLUS_MODEL} is not utilized in MET config file: /path/to/GridStatConfig_trey + +This is often an indicator that the use case will need to be updated. +The deprecated environment variables, e.g. **${MODEL}**, were still set by the +wrappers, so the use case still ran without any issues. + +Starting in v6.0.0, the deprecated environment variables are no longer set and +an error message will be displayed for each deprecated variable that was found:: + + ERROR: Deprecated environment variables found in GRID_STAT_CONFIG_FILE: /path/to/GridStatConfig_trey + ERROR: Deprecated environment variable ${MODEL} found + ERROR: Deprecated environment variable ${OBTYPE} found + ERROR: Deprecated environment variable ${REGRID_TO_GRID} found + +If these errors occur, +the use case will not run until the METplus configuration file has been updated. + +How to upgrade +^^^^^^^^^^^^^^ + +Removing **_CONFIG_FILE**, e.g. :term:`GRID_STAT_CONFIG_FILE`, +from the METplus config file will prevent the errors and +allow the use case to run. +However, this alone may result in changes to the output because the settings +in the user-defined wrapped MET config file may no longer be set. + +**It is important to carefully review the settings and set the appropriate +METplus configuration variables to preserve the original configuration!** + +Compare the user-defined wrapped MET config file (:term:`GRID_STAT_CONFIG_FILE`) +with the default config file that is found in the MET installation location, +e.g. /path/to/met-X.Y.Z/share/met/GridStatConfig_default. +After the error log messages that list the deprecated environment variables +that were found, users can find the path to the files to compare in the final +error log message. +The error log messages also note the METplus config variable that will be +removed, e.g. :term:`GRID_STAT_CONFIG_FILE`. + +:: + + ERROR: Deprecated environment variables found in GRID_STAT_CONFIG_FILE: /path/to/GridStatConfig_trey + ERROR: Deprecated environment variable ${MODEL} found + ... + ERROR: Deprecated environment variable ${NEIGHBORHOOD_WIDTH} found + ERROR: Please set values that differ from the defaults in a METplus config file and unset GRID_STAT_CONFIG_FILE to use the wrapped MET config that is provided with the METplus wrappers. + ERROR: Compare values set in /path/to/GridStatConfig_trey to /path/to/met/share/met/config/GridStatConfig_default + +The easiest approach for investigating differences between two files is to use +a visual difference tool that displays the files side-by-side and highlights any +differences. +Alternatively, the **diff** command is available on most Linux systems and can +be used to quickly view line-by-line differences. +However, viewing the actual files directly may still be necessary +to see the context of the differences within the files. +The **-y** argument can be provided to **diff** to view the differences in the +terminal side-by-side in two columns. + +Please create a +`METplus GitHub Discussions `_ +post for any questions or clarification. + +The following examples of differences are shown using the format that is output +by the **diff** utility. +Lines that begin with the **<** character are from the first file passed +to **diff** (i.e. the user-defined wrapped MET config file). +Lines that begin with the **>** character are from the second file passed +to **diff** (i.e. the default MET config file). +Lines that contain three dashes (*\-\-\-*) separate the lines from each file. + +:: + + diff /path/to/GridStatConfig_trey /path/to/met/share/met/config/GridStatConfig_default + +Comments +"""""""" + +Text following two forward slashes (**//**) are comments. +They are not read by the configuration file parser and can be ignored. + +:: + + < // For additional information, see the MET_BASE/config/README file. + --- + > // For additional information, please see the MET User's Guide. + +Variables only in default config +"""""""""""""""""""""""""""""""" + +Differences that are only found in the default config file +(preceded by **>** with no corresponding **<** line) +can be ignored. These are likely new config variables that were added since +the user-defined wrapped MET config file was created. + +:: + + > hss_ec_value = NA; + +Variables referencing deprecated environment variables +"""""""""""""""""""""""""""""""""""""""""""""""""""""" + +Variables that include a reference to an environment variable that was +previously set by METplus but has since been deprecated do not require updates. + +:: + + < model = "${MODEL}"; + --- + > model = "WRF"; + +We know that the environment variable **${MODEL}** was deprecated because it was +mentioned in the error log:: + + ERROR: Deprecated environment variable ${MODEL} found + +There is a new environment variable, **${METPLUS_MODEL}**, that will set the +value of *model* in the wrapped MET config file that is provided with the +METplus wrappers. +The same METplus configuration variable that set the deprecated +environment variable will set the new environment variable, so no changes +are needed to the METplus configuration file to handle this update. + +fcst and obs dictionaries +""""""""""""""""""""""""" + +Deprecated environment variables **${FCST_FIELD}** and **${OBS_FIELD}** can be +ignored because they have been replaced by **${METPLUS_FCST_FIELD}** and +**${METPLUS_OBS_FIELD}**. +The same METplus configuration variables that set these variables +will also set the new corresponding environment variables. + +User-defined wrapped MET config vs. default MET config +:: + + fcst = { fcst = { + field = [ ${FCST_FIELD} ]; | + } | field = [ + obs = { | { + field = [ ${OBS_FIELD} ]; | name = "APCP"; + > level = [ "A03" ]; + > cat_thresh = [ >0.0, >=5.0 ]; + > } + > ]; + > + } } + > obs = fcst; + +Field information (name/level/etc) that has been defined explicitly in the +user-defined wrapped MET config variable will need to be set using the +appropriate METplus configuration variables, e.g. **FCST_VAR1_NAME**, +**FCST_VAR1_LEVELS**, **OBS_VAR1_NAME**, **OBS_VAR1_LEVELS**, etc. +See :ref:`Field_Info` for more information. + +Variables that contain different values +""""""""""""""""""""""""""""""""""""""" + +Values that differ will need to be set in the METplus configuration file. +Many of the MET variables are set using METplus config variables. +The name of the corresponding METplus config variable typically matches the +format **_**. + +For example, the **cat_thresh** variable for GridStat is controlled by the +:term:`GRID_STAT_CAT_THRESH` METplus config variable (as of v6.0.0). + +MET config dictionary variables are typically set by METplus config +variables that match the format **__**. + +For example, the **to_grid** variable inside the **regrid** dictionary is +controlled by the :term:`GRID_STAT_REGRID_TO_GRID` METplus config variable. + +The :ref:`python_wrappers` chapter of the METplus User's Guide contains sections +for each MET tool. Each MET tool that uses a MET configuration file will include +a *MET Configuration* section that contains the contents of the +wrapped MET config file that is provided with the METplus wrappers, followed by +tables that show how the MET settings correspond to the METplus variables. + +In the wrapped MET config file, +MET variables that are controlled by METplus config variables will be commented +out (using *//*) and followed by an environment variable +(starting with *METPLUS_*):: + + // cat_thresh = + ${METPLUS_CAT_THRESH} + +A corresponding table entry will exist listing the METplus config variable that +is used to set the value. See :ref:`grid-stat-met-conf-cat-thresh`. + +**${METPLUS_CAT_THRESH}** + +.. list-table:: + :widths: 5 5 + :header-rows: 0 + + * - METplus Config(s) + - MET Config File + * - :term:`GRID_STAT_CAT_THRESH` + - cat_thresh + +MET variables that are NOT controlled by METplus config variables will likely be +set to a value in the wrapped config file (unless they were newly added) and an +entry in the tables will not be found. +In this case, its value can still be overridden through a METplus config file +by using the MET config overrides variables. +See the *Unsupported Variable Example* below for more information. + +**Supported Variable Example:** + +:: + + < cat_thresh = [ NA ]; + --- + > cat_thresh = []; + +The :ref:`GridStat - MET Configuration` section +of the Python Wrappers chapter shows that :term:`GRID_STAT_CAT_THRESH` is the +METplus config variable that sets **cat_thresh** in the wrapped GridStat +MET config file. +To set the variable found in the user-defined wrapped MET config +file, set the following in the METplus config file:: + + GRID_STAT_CAT_THRESH = NA + +Note that this difference was likely not set by the user but rather due to a +change in the default values. See :ref:`reconcile_default_values` +for more information. + +**Supported Dictionary Variable Example:** + +:: + + < cdf_bins = 2; + --- + > cdf_bins = 1; + +It is difficult to tell the **cdf_bins** variable is a member of the +**climo_cdf** dictionary from the *diff* output. +Viewing the two files side-by-side, either by opening both files or +using the *-y* argument to *diff*, +is necessary in this case to see which dictionary the variable belongs to:: + + climo_cdf = { climo_cdf = { + cdf_bins = 2; | cdf_bins = 1; + center_bins = FALSE; center_bins = FALSE; + write_bins = TRUE; write_bins = TRUE; + } } + +The :ref:`GridStat - MET Configuration` section of +the Python Wrappers chapter shows that :term:`GRID_STAT_CLIMO_CDF_BINS` is the +METplus config variable that sets the **climo_cdf.cdf_bins** variable +in the GridStat wrapped MET config file. +Note that slightly redundant :term:`GRID_STAT_CLIMO_CDF_CDF_BINS` is also +supported to match the naming convention __. + +To set the variable found in the user-defined wrapped MET config +file, set the following in the METplus config file:: + + GRID_STAT_CLIMO_CDF_BINS = 2 + +**Unsupported Variable Example:** + +:: + + < ci_alpha = [ 0.3 ]; + --- + > ci_alpha = [ 0.05 ]; + +The **ci_alpha** variable is not found in the +:ref:`GridStat - MET Configuration` section. +Reviewing the wrapped MET config file in this section will reveal that there is +no environment variable that sets the variable. + +In this case, add the desired setting including the variable name to the +MET config overrides variable without changing any formatting:: + + GRID_STAT_MET_CONFIG_OVERRIDES = ci_alpha = [ 0.3 ]; + +See :ref:`met-config-overrides` for more information. + +Variables referencing user-defined environment variables +"""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +Some users may have set their own environment variables and referenced them in +their wrapped MET config file. An environment variable that is not found in the +error logs listing deprecated environment variables and does not start with +**METPLUS_** was likely defined by the user. These variables will no longer +be supported, so the variables that reference them should be set using METplus +configuration variables instead. + +Verify results +^^^^^^^^^^^^^^ + +Once all of the changes are made, it is recommended to confirm that the use case +produces the same results. A good way to confirm this is to run the use case +using the version of METplus that was previously used, run the use case with the +new version with use case updates, then compare the output. + +A diff utility is provided with the METplus wrappers that can be used to compare +two directories that contain METplus output while filtering out differences that +are not relevant, such as skipping log files that contain different timestamps +and ignoring version number differences in stat output files. The diff utility +can be found in the METplus installation location at +**metplus/util/diff_util.py**. Call the script on the command line passing in +the two directory (or file) paths to compare:: + + /path/to/METplus-X.Y.Z/metplus/util/diff_util.py /path/to/output_one /path/to/output_two + +Users can also review the environment variables that were set by METplus by +running the use case with :ref:`LOG_LEVEL` **= DEBUG**. The list of environment +variables set will be logged directly before the call to the MET application. -**TODO: Add info about switching to using provided wrapped MET config file instead of user-defined.** +Please submit a +`METplus GitHub Discussions `_ +post for assistance with updating use cases or verifying results. diff --git a/docs/Users_Guide/statistics_list.rst b/docs/Users_Guide/statistics_list.rst index 537c3063fc..076466e970 100644 --- a/docs/Users_Guide/statistics_list.rst +++ b/docs/Users_Guide/statistics_list.rst @@ -15,7 +15,7 @@ Statistics Database Statistics List A-B -___________________ +------------------- .. role:: raw-html(raw) :format: html @@ -137,7 +137,7 @@ ___________________ - PSTD Statistics List C-E -___________________ +------------------- .. role:: raw-html(raw) :format: html @@ -307,7 +307,7 @@ ___________________ SSVAR Statistics List F -_________________ +----------------- .. list-table:: Statistics List F :widths: auto @@ -528,8 +528,8 @@ _________________ NBRCTC Statistics List G-M -___________________ - +------------------- + .. role:: raw-html(raw) :format: html @@ -734,7 +734,7 @@ ___________________ - VCNT Statistics List N-O -___________________ +------------------- .. role:: raw-html(raw) :format: html @@ -909,7 +909,7 @@ ___________________ Statistics List P-R -___________________ +------------------- .. role:: raw-html(raw) @@ -1130,7 +1130,7 @@ ___________________ Statistics List S-T -___________________ +------------------- .. role:: raw-html(raw) @@ -1246,7 +1246,7 @@ ___________________ Statistics List U-Z -___________________ +------------------- .. role:: raw-html(raw) :format: html @@ -1433,7 +1433,7 @@ Diagnostics Database METplus Line Type - currently unlimited (approx 33 characters) Diagnostics List A-B -____________________ +-------------------- .. role:: raw-html(raw) :format: html @@ -1514,7 +1514,7 @@ ____________________ - MODE obj Diagnostics List C-E -____________________ +-------------------- .. role:: raw-html(raw) :format: html @@ -1680,7 +1680,7 @@ ____________________ - MTD 3D obj Diagnostics List F -__________________ +------------------ .. role:: raw-html(raw) :format: html @@ -1936,7 +1936,7 @@ __________________ Diagnostics List G-L -____________________ +-------------------- .. role:: raw-html(raw) :format: html @@ -2078,7 +2078,7 @@ ____________________ Diagnostics List M-O -____________________ +-------------------- .. role:: raw-html(raw) :format: html @@ -2253,7 +2253,7 @@ ____________________ Diagnostics List P-Z -____________________ +-------------------- .. role:: raw-html(raw) :format: html diff --git a/docs/Users_Guide/systemconfiguration.rst b/docs/Users_Guide/systemconfiguration.rst index 6d447e7d7b..bca6adb1db 100644 --- a/docs/Users_Guide/systemconfiguration.rst +++ b/docs/Users_Guide/systemconfiguration.rst @@ -340,6 +340,19 @@ to the METplus log file:: If set to false/no, the output is written to a separate file in the log directory named after the application. + +.. _log_to_terminal_only: + +LOG_TO_TERMINAL_ONLY +"""""""""""""""""""" + +If set to True, all log output is written to the screen only. +This includes output from commands that are run, e.g. MET commands. +No log files will be created and :ref:`log_metplus` will be set to an empty +string. :: + + LOG_TO_TERMINAL_ONLY = True + Log Level Information ^^^^^^^^^^^^^^^^^^^^^ @@ -719,7 +732,7 @@ The following is a configuration that will process initialization time 2019-02-0 INIT_INCREMENT = 6H .. note:: - Substituting VALID_INCREMENT = 21600 will generate the same result. + Substituting INIT_INCREMENT = 21600 will generate the same result. This will process data initialized on 2019-02-01 at 00Z, 06Z, 12Z, and 18Z as well as 2019-02-02 at 00Z. For each of these initialization times, METplus Wrappers can also loop over a set of forecast leads that are all initialized at the current run time. See :ref:`looping_over_forecast_leads` for more information. @@ -2106,20 +2119,20 @@ Notice that this file is similar to the default GridStat MET config file, but some of the variables in the wrapped configuration file have been replaced with environment variables. -GridStatConfig\_**default**:: +GridStatConfig\_\ **default**:: desc = "NA"; -GridStatConfig\_**wrapped**:: +GridStatConfig\_\ **wrapped**:: // desc = ${METPLUS_DESC} When GridStat is run, the tool first reads its default configuration file -(GridStatConfig\_**default**) and sets all of the default values. Then it reads +(GridStatConfig\_\ **default**) and sets all of the default values. Then it reads the configuration file that is passed into the tool on the command line, which is *typically* the wrapped GridStat config file -(parm/met_config/GridStatConfig\_**wrapped**). +(parm/met_config/GridStatConfig\_\ **wrapped**). If the user sets the following in their METplus config file:: @@ -2142,8 +2155,8 @@ the names of the METplus config variable, environment variable, and MET config variable are closely related, i.e. * **desc**: MET config name -* GRID_STAT\_**DESC**: METplus config name -* $METPLUS\_**DESC**: Environment variable name +* GRID_STAT\_\ **DESC**: METplus config name +* $METPLUS\_\ **DESC**: Environment variable name However, this is not always the case. Refer to the 'MET Configuration' section for each wrapper in the:doc:`wrappers` chapter to see the full list of @@ -2188,11 +2201,11 @@ Instead of a single METplus configuration variable to control the value of this environment variable, there are multiple variables -- one for each item of the dictionary: -* GRID_STAT_REGRID_**TO_GRID** -* GRID_STAT_REGRID_**METHOD** -* GRID_STAT_REGRID_**WIDTH** -* GRID_STAT_REGRID_**VLD_THRESH** -* GRID_STAT_REGRID_**SHAPE** +* GRID_STAT_REGRID\_\ **TO_GRID** +* GRID_STAT_REGRID\_\ **METHOD** +* GRID_STAT_REGRID\_\ **WIDTH** +* GRID_STAT_REGRID\_\ **VLD_THRESH** +* GRID_STAT_REGRID\_\ **SHAPE** If all of these variables are unset, then the value of ${METPLUS_REGRID_DICT} will be an empty string. If one or more of these variables are set, then each @@ -2347,7 +2360,7 @@ cat_thresh +------------------+---------------------------------------------------------------+ | New (Correct): | cat_thresh = []; | +------------------+---------------------------------------------------------------+ -| METplus Config: | :term:`GRID_STAT_MET_CONFIG_OVERRIDES` = cat_thresh = [ NA ]; | +| METplus Config: | :term:`GRID_STAT_CAT_THRESH` = NA; | +------------------+---------------------------------------------------------------+ output_flag (multiple items) diff --git a/docs/Users_Guide/wrappers.rst b/docs/Users_Guide/wrappers.rst index e51c3e6cb1..fe5a6b5a80 100644 --- a/docs/Users_Guide/wrappers.rst +++ b/docs/Users_Guide/wrappers.rst @@ -1,3 +1,5 @@ +.. _python_wrappers: + *************** Python Wrappers *************** @@ -82,13 +84,19 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/Ascii2NcConfig_wrapped +.. dropdown:: Click to view parm/met_config/Ascii2NcConfig_wrapped + + .. literalinclude:: ../../parm/met_config/Ascii2NcConfig_wrapped -**${METPLUS_TIME_SUMMARY_DICT}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_TIME_SUMMARY_DICT} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -115,11 +123,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`ASCII2NC_TIME_SUMMARY_VALID_THRESH` - time_summary.vld_thresh -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -352,46 +361,55 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/EnsembleStatConfig_wrapped +.. dropdown:: Click to view parm/met_config/EnsembleStatConfig_wrapped + + .. literalinclude:: ../../parm/met_config/EnsembleStatConfig_wrapped -**${METPLUS_MODEL}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_DESC}** +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`DESC` or :term:`ENSEMBLE_STAT_DESC` - desc -**${METPLUS_OBTYPE}** +${METPLUS_OBTYPE} +""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBTYPE` - obtype -**${METPLUS_REGRID_DICT}** +${METPLUS_REGRID_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -412,77 +430,84 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`ENSEMBLE_STAT_REGRID_CENSOR_VAL` - regrid.censor_val -**${METPLUS_CENSOR_THRESH}** +${METPLUS_CENSOR_THRESH} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_CENSOR_THRESH` - censor_thresh -**${METPLUS_CENSOR_VAL}** +${METPLUS_CENSOR_VAL} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_CENSOR_VAL` - censor_val -**${METPLUS_ENS_FILE_TYPE}** +${METPLUS_ENS_FILE_TYPE} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENS_ENSEMBLE_STAT_INPUT_DATATYPE` - ens.file_type -**${METPLUS_ENS_THRESH}** +${METPLUS_ENS_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_ENS_THRESH` - fcst.ens_thresh -**${METPLUS_VLD_THRESH}** +${METPLUS_VLD_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_VLD_THRESH` - fcst.vld_thresh -**${METPLUS_OBS_THRESH}** +${METPLUS_OBS_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_OBS_THRESH` - obs_thresh -**${METPLUS_ENS_FIELD}** +${METPLUS_ENS_FIELD} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -497,55 +522,60 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the forecast field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_PROB_CAT_THRESH}** +${METPLUS_PROB_CAT_THRESH} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_PROB_CAT_THRESH` - prob_cat_thresh -**${METPLUS_PROB_PCT_THRESH}** +${METPLUS_PROB_PCT_THRESH} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_PROB_PCT_THRESH` - prob_pct_thresh -**${METPLUS_ECLV_POINTS}** +${METPLUS_ECLV_POINTS} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_ECLV_POINTS` - eclv_points -**${METPLUS_FCST_FILE_TYPE}** +${METPLUS_FCST_FILE_TYPE} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_ENSEMBLE_STAT_INPUT_DATATYPE` - fcst.file_type -**${METPLUS_FCST_FIELD}** +${METPLUS_FCST_FIELD} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -560,22 +590,24 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the forecast field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_OBS_FILE_TYPE}** +${METPLUS_OBS_FILE_TYPE} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_ENSEMBLE_STAT_INPUT_GRID_DATATYPE` -or- :term:`OBS_ENSEMBLE_STAT_INPUT_POINT_DATATYPE` - obs.file_type -**${METPLUS_OBS_FIELD}** +${METPLUS_OBS_FIELD} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -590,77 +622,84 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the observation field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_MESSAGE_TYPE}** +${METPLUS_MESSAGE_TYPE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_MESSAGE_TYPE` - message_type -**${METPLUS_DUPLICATE_FLAG}** +${METPLUS_DUPLICATE_FLAG} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_DUPLICATE_FLAG` - duplicate_flag -**${METPLUS_SKIP_CONST}** +${METPLUS_SKIP_CONST} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_SKIP_CONST` - skip_const -**${METPLUS_OBS_ERROR_FLAG}** +${METPLUS_OBS_ERROR_FLAG} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_OBS_ERROR_FLAG` - obs_error.flag -**${METPLUS_ENS_SSVAR_BIN_SIZE}** +${METPLUS_ENS_SSVAR_BIN_SIZE} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_ENS_SSVAR_BIN_SIZE` - ens_ssvar_bin_size -**${METPLUS_ENS_PHIST_BIN_SIZE}** +${METPLUS_ENS_PHIST_BIN_SIZE} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_ENS_PHIST_BIN_SIZE` - ens_phist_bin_size -**${METPLUS_CLIMO_MEAN_DICT}** +${METPLUS_CLIMO_MEAN_DICT} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -686,11 +725,12 @@ see :ref:`How METplus controls MET config file settings`. - climo_mean.hour_interval -**${METPLUS_CLIMO_STDEV_DICT}** +${METPLUS_CLIMO_STDEV_DICT} +""""""""""""""""""""""""""" .. list-table:: - :widths: 5 5 - :header-rows: 0 + :widths: 7 3 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -716,22 +756,24 @@ see :ref:`How METplus controls MET config file settings`. - climo_stdev.hour_interval -**${METPLUS_CLIMO_CDF_DICT}** +${METPLUS_CLIMO_CDF_DICT} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_OBS_WINDOW_DICT}** +${METPLUS_OBS_WINDOW_DICT} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -744,44 +786,48 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`ENSEMBLE_STAT_CLIMO_CDF_DIRECT_PROB` - climo_cdf.direct_prob -**${METPLUS_MASK_GRID}** +${METPLUS_MASK_GRID} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_MASK_GRID` - mask.grid -**${METPLUS_MASK_POLY}** +${METPLUS_MASK_POLY} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_MASK_POLY` - mask.poly -**${METPLUS_CI_ALPHA}** +${METPLUS_CI_ALPHA} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_CI_ALPHA` - ci_alpha -**${METPLUS_INTERP_DICT}** +${METPLUS_INTERP_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -796,11 +842,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`ENSEMBLE_STAT_INTERP_WIDTH` - interp.type.width -**${METPLUS_OUTPUT_FLAG_DICT}** +${METPLUS_OUTPUT_FLAG_DICT} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -829,11 +876,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`ENSEMBLE_STAT_OUTPUT_FLAG_ECLV` - output_flag.eclv -**${METPLUS_NC_ORANK_FLAG_DICT}** +${METPLUS_NC_ORANK_FLAG_DICT} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -852,77 +900,84 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`ENSEMBLE_STAT_NC_ORANK_FLAG_WEIGHT` - nc_orank_flag.weight -**${METPLUS_OUTPUT_PREFIX}** +${METPLUS_OUTPUT_PREFIX} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_OUTPUT_PREFIX` - output_prefix -**${METPLUS_OBS_QUALITY_INC}** +${METPLUS_OBS_QUALITY_INC} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_OBS_QUALITY_INC` - obs_quality_inc -**${METPLUS_OBS_QUALITY_EXC}** +${METPLUS_OBS_QUALITY_EXC} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_OBS_QUALITY_EXC` - obs_quality_exc -**${METPLUS_ENS_MEMBER_IDS}** +${METPLUS_ENS_MEMBER_IDS} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_ENS_MEMBER_IDS` - ens_member_ids -**${METPLUS_CONTROL_ID}** +${METPLUS_CONTROL_ID} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_CONTROL_ID` - control_id -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ENSEMBLE_STAT_MET_CONFIG_OVERRIDES` - n/a -**${METPLUS_GRID_WEIGHT_FLAG}** +${METPLUS_GRID_WEIGHT_FLAG} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -1160,35 +1215,43 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/GenEnsProdConfig_wrapped +.. dropdown:: Click to view parm/met_config/GenEnsProdConfig_wrapped + + .. literalinclude:: ../../parm/met_config/GenEnsProdConfig_wrapped + +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -**${METPLUS_MODEL}** +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_DESC}** +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`DESC` or :term:`GEN_ENS_PROD_DESC` - desc -**${METPLUS_REGRID_DICT}** +${METPLUS_REGRID_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -1209,99 +1272,108 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GEN_ENS_PROD_REGRID_CENSOR_VAL` - regrid.censor_val -**${METPLUS_CENSOR_THRESH}** +${METPLUS_CENSOR_THRESH} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GEN_ENS_PROD_CENSOR_THRESH` - censor_thresh -**${METPLUS_CENSOR_VAL}** +${METPLUS_CENSOR_VAL} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GEN_ENS_PROD_CENSOR_VAL` - censor_val -**${METPLUS_NORMALIZE}** +${METPLUS_NORMALIZE} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GEN_ENS_PROD_NORMALIZE` - normalize -**${METPLUS_CAT_THRESH}** +${METPLUS_CAT_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GEN_ENS_PROD_CAT_THRESH` - cat_thresh -**${METPLUS_NC_VAR_STR}** +${METPLUS_NC_VAR_STR} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GEN_ENS_PROD_NC_VAR_STR` - nc_var_str -**${METPLUS_ENS_FILE_TYPE}** +${METPLUS_ENS_FILE_TYPE} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GEN_ENS_PROD_ENS_FILE_TYPE` - ens.file_type -**${METPLUS_ENS_ENS_THRESH}** +${METPLUS_ENS_ENS_THRESH} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GEN_ENS_PROD_ENS_THRESH` - ens.ens_thresh -**${METPLUS_ENS_VLD_THRESH}** +${METPLUS_ENS_VLD_THRESH} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GEN_ENS_PROD_ENS_VLD_THRESH` - ens.vld_thresh -**${METPLUS_ENS_FIELD}** +${METPLUS_ENS_FIELD} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -1316,11 +1388,12 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the forecast field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_NBRHD_PROB_DICT}** +${METPLUS_NBRHD_PROB_DICT} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -1331,11 +1404,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GEN_ENS_PROD_NBRHD_PROB_VLD_THRESH` - nbrhd_prob.vld_thresh -**${METPLUS_NMEP_SMOOTH_DICT}** +${METPLUS_NMEP_SMOOTH_DICT} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -1352,11 +1426,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GEN_ENS_PROD_NMEP_SMOOTH_WIDTH` - nmep_smooth.type.width -**${METPLUS_CLIMO_MEAN_DICT}** +${METPLUS_CLIMO_MEAN_DICT} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -1381,11 +1456,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GEN_ENS_PROD_CLIMO_MEAN_HOUR_INTERVAL` - climo_mean.hour_interval -**${METPLUS_CLIMO_STDEV_DICT}** +${METPLUS_CLIMO_STDEV_DICT} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -1410,11 +1486,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GEN_ENS_PROD_CLIMO_STDEV_HOUR_INTERVAL` - climo_stdev.hour_interval -**${METPLUS_ENSEMBLE_FLAG_DICT}** +${METPLUS_ENSEMBLE_FLAG_DICT} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -1447,33 +1524,36 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GEN_ENS_PROD_ENSEMBLE_FLAG_CLIMO_CDP` - ensemble_flag.climo_cdp -**${METPLUS_ENS_MEMBER_IDS}** +${METPLUS_ENS_MEMBER_IDS} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GEN_ENS_PROD_ENS_MEMBER_IDS` - ens_member_ids -**${METPLUS_CONTROL_ID}** +${METPLUS_CONTROL_ID} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GEN_ENS_PROD_CONTROL_ID` - control_id -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -1643,1036 +1723,1135 @@ file. While it may appear that environment variables are used in the NML template file, they are not actually environment variables. The wrapper searches for these strings and substitutes the values as appropriate. -.. literalinclude:: ../../parm/use_cases/met_tool_wrapper/GFDLTracker/template.nml +.. dropdown:: Click to view parm/use_cases/met_tool_wrapper/GFDLTracker/template.nml -**${METPLUS_DATEIN_INP_BCC}** + .. literalinclude:: ../../parm/use_cases/met_tool_wrapper/GFDLTracker/template.nml + +Environment variables in template +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_DATEIN_INP_BCC} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`INIT_BEG` - &datein: inp%bcc -**${METPLUS_DATEIN_INP_BYY}** +${METPLUS_DATEIN_INP_BYY} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`INIT_BEG` - &datein: inp%byy -**${METPLUS_DATEIN_INP_BMM}** +${METPLUS_DATEIN_INP_BMM} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`INIT_BEG` - &datein: inp%bmm -**${METPLUS_DATEIN_INP_BDD}** +${METPLUS_DATEIN_INP_BDD} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`INIT_BEG` - &datein: inp%bdd -**${METPLUS_DATEIN_INP_BHH}** +${METPLUS_DATEIN_INP_BHH} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`INIT_BEG` - &datein: inp%bhh -**${METPLUS_DATEIN_INP_MODEL}** +${METPLUS_DATEIN_INP_MODEL} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_DATEIN_INP_MODEL` - &datein: inp%model -**${METPLUS_DATEIN_INP_MODTYP}** +${METPLUS_DATEIN_INP_MODTYP} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_DATEIN_INP_MODTYP` - &datein: inp%modtyp -**${METPLUS_DATEIN_INP_LT_UNITS}** +${METPLUS_DATEIN_INP_LT_UNITS} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_DATEIN_INP_LT_UNITS` - &datein: inp%lt_units -**${METPLUS_DATEIN_INP_FILE_SEQ}** +${METPLUS_DATEIN_INP_FILE_SEQ} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_DATEIN_INP_FILE_SEQ` - &datein: inp%file_seq -**${METPLUS_DATEIN_INP_NESTTYP}** +${METPLUS_DATEIN_INP_NESTTYP} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_DATEIN_INP_NESTTYP` - &datein: inp%nesttyp -**${METPLUS_ATCFINFO_ATCFNUM}** +${METPLUS_ATCFINFO_ATCFNUM} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_ATCFINFO_ATCFNUM` - &atcfinfo: atcfnum -**${METPLUS_ATCFINFO_ATCFNAME}** +${METPLUS_ATCFINFO_ATCFNAME} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_ATCFINFO_ATCFNAME` - &atcfinfo: atcfname -**${METPLUS_ATCFINFO_ATCFYMDH}** +${METPLUS_ATCFINFO_ATCFYMDH} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`INIT_BEG` - &atcfinfo: atcfymdh -**${METPLUS_ATCFINFO_ATCFFREQ}** +${METPLUS_ATCFINFO_ATCFFREQ} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_ATCFINFO_ATCFFREQ` - &atcfinfo: atcffreq -**${METPLUS_TRACKERINFO_TYPE}** +${METPLUS_TRACKERINFO_TYPE} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_TYPE` - &trackerinfo: trkrinfo%type -**${METPLUS_TRACKERINFO_MSLPTHRESH}** +${METPLUS_TRACKERINFO_MSLPTHRESH} +""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_MSLPTHRESH` - &trackerinfo: trkrinfo%mslpthresh -**${METPLUS_TRACKERINFO_USE_BACKUP_MSLP_GRAD_CHECK}** +${METPLUS_TRACKERINFO_USE_BACKUP_MSLP_GRAD_CHECK} +""""""""""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_USE_BACKUP_MSLP_GRAD_CHECK` - &trackerinfo: trkrinfo%use_backup_mslp_grad_check -**${METPLUS_TRACKERINFO_V850THRESH}** +${METPLUS_TRACKERINFO_V850THRESH} +""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_V850THRESH` - &trackerinfo: trkrinfo%v850thresh -**${METPLUS_TRACKERINFO_USE_BACKUP_850_VT_CHECK}** +${METPLUS_TRACKERINFO_USE_BACKUP_850_VT_CHECK} +"""""""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_USE_BACKUP_850_VT_CHECK` - &trackerinfo: trkrinfo%use_backup_850_vt_check -**${METPLUS_TRACKERINFO_ENABLE_TIMING}** +${METPLUS_TRACKERINFO_ENABLE_TIMING} +"""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_ENABLE_TIMING` - &trackerinfo: trkrinfo%enable_timing -**${METPLUS_TRACKERINFO_GRIDTYPE}** +${METPLUS_TRACKERINFO_GRIDTYPE} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_GRIDTYPE` - &trackerinfo: trkrinfo%gridtype -**${METPLUS_TRACKERINFO_CONTINT}** +${METPLUS_TRACKERINFO_CONTINT} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_CONTINT` - &trackerinfo: trkrinfo%contint -**${METPLUS_TRACKERINFO_WANT_OCI}** +${METPLUS_TRACKERINFO_WANT_OCI} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_WANT_OCI` - &trackerinfo: trkrinfo%want_oci -**${METPLUS_TRACKERINFO_OUT_VIT}** +${METPLUS_TRACKERINFO_OUT_VIT} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_OUT_VIT` - &trackerinfo: trkrinfo%out_vit -**${METPLUS_TRACKERINFO_USE_LAND_MASK}** +${METPLUS_TRACKERINFO_USE_LAND_MASK} +"""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_USE_LAND_MASK` - &trackerinfo: trkrinfo%use_land_mask -**${METPLUS_TRACKERINFO_INP_DATA_TYPE}** +${METPLUS_TRACKERINFO_INP_DATA_TYPE} +"""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_INP_DATA_TYPE` - &trackerinfo: trkrinfo%inp_data_type -**${METPLUS_TRACKERINFO_GRIBVER}** +${METPLUS_TRACKERINFO_GRIBVER} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_GRIBVER` - &trackerinfo: trkrinfo%gribver -**${METPLUS_TRACKERINFO_G2_JPDTN}** +${METPLUS_TRACKERINFO_G2_JPDTN} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_G2_JPDTN` - &trackerinfo: trkrinfo%g2_jpdtn -**${METPLUS_TRACKERINFO_G2_MSLP_PARM_ID}** +${METPLUS_TRACKERINFO_G2_MSLP_PARM_ID} +"""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_G2_MSLP_PARM_ID` - &trackerinfo: trkrinfo%g2_mslp_parm_id -**${METPLUS_TRACKERINFO_G1_MSLP_PARM_ID}** +${METPLUS_TRACKERINFO_G1_MSLP_PARM_ID} +"""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_G1_MSLP_PARM_ID` - &trackerinfo: trkrinfo%g1_mslp_parm_id -**${METPLUS_TRACKERINFO_G1_SFCWIND_LEV_TYP}** +${METPLUS_TRACKERINFO_G1_SFCWIND_LEV_TYP} +""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_G1_SFCWIND_LEV_TYP` - &trackerinfo: trkrinfo%g1_sfcwind_lev_typ -**${METPLUS_TRACKERINFO_G1_SFCWIND_LEV_VAL}** +${METPLUS_TRACKERINFO_G1_SFCWIND_LEV_VAL} +""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_TRACKERINFO_G1_SFCWIND_LEV_VAL` - &trackerinfo: trkrinfo%g1_sfcwind_lev_val -**${METPLUS_PHASEINFO_PHASEFLAG}** +${METPLUS_PHASEINFO_PHASEFLAG} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_PHASEINFO_PHASEFLAG` - &phaseinfo: phaseflag -**${METPLUS_PHASEINFO_PHASESCHEME}** +${METPLUS_PHASEINFO_PHASESCHEME} +"""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_PHASEINFO_PHASESCHEME` - &phaseinfo: phasescheme -**${METPLUS_PHASEINFO_WCORE_DEPTH}** +${METPLUS_PHASEINFO_WCORE_DEPTH} +"""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_PHASEINFO_WCORE_DEPTH` - &phaseinfo: wcore_depth -**${METPLUS_STRUCTINFO_STRUCTFLAG}** +${METPLUS_STRUCTINFO_STRUCTFLAG} +"""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_STRUCTINFO_STRUCTFLAG` - &structinfo: structflag -**${METPLUS_STRUCTINFO_IKEFLAG}** +${METPLUS_STRUCTINFO_IKEFLAG} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_STRUCTINFO_IKEFLAG` - &structinfo: ikeflag -**${METPLUS_FNAMEINFO_GMODNAME}** +${METPLUS_FNAMEINFO_GMODNAME} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_FNAMEINFO_GMODNAME` - &fnameinfo: gmodname -**${METPLUS_FNAMEINFO_RUNDESCR}** +${METPLUS_FNAMEINFO_RUNDESCR} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_FNAMEINFO_RUNDESCR` - &fnameinfo: rundescr -**${METPLUS_FNAMEINFO_ATCFDESCR}** +${METPLUS_FNAMEINFO_ATCFDESCR} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_FNAMEINFO_ATCFDESCR` - &fnameinfo: atcfdescr -**${METPLUS_WAITINFO_USE_WAITFOR}** +${METPLUS_WAITINFO_USE_WAITFOR} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_WAITINFO_USE_WAITFOR` - &waitinfo: use_waitfor -**${METPLUS_WAITINFO_WAIT_MIN_AGE}** +${METPLUS_WAITINFO_WAIT_MIN_AGE} +"""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_WAITINFO_WAIT_MIN_AGE` - &waitinfo: wait_min_age -**${METPLUS_WAITINFO_WAIT_MIN_SIZE}** +${METPLUS_WAITINFO_WAIT_MIN_SIZE} +""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_WAITINFO_WAIT_MIN_SIZE` - &waitinfo: wait_min_size -**${METPLUS_WAITINFO_WAIT_MAX_WAIT}** +${METPLUS_WAITINFO_WAIT_MAX_WAIT} +""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_WAITINFO_WAIT_MAX_WAIT` - &waitinfo: wait_max_wait -**${METPLUS_WAITINFO_WAIT_SLEEPTIME}** +${METPLUS_WAITINFO_WAIT_SLEEPTIME} +"""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_WAITINFO_WAIT_SLEEPTIME` - &waitinfo: wait_sleeptime -**${METPLUS_WAITINFO_USE_PER_FCST_COMMAND}** +${METPLUS_WAITINFO_USE_PER_FCST_COMMAND} +"""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_WAITINFO_USE_PER_FCST_COMMAND` - &waitinfo: use_per_fcst_command -**${METPLUS_WAITINFO_PER_FCST_COMMAND}** +${METPLUS_WAITINFO_PER_FCST_COMMAND} +"""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_WAITINFO_PER_FCST_COMMAND` - &waitinfo: per_fcst_command -**${METPLUS_NETCDFINFO_LAT_NAME}** +${METPLUS_NETCDFINFO_LAT_NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_LAT_NAME` - &netcdflist: netcdfinfo%lat_name -**${METPLUS_NETCDFINFO_LMASKNAME}** +${METPLUS_NETCDFINFO_LMASKNAME} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_LMASKNAME` - &netcdflist: netcdfinfo%lmaskname -**${METPLUS_NETCDFINFO_LON_NAME}** +${METPLUS_NETCDFINFO_LON_NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_LON_NAME` - &netcdflist: netcdfinfo%lon_name -**${METPLUS_NETCDFINFO_MSLPNAME}** +${METPLUS_NETCDFINFO_MSLPNAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_MSLPNAME` - &netcdflist: netcdfinfo%mslpname -**${METPLUS_NETCDFINFO_NETCDF_FILENAME}** +${METPLUS_NETCDFINFO_NETCDF_FILENAME} +""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_NETCDF_FILENAME` - &netcdflist: netcdfinfo%netcdf_filename -**${METPLUS_NETCDFINFO_NUM_NETCDF_VARS}** +${METPLUS_NETCDFINFO_NUM_NETCDF_VARS} +""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_NUM_NETCDF_VARS` - &netcdflist: netcdfinfo%num_netcdf_vars -**${METPLUS_NETCDFINFO_RV700NAME}** +${METPLUS_NETCDFINFO_RV700NAME} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_RV700NAME` - &netcdflist: netcdfinfo%rv700name -**${METPLUS_NETCDFINFO_RV850NAME}** +${METPLUS_NETCDFINFO_RV850NAME} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_RV850NAME` - &netcdflist: netcdfinfo%rv850name -**${METPLUS_NETCDFINFO_TIME_NAME}** +${METPLUS_NETCDFINFO_TIME_NAME} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_TIME_NAME` - &netcdflist: netcdfinfo%time_name -**${METPLUS_NETCDFINFO_TIME_UNITS}** +${METPLUS_NETCDFINFO_TIME_UNITS} +"""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_TIME_UNITS` - &netcdflist: netcdfinfo%time_units -**${METPLUS_NETCDFINFO_TMEAN_300_500_NAME}** +${METPLUS_NETCDFINFO_TMEAN_300_500_NAME} +"""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_TMEAN_300_500_NAME` - &netcdflist: netcdfinfo%tmean_300_500_name -**${METPLUS_NETCDFINFO_U500NAME}** +${METPLUS_NETCDFINFO_U500NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_U500NAME` - &netcdflist: netcdfinfo%u500name -**${METPLUS_NETCDFINFO_U700NAME}** +${METPLUS_NETCDFINFO_U700NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_U700NAME` - &netcdflist: netcdfinfo%u700name -**${METPLUS_NETCDFINFO_U850NAME}** +${METPLUS_NETCDFINFO_U850NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_U850NAME` - &netcdflist: netcdfinfo%u850name -**${METPLUS_NETCDFINFO_USFCNAME}** +${METPLUS_NETCDFINFO_USFCNAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_USFCNAME` - &netcdflist: netcdfinfo%usfcname -**${METPLUS_NETCDFINFO_V500NAME}** +${METPLUS_NETCDFINFO_V500NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_V500NAME` - &netcdflist: netcdfinfo%v500name -**${METPLUS_NETCDFINFO_V700NAME}** +${METPLUS_NETCDFINFO_V700NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_V700NAME` - &netcdflist: netcdfinfo%v700name -**${METPLUS_NETCDFINFO_V850NAME}** +${METPLUS_NETCDFINFO_V850NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_V850NAME` - &netcdflist: netcdfinfo%v850name -**${METPLUS_NETCDFINFO_VSFCNAME}** +${METPLUS_NETCDFINFO_VSFCNAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_VSFCNAME` - &netcdflist: netcdfinfo%vsfcname -**${METPLUS_NETCDFINFO_Z200NAME}** +${METPLUS_NETCDFINFO_Z200NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z200NAME` - &netcdflist: netcdfinfo%z200name -**${METPLUS_NETCDFINFO_Z300NAME}** +${METPLUS_NETCDFINFO_Z300NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z300NAME` - &netcdflist: netcdfinfo%z300name -**${METPLUS_NETCDFINFO_Z350NAME}** +${METPLUS_NETCDFINFO_Z350NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z350NAME` - &netcdflist: netcdfinfo%z350name -**${METPLUS_NETCDFINFO_Z400NAME}** +${METPLUS_NETCDFINFO_Z400NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z400NAME` - &netcdflist: netcdfinfo%z400name -**${METPLUS_NETCDFINFO_Z450NAME}** +${METPLUS_NETCDFINFO_Z450NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z450NAME` - &netcdflist: netcdfinfo%z450name -**${METPLUS_NETCDFINFO_Z500NAME}** +${METPLUS_NETCDFINFO_Z500NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z500NAME` - &netcdflist: netcdfinfo%z500name -**${METPLUS_NETCDFINFO_Z550NAME}** +${METPLUS_NETCDFINFO_Z550NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z550NAME` - &netcdflist: netcdfinfo%z550name -**${METPLUS_NETCDFINFO_Z600NAME}** +${METPLUS_NETCDFINFO_Z600NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z600NAME` - &netcdflist: netcdfinfo%z600name -**${METPLUS_NETCDFINFO_Z650NAME}** +${METPLUS_NETCDFINFO_Z650NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z650NAME` - &netcdflist: netcdfinfo%z650name -**${METPLUS_NETCDFINFO_Z700NAME}** +${METPLUS_NETCDFINFO_Z700NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z700NAME` - &netcdflist: netcdfinfo%z700name -**${METPLUS_NETCDFINFO_Z750NAME}** +${METPLUS_NETCDFINFO_Z750NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z750NAME` - &netcdflist: netcdfinfo%z750name -**${METPLUS_NETCDFINFO_Z800NAME}** +${METPLUS_NETCDFINFO_Z800NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z800NAME` - &netcdflist: netcdfinfo%z800name -**${METPLUS_NETCDFINFO_Z850NAME}** +${METPLUS_NETCDFINFO_Z850NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z850NAME` - &netcdflist: netcdfinfo%z850name -**${METPLUS_NETCDFINFO_Z900NAME}** +${METPLUS_NETCDFINFO_Z900NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_NETCDFINFO_Z900NAME` - &netcdflist: netcdfinfo%z900name -**${METPLUS_USER_WANTS_TO_TRACK_ZETA700}** +${METPLUS_USER_WANTS_TO_TRACK_ZETA700} +"""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_ZETA700` - &parmpreflist: user_wants_to_track_zeta700 -**${METPLUS_USER_WANTS_TO_TRACK_WCIRC850}** +${METPLUS_USER_WANTS_TO_TRACK_WCIRC850} +""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_WCIRC850` - &parmpreflist: user_wants_to_track_wcirc850 -**${METPLUS_USER_WANTS_TO_TRACK_WCIRC700}** +${METPLUS_USER_WANTS_TO_TRACK_WCIRC700} +""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_WCIRC700` - &parmpreflist: user_wants_to_track_wcirc700 -**${METPLUS_USER_WANTS_TO_TRACK_GPH850}** +${METPLUS_USER_WANTS_TO_TRACK_GPH850} +""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_GPH850` - &parmpreflist: user_wants_to_track_gph850 -**${METPLUS_USER_WANTS_TO_TRACK_GPH700}** +${METPLUS_USER_WANTS_TO_TRACK_GPH700} +""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_GPH700` - &parmpreflist: user_wants_to_track_gph700 -**${METPLUS_USER_WANTS_TO_TRACK_MSLP}** +${METPLUS_USER_WANTS_TO_TRACK_MSLP} +""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_MSLP` - &parmpreflist: user_wants_to_track_mslp -**${METPLUS_USER_WANTS_TO_TRACK_WCIRCSFC}** +${METPLUS_USER_WANTS_TO_TRACK_WCIRCSFC} +""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_WCIRCSFC` - &parmpreflist: user_wants_to_track_wcircsfc -**${METPLUS_USER_WANTS_TO_TRACK_ZETASFC}** +${METPLUS_USER_WANTS_TO_TRACK_ZETASFC} +"""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_ZETASFC` - &parmpreflist: user_wants_to_track_zetasfc -**${METPLUS_USER_WANTS_TO_TRACK_THICK500850}** +${METPLUS_USER_WANTS_TO_TRACK_THICK500850} +"""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_THICK500850` - &parmpreflist: user_wants_to_track_thick500850 -**${METPLUS_USER_WANTS_TO_TRACK_THICK200500}** +${METPLUS_USER_WANTS_TO_TRACK_THICK200500} +"""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_THICK200500` - &parmpreflist: user_wants_to_track_thick200500 -**${METPLUS_USER_WANTS_TO_TRACK_THICK200850}** +${METPLUS_USER_WANTS_TO_TRACK_THICK200850} +"""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_THICK200850` - &parmpreflist: user_wants_to_track_thick200850 -**${METPLUS_USER_WANTS_TO_TRACK_ZETA850}** +${METPLUS_USER_WANTS_TO_TRACK_ZETA850} +"""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_USER_WANTS_TO_TRACK_ZETA850` - &parmpreflist: user_wants_to_track_zeta850 -**${METPLUS_VERBOSE_VERB}** +${METPLUS_VERBOSE_VERB} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File * - :term:`GFDL_TRACKER_VERBOSE_VERB` - &verbose: verb -**${METPLUS_VERBOSE_VERB_G2}** +${METPLUS_VERBOSE_VERB_G2} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - NML Config File @@ -2739,24 +2918,31 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/GridDiagConfig_wrapped +.. dropdown:: Click to view parm/met_config/GridDiagConfig_wrapped + + .. literalinclude:: ../../parm/met_config/GridDiagConfig_wrapped -**${METPLUS_DESC}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`DESC` or :term:`GRID_DIAG_DESC` - desc -**${METPLUS_REGRID_DICT}** +${METPLUS_REGRID_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -2777,22 +2963,24 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GRID_DIAG_REGRID_CENSOR_VAL` - regrid.censor_val -**${METPLUS_CENSOR_THRESH}** +${METPLUS_CENSOR_THRESH} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GRID_DIAG_CENSOR_THRESH` - censor_thresh -**${METPLUS_CENSOR_VAL}** +${METPLUS_CENSOR_VAL} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -2800,11 +2988,12 @@ see :ref:`How METplus controls MET config file settings`. - censor_val -**${METPLUS_DATA_DICT}** +${METPLUS_DATA_DICT} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -2817,11 +3006,12 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_MASK_DICT}** +${METPLUS_MASK_DICT} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -2832,11 +3022,12 @@ see :ref:`How METplus controls MET config file settings`. .. note:: Since the default value in the MET config file for 'grid' is grid = [ "FULL" ];, setting GRID_DIAG_MASK_GRID to an empty string will result in a value of grid = []; in the MET config file. -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -2967,6 +3158,7 @@ METplus Configuration | :term:`GRID_STAT_FOURIER_WAVE_1D_END` | :term:`GRID_STAT_CENSOR_THRESH` | :term:`GRID_STAT_CENSOR_VAL` +| :term:`GRID_STAT_CAT_THRESH` | :term:`FCST_GRID_STAT_IS_PROB` | :term:`FCST_GRID_STAT_PROB_IN_GRIB_PDS` | :term:`GRID_STAT_MASK_GRID` @@ -3030,46 +3222,55 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/GridStatConfig_wrapped +.. dropdown:: Click to view parm/met_config/GridStatConfig_wrapped + + .. literalinclude:: ../../parm/met_config/GridStatConfig_wrapped + +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -**${METPLUS_MODEL}** +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_DESC}** +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`DESC` or :term:`GRID_STAT_DESC` - desc -**${METPLUS_OBTYPE}** +${METPLUS_OBTYPE} +""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBTYPE` - obtype -**${METPLUS_REGRID_DICT}** +${METPLUS_REGRID_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3090,11 +3291,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GRID_STAT_REGRID_CENSOR_VAL` - regrid.censor_val -**${METPLUS_FCST_FIELD}** +${METPLUS_FCST_FIELD} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3109,22 +3311,24 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the forecast field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_FCST_FILE_TYPE}** +${METPLUS_FCST_FILE_TYPE} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_GRID_STAT_FILE_TYPE` - fcst.file_type -**${METPLUS_OBS_FIELD}** +${METPLUS_OBS_FIELD} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3139,22 +3343,24 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the observation field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_OBS_FILE_TYPE}** +${METPLUS_OBS_FILE_TYPE} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_GRID_STAT_FILE_TYPE` - obs.file_type -**${METPLUS_CLIMO_MEAN_DICT}** +${METPLUS_CLIMO_MEAN_DICT} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3179,11 +3385,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GRID_STAT_CLIMO_MEAN_HOUR_INTERVAL` - climo_mean.hour_interval -**${METPLUS_CLIMO_STDEV_DICT}** +${METPLUS_CLIMO_STDEV_DICT} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3208,11 +3415,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GRID_STAT_CLIMO_STDEV_HOUR_INTERVAL` - climo_stdev.hour_interval -**${METPLUS_MASK_DICT}** +${METPLUS_MASK_DICT} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3223,66 +3431,74 @@ see :ref:`How METplus controls MET config file settings`. .. note:: Since the default value in the MET config file for 'grid' is grid = [ "FULL" ];, setting GRID_STAT_MASK_GRID to an empty string will result in a value of grid = []; in the MET config file. -**${METPLUS_NBRHD_SHAPE}** +${METPLUS_NBRHD_SHAPE} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GRID_STAT_NEIGHBORHOOD_SHAPE` - nbrhd.shape -**${METPLUS_NBRHD_WIDTH}** +${METPLUS_NBRHD_WIDTH} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GRID_STAT_NEIGHBORHOOD_WIDTH` - nbrhd.width -**${METPLUS_NBRHD_COV_THRESH}** +${METPLUS_NBRHD_COV_THRESH} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GRID_STAT_NEIGHBORHOOD_COV_THRESH` - nbrhd.cov_thresh -**${METPLUS_OUTPUT_PREFIX}** +${METPLUS_OUTPUT_PREFIX} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GRID_STAT_OUTPUT_PREFIX` - output_prefix -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GRID_STAT_MET_CONFIG_OVERRIDES` - n/a -**${METPLUS_CLIMO_CDF_DICT}** +.. _grid-stat-met-conf-climo-cdf: + +${METPLUS_CLIMO_CDF_DICT} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3295,11 +3511,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GRID_STAT_CLIMO_CDF_DIRECT_PROB` - climo_cdf.direct_prob -**${METPLUS_OUTPUT_FLAG_DICT}** +${METPLUS_OUTPUT_FLAG_DICT} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3348,11 +3565,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GRID_STAT_OUTPUT_FLAG_SEEPS` - output_flag.seeps -**${METPLUS_NC_PAIRS_FLAG_DICT}** +${METPLUS_NC_PAIRS_FLAG_DICT} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3381,11 +3599,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GRID_STAT_NC_PAIRS_FLAG_SEEPS` - nc_pairs_flag.seeps -**${METPLUS_INTERP_DICT}** +${METPLUS_INTERP_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3400,44 +3619,48 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GRID_STAT_INTERP_TYPE_WIDTH` - interp.type.width -**${METPLUS_NC_PAIRS_VAR_NAME}** +${METPLUS_NC_PAIRS_VAR_NAME} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GRID_STAT_NC_PAIRS_VAR_NAME` - nc_pairs_var_name -**${METPLUS_GRID_WEIGHT_FLAG}** +${METPLUS_GRID_WEIGHT_FLAG} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GRID_STAT_GRID_WEIGHT_FLAG` - grid_weight_flag -**${METPLUS_HSS_EC_VALUE}** +${METPLUS_HSS_EC_VALUE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GRID_STAT_HSS_EC_VALUE` - hss_ec_value -**${METPLUS_DISTANCE_MAP_DICT}** +${METPLUS_DISTANCE_MAP_DICT} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3452,11 +3675,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GRID_STAT_DISTANCE_MAP_BETA_VALUE_N` - distance_map.beta_value(n) -**${METPLUS_FOURIER_DICT}** +${METPLUS_FOURIER_DICT} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3465,33 +3689,50 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`GRID_STAT_FOURIER_WAVE_1D_END` - fourier.wave_1d_end -**${METPLUS_CENSOR_THRESH}** +${METPLUS_CENSOR_THRESH} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GRID_STAT_CENSOR_THRESH` - censor_thresh -**${METPLUS_CENSOR_VAL}** +${METPLUS_CENSOR_VAL} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`GRID_STAT_CENSOR_VAL` - censor_val -**${METPLUS_SEEPS_P1_THRESH}** +.. _grid-stat-met-conf-cat-thresh: + +${METPLUS_CAT_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 + + * - METplus Config(s) + - MET Config File + * - :term:`GRID_STAT_CAT_THRESH` + - cat_thresh + +${METPLUS_SEEPS_P1_THRESH} +"""""""""""""""""""""""""" + +.. list-table:: + :widths: 5 5 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3577,57 +3818,67 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/IODA2NCConfig_wrapped +.. dropdown:: Click to view parm/met_config/IODA2NCConfig_wrapped + + .. literalinclude:: ../../parm/met_config/IODA2NCConfig_wrapped + +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -**${METPLUS_MESSAGE_TYPE}** +${METPLUS_MESSAGE_TYPE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`IODA2NC_MESSAGE_TYPE` - message_type -**${METPLUS_MESSAGE_TYPE_MAP}** +${METPLUS_MESSAGE_TYPE_MAP} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`IODA2NC_MESSAGE_TYPE_MAP` - message_type_map -**${METPLUS_MESSAGE_TYPE_GROUP_MAP}** +${METPLUS_MESSAGE_TYPE_GROUP_MAP} +""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`IODA2NC_MESSAGE_TYPE_GROUP_MAP` - message_type_group_map -**${METPLUS_STATION_ID}** +${METPLUS_STATION_ID} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`IODA2NC_STATION_ID` - station_id -**${METPLUS_OBS_WINDOW_DICT}** +${METPLUS_OBS_WINDOW_DICT} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3636,11 +3887,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`IODA2NC_OBS_WINDOW_END` - obs_window.end -**${METPLUS_MASK_DICT}** +${METPLUS_MASK_DICT} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3649,11 +3901,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`IODA2NC_MASK_POLY` - mask.poly -**${METPLUS_ELEVATION_RANGE_DICT}** +${METPLUS_ELEVATION_RANGE_DICT} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3662,11 +3915,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`IODA2NC_ELEVATION_RANGE_END` - elevation_range.end -**${METPLUS_LEVEL_RANGE_DICT}** +${METPLUS_LEVEL_RANGE_DICT} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3675,66 +3929,72 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`IODA2NC_LEVEL_RANGE_END` - level_range.end -**${METPLUS_OBS_VAR}** +${METPLUS_OBS_VAR} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`IODA2NC_OBS_VAR` - obs_var -**${METPLUS_OBS_NAME_MAP}** +${METPLUS_OBS_NAME_MAP} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`IODA2NC_OBS_NAME_MAP` - obs_name_map -**${METPLUS_METADATA_MAP}** +${METPLUS_METADATA_MAP} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`IODA2NC_METADATA_MAP` - metadata_map -**${METPLUS_MISSING_THRESH}** +${METPLUS_MISSING_THRESH} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`IODA2NC_MISSING_THRESH` - missing_thresh -**${METPLUS_QUALITY_MARK_THRESH}** +${METPLUS_QUALITY_MARK_THRESH} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`IODA2NC_QUALITY_MARK_THRESH` - quality_mark_thresh -**${METPLUS_TIME_SUMMARY_DICT}** +${METPLUS_TIME_SUMMARY_DICT} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3761,11 +4021,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`IODA2NC_TIME_SUMMARY_VLD_THRESH` - time_summary.vld_thresh -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -3818,167 +4079,187 @@ file. While it may appear that environment variables are used in the XML template file, they are not actually environment variables. The wrapper searches for these strings and substitutes the values as appropriate. -.. literalinclude:: ../../parm/use_cases/met_tool_wrapper/METdbLoad/METdbLoadConfig.xml +.. dropdown:: Click to view parm/use_cases/met_tool_wrapper/METdbLoad/METdbLoadConfig.xml -**${METPLUS_MV_HOST}** + .. literalinclude:: ../../parm/use_cases/met_tool_wrapper/METdbLoad/METdbLoadConfig.xml + +Environment variables in XML config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_MV_HOST} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_HOST` - -**${METPLUS_MV_DATABASE}** +${METPLUS_MV_DATABASE} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_DATABASE` - -**${METPLUS_MV_USER}** +${METPLUS_MV_USER} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_USER` - -**${METPLUS_MV_PASSWORD}** +${METPLUS_MV_PASSWORD} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_PASSWORD` - -**${METPLUS_MV_VERBOSE}** +${METPLUS_MV_VERBOSE} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_VERBOSE` - -**${METPLUS_MV_INSERT_SIZE}** +${METPLUS_MV_INSERT_SIZE} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_INSERT_SIZE` - -**${METPLUS_MV_MODE_HEADER_DB_CHECK}** +${METPLUS_MV_MODE_HEADER_DB_CHECK} +"""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_MODE_HEADER_DB_CHECK` - -**${METPLUS_MV_DROP_INDEXES}** +${METPLUS_MV_DROP_INDEXES} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_DROP_INDEXES` - -**${METPLUS_MV_APPLY_INDEXES}** +${METPLUS_MV_APPLY_INDEXES} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_APPLY_INDEXES` - -**${METPLUS_MV_GROUP}** +${METPLUS_MV_GROUP} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_GROUP` - -**${METPLUS_MV_LOAD_STAT}** +${METPLUS_MV_LOAD_STAT} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_LOAD_STAT` - -**${METPLUS_MV_LOAD_MODE}** +${METPLUS_MV_LOAD_MODE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_LOAD_MODE` - -**${METPLUS_MV_LOAD_MTD}** +${METPLUS_MV_LOAD_MTD} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_LOAD_MTD` - -**${METPLUS_MV_LOAD_MPR}** +${METPLUS_MV_LOAD_MPR} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File * - :term:`MET_DB_LOAD_MV_LOAD_MPR` - -**${METPLUS_INPUT_PATHS}** +${METPLUS_INPUT_PATHS} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - XML Config File @@ -4132,46 +4413,55 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/MODEConfig_wrapped +.. dropdown:: Click to view parm/met_config/MODEConfig_wrapped + + .. literalinclude:: ../../parm/met_config/MODEConfig_wrapped -**${METPLUS_MODEL}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_DESC}** +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_DESC` - desc -**${METPLUS_OBTYPE}** +${METPLUS_OBTYPE} +""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBTYPE` - obtype -**${METPLUS_REGRID_DICT}** +${METPLUS_REGRID_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -4192,55 +4482,60 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`MODE_REGRID_CENSOR_VAL` - regrid.censor_val -**${METPLUS_GRID_RES}** +${METPLUS_GRID_RES} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_GRID_RES` - grid_res -**${METPLUS_QUILT}** +${METPLUS_QUILT} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_QUILT` - quilt -**${METPLUS_MULTIVAR_LOGIC}** +${METPLUS_MULTIVAR_LOGIC} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_MULTIVAR_LOGIC` - multivar_logic -**${METPLUS_MULTIVAR_INTENSITY_FLAG}** +${METPLUS_MULTIVAR_INTENSITY_FLAG} +"""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_MULTIVAR_INTENSITY_FLAG` - multivar_intensity_flag -**${METPLUS_FCST_FIELD}** +${METPLUS_FCST_FIELD} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -4255,77 +4550,84 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the forecast field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_FCST_CONV_RADIUS}** +${METPLUS_FCST_CONV_RADIUS} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_FCST_CONV_RADIUS` - fcst.conv_radius -**${METPLUS_FCST_CONV_THRESH}** +${METPLUS_FCST_CONV_THRESH} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_FCST_CONV_THRESH` - fcst.conv_thresh -**${METPLUS_FCST_MERGE_THRESH}** +${METPLUS_FCST_MERGE_THRESH} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_FCST_MERGE_THRESH` - fcst.merge_thresh -**${METPLUS_FCST_MERGE_FLAG}** +${METPLUS_FCST_MERGE_FLAG} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_FCST_MERGE_FLAG` - fcst.merge_flag -**${METPLUS_FCST_FILE_TYPE}** +${METPLUS_FCST_FILE_TYPE} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_FCST_FILE_TYPE` - fcst.file_type -**${METPLUS_FCST_MULTIVAR_NAME}** +${METPLUS_FCST_MULTIVAR_NAME} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_FCST_MULTIVAR_NAME` - fcst.multivar_name -**${METPLUS_FCST_MULTIVAR_LEVEL}** +${METPLUS_FCST_MULTIVAR_LEVEL} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -4333,11 +4635,12 @@ see :ref:`How METplus controls MET config file settings`. - fcst.multivar_level -**${METPLUS_OBS_FIELD}** +${METPLUS_OBS_FIELD} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -4352,231 +4655,252 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the observation field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_OBS_CONV_RADIUS}** +${METPLUS_OBS_CONV_RADIUS} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_MODE_CONV_RADIUS` - obs.conv_radius -**${METPLUS_OBS_CONV_THRESH}** +${METPLUS_OBS_CONV_THRESH} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_MODE_CONV_THRESH` - obs.conv_thresh -**${METPLUS_OBS_MERGE_THRESH}** +${METPLUS_OBS_MERGE_THRESH} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_MODE_MERGE_THRESH` - obs.merge_thresh -**${METPLUS_OBS_MERGE_FLAG}** +${METPLUS_OBS_MERGE_FLAG} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_MODE_MERGE_FLAG` - obs.merge_flag -**${METPLUS_OBS_FILE_TYPE}** +${METPLUS_OBS_FILE_TYPE} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_OBS_FILE_TYPE` - obs.file_type -**${METPLUS_OBS_MULTIVAR_NAME}** +${METPLUS_OBS_MULTIVAR_NAME} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_OBS_MULTIVAR_NAME` - obs.multivar_name -**${METPLUS_OBS_MULTIVAR_LEVEL}** +${METPLUS_OBS_MULTIVAR_LEVEL} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_OBS_MULTIVAR_LEVEL` - obs.multivar_level -**${METPLUS_MASK_POLY}** +${METPLUS_MASK_POLY} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_MASK_POLY` - mask.poly -**${METPLUS_OUTPUT_PREFIX}** +${METPLUS_OUTPUT_PREFIX} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_OUTPUT_PREFIX` - output_prefix -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_MET_CONFIG_OVERRIDES` - n/a -**${METPLUS_FCST_FILTER_ATTR_NAME}** +${METPLUS_FCST_FILTER_ATTR_NAME} +"""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_FCST_FILTER_ATTR_NAME` - fcst.filter_attr_name -**${METPLUS_FCST_FILTER_ATTR_THRESH}** +${METPLUS_FCST_FILTER_ATTR_THRESH} +"""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_FCST_FILTER_ATTR_THRESH` - fcst.filter_attr_thresh -**${METPLUS_FCST_CENSOR_THRESH}** +${METPLUS_FCST_CENSOR_THRESH} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_FCST_CENSOR_THRESH` - fcst.censor_thresh -**${METPLUS_FCST_CENSOR_VAL}** +${METPLUS_FCST_CENSOR_VAL} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_FCST_CENSOR_VAL` - fcst.censor_val -**${METPLUS_FCST_VLD_THRESH}** +${METPLUS_FCST_VLD_THRESH} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_FCST_VLD_THRESH` - fcst.vld_thresh -**${METPLUS_OBS_FILTER_ATTR_NAME}** +${METPLUS_OBS_FILTER_ATTR_NAME} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_OBS_FILTER_ATTR_NAME` - obs.filter_attr_name -**${METPLUS_OBS_FILTER_ATTR_THRESH}** +${METPLUS_OBS_FILTER_ATTR_THRESH} +""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_OBS_FILTER_ATTR_THRESH` - obs.filter_attr_thresh -**${METPLUS_OBS_CENSOR_THRESH}** +${METPLUS_OBS_CENSOR_THRESH} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_OBS_CENSOR_THRESH` - obs.censor_thresh -**${METPLUS_OBS_CENSOR_VAL}** +${METPLUS_OBS_CENSOR_VAL} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_OBS_CENSOR_VAL` - obs.censor_val -**${METPLUS_OBS_VLD_THRESH}** +${METPLUS_OBS_VLD_THRESH} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_OBS_VLD_THRESH` - obs.vld_thresh -**${METPLUS_MASK_DICT}** +${METPLUS_MASK_DICT} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -4589,33 +4913,36 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`MODE_MASK_POLY_FLAG` - mask.poly_flag -**${METPLUS_MASK_MISSING_FLAG}** +${METPLUS_MASK_MISSING_FLAG} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_MASK_MISSING_FLAG` - mask_missing_flag -**${METPLUS_MATCH_FLAG}** +${METPLUS_MATCH_FLAG} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_MATCH_FLAG` - match_flag -**${METPLUS_WEIGHT_DICT}** +${METPLUS_WEIGHT_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -4642,11 +4969,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`MODE_WEIGHT_INTEN_PERC_VALUE` - weight.inten_perc_value -**${METPLUS_NC_PAIRS_FLAG_DICT}** +${METPLUS_NC_PAIRS_FLAG_DICT} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -4663,77 +4991,84 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`MODE_NC_PAIRS_FLAG_POLYLINES` - nc_pairs_flag.polylines -**${METPLUS_MAX_CENTROID_DIST}** +${METPLUS_MAX_CENTROID_DIST} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_MAX_CENTROID_DIST` - max_centroid_dist -**${METPLUS_INTEREST_FUNCTION_CENTROID_DIST}** +${METPLUS_INTEREST_FUNCTION_CENTROID_DIST} +"""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_INTEREST_FUNCTION_CENTROID_DIST` - interest_function.centroid_dist -**${METPLUS_INTEREST_FUNCTION_BOUNDARY_DIST}** +${METPLUS_INTEREST_FUNCTION_BOUNDARY_DIST} +"""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_INTEREST_FUNCTION_BOUNDARY_DIST` - interest_function.boundary_dist -**${METPLUS_INTEREST_FUNCTION_CONVEX_HULL_DIST}** +${METPLUS_INTEREST_FUNCTION_CONVEX_HULL_DIST} +""""""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_INTEREST_FUNCTION_CONVEX_HULL_DIST` - interest_function.convex_hull_dist -**${METPLUS_TOTAL_INTEREST_THRESH}** +${METPLUS_TOTAL_INTEREST_THRESH} +"""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_TOTAL_INTEREST_THRESH` - total_interest_thresh -**${METPLUS_PS_PLOT_FLAG}** +${METPLUS_PS_PLOT_FLAG} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODE_PS_PLOT_FLAG` - ps_plot_flag -**${METPLUS_CT_STATS_FLAG}** +${METPLUS_CT_STATS_FLAG} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -4825,46 +5160,55 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/MTDConfig_wrapped +.. dropdown:: Click to view parm/met_config/MTDConfig_wrapped + + .. literalinclude:: ../../parm/met_config/MTDConfig_wrapped -**${METPLUS_MODEL}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_DESC}** +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MTD_DESC` - desc -**${METPLUS_OBTYPE}** +${METPLUS_OBTYPE} +""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBTYPE` - obtype -**${METPLUS_REGRID_DICT}** +${METPLUS_REGRID_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -4885,22 +5229,24 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`MTD_REGRID_CENSOR_VAL` - regrid.censor_val -**${METPLUS_FCST_FILE_TYPE}** +${METPLUS_FCST_FILE_TYPE} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_MTD_INPUT_DATATYPE` - fcst.file_type -**${METPLUS_FCST_FIELD}** +${METPLUS_FCST_FIELD} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -4915,44 +5261,48 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the forecast field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_FCST_CONV_RADIUS}** +${METPLUS_FCST_CONV_RADIUS} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MTD_FCST_CONV_RADIUS` - fcst.conv_radius -**${METPLUS_FCST_CONV_THRESH}** +${METPLUS_FCST_CONV_THRESH} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MTD_FCST_CONV_THRESH` - fcst.conv_thresh -**${METPLUS_OBS_FILE_TYPE}** +${METPLUS_OBS_FILE_TYPE} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_MTD_INPUT_DATATYPE` - obs.file_type -**${METPLUS_OBS_FIELD}** +${METPLUS_OBS_FIELD} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -4967,55 +5317,60 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the observation field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_OBS_CONV_RADIUS}** +${METPLUS_OBS_CONV_RADIUS} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MTD_OBS_CONV_RADIUS` - obs.conv_radius -**${METPLUS_OBS_CONV_THRESH}** +${METPLUS_OBS_CONV_THRESH} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MTD_OBS_CONV_THRESH` - obs.conv_thresh -**${METPLUS_MIN_VOLUME}** +${METPLUS_MIN_VOLUME} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MTD_MIN_VOLUME` - min_volume -**${METPLUS_OUTPUT_PREFIX}** +${METPLUS_OUTPUT_PREFIX} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MTD_OUTPUT_PREFIX` - output_prefix -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -5107,35 +5462,43 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/PB2NCConfig_wrapped +.. dropdown:: Click to view parm/met_config/PB2NCConfig_wrapped + + .. literalinclude:: ../../parm/met_config/PB2NCConfig_wrapped -**${METPLUS_MESSAGE_TYPE}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_MESSAGE_TYPE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PB2NC_MESSAGE_TYPE` - message_type -**${METPLUS_STATION_ID}** +${METPLUS_STATION_ID} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PB2NC_STATION_ID` - station_id -**${METPLUS_OBS_WINDOW_DICT}** +${METPLUS_OBS_WINDOW_DICT} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -5144,11 +5507,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`PB2NC_OBS_WINDOW_END` - obs_window.end -**${METPLUS_MASK_DICT}** +${METPLUS_MASK_DICT} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -5159,22 +5523,24 @@ see :ref:`How METplus controls MET config file settings`. .. note:: Since the default value in the MET config file for 'grid' is grid = [ "FULL" ];, setting GRID_STAT_MASK_GRID to an empty string will result in a value of grid = []; in the MET config file. -**${METPLUS_OBS_BUFR_VAR}** +${METPLUS_OBS_BUFR_VAR} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PB2NC_OBS_BUFR_VAR_LIST` - obs_bufr_var -**${METPLUS_TIME_SUMMARY_DICT}** +${METPLUS_TIME_SUMMARY_DICT} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -5201,33 +5567,36 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`PB2NC_TIME_SUMMARY_VALID_THRESH` - time_summary.vld_thresh -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PB2NC_MET_CONFIG_OVERRIDES` - n/a -**${METPLUS_PB_REPORT_TYPE}** +${METPLUS_PB_REPORT_TYPE} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PB2NC_PB_REPORT_TYPE` - pb_report_type -**${METPLUS_LEVEL_RANGE_DICT}** +${METPLUS_LEVEL_RANGE_DICT} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -5236,33 +5605,36 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`PB2NC_LEVEL_RANGE_END` - level_range.end -**${METPLUS_LEVEL_CATEGORY}** +${METPLUS_LEVEL_CATEGORY} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PB2NC_LEVEL_CATEGORY` - level_category -**${METPLUS_QUALITY_MARK_THRESH}** +${METPLUS_QUALITY_MARK_THRESH} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PB2NC_QUALITY_MARK_THRESH` - quality_mark_thresh -**${METPLUS_OBS_BUFR_MAP}** +${METPLUS_OBS_BUFR_MAP} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -5545,13 +5917,19 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/PlotPointObsConfig_wrapped +.. dropdown:: Click to view parm/met_config/PlotPointObsConfig_wrapped + + .. literalinclude:: ../../parm/met_config/PlotPointObsConfig_wrapped -**${METPLUS_GRID_DATA_DICT}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_GRID_DATA_DICT} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -5576,231 +5954,252 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`PLOT_POINT_OBS_GRID_DATA_GRID_PLOT_INFO_COLORBAR_FLAG` - grid_data.grid_plot_info.colorbar_flag -**${METPLUS_MSG_TYP}** +${METPLUS_MSG_TYP} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_MSG_TYP` - msg_typ -**${METPLUS_SID_INC}** +${METPLUS_SID_INC} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_SID_INC` - sid_inc -**${METPLUS_SID_EXC}** +${METPLUS_SID_EXC} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_SID_EXC` - sid_exc -**${METPLUS_OBS_VAR}** +${METPLUS_OBS_VAR} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_OBS_VAR` - obs_var -**${METPLUS_OBS_GC}** +${METPLUS_OBS_GC} +""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_OBS_GC` - obs_gc -**${METPLUS_OBS_QUALITY}** +${METPLUS_OBS_QUALITY} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_OBS_QUALITY` - obs_quality -**${METPLUS_VALID_BEG}** +${METPLUS_VALID_BEG} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_VALID_BEG` - valid_beg -**${METPLUS_VALID_END}** +${METPLUS_VALID_END} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_VALID_END` - valid_end -**${METPLUS_LAT_THRESH}** +${METPLUS_LAT_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_LAT_THRESH` - lat_thresh -**${METPLUS_LON_THRESH}** +${METPLUS_LON_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_LON_THRESH` - lon_thresh -**${METPLUS_ELV_THRESH}** +${METPLUS_ELV_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_ELV_THRESH` - elv_thresh -**${METPLUS_HGT_THRESH}** +${METPLUS_HGT_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_HGT_THRESH` - hgt_thresh -**${METPLUS_PRS_THRESH}** +${METPLUS_PRS_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_PRS_THRESH` - prs_thresh -**${METPLUS_OBS_THRESH}** +${METPLUS_OBS_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_OBS_THRESH` - obs_thresh -**${METPLUS_CENSOR_THRESH}** +${METPLUS_CENSOR_THRESH} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_CENSOR_THRESH` - censor_thresh -**${METPLUS_CENSOR_VAL}** +${METPLUS_CENSOR_VAL} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_CENSOR_VAL` - censor_val -**${METPLUS_DOTSIZE}** +${METPLUS_DOTSIZE} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_DOTSIZE` - dotsize -**${METPLUS_LINE_COLOR}** +${METPLUS_LINE_COLOR} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_LINE_COLOR` - line_color -**${METPLUS_LINE_WIDTH}** +${METPLUS_LINE_WIDTH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_LINE_WIDTH` - line_width -**${METPLUS_FILL_COLOR}** +${METPLUS_FILL_COLOR} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`PLOT_POINT_OBS_FILL_COLOR` - fill_color -**${METPLUS_FILL_PLOT_INFO_DICT}** +${METPLUS_FILL_PLOT_INFO_DICT} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -5815,11 +6214,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`PLOT_POINT_OBS_FILL_PLOT_INFO_COLORBAR_FLAG` - fill_plot_info.colorbar_flag -**${METPLUS_POINT_DATA}** +${METPLUS_POINT_DATA} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6052,35 +6452,43 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/PointStatConfig_wrapped +.. dropdown:: Click to view parm/met_config/PointStatConfig_wrapped + + .. literalinclude:: ../../parm/met_config/PointStatConfig_wrapped -**${METPLUS_MODEL}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_DESC}** +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`DESC` -or- :term:`POINT_STAT_DESC` - desc -**${METPLUS_REGRID_DICT}** +${METPLUS_REGRID_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6101,11 +6509,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`POINT_STAT_REGRID_CENSOR_VAL` - regrid.censor_val -**${METPLUS_FCST_FIELD}** +${METPLUS_FCST_FIELD} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6120,22 +6529,24 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the forecast field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_FCST_FILE_TYPE}** +${METPLUS_FCST_FILE_TYPE} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`POINT_STAT_FCST_FILE_TYPE` - fcst.file_type -**${METPLUS_OBS_FIELD}** +${METPLUS_OBS_FIELD} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6150,22 +6561,24 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the observation field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_OBS_FILE_TYPE}** +${METPLUS_OBS_FILE_TYPE} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`POINT_STAT_OBS_FILE_TYPE` - obs.file_type -**${METPLUS_MESSAGE_TYPE}** +${METPLUS_MESSAGE_TYPE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6173,11 +6586,12 @@ see :ref:`How METplus controls MET config file settings`. - message_type -**${METPLUS_CLIMO_MEAN_DICT}** +${METPLUS_CLIMO_MEAN_DICT} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6202,11 +6616,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`POINT_STAT_CLIMO_MEAN_HOUR_INTERVAL` - climo_mean.hour_interval -**${METPLUS_CLIMO_STDEV_DICT}** +${METPLUS_CLIMO_STDEV_DICT} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6232,11 +6647,12 @@ see :ref:`How METplus controls MET config file settings`. - climo_stdev.hour_interval -**${METPLUS_OBS_WINDOW_DICT}** +${METPLUS_OBS_WINDOW_DICT} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6245,11 +6661,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`OBS_WINDOW_END` - obs_window.end -**${METPLUS_MASK_DICT}** +${METPLUS_MASK_DICT} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6262,33 +6679,36 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`POINT_STAT_MASK_LLPNT` - mask.llpnt -**${METPLUS_OUTPUT_PREFIX}** +${METPLUS_OUTPUT_PREFIX} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`POINT_STAT_OUTPUT_PREFIX` - output_prefix -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`POINT_STAT_MET_CONFIG_OVERRIDES` - n/a -**${METPLUS_CLIMO_CDF_DICT}** +${METPLUS_CLIMO_CDF_DICT} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6301,33 +6721,36 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`POINT_STAT_CLIMO_CDF_DIRECT_PROB` - climo_cdf.direct_prob -**${METPLUS_OBS_QUALITY_INC}** +${METPLUS_OBS_QUALITY_INC} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`POINT_STAT_OBS_QUALITY_INC` - obs_quality_inc -**${METPLUS_OBS_QUALITY_EXC}** +${METPLUS_OBS_QUALITY_EXC} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`POINT_STAT_OBS_QUALITY_EXC` - obs_quality_exc -**${METPLUS_OUTPUT_FLAG_DICT}** +${METPLUS_OUTPUT_FLAG_DICT} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6376,11 +6799,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`POINT_STAT_OUTPUT_FLAG_SEEPS_MPR` - output_flag.seeps_mpr -**${METPLUS_INTERP_DICT}** +${METPLUS_INTERP_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6393,22 +6817,24 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`POINT_STAT_INTERP_TYPE_WIDTH` - interp.type.width -**${METPLUS_HSS_EC_VALUE}** +${METPLUS_HSS_EC_VALUE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`POINT_STAT_HSS_EC_VALUE` - hss_ec_value -**${METPLUS_HIRA_DICT}** +${METPLUS_HIRA_DICT} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6425,22 +6851,24 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`POINT_STAT_HIRA_PROB_CAT_THRESH` - hira.prob_cat_thresh -**${METPLUS_MESSAGE_TYPE_GROUP_MAP}** +${METPLUS_MESSAGE_TYPE_GROUP_MAP} +""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`POINT_STAT_MESSAGE_TYPE_GROUP_MAP` - message_type_group_map -**${METPLUS_SEEPS_P1_THRESH}** +${METPLUS_SEEPS_P1_THRESH} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6680,46 +7108,55 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/SeriesAnalysisConfig_wrapped +.. dropdown:: Click to view parm/met_config/SeriesAnalysisConfig_wrapped + + .. literalinclude:: ../../parm/met_config/SeriesAnalysisConfig_wrapped -**${METPLUS_MODEL}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_DESC}** +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`DESC` -or- :term:`SERIES_ANALYSIS_DESC` - desc -**${METPLUS_OBTYPE}** +${METPLUS_OBTYPE} +""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBTYPE` - obtype -**${METPLUS_REGRID_DICT}** +${METPLUS_REGRID_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6740,33 +7177,36 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`SERIES_ANALYSIS_REGRID_CENSOR_VAL` - regrid.censor_val -**${METPLUS_CAT_THRESH}** +${METPLUS_CAT_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`SERIES_ANALYSIS_CAT_THRESH` - cat_thresh -**${METPLUS_FCST_FILE_TYPE}** +${METPLUS_FCST_FILE_TYPE} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_SERIES_ANALYSIS_INPUT_DATATYPE` - fcst.file_type -**${METPLUS_FCST_FIELD}** +${METPLUS_FCST_FIELD} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6783,22 +7223,24 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the forecast field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_OBS_FILE_TYPE}** +${METPLUS_OBS_FILE_TYPE} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_SERIES_ANALYSIS_INPUT_DATATYPE` - obs.file_type -**${METPLUS_OBS_FIELD}** +${METPLUS_OBS_FIELD} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6813,11 +7255,12 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the observation field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_CLIMO_MEAN_DICT}** +${METPLUS_CLIMO_MEAN_DICT} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6844,11 +7287,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`SERIES_ANALYSIS_CLIMO_MEAN_FILE_TYPE` - climo_mean.file_type -**${METPLUS_CLIMO_STDEV_DICT}** +${METPLUS_CLIMO_STDEV_DICT} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6875,11 +7319,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`SERIES_ANALYSIS_CLIMO_STDEV_FILE_TYPE` - climo_stdev.file_type -**${METPLUS_CLIMO_CDF_DICT}** +${METPLUS_CLIMO_CDF_DICT} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6890,11 +7335,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`SERIES_ANALYSIS_CLIMO_CDF_DIRECT_PROB` - climo_cdf.direct_prob -**${METPLUS_MASK_DICT}** +${METPLUS_MASK_DICT} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6903,55 +7349,60 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`SERIES_ANALYSIS_MASK_POLY` - mask.poly -**${METPLUS_BLOCK_SIZE}** +${METPLUS_BLOCK_SIZE} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`SERIES_ANALYSIS_BLOCK_SIZE` - block_size -**${METPLUS_VLD_THRESH}** +${METPLUS_VLD_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`SERIES_ANALYSIS_VLD_THRESH` - vld_thresh -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`SERIES_ANALYSIS_MET_CONFIG_OVERRIDES` - n/a -**${METPLUS_HSS_EC_VALUE}** +${METPLUS_HSS_EC_VALUE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`SERIES_ANALYSIS_HSS_EC_VALUE` - hss_ec_value -**${METPLUS_OUTPUT_STATS_DICT}** +${METPLUS_OUTPUT_STATS_DICT} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -6980,22 +7431,24 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`SERIES_ANALYSIS_OUTPUT_STATS_PRC` - output_stats.prc -**${METPLUS_FCST_CAT_THRESH}** +${METPLUS_FCST_CAT_THRESH} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_SERIES_ANALYSIS_CAT_THRESH` - fcst.cat_thresh -**${METPLUS_OBS_CAT_THRESH}** +${METPLUS_OBS_CAT_THRESH} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -7355,376 +7808,415 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/STATAnalysisConfig_wrapped +.. dropdown:: Click to view parm/met_config/STATAnalysisConfig_wrapped + + .. literalinclude:: ../../parm/met_config/STATAnalysisConfig_wrapped -**${METPLUS_MODEL}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_DESC}** +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`DESC_LIST` - desc -**${METPLUS_FCST_LEAD}** +${METPLUS_FCST_LEAD} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_LEAD_LIST` - fcst_lead -**${METPLUS_OBS_LEAD}** +${METPLUS_OBS_LEAD} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_LEAD_LIST` - obs_lead -**${METPLUS_FCST_VALID_BEG}** +${METPLUS_FCST_VALID_BEG} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_VALID_HOUR_LIST` and :term:`VALID_BEG` - fcst_valid_beg -**${METPLUS_FCST_VALID_END}** +${METPLUS_FCST_VALID_END} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_VALID_HOUR_LIST` and :term:`VALID_END` - fcst_valid_end -**${METPLUS_FCST_VALID_HOUR}** +${METPLUS_FCST_VALID_HOUR} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_VALID_HOUR_LIST` - fcst_valid_hour -**${METPLUS_OBS_VALID_BEG}** +${METPLUS_OBS_VALID_BEG} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_VALID_HOUR_LIST` and :term:`VALID_BEG` - obs_valid_beg -**${METPLUS_OBS_VALID_END}** +${METPLUS_OBS_VALID_END} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_VALID_HOUR_LIST` and :term:`VALID_END` - obs_valid_end -**${METPLUS_OBS_VALID_HOUR}** +${METPLUS_OBS_VALID_HOUR} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_VALID_HOUR_LIST` - obs_valid_hour -**${METPLUS_FCST_INIT_BEG}** +${METPLUS_FCST_INIT_BEG} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_INIT_HOUR_LIST` and :term:`INIT_BEG` - fcst_init_beg -**${METPLUS_FCST_INIT_END}** +${METPLUS_FCST_INIT_END} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_INIT_HOUR_LIST` and :term:`INIT_END` - fcst_init_end -**${METPLUS_FCST_INIT_HOUR}** +${METPLUS_FCST_INIT_HOUR} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_INIT_HOUR_LIST` - fcst_init_hour -**${METPLUS_OBS_INIT_BEG}** +${METPLUS_OBS_INIT_BEG} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_INIT_HOUR_LIST` and :term:`INIT_BEG` - obs_init_beg -**${METPLUS_OBS_INIT_END}** +${METPLUS_OBS_INIT_END} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_INIT_HOUR_LIST` and :term:`INIT_END` - obs_init_end -**${METPLUS_OBS_INIT_HOUR}** +${METPLUS_OBS_INIT_HOUR} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_INIT_HOUR_LIST` - obs_init_hour -**${METPLUS_FCST_VAR}** +${METPLUS_FCST_VAR} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_VAR_LIST` - fcst_var -**${METPLUS_OBS_VAR}** +${METPLUS_OBS_VAR} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_VAR_LIST` - obs_var -**${METPLUS_FCST_UNITS}** +${METPLUS_FCST_UNITS} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_UNITS_LIST` - fcst_units -**${METPLUS_OBS_UNITS}** +${METPLUS_OBS_UNITS} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_UNITS_LIST` - obs_units -**${METPLUS_FCST_LEVEL}** +${METPLUS_FCST_LEVEL} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_LEVEL_LIST` - fcst_lev -**${METPLUS_OBS_LEVEL}** +${METPLUS_OBS_LEVEL} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_LEVEL_LIST` - obs_lev -**${METPLUS_OBTYPE}** +${METPLUS_OBTYPE} +""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL_OBTYPE` - obtype -**${METPLUS_VX_MASK}** +${METPLUS_VX_MASK} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`VX_MASK_LIST` - vx_mask -**${METPLUS_INTERP_MTHD}** +${METPLUS_INTERP_MTHD} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`INTERP_MTHD_LIST` - interp_mthd -**${METPLUS_INTERP_PNTS}** +${METPLUS_INTERP_PNTS} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`INTERP_PNTS_LIST` - interp_pnts -**${METPLUS_FCST_THRESH}** +${METPLUS_FCST_THRESH} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`FCST_THRESH_LIST` - fcst_thresh -**${METPLUS_OBS_THRESH}** +${METPLUS_OBS_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`OBS_THRESH_LIST` - obs_thresh -**${METPLUS_COV_THRESH}** +${METPLUS_COV_THRESH} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`COV_THRESH_LIST` - cov_thresh -**${METPLUS_ALPHA}** +${METPLUS_ALPHA} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`ALPHA_LIST` - alpha -**${METPLUS_LINE_TYPE}** +${METPLUS_LINE_TYPE} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`LINE_TYPE_LIST` - line_type -**${METPLUS_JOBS}** +${METPLUS_JOBS} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`STAT_ANALYSIS_JOB_NAME` - jobs -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`STAT_ANALYSIS_MET_CONFIG_OVERRIDES` - n/a -**${METPLUS_HSS_EC_VALUE}** +${METPLUS_HSS_EC_VALUE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -7791,6 +8283,7 @@ METplus Configuration | :term:`TC_DIAG_RADIAL_VELOCITY_FIELD_NAME` | :term:`TC_DIAG_RADIAL_VELOCITY_LONG_FIELD_NAME` | :term:`TC_DIAG_VORTEX_REMOVAL` +| :term:`TC_DIAG_ONE_TIME_PER_FILE_FLAG` | :term:`TC_DIAG_NC_RNG_AZI_FLAG` | :term:`TC_DIAG_NC_DIAG_FLAG` | :term:`TC_DIAG_CIRA_DIAG_FLAG` @@ -7821,145 +8314,163 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/TCDiagConfig_wrapped +.. dropdown:: Click to view parm/met_config/TCDiagConfig_wrapped + + .. literalinclude:: ../../parm/met_config/TCDiagConfig_wrapped + +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -**${METPLUS_MODEL}** +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_STORM_ID}** +${METPLUS_STORM_ID} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_STORM_ID` - storm_id -**${METPLUS_BASIN}** +${METPLUS_BASIN} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_BASIN` - basin -**${METPLUS_CYCLONE}** +${METPLUS_CYCLONE} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_CYCLONE` - cyclone -**${METPLUS_INIT_INCLUDE_LIST}** +${METPLUS_INIT_INCLUDE_LIST} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_INIT_INCLUDE` - init_inc -**${METPLUS_VALID_BEG}** +${METPLUS_VALID_BEG} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_VALID_BEG` - valid_beg -**${METPLUS_VALID_END}** +${METPLUS_VALID_END} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_VALID_END` - valid_end -**${METPLUS_VALID_INCLUDE_LIST}** +${METPLUS_VALID_INCLUDE_LIST} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_VALID_INCLUDE` - valid_inc -**${METPLUS_VALID_EXCLUDE_LIST}** +${METPLUS_VALID_EXCLUDE_LIST} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_VALID_EXCLUDE` - valid_exc -**${METPLUS_VALID_HOUR_LIST}** +${METPLUS_VALID_HOUR_LIST} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_VALID_HOUR` - valid_hour -**${METPLUS_LEAD_LIST}** +${METPLUS_LEAD_LIST} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`LEAD_SEQ` - lead -**${METPLUS_DIAG_SCRIPT}** +${METPLUS_DIAG_SCRIPT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_DIAG_SCRIPT` - diag_script -**${METPLUS_DOMAIN_INFO_LIST}** +${METPLUS_DOMAIN_INFO_LIST} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -7974,44 +8485,48 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_DIAG_DOMAIN_INFO_DIAG_SCRIPT` - domain_info.diag_script -**${METPLUS_CENSOR_THRESH}** +${METPLUS_CENSOR_THRESH} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_CENSOR_THRESH` - censor_thresh -**${METPLUS_CENSOR_VAL}** +${METPLUS_CENSOR_VAL} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_CENSOR_VAL` - censor_val -**${METPLUS_CONVERT}** +${METPLUS_CONVERT} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_CONVERT` - convert -**${METPLUS_DATA_FIELD}** +${METPLUS_DATA_FIELD} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8024,44 +8539,48 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_DATA_FILE_TYPE}** +${METPLUS_DATA_FILE_TYPE} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_INPUT_DATATYPE` - data.file_type -**${METPLUS_DATA_DOMAIN}** +${METPLUS_DATA_DOMAIN} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_DATA_DOMAIN` - data.domain -**${METPLUS_DATA_LEVEL}** +${METPLUS_DATA_LEVEL} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_DATA_LEVEL` - data.level -**${METPLUS_REGRID_DICT}** +${METPLUS_REGRID_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8080,143 +8599,168 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_DIAG_REGRID_CENSOR_VAL` - regrid.censor_val -**${METPLUS_COMPUTE_TANGENTIAL_AND_RADIAL_WINDS}** +${METPLUS_COMPUTE_TANGENTIAL_AND_RADIAL_WINDS} +"""""""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_COMPUTE_TANGENTIAL_AND_RADIAL_WINDS` - compute_tangential_and_radial_winds -**${METPLUS_U_WIND_FIELD_NAME}** +${METPLUS_U_WIND_FIELD_NAME} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_U_WIND_FIELD_NAME` - u_wind_field_name -**${METPLUS_V_WIND_FIELD_NAME}** +${METPLUS_V_WIND_FIELD_NAME} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_V_WIND_FIELD_NAME` - v_wind_field_name -**${METPLUS_TANGENTIAL_VELOCITY_FIELD_NAME}** +${METPLUS_TANGENTIAL_VELOCITY_FIELD_NAME} +""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_TANGENTIAL_VELOCITY_FIELD_NAME` - tangential_velocity_field_name -**${METPLUS_TANGENTIAL_VELOCITY_LONG_FIELD_NAME}** +${METPLUS_TANGENTIAL_VELOCITY_LONG_FIELD_NAME} +"""""""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_TANGENTIAL_VELOCITY_LONG_FIELD_NAME` - tangential_velocity_long_field_name -**${METPLUS_RADIAL_VELOCITY_FIELD_NAME}** +${METPLUS_RADIAL_VELOCITY_FIELD_NAME} +""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_RADIAL_VELOCITY_FIELD_NAME` - radial_velocity_field_name -**${METPLUS_RADIAL_VELOCITY_LONG_FIELD_NAME}** +${METPLUS_RADIAL_VELOCITY_LONG_FIELD_NAME} +"""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_RADIAL_VELOCITY_LONG_FIELD_NAME` - radial_velocity_long_field_name -**${METPLUS_VORTEX_REMOVAL}** +${METPLUS_VORTEX_REMOVAL} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_VORTEX_REMOVAL` - vortex_removal -**${METPLUS_NC_RNG_AZI_FLAG}** +${METPLUS_ONE_TIME_PER_FILE_FLAG} +""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 + + * - METplus Config(s) + - MET Config File + * - :term:`TC_DIAG_ONE_TIME_PER_FILE_FLAG` + - one_time_per_file_flag + +${METPLUS_NC_RNG_AZI_FLAG} +"""""""""""""""""""""""""" + +.. list-table:: + :widths: 5 5 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_NC_RNG_AZI_FLAG` - nc_rng_azi_flag -**${METPLUS_NC_DIAG_FLAG}** +${METPLUS_NC_DIAG_FLAG} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_NC_DIAG_FLAG` - nc_diag_flag -**${METPLUS_CIRA_DIAG_FLAG}** +${METPLUS_CIRA_DIAG_FLAG} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_CIRA_DIAG_FLAG` - cira_diag_flag -**${METPLUS_OUTPUT_PREFIX}** +${METPLUS_OUTPUT_PREFIX} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_DIAG_OUTPUT_PREFIX` - output_prefix -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8348,35 +8892,43 @@ how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/TCGenConfig_wrapped +.. dropdown:: Click to view parm/met_config/TCGenConfig_wrapped + + .. literalinclude:: ../../parm/met_config/TCGenConfig_wrapped -**${METPLUS_INIT_FREQ}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_INIT_FREQ} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_INIT_FREQ` - init_freq -**${METPLUS_VALID_FREQ}** +${METPLUS_VALID_FREQ} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_VALID_FREQ` - valid_freq -**${METPLUS_FCST_HR_WINDOW_DICT}** +${METPLUS_FCST_HR_WINDOW_DICT} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8385,22 +8937,24 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_GEN_FCST_HR_WINDOW_END` - fcst_hr_window.end -**${METPLUS_MIN_DURATION}** +${METPLUS_MIN_DURATION} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_MIN_DURATION` - min_duration -**${METPLUS_FCST_GENESIS_DICT}** +${METPLUS_FCST_GENESIS_DICT} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8409,11 +8963,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_GEN_FCST_GENESIS_MSLP_THRESH` - fcst_genesis.mslp_thresh -**${METPLUS_BEST_GENESIS_DICT}** +${METPLUS_BEST_GENESIS_DICT} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8426,99 +8981,108 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_GEN_BEST_GENESIS_MSLP_THRESH` - best_genesis.mslp_thresh -**${METPLUS_OPER_TECHNIQUE}** +${METPLUS_OPER_TECHNIQUE} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_OPER_TECHNIQUE` - oper_technique -**${METPLUS_FILTER}** +${METPLUS_FILTER} +""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_FILTER_\` - filter -**${METPLUS_DESC}** +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`DESC` -or- :term:`TC_GEN_DESC` - desc -**${METPLUS_MODEL}** +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_STORM_ID}** +${METPLUS_STORM_ID} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_STORM_ID` - storm_id -**${METPLUS_STORM_NAME}** +${METPLUS_STORM_NAME} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_STORM_NAME` - storm_name -**${METPLUS_INIT_BEG}** +${METPLUS_INIT_BEG} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_INIT_BEG` - init_beg -**${METPLUS_INIT_END}** +${METPLUS_INIT_END} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_INIT_END` - init_end -**${METPLUS_INIT_INC}** +${METPLUS_INIT_INC} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8526,99 +9090,108 @@ see :ref:`How METplus controls MET config file settings`. - init_inc -**${METPLUS_INIT_EXC}** +${METPLUS_INIT_EXC} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_INIT_EXC` - init_exc -**${METPLUS_VALID_BEG}** +${METPLUS_VALID_BEG} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_VALID_BEG` - valid_beg -**${METPLUS_VALID_END}** +${METPLUS_VALID_END} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_VALID_END` - valid_end -**${METPLUS_INIT_HOUR}** +${METPLUS_INIT_HOUR} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_INIT_HOUR` - init_hour -**${METPLUS_LEAD}** +${METPLUS_LEAD} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`LEAD_SEQ` - lead -**${METPLUS_VX_MASK}** +${METPLUS_VX_MASK} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_VX_MASK` - vx_mask -**${METPLUS_BASIN_MASK}** +${METPLUS_BASIN_MASK} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_BASIN_MASK` - basin_mask -**${METPLUS_DLAND_THRESH}** +${METPLUS_DLAND_THRESH} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_DLAND_THRESH` - dland_thresh -**${METPLUS_DEV_HIT_WINDOW_DICT}** +${METPLUS_DEV_HIT_WINDOW_DICT} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8627,33 +9200,36 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_GEN_DEV_HIT_WINDOW_END` - dev_hit_window.end -**${METPLUS_GENESIS_MATCH_RADIUS}** +${METPLUS_GENESIS_MATCH_RADIUS} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_GENESIS_MATCH_RADIUS` - genesis_match_radius -**${METPLUS_GENESIS_MATCH_POINT_TO_TRACK}** +${METPLUS_GENESIS_MATCH_POINT_TO_TRACK} +""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_GENESIS_MATCH_POINT_TO_TRACK` - genesis_match_point_to_track -**${METPLUS_GENESIS_MATCH_WINDOW_DICT}** +${METPLUS_GENESIS_MATCH_WINDOW_DICT} +"""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8662,22 +9238,24 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_GEN_GENESIS_MATCH_WINDOW_END` - genesis_match_window.end -**${METPLUS_DEV_HIT_RADIUS}** +${METPLUS_DEV_HIT_RADIUS} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_DEV_HIT_RADIUS` - dev_hit_radius -**${METPLUS_OPS_HIT_WINDOW_DICT}** +${METPLUS_OPS_HIT_WINDOW_DICT} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8686,55 +9264,60 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_GEN_OPS_HIT_WINDOW_END` - ops_hit_window.end -**${METPLUS_DISCARD_INIT_POST_GENESIS_FLAG}** +${METPLUS_DISCARD_INIT_POST_GENESIS_FLAG} +""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_DISCARD_INIT_POST_GENESIS_FLAG` - discard_init_post_genesis_flag -**${METPLUS_DEV_METHOD_FLAG}** +${METPLUS_DEV_METHOD_FLAG} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_DEV_METHOD_FLAG` - dev_method_flag -**${METPLUS_OPS_METHOD_FLAG}** +${METPLUS_OPS_METHOD_FLAG} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_OPS_METHOD_FLAG` - ops_method_flag -**${METPLUS_CI_ALPHA}** +${METPLUS_CI_ALPHA} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_CI_ALPHA` - ci_alpha -**${METPLUS_OUTPUT_FLAG_DICT}** +${METPLUS_OUTPUT_FLAG_DICT} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8755,11 +9338,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_GEN_OUTPUT_FLAG_GENMPR` - output_flag.genmpr -**${METPLUS_NC_PAIRS_FLAG_DICT}** +${METPLUS_NC_PAIRS_FLAG_DICT} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8782,66 +9366,72 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_GEN_NC_PAIRS_FLAG_BEST_FN_OY` - nc_pairs_flag.best_fn_oy -**${METPLUS_VALID_MINUS_GENESIS_DIFF_THRESH}** +${METPLUS_VALID_MINUS_GENESIS_DIFF_THRESH} +"""""""""""""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_VALID_MINUS_GENESIS_DIFF_THRESH` - valid_minus_genesis_diff_thresh -**${METPLUS_BEST_UNIQUE_FLAG}** +${METPLUS_BEST_UNIQUE_FLAG} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_BEST_UNIQUE_FLAG` - best_unique_flag -**${METPLUS_DLAND_FILE}** +${METPLUS_DLAND_FILE} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_DLAND_FILE` - dland_file -**${METPLUS_BASIN_FILE}** +${METPLUS_BASIN_FILE} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_BASIN_FILE` - basin_file -**${METPLUS_NC_PAIRS_GRID}** +${METPLUS_NC_PAIRS_GRID} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_GEN_NC_PAIRS_GRID` - nc_pairs_grid -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -8972,211 +9562,235 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/TCPairsConfig_wrapped +.. dropdown:: Click to view parm/met_config/TCPairsConfig_wrapped + + .. literalinclude:: ../../parm/met_config/TCPairsConfig_wrapped -**${METPLUS_MODEL}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_DESC}** +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`DESC` -or- :term:`TC_PAIRS_DESC` - desc -**${METPLUS_STORM_ID}** +${METPLUS_STORM_ID} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_STORM_ID` - storm_id -**${METPLUS_BASIN}** +${METPLUS_BASIN} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_BASIN` - basin -**${METPLUS_CYCLONE}** +${METPLUS_CYCLONE} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_CYCLONE` - cyclone -**${METPLUS_STORM_NAME}** +${METPLUS_STORM_NAME} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_STORM_NAME` - storm_name -**${METPLUS_INIT_BEG}** +${METPLUS_INIT_BEG} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_INIT_BEG` - init_beg -**${METPLUS_INIT_END}** +${METPLUS_INIT_END} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_INIT_END` - init_end -**${METPLUS_INIT_INC}** +${METPLUS_INIT_INC} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_INIT_INCLUDE` - init_inc -**${METPLUS_INIT_EXC}** +${METPLUS_INIT_EXC} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_INIT_EXCLUDE` - init_exc -**${METPLUS_VALID_INC}** +${METPLUS_VALID_INC} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_VALID_INCLUDE` - valid_inc -**${METPLUS_VALID_EXC}** +${METPLUS_VALID_EXC} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_VALID_EXCLUDE` - valid_exc -**${METPLUS_WRITE_VALID}** +${METPLUS_WRITE_VALID} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_WRITE_VALID` - write_valid -**${METPLUS_VALID_BEG}** +${METPLUS_VALID_BEG} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_VALID_BEG` - valid_beg -**${METPLUS_VALID_END}** +${METPLUS_VALID_END} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_VALID_END` - valid_end -**${METPLUS_MATCH_POINTS}** +${METPLUS_MATCH_POINTS} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_MATCH_POINTS` - match_points -**${METPLUS_DLAND_FILE}** +${METPLUS_DLAND_FILE} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_DLAND_FILE` - dland_file -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_MET_CONFIG_OVERRIDES` - n/a -**${METPLUS_CONSENSUS_LIST}** +${METPLUS_CONSENSUS_LIST} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -9192,33 +9806,36 @@ see :ref:`How METplus controls MET config file settings`. - consensus.write_members -**${METPLUS_CHECK_DUP}** +${METPLUS_CHECK_DUP} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_CHECK_DUP` - check_dup -**${METPLUS_INTERP12}** +${METPLUS_INTERP12} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_PAIRS_INTERP12` - interp12 -**${METPLUS_DIAG_INFO_MAP_LIST}** +${METPLUS_DIAG_INFO_MAP_LIST} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -9233,11 +9850,12 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_PAIRS_DIAG_INFO_MAP_DIAG_NAME` - diag_info_map.diag_name -**${METPLUS_DIAG_CONVERT_MAP_LIST}** +${METPLUS_DIAG_CONVERT_MAP_LIST} +"""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -9323,145 +9941,163 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/TCRMWConfig_wrapped +.. dropdown:: Click to view parm/met_config/TCRMWConfig_wrapped + + .. literalinclude:: ../../parm/met_config/TCRMWConfig_wrapped -**${METPLUS_MODEL}** +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +${METPLUS_MODEL} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`MODEL` - model -**${METPLUS_STORM_ID}** +${METPLUS_STORM_ID} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_STORM_ID` - storm_id -**${METPLUS_BASIN}** +${METPLUS_BASIN} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_BASIN` - basin -**${METPLUS_CYCLONE}** +${METPLUS_CYCLONE} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_CYCLONE` - cyclone -**${METPLUS_INIT_INCLUDE}** +${METPLUS_INIT_INCLUDE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_INIT_INCLUDE` - init_inc -**${METPLUS_VALID_BEG}** +${METPLUS_VALID_BEG} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_VALID_BEG` - valid_beg -**${METPLUS_VALID_END}** +${METPLUS_VALID_END} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_VALID_END` - valid_end -**${METPLUS_VALID_INCLUDE_LIST}** +${METPLUS_VALID_INCLUDE_LIST} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_VALID_INCLUDE_LIST` - valid_inc -**${METPLUS_VALID_EXCLUDE_LIST}** +${METPLUS_VALID_EXCLUDE_LIST} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_VALID_EXCLUDE_LIST` - valid_exc -**${METPLUS_VALID_HOUR_LIST}** +${METPLUS_VALID_HOUR_LIST} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_VALID_HOUR_LIST` - valid_hour -**${METPLUS_LEAD_LIST}** +${METPLUS_LEAD_LIST} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`LEAD_SEQ` - lead -**${METPLUS_DATA_FILE_TYPE}** +${METPLUS_DATA_FILE_TYPE} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_INPUT_DATATYPE` - data.file_type -**${METPLUS_DATA_FIELD}** +${METPLUS_DATA_FIELD} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -9474,11 +10110,12 @@ see :ref:`How METplus controls MET config file settings`. .. note:: For more information on controlling the field attributes in METplus, please see the :ref:`Field_Info` section of the User's Guide. -**${METPLUS_REGRID_DICT}** +${METPLUS_REGRID_DICT} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -9497,66 +10134,72 @@ see :ref:`How METplus controls MET config file settings`. * - :term:`TC_RMW_REGRID_CENSOR_VAL` - regrid.censor_val -**${METPLUS_N_RANGE}** +${METPLUS_N_RANGE} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_N_RANGE` - n_range -**${METPLUS_N_AZIMUTH}** +${METPLUS_N_AZIMUTH} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_N_AZIMUTH` - n_azimuth -**${METPLUS_MAX_RANGE_KM}** +${METPLUS_MAX_RANGE_KM} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_MAX_RANGE_KM` - max_range_km -**${METPLUS_DELTA_RANGE_KM}** +${METPLUS_DELTA_RANGE_KM} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_DELTA_RANGE_KM` - delta_range_km -**${METPLUS_RMW_SCALE}** +${METPLUS_RMW_SCALE} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_RMW_SCALE` - rmw_scale -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File @@ -9663,552 +10306,607 @@ to set the value of the environment variable. For detailed examples showing how METplus sets the values of these environment variables, see :ref:`How METplus controls MET config file settings`. -.. literalinclude:: ../../parm/met_config/TCStatConfig_wrapped +.. dropdown:: Click to view parm/met_config/TCStatConfig_wrapped + + .. literalinclude:: ../../parm/met_config/TCStatConfig_wrapped + +Environment variables in wrapped MET config +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -**${METPLUS_AMODEL}** +${METPLUS_AMODEL} +""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_AMODEL` - amodel -**${METPLUS_BMODEL}** +${METPLUS_BMODEL} +""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_BMODEL` - bmodel -**${METPLUS_DESC}** +${METPLUS_DESC} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_DESC` - desc -**${METPLUS_STORM_ID}** +${METPLUS_STORM_ID} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_STORM_ID` - storm_id -**${METPLUS_BASIN}** +${METPLUS_BASIN} +"""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_BASIN` - basin -**${METPLUS_CYCLONE}** +${METPLUS_CYCLONE} +"""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_CYCLONE` - cyclone -**${METPLUS_STORM_NAME}** +${METPLUS_STORM_NAME} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_STORM_NAME` - storm_name -**${METPLUS_INIT_BEG}** +${METPLUS_INIT_BEG} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_BEG` - init_beg -**${METPLUS_INIT_END}** +${METPLUS_INIT_END} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_END` - init_end -**${METPLUS_INIT_INCLUDE}** +${METPLUS_INIT_INCLUDE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_INCLUDE` - init_inc -**${METPLUS_INIT_EXCLUDE}** +${METPLUS_INIT_EXCLUDE} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_EXCLUDE` - init_exc -**${METPLUS_VALID_BEG}** +${METPLUS_VALID_BEG} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_VALID_BEG` - valid_beg -**${METPLUS_VALID_END}** +${METPLUS_VALID_END} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_VALID_END` - valid_end -**${METPLUS_VALID_INCLUDE}** +${METPLUS_VALID_INCLUDE} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_VALID_INCLUDE` - valid_inc -**${METPLUS_VALID_EXCLUDE}** +${METPLUS_VALID_EXCLUDE} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_VALID_EXCLUDE` - valid_exc -**${METPLUS_INIT_HOUR}** +${METPLUS_INIT_HOUR} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_HOUR` - init_hour -**${METPLUS_VALID_HOUR}** +${METPLUS_VALID_HOUR} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_VALID_HOUR` - valid_hour -**${METPLUS_LEAD}** +${METPLUS_LEAD} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_LEAD` - lead -**${METPLUS_LEAD_REQ}** +${METPLUS_LEAD_REQ} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_LEAD_REQ` - lead_req -**${METPLUS_INIT_MASK}** +${METPLUS_INIT_MASK} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_MASK` - init_mask -**${METPLUS_VALID_MASK}** +${METPLUS_VALID_MASK} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_VALID_MASK` - valid_mask -**${METPLUS_LINE_TYPE}** +${METPLUS_LINE_TYPE} +"""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_LINE_TYPE` - line_type -**${METPLUS_TRACK_WATCH_WARN}** +${METPLUS_TRACK_WATCH_WARN} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_TRACK_WATCH_WARN` - track_watch_warn -**${METPLUS_COLUMN_THRESH_NAME}** +${METPLUS_COLUMN_THRESH_NAME} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_COLUMN_THRESH_NAME` - column_thresh_name -**${METPLUS_COLUMN_THRESH_VAL}** +${METPLUS_COLUMN_THRESH_VAL} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_COLUMN_THRESH_VAL` - column_thresh_val -**${METPLUS_COLUMN_STR_NAME}** +${METPLUS_COLUMN_STR_NAME} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_COLUMN_STR_NAME` - column_str_name -**${METPLUS_COLUMN_STR_VAL}** +${METPLUS_COLUMN_STR_VAL} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_COLUMN_STR_VAL` - column_str_val -**${METPLUS_COLUMN_STR_EXC_NAME}** +${METPLUS_COLUMN_STR_EXC_NAME} +"""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_COLUMN_STR_EXC_NAME` - column_str_exc_name -**${METPLUS_COLUMN_STR_EXC_VAL}** +${METPLUS_COLUMN_STR_EXC_VAL} +""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_COLUMN_STR_EXC_VAL` - column_str_exc_val -**${METPLUS_INIT_THRESH_NAME}** +${METPLUS_INIT_THRESH_NAME} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_THRESH_NAME` - init_thresh_name -**${METPLUS_INIT_THRESH_VAL}** +${METPLUS_INIT_THRESH_VAL} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_THRESH_VAL` - init_thresh_val -**${METPLUS_INIT_STR_NAME}** +${METPLUS_INIT_STR_NAME} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_STR_NAME` - init_str_name -**${METPLUS_INIT_STR_VAL}** +${METPLUS_INIT_STR_VAL} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_STR_VAL` - init_str_val -**${METPLUS_INIT_STR_EXC_NAME}** +${METPLUS_INIT_STR_EXC_NAME} +"""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_STR_EXC_NAME` - init_str_exc_name -**${METPLUS_INIT_STR_EXC_VAL}** +${METPLUS_INIT_STR_EXC_VAL} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_STR_EXC_VAL` - init_str_exc_val -**${METPLUS_DIAG_THRESH_NAME}** +${METPLUS_DIAG_THRESH_NAME} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_DIAG_THRESH_NAME` - diag_thresh_name -**${METPLUS_DIAG_THRESH_VAL}** +${METPLUS_DIAG_THRESH_VAL} +"""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_DIAG_THRESH_VAL` - diag_thresh_val -**${METPLUS_INIT_DIAG_THRESH_NAME}** +${METPLUS_INIT_DIAG_THRESH_NAME} +"""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_DIAG_THRESH_NAME` - init_diag_thresh_name -**${METPLUS_INIT_DIAG_THRESH_VAL}** +${METPLUS_INIT_DIAG_THRESH_VAL} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_INIT_DIAG_THRESH_VAL` - init_diag_thresh_val -**${METPLUS_WATER_ONLY}** +${METPLUS_WATER_ONLY} +""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_WATER_ONLY` - water_only -**${METPLUS_LANDFALL}** +${METPLUS_LANDFALL} +""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_LANDFALL` - landfall -**${METPLUS_LANDFALL_BEG}** +${METPLUS_LANDFALL_BEG} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_LANDFALL_BEG` - landfall_beg -**${METPLUS_LANDFALL_END}** +${METPLUS_LANDFALL_END} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_LANDFALL_END` - landfall_end -**${METPLUS_MATCH_POINTS}** +${METPLUS_MATCH_POINTS} +""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_MATCH_POINTS` - match_points -**${METPLUS_JOBS}** +${METPLUS_JOBS} +""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_JOBS_LIST` - jobs -**${METPLUS_MET_CONFIG_OVERRIDES}** +${METPLUS_MET_CONFIG_OVERRIDES} +""""""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_MET_CONFIG_OVERRIDES` - n/a -**${METPLUS_EVENT_EQUAL}** +${METPLUS_EVENT_EQUAL} +"""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_EVENT_EQUAL` - event_equal -**${METPLUS_EVENT_EQUAL_LEAD}** +${METPLUS_EVENT_EQUAL_LEAD} +""""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_EVENT_EQUAL_LEAD` - event_equal_lead -**${METPLUS_OUT_INIT_MASK}** +${METPLUS_OUT_INIT_MASK} +"""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File * - :term:`TC_STAT_OUT_INIT_MASK` - out_init_mask -**${METPLUS_OUT_VALID_MASK}** +${METPLUS_OUT_VALID_MASK} +""""""""""""""""""""""""" .. list-table:: :widths: 5 5 - :header-rows: 0 + :header-rows: 1 * - METplus Config(s) - MET Config File diff --git a/docs/Verification_Datasets/datasets.rst b/docs/Verification_Datasets/datasets.rst index 9b202b18fb..45b78ec5fc 100644 --- a/docs/Verification_Datasets/datasets.rst +++ b/docs/Verification_Datasets/datasets.rst @@ -1,5 +1,6 @@ -Datasets -======== +******** +Datasets +******** .. toctree:: :titlesonly: diff --git a/docs/Verification_Datasets/datasets/aeronet.rst b/docs/Verification_Datasets/datasets/aeronet.rst index 08e9f10cec..60a626abdd 100644 --- a/docs/Verification_Datasets/datasets/aeronet.rst +++ b/docs/Verification_Datasets/datasets/aeronet.rst @@ -1,7 +1,7 @@ .. _vx-data-aeronet: AERONET -------- +======= Description AErosol RObotic NETwork (AERONET) - This is data from a group of ground-based remote sensing aerosol networks, providing globally distributed observations of aerosol optical depth (AOD) and related fields. This application focuses on AOD, specifically. diff --git a/docs/Verification_Datasets/datasets/gdas_ice.rst b/docs/Verification_Datasets/datasets/gdas_ice.rst index 3a8d19e7d9..388b2ec42a 100644 --- a/docs/Verification_Datasets/datasets/gdas_ice.rst +++ b/docs/Verification_Datasets/datasets/gdas_ice.rst @@ -1,7 +1,7 @@ .. _vx-data-gdas-ice: GDAS: Ice ---------- +========= Description "The Global Data Assimilation System (GDAS) is the system used by the National Center for Environmental Prediction (NCEP) Global Forecast System (GFS) model to place observations into a gridded model space for the purpose of starting, or initializing, weather forecasts with observed data." from NOAA NCEI @@ -13,10 +13,10 @@ Sample image :width: 600 Recommended use -"Place observations into a gridded model space for the purpose of starting, or initializing, weather forecasts with observed data” from NOAA NCEI + "Place observations into a gridded model space for the purpose of starting, or initializing, weather forecasts with observed data” from NOAA NCEI File format -* Grib2 + * Grib2 Location of data NCDC/NCEI: https://www.ncdc.noaa.gov/data-access/model-data/model-datasets/global-data-assimilation-system-gdas diff --git a/docs/Verification_Datasets/datasets/gdas_prepbufr.rst b/docs/Verification_Datasets/datasets/gdas_prepbufr.rst index 4c2848de99..0fa11c195b 100644 --- a/docs/Verification_Datasets/datasets/gdas_prepbufr.rst +++ b/docs/Verification_Datasets/datasets/gdas_prepbufr.rst @@ -1,7 +1,7 @@ .. _vx-data-gdas-prepbufr: GDAS Prepbufr Data ------------------- +================== Description Global Data Assimilation System (GDAS) prepbufr files contain a variety of upper-air and surface weather observations from around the globe, including radiosonde, profiler and US radar derived winds, land and marine surface reports, aircraft reports, and more. diff --git a/docs/Verification_Datasets/datasets/goes_level_1b.rst b/docs/Verification_Datasets/datasets/goes_level_1b.rst index fda714672e..fa46d0b7ef 100644 --- a/docs/Verification_Datasets/datasets/goes_level_1b.rst +++ b/docs/Verification_Datasets/datasets/goes_level_1b.rst @@ -1,7 +1,7 @@ .. _vx-data-goes-level-1b.rst: GOES ABI L1b Radiances ----------------------- +====================== Description Geostationary Operational Environmental Satellite (GOES-16/17) Advanced Baseline Imagers (ABIs) Data - Level 1b Radiances diff --git a/docs/Verification_Datasets/datasets/goes_level_2_aerosol.rst b/docs/Verification_Datasets/datasets/goes_level_2_aerosol.rst index c461f77d05..d6fecac9ca 100644 --- a/docs/Verification_Datasets/datasets/goes_level_2_aerosol.rst +++ b/docs/Verification_Datasets/datasets/goes_level_2_aerosol.rst @@ -1,7 +1,7 @@ .. _vx-data-goes-level-2-aerosol.rst: GOES ABI L2 Aerosol -------------------- +=================== Description Geostationary Operational Environmental Satellite (GOES-16/17) Advanced Baseline Imagers (ABIs) Data - Level 2 Aerosol Products diff --git a/docs/Verification_Datasets/datasets/gpm_imerg.rst b/docs/Verification_Datasets/datasets/gpm_imerg.rst index d625a5b1e2..b1a34a1432 100644 --- a/docs/Verification_Datasets/datasets/gpm_imerg.rst +++ b/docs/Verification_Datasets/datasets/gpm_imerg.rst @@ -1,7 +1,7 @@ .. _vx-data-gpm-imerg: GPM IMERG ---------- +========= Description Global Precipitation Measurement (GPM) Integrated Multi-satellitE Retrievals for GPM (IMERG) diff --git a/docs/Verification_Datasets/datasets/ims_ice.rst b/docs/Verification_Datasets/datasets/ims_ice.rst index a2e10f35ec..e58f5c1674 100644 --- a/docs/Verification_Datasets/datasets/ims_ice.rst +++ b/docs/Verification_Datasets/datasets/ims_ice.rst @@ -1,7 +1,7 @@ .. _vx-data-ims-ice: IMS ---- +=== Description IMS stands for the Interactive Multisensor Snow and Ice Mapping System. diff --git a/docs/Verification_Datasets/datasets/madis.rst b/docs/Verification_Datasets/datasets/madis.rst index dcd42a0cdf..0d477a93ff 100644 --- a/docs/Verification_Datasets/datasets/madis.rst +++ b/docs/Verification_Datasets/datasets/madis.rst @@ -1,7 +1,7 @@ .. _vx-data-madis: MADIS Data ----------- +========== Description Meteorological Assimilation Data Ingest System (MADIS) consists of NOAA and non-NOAA data providers and provides observational data in a common format, with quality checks. This information is focused on METAR data. diff --git a/docs/Verification_Datasets/datasets/metar_isu.rst b/docs/Verification_Datasets/datasets/metar_isu.rst index 1c2703ac11..5718203115 100644 --- a/docs/Verification_Datasets/datasets/metar_isu.rst +++ b/docs/Verification_Datasets/datasets/metar_isu.rst @@ -1,7 +1,7 @@ .. _vx-data-metar-isu: METAR Data ----------- +========== Description Meteorological Aviation Routine Weather Report (METAR) is a format for observational weather data, which typically comes from airports or permanent observing stations around the world. diff --git a/docs/Verification_Datasets/datasets/mping.rst b/docs/Verification_Datasets/datasets/mping.rst index 6d3b2e24cd..70d5064c43 100644 --- a/docs/Verification_Datasets/datasets/mping.rst +++ b/docs/Verification_Datasets/datasets/mping.rst @@ -1,7 +1,7 @@ .. _vx-data-mping: mPING ------ +===== Description Meteorological Phenomena Identification Near the Ground (mPING) is a crowd-sourced weather observing network developed through partnership between the National Severe Storms Laboratory, The University of Oklahoma, and the Cooperative Institute for Mesoscale Meteorological Studies. diff --git a/docs/Verification_Datasets/datasets/mrms_composite_reflectivity.rst b/docs/Verification_Datasets/datasets/mrms_composite_reflectivity.rst index 49b852b5d2..9229874995 100644 --- a/docs/Verification_Datasets/datasets/mrms_composite_reflectivity.rst +++ b/docs/Verification_Datasets/datasets/mrms_composite_reflectivity.rst @@ -1,7 +1,7 @@ .. _vx-data-mrms-composite-reflectivity: MRMS Composite Reflectivity ---------------------------- +=========================== Description Multi-radar/multi-sensor (MRMS) composite reflectivity diff --git a/docs/Verification_Datasets/datasets/nexrad_level_2.rst b/docs/Verification_Datasets/datasets/nexrad_level_2.rst index e02e14ae37..4f68e2d214 100644 --- a/docs/Verification_Datasets/datasets/nexrad_level_2.rst +++ b/docs/Verification_Datasets/datasets/nexrad_level_2.rst @@ -1,7 +1,7 @@ .. _vx-data-nexrad-level-2: NEXRAD Level 2 --------------- +============== Description Next-Generation Radar (NEXRAD) Level 2, gridded radial diff --git a/docs/Verification_Datasets/datasets/nexrad_level_3.rst b/docs/Verification_Datasets/datasets/nexrad_level_3.rst index 5212783e63..57fd35dbcb 100644 --- a/docs/Verification_Datasets/datasets/nexrad_level_3.rst +++ b/docs/Verification_Datasets/datasets/nexrad_level_3.rst @@ -1,7 +1,7 @@ .. _vx-data-nexrad-level-3: NEXRAD Level 3 --------------- +============== Description Next-Generation Radar (NEXRAD) Level 3, gridded radial diff --git a/docs/Verification_Datasets/datasets/opera_eumetnet.rst b/docs/Verification_Datasets/datasets/opera_eumetnet.rst index 7353e9912d..844a765a89 100644 --- a/docs/Verification_Datasets/datasets/opera_eumetnet.rst +++ b/docs/Verification_Datasets/datasets/opera_eumetnet.rst @@ -2,7 +2,7 @@ OPERA EUMETNET --------------- +============== Description Operational Program for Exchange of Weather Radar Information (OPERA) European National Meteorological Services (EUMETNET) diff --git a/docs/Verification_Datasets/datasets/template.rst b/docs/Verification_Datasets/datasets/template.rst index 2c6a13021b..172a3e6e89 100644 --- a/docs/Verification_Datasets/datasets/template.rst +++ b/docs/Verification_Datasets/datasets/template.rst @@ -5,7 +5,7 @@ Define a vx-data name above and add it to the alphabetical list in datasets.rst. *Insert Dataset Name Here* --------------------------- +========================== Description *Insert description here* diff --git a/docs/Verification_Datasets/datasets/viirs.rst b/docs/Verification_Datasets/datasets/viirs.rst index 20f61c1567..8cd04945d1 100644 --- a/docs/Verification_Datasets/datasets/viirs.rst +++ b/docs/Verification_Datasets/datasets/viirs.rst @@ -1,7 +1,7 @@ .. _vx-data-viirs: VIIRS ------ +===== Description Visible Infrared Imaging Radiometer Suite (VIIRS) diff --git a/docs/Verification_Datasets/index.rst b/docs/Verification_Datasets/index.rst index 2eaea2abd0..88298a1131 100644 --- a/docs/Verification_Datasets/index.rst +++ b/docs/Verification_Datasets/index.rst @@ -1,7 +1,6 @@ - -=========================== +########################### Verification Datasets Guide -=========================== +########################### .. toctree:: :titlesonly: diff --git a/docs/Verification_Datasets/overview.rst b/docs/Verification_Datasets/overview.rst index b6bb9068dc..e536b7ca81 100644 --- a/docs/Verification_Datasets/overview.rst +++ b/docs/Verification_Datasets/overview.rst @@ -1,5 +1,6 @@ -Overview -======== +******** +Overview +******** One of biggest challenges in verification is identifying appropriate and available datasets. While countless observations and analyses exist for both standard (e.g., temperature, pressure, wind, and precipitation) and non-state (e.g., aerosol optical depth, composite reflectivity, and turbulence) variables, it is often difficult to identify, procure, and apply the necessary datasets needed for a robust model evaluation. To address the need for a centralized catalogue of verification datasets, the DTC has assembled an initial version of the Verification Datasets Guide to provide the model verification community with relevant “truth” datasets, including data from satellite platforms (geostationary and polar orbiting), gridded analyses (global and regional), station or point-based datasets (global and regional), and radar networks. diff --git a/docs/Verification_Datasets/quicksearch.rst b/docs/Verification_Datasets/quicksearch.rst index b199566291..bb2d16277c 100644 --- a/docs/Verification_Datasets/quicksearch.rst +++ b/docs/Verification_Datasets/quicksearch.rst @@ -1,21 +1,25 @@ .. _quicksearch: +************************* Quick Search for Datasets -========================= +************************* Dataset Types -------------- +============= + | `Point Data <../search.html?q=DataTypePoint&check_keywords=yes&area=default>`_ | `Gridded Data <../search.html?q=DataTypeGridded&check_keywords=yes&area=default>`_ -Dataset Levels --------------- +Dataset Levels +============== + | `Surface Data <../search.html?q=DataLevelSurface&check_keywords=yes&area=default>`_ | `Upper-Air Data <../search.html?q=DataLevelUpperAir&check_keywords=yes&area=default>`_ | `Satellite Data <../search.html?q=DataLevelSatellite&check_keywords=yes&area=default>`_ -Dataset Providers ------------------ +Dataset Providers +================= + | `EUMETNET <../search.html?q=DataProviderEUMETNET&check_keywords=yes&area=default>`_ | `ISU <../search.html?q=DataProviderISU&check_keywords=yes&area=default>`_ | `NOAA <../search.html?q=DataProviderNOAA&check_keywords=yes&area=default>`_ @@ -25,7 +29,8 @@ Dataset Providers | `NSIDC <../search.html?q=DataProviderNSIDC&check_keywords=yes&area=default>`_ Dataset Applications --------------------- +==================== + | `Climate <../search.html?q=DataApplicationClimate&check_keywords=yes&area=default>`_ | `Ensemble <../search.html?q=DataApplicationEnsemble&check_keywords=yes&area=default>`_ | `Marine and Cryosphere <../search.html?q=DataApplicationMarineAndCryo&check_keywords=yes&area=default>`_ diff --git a/docs/index.rst b/docs/index.rst index 65fd718cf6..00b89ef73d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -127,12 +127,17 @@ To cite this documentation in publications, please refer to the METplus User's G .. toctree:: :hidden: - :caption: METplus Wrappers Guides + :caption: FOR USERS Users_Guide/index + Verification_Datasets/index + +.. toctree:: + :hidden: + :caption: FOR CONTRIBUTORS + Contributors_Guide/index Release_Guide/index - Verification_Datasets/index Index diff --git a/docs/requirements.txt b/docs/requirements.txt index 9e01ed25f1..6bbf0dbad2 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,5 @@ -sphinx-gallery==0.11.1 sphinx==5.3.0 -sphinx-rtd-theme==1.2.0 +pillow==10.0.1 +sphinx-gallery==0.14.0 +sphinx-rtd-theme==1.3.0 sphinx-design==0.3.0 diff --git a/docs/use_cases/model_applications/medium_range/UserScript_fcstGEFS_Difficulty_Index.py b/docs/use_cases/model_applications/medium_range/UserScript_fcstGEFS_Difficulty_Index.py index f738570adf..b62d0c6990 100644 --- a/docs/use_cases/model_applications/medium_range/UserScript_fcstGEFS_Difficulty_Index.py +++ b/docs/use_cases/model_applications/medium_range/UserScript_fcstGEFS_Difficulty_Index.py @@ -13,30 +13,35 @@ # -------------------- # # This use case calls the UserScript wrapper to run a user provided script that calculates -# the difficulty index for windspeed. This use case allows for the user to change a variety -# of variables needed to run the difficulty index (i.e. threshold start and units) so that +# the difficulty index for wind speed. This use case allows for the user to change a variety +# of variables needed to run the difficulty index (i.e. threshold start and units) so that the # user can run the script at different thresholds without needing to alter the code. This # script run by the use case uses METcalcpy to provide the difficulty index calculation and # METplotpy to provide the plotting capability. # # The difficulty index was developed by the Naval Research Lab (NRL). The overall aim of the # difficulty index is to graphically represent the expected difficulty of a decision based on -# a set of forecasts (ensemble) of, e.g., significant wave height as a function of space and +# a set of forecasts (ensemble) of, e.g., wind speed as a function of space and # time. There are two basic factors that can make a decision difficult. The first factor is the -# proximity of the ensemble mean forecast to a decision threshold, e.g. 12 ft seas. If the +# proximity of the ensemble mean forecast to a decision threshold, e.g. 34 knot winds. If the # ensemble mean is either much lower or much higher than the threshold, the decision is easier; # if it is closer to the threshold, the decision is harder. The second factor is the forecast # precision, or ensemble spread. The greater the spread around the ensemble mean, the more likely # it is that there will be ensemble members both above and below the decision threshold, making # the decision harder. (A third factor that we will not address here is undiagnosed systematic # error, which adds uncertainty in a similar way to ensemble spread.) The challenge is combining -# these factors into a continuous function that allows the user to assess relative risk. +# these factors into a continuous function that allows the user to assess relative risk. +# +# Additional details on the computation of the Difficulty Index can be found in the `METcalcpy +# documentation `_ +# and more information on plotting difficulty index can be found in the `METplotpy documentation +# `_. ############################################################################## # Datasets # -------- # -# This use case calculates the difficulty index for windspeed using NCEP +# This use case calculates the difficulty index for wind speed using NCEP # GEFS ensemble data. The data is composed of 30 ensemble members that # have been compiled and compressed into one .npz file. # @@ -172,7 +177,7 @@ # # wndspd_GEFS_NorthPac_5dy_30mem_difficulty_indexTHRESH_00_kn.png # -# Where THRESH isa number between DIFF_INDEX_SAVE_THRESH_START and +# Where THRESH is a number between DIFF_INDEX_SAVE_THRESH_START and # DIFF_INDEX_SAVE_THRESH_STOP which are defined in UserScript_fcstGEFS_Difficulty_Index.conf. # diff --git a/internal/scripts/dev_tools/add_met_config_helper.py b/internal/scripts/dev_tools/add_met_config_helper.py index 6cd8faaef0..3dd55af4ff 100755 --- a/internal/scripts/dev_tools/add_met_config_helper.py +++ b/internal/scripts/dev_tools/add_met_config_helper.py @@ -271,11 +271,11 @@ def _print_met_config_table(var): env_var_name = var['env_var_name'] metplus_names = var['metplus_config_names'] met_names = var['met_config_names'] - var_header = (f"**${{{env_var_name}}}**") + var_header = f"${{{env_var_name}}}\n{'^' * (len(env_var_name)+3)}" list_table_text = (f"{var_header}\n\n" ".. list-table::\n" " :widths: 5 5\n" - " :header-rows: 0\n\n" + " :header-rows: 1\n\n" " * - METplus Config(s)\n" " - MET Config File\n" ) diff --git a/internal/scripts/docker_env/Dockerfile.conda b/internal/scripts/docker_env/Dockerfile.conda index f1a62fa780..e2679c05a9 100644 --- a/internal/scripts/docker_env/Dockerfile.conda +++ b/internal/scripts/docker_env/Dockerfile.conda @@ -5,6 +5,6 @@ ARG DEBIAN_VERSION=12 FROM debian:${DEBIAN_VERSION}-slim RUN apt update && apt install -y curl \ - && curl https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-x86_64.sh > /miniconda.sh \ - && bash /miniconda.sh -b -p /usr/local/conda \ + && curl -L https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-$(uname)-$(uname -m).sh -o /miniforge.sh \ + && bash /miniforge.sh -b -p /usr/local/conda \ && /usr/local/conda/bin/conda update -y -n base -c conda-forge conda diff --git a/internal/scripts/installation/metplus_components_v5.1_py3.10.sh b/internal/scripts/installation/metplus_components_v5.1_py3.10.sh index 9ed5724cc9..5ad948a071 100644 --- a/internal/scripts/installation/metplus_components_v5.1_py3.10.sh +++ b/internal/scripts/installation/metplus_components_v5.1_py3.10.sh @@ -34,3 +34,4 @@ ${MINICONDA_PATH}/bin/conda install -y --name ${ENV_NAME} -c conda-forge pytest- ${MINICONDA_PATH}/bin/conda install -y --name ${ENV_NAME} -c conda-forge numpy==1.24.2 ${MINICONDA_PATH}/bin/conda install -y --name ${ENV_NAME} -c conda-forge libstdcxx-ng==12.1.0 ${MINICONDA_PATH}/bin/conda install -y --name ${ENV_NAME} -c conda-forge opencv-python==4.7.0 +${MINICONDA_PATH}/bin/conda install -y --name ${ENV_NAME} -c conda-forge libssh diff --git a/internal/scripts/installation/modulefiles/5.1.0.lua_wcoss2 b/internal/scripts/installation/modulefiles/6.0.0.lua_wcoss2 similarity index 90% rename from internal/scripts/installation/modulefiles/5.1.0.lua_wcoss2 rename to internal/scripts/installation/modulefiles/6.0.0.lua_wcoss2 index 5a41532114..2f5d5cf7c5 100644 --- a/internal/scripts/installation/modulefiles/5.1.0.lua_wcoss2 +++ b/internal/scripts/installation/modulefiles/6.0.0.lua_wcoss2 @@ -23,4 +23,4 @@ setenv("METPLUS_PATH", base) whatis("Name: ".. pkgName) whatis("Version: " .. pkgVersion) whatis("Category: application") -whatis("Description: Model Evaluation Tools Plus (METplus)") \ No newline at end of file +whatis("Description: Model Evaluation Tools Plus (METplus)") diff --git a/internal/scripts/installation/modulefiles/5.1.0_acorn b/internal/scripts/installation/modulefiles/6.0.0_acorn similarity index 66% rename from internal/scripts/installation/modulefiles/5.1.0_acorn rename to internal/scripts/installation/modulefiles/6.0.0_acorn index d5409853a9..60d33efc6d 100644 --- a/internal/scripts/installation/modulefiles/5.1.0_acorn +++ b/internal/scripts/installation/modulefiles/6.0.0_acorn @@ -3,20 +3,20 @@ ## METplus ## proc ModulesHelp { } { - puts stderr "Sets up the paths and environment variables to use the METplus-5.1.0 + puts stderr "Sets up the paths and environment variables to use the METplus-6.0.0 *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" } -module load intel python/3.10.4 +module load intel module use /apps/dev/modulefiles/ -module load ve/evs/1.0 +module load ve/evs/2.0 module use /apps/sw_review/emc/MET/modulefiles -module load met/11.1.0 +module load met/12.0.0 module load nco module load libjpeg module load grib_util module load wgrib2 -setenv METPLUS_PATH /apps/sw_review/emc/METplus/METplus-5.1.0 -prepend-path PATH /apps/sw_review/emc/METplus/METplus-5.1.0/ush +setenv METPLUS_PATH /apps/sw_review/emc/METplus/6.0.0 +prepend-path PATH /apps/sw_review/emc/METplus/6.0.0/ush diff --git a/internal/scripts/installation/modulefiles/6.0.0_gaea b/internal/scripts/installation/modulefiles/6.0.0_gaea new file mode 100644 index 0000000000..6186e5506c --- /dev/null +++ b/internal/scripts/installation/modulefiles/6.0.0_gaea @@ -0,0 +1,20 @@ +#%Module###################################################################### +## +## METplus +## +proc ModulesHelp { } { + puts stderr "Sets up the paths and environment variables to use the METplus-6.0. + *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" +} + +module load intel/2022.2.1 +module use -a /usw/met/modulefiles +module load met/12.0.0 +module load nco +module load wgrib +module load wgrib2 + +setenv METPLUS_PATH /usw/met/METplus/METplus-6.0.0 +prepend-path PATH /usw/met/METplus/METplus-6.0.0/ush:/lustre/f2/dev/esrl/Julie.Prestopnik/projects/miniconda/miniconda3/envs/metplus_v5.1_py3.10/bin + + diff --git a/internal/scripts/installation/modulefiles/5.1.0_hera b/internal/scripts/installation/modulefiles/6.0.0_hera similarity index 76% rename from internal/scripts/installation/modulefiles/5.1.0_hera rename to internal/scripts/installation/modulefiles/6.0.0_hera index ff8e845589..0db92569f7 100644 --- a/internal/scripts/installation/modulefiles/5.1.0_hera +++ b/internal/scripts/installation/modulefiles/6.0.0_hera @@ -3,7 +3,7 @@ ## METplus ## proc ModulesHelp { } { - puts stderr "Sets up the paths and environment variables to use the METplus-5.1.0. + puts stderr "Sets up the paths and environment variables to use the METplus-6.0.0. *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" } @@ -11,10 +11,10 @@ prereq intel prepend-path PATH /scratch1/BMC/dtc/miniconda/miniconda3/envs/metplus_v5.1_py3.10/bin module use -a /contrib/met/modulefiles -module load met/11.1.0 +module load met/12.0.0 module load nco module load wgrib module load wgrib2 module load R -setenv METPLUS_PATH /contrib/METplus/METplus-5.1.0 -prepend-path PATH /contrib/METplus/METplus-5.1.0/ush +setenv METPLUS_PATH /contrib/METplus/METplus-6.0.0 +prepend-path PATH /contrib/METplus/METplus-6.0.0/ush diff --git a/internal/scripts/installation/modulefiles/5.1.0_jet b/internal/scripts/installation/modulefiles/6.0.0_jet similarity index 58% rename from internal/scripts/installation/modulefiles/5.1.0_jet rename to internal/scripts/installation/modulefiles/6.0.0_jet index c2db60aeb3..f52b066e8a 100644 --- a/internal/scripts/installation/modulefiles/5.1.0_jet +++ b/internal/scripts/installation/modulefiles/6.0.0_jet @@ -3,18 +3,16 @@ ## Model Evaluation Tools ## proc ModulesHelp { } { - puts stderr "Sets up the paths and environment variables to use the METplus v5.1.0 + puts stderr "Sets up the paths and environment variables to use the METplus v6.0.0 *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" } prereq intel -prereq netcdf/4.7.0 -prereq hdf5/1.10.5 prereq nco/4.9.1 prereq wgrib/1.8.1.0b prereq wgrib2/2.0.8 prereq R/4.0.2 -prereq met/11.1.0 +prereq met/12.0.0-beta1 -setenv METPLUS_PATH /contrib/met/METplus/METplus-5.1.0 -prepend-path PATH /contrib/met/METplus/METplus-5.1.0/ush:/mnt/lfs1/HFIP/dtc-hurr/METplus/miniconda/miniconda3/envs/metplus_v5.1_py3.10/bin +setenv METPLUS_PATH /contrib/met/METplus/METplus-12.0.0-beta1 +prepend-path PATH /contrib/met/METplus/METplus-12.0.0-beta1/ush:/mnt/lfs1/HFIP/dtc-hurr/METplus/miniconda/miniconda3/envs/metplus_v5.1_py3.10/bin diff --git a/internal/tests/pytests/conftest.py b/internal/tests/pytests/conftest.py index 795a45f802..4e3f94c6bb 100644 --- a/internal/tests/pytests/conftest.py +++ b/internal/tests/pytests/conftest.py @@ -103,7 +103,15 @@ def test_example(metplus_config): config.logger = mock.MagicMock() yield config - + + if config.logger.error.call_args_list: + err_msgs = [ + str(msg.args[0]) + for msg + in config.logger.error.call_args_list + if len(msg.args) != 0] + print("Tests raised the following errors:") + print("\n".join(err_msgs)) config.logger = old_logger # don't remove output base if test fails if request.node.rep_call.failed: @@ -128,7 +136,7 @@ def read_configs(extra_configs): script_dir = os.path.dirname(__file__) minimum_conf = os.path.join(script_dir, "minimum_pytest.conf") args = extra_configs.copy() - args.append(minimum_conf) + args.insert(0, minimum_conf) config = config_metplus.setup(args) return config diff --git a/internal/tests/pytests/util/config_metplus/test_config_metplus.py b/internal/tests/pytests/util/config_metplus/test_config_metplus.py index ca6daf44f6..657a0e8642 100644 --- a/internal/tests/pytests/util/config_metplus/test_config_metplus.py +++ b/internal/tests/pytests/util/config_metplus/test_config_metplus.py @@ -7,9 +7,34 @@ from datetime import datetime from metplus.util import config_metplus -from metplus.util.time_util import ti_calculate from metplus.util.config_validate import validate_config_variables + +@pytest.mark.parametrize( + 'config_overrides,expected_logfile', [ + (['config.LOG_METPLUS={LOG_DIR}/metplus.log'], '/metplus.log'), + (['config.LOG_METPLUS='], ''), + (['config.LOG_METPLUS={LOG_DIR}/metplus.log.{LOG_TIMESTAMP}', + 'config.LOG_TIMESTAMP_TEMPLATE=%Y'], '/metplus.log.'), + (['config.LOG_METPLUS={LOG_DIR}/metplus.log.{LOG_TIMESTAMP}', + 'config.LOG_TIMESTAMP_USE_DATATIME=True', 'config.LOOP_BY=INIT', + 'config.INIT_TIME_FMT=%Y', 'config.INIT_BEG=1987', + 'config.LOG_TIMESTAMP_TEMPLATE=%Y'], '/metplus.log.1987'), + (['config.LOG_METPLUS={LOG_DIR}/metplus.log', + 'config.LOG_TO_TERMINAL_ONLY=True'], ''), + (['config.LOG_TO_TERMINAL_ONLY=True'], ''), + (['config.LOG_METPLUS=metplus.log'], '/metplus.log'), + ] +) +@pytest.mark.util +def test_set_logvars(metplus_config_files, config_overrides, expected_logfile): + config = metplus_config_files(config_overrides) + log_dir = config.getdir('LOG_DIR') + expected = expected_logfile.replace('', log_dir) + expected = expected.replace('', datetime.now().strftime('%Y')) + assert config.getstr('config', 'LOG_METPLUS') == expected + + @pytest.mark.util def test_get_default_config_list(): test_data_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), diff --git a/internal/tests/pytests/util/run_util/test_run_util.py b/internal/tests/pytests/util/run_util/test_run_util.py index 4b197d0d46..45d27fa46a 100644 --- a/internal/tests/pytests/util/run_util/test_run_util.py +++ b/internal/tests/pytests/util/run_util/test_run_util.py @@ -1,6 +1,9 @@ -import os import pytest from unittest import mock + +import os + +import produtil import metplus.util.run_util as ru import metplus.util.wrapper_init as wi from metplus.wrappers.ensemble_stat_wrapper import EnsembleStatWrapper @@ -40,6 +43,7 @@ 'CONFIG_INPUT', 'RUN_ID', 'LOG_TIMESTAMP', + 'LOG_TO_TERMINAL_ONLY', 'METPLUS_BASE', 'PARM_BASE', 'METPLUS_VERSION', @@ -61,6 +65,57 @@ def get_config_from_file(conf_file='run_util.conf'): conf_inputs = get_run_util_configs(conf_file) return ru.pre_run_setup(conf_inputs) +@pytest.mark.parametrize( + "log_met_to_metplus,copyable_env", + [ + (False, 'some text'), + (False, ''), + (True, 'some text'), + (True, ''), + ], +) +@pytest.mark.util +def test_log_header_info(tmp_path_factory, log_met_to_metplus, copyable_env): + fake_log = tmp_path_factory.mktemp("data") / 'fake.log' + cmd = '/my/cmd' + ru._log_header_info(fake_log, copyable_env=copyable_env, cmd=cmd, log_met_to_metplus=log_met_to_metplus) + with open(fake_log, 'r') as file_handle: + file_content = file_handle.read() + + assert 'OUTPUT:' in file_content + if not log_met_to_metplus: + assert "COMMAND" in file_content + assert cmd in file_content + if copyable_env: + assert copyable_env in file_content + + +@pytest.mark.parametrize( + "cmd,skip_run,use_log_path,expected_to_fail", + [ + (None, False, True, False), # no command + ('/my/cmd some args', True, True, False), # skip run + ('echo hello', False, True, False), # simple command with log + ('echo hello', False, False, False), # simple command no log + ('echo hello; echo hi', False, True, False), # complex 2 commands with log + ('echo hello; echo hi', False, False, False), # complex 2 commands no log + ('ls *', False, False, False), # complex command with wildcard * + ('ls fake_dir', False, False, True), # failed command + ], +) +@pytest.mark.util +def test_run_cmd(tmp_path_factory, cmd, skip_run, use_log_path, expected_to_fail): + log_path = str(tmp_path_factory.mktemp("data") / 'fake_run_cmd.log') if use_log_path else None + run_arguments = ru.RunArgs( + logger=None, + log_path=log_path, + skip_run=skip_run, + log_met_to_metplus=True, + env=os.environ, + copyable_env='some text', + ) + actual = ru.run_cmd(cmd, run_arguments) + assert bool(actual) == expected_to_fail @pytest.mark.util def test_pre_run_setup(): diff --git a/internal/tests/pytests/util/string_manip/test_util_string_manip.py b/internal/tests/pytests/util/string_manip/test_util_string_manip.py index 958d902b70..e448eb2ba0 100644 --- a/internal/tests/pytests/util/string_manip/test_util_string_manip.py +++ b/internal/tests/pytests/util/string_manip/test_util_string_manip.py @@ -3,10 +3,61 @@ import pytest import pprint -from csv import reader +from datetime import datetime from metplus.util.string_manip import * -from metplus.util.string_manip import _fix_list + + +@pytest.mark.parametrize( + 'config_overrides,logfile_arg,expected_logfile', [ + ({'LOG_METPLUS': ''}, None, None), + ({'LOG_METPLUS': '{LOG_DIR}/metplus.log'}, None, '/metplus.log'), + ({'LOG_METPLUS': '{LOG_DIR}/metplus.log', + 'LOG_MET_OUTPUT_TO_METPLUS': True}, 'app.log', '/metplus.log'), + ({'LOG_METPLUS': '{LOG_DIR}/metplus.log', + 'LOG_MET_OUTPUT_TO_METPLUS': False, + 'LOG_TIMESTAMP': ''}, 'app.log', '/app.log'), + ({'LOG_METPLUS': '{LOG_DIR}/metplus.log', + 'LOG_MET_OUTPUT_TO_METPLUS': False, + 'LOG_TIMESTAMP': '2020'}, 'app.log', '/app.log.2020'), + ] +) +@pytest.mark.util +def test_set_logvars(metplus_config, config_overrides, logfile_arg, expected_logfile): + config = metplus_config + for key, value in config_overrides.items(): + config.set('config', key, value) + + log_dir = config.getdir('LOG_DIR') + if expected_logfile is None: + expected = expected_logfile + else: + expected = expected_logfile.replace('', log_dir) + expected = expected.replace('', datetime.now().strftime('%Y')) + assert get_log_path(config, logfile=logfile_arg) == expected + + +@pytest.mark.parametrize( + 'config_overrides,expected_logfile', [ + ({'LOG_TO_TERMINAL_ONLY': True}, + 'Set LOG_TO_TERMINAL_ONLY=False to write logs to a file'), + ({'LOG_TO_TERMINAL_ONLY': False, + 'LOG_METPLUS': '{LOG_DIR}/metplus.log'}, + '/metplus.log'), + ({'LOG_TO_TERMINAL_ONLY': False, + 'LOG_METPLUS': ''}, + 'Set LOG_METPLUS to write logs to a file'), + ] +) +@pytest.mark.util +def test_get_logfile_info(metplus_config, config_overrides, expected_logfile): + config = metplus_config + for key, value in config_overrides.items(): + config.set('config', key, value) + log_dir = config.getdir('LOG_DIR') + expected = expected_logfile.replace('', log_dir) + assert get_logfile_info(config) == expected + @pytest.mark.parametrize( 'template, expected_output', [ @@ -21,6 +72,7 @@ def test_template_to_regex(template, expected_output): assert template_to_regex(template) == expected_output + @pytest.mark.parametrize( 'subset_definition, expected_result', [ ([1, 3, 5], ['b', 'd', 'f']), diff --git a/internal/tests/pytests/wrappers/command_builder/test_command_builder.py b/internal/tests/pytests/wrappers/command_builder/test_command_builder.py index 8822e165df..89fd7fef36 100644 --- a/internal/tests/pytests/wrappers/command_builder/test_command_builder.py +++ b/internal/tests/pytests/wrappers/command_builder/test_command_builder.py @@ -1,11 +1,13 @@ #!/usr/bin/env python3 import pytest +from unittest import mock import os import datetime - +import metplus.wrappers.command_builder as cb_wrapper from metplus.wrappers.command_builder import CommandBuilder +import metplus.util.run_util from metplus.util import ti_calculate, add_field_info_to_time_info @@ -144,7 +146,7 @@ def test_find_obs_offset(metplus_config, offsets, expected_file, offset_seconds) pcw.c_dict['OFFSETS'] = offsets pcw.c_dict['OBS_INPUT_DIR'] = get_data_dir(pcw.config) - pcw.c_dict['OBS_INPUT_TEMPLATE'] = "{da_init?fmt=%2H}z.prepbufr.tm{offset?fmt=%2H}.{da_init?fmt=%Y%m%d}" + pcw.c_dict['OBS_INPUT_TEMPLATE'] = "{da_init?fmt=%H}z.prepbufr.tm{offset?fmt=%2H}.{da_init?fmt=%Y%m%d}" add_field_info_to_time_info(time_info, var_info) obs_file, time_info = pcw.find_obs_offset(time_info) @@ -1001,4 +1003,239 @@ def test_get_env_copy(metplus_config, shell, expected): actual = cb.get_env_copy({'MET_TMP_DIR', 'OMP_NUM_THREADS'}) assert expected in actual - \ No newline at end of file + + +def _in_last_err(msg, mock_logger): + last_msg = mock_logger.error.call_args_list[-1][0][0] + return msg in last_msg + + +@pytest.mark.wrapper +def test_get_command(metplus_config): + config = metplus_config + + cb = CommandBuilder(config) + cb.app_path = '/jabberwocky/' + cb.infiles = ['O','frabjous','day'] + cb.outfile = 'callooh' + cb.param = 'callay' + + with mock.patch.object(os.path, 'dirname', return_value='callooh'): + with mock.patch.object(cb_wrapper, 'mkdir_p'): + actual = cb.get_command() + assert actual == '/jabberwocky/ -v 2 O frabjous day callooh callay' + + with mock.patch.object(os.path, 'dirname', return_value=None): + actual = cb.get_command() + assert actual is None + assert _in_last_err('Must specify path to output file', cb.logger) + + cb.outfile = None + actual = cb.get_command() + assert actual is None + assert _in_last_err('No output filename specified', cb.logger) + + cb.infiles = None + actual = cb.get_command() + assert actual is None + assert _in_last_err('No input filenames specified', cb.logger) + + cb.app_path = None + actual = cb.get_command() + assert actual is None + assert _in_last_err('No app path specified.', cb.logger) + + +@pytest.mark.parametrize( + 'd_type, curly, values, expected', [ + ('fcst', + True, + [['0.2','1.0'],'A24','Z0','extra'], + ['{ name="A24"; level="Z0"; cat_thresh=[ 0.2,1.0 ]; extra; }'] + ), + ('fcst', + False, + [['20'],'apcp','3000',None], + ['\'name="apcp"; level="3000"; cat_thresh=[ 20 ];\''] + ), + ('obs', + True, + [['0.2','1.0'],'A24','Z0',None], + ['{ name="A24"; level="Z0"; cat_thresh=[ 0.2,1.0 ]; }'] + ), + ] +) +@pytest.mark.wrapper +def test_format_field_info(metplus_config, + d_type, + curly, + values, + expected): + var_keys = [ + f'{d_type}_thresh', + f'{d_type}_name', + f'{d_type}_level', + f'{d_type}_extra', + ] + var_info = dict(zip(var_keys, values)) + + cb = CommandBuilder(metplus_config) + actual = cb.format_field_info(var_info, d_type, curly) + assert actual == expected + + +@pytest.mark.parametrize( + 'log_metplus', [ + (True),(False) + ] +) +@pytest.mark.wrapper +def test_run_command_error(metplus_config, log_metplus): + config = metplus_config + if log_metplus: + config.set('config', 'LOG_METPLUS', '/fake/file.log') + else: + config.set('config', 'LOG_METPLUS', '') + + cb = CommandBuilder(metplus_config) + with mock.patch.object(cb, 'run_cmd', return_value=-1): + actual = cb.run_command('foo') + assert not actual + assert _in_last_err('Command returned a non-zero return code: foo', cb.logger) + + +@pytest.mark.wrapper +def test_find_input_files_ensemble(metplus_config): + config = metplus_config + cb = CommandBuilder(metplus_config) + + time_info = ti_calculate({ + 'valid': datetime.datetime.strptime("201802010000", '%Y%m%d%H%M'), + 'lead': 0, + }) + + # can't write file list + with mock.patch.object(cb, 'write_list_file', return_value=None): + with mock.patch.object(cb, 'find_model', return_value=['file']): + actual = cb.find_input_files_ensemble(time_info, False) + assert actual is False + assert _in_last_err('Could not write filelist file', cb.logger) + + # not _check_expected_ensembles + with mock.patch.object(cb, '_check_expected_ensembles', return_value=None): + with mock.patch.object(cb, 'find_model', return_value=['file']): + actual = cb.find_input_files_ensemble(time_info) + assert actual is False + + # no input files + with mock.patch.object(cb, 'find_model', return_value=[]): + actual = cb.find_input_files_ensemble(time_info) + assert actual is False + assert _in_last_err('Could not find any input files', cb.logger) + + # file list does/doesn't exist + cb.c_dict['FCST_INPUT_FILE_LIST'] = 'fcst_file_list' + actual = cb.find_input_files_ensemble(time_info) + assert actual is False + assert _in_last_err('Could not find file list file', cb.logger) + + with mock.patch.object(cb_wrapper.os.path, 'exists', return_value=True): + actual = cb.find_input_files_ensemble(time_info) + assert actual is True + assert cb.infiles[-1] == 'fcst_file_list' + + # ctrl file not found + cb.c_dict['CTRL_INPUT_TEMPLATE'] = 'ctrl_file' + with mock.patch.object(cb, 'find_data', return_value=None): + actual = cb.find_input_files_ensemble(time_info) + assert actual is False + + +@pytest.mark.wrapper +def test_errors_and_defaults(metplus_config): + """ + A test to check various functions produce expected log messages + and return values on error or unexpected input. + """ + config = metplus_config + app_name = 'command_builder' + config.set('config', f'{app_name.upper()}_OUTPUT_PREFIX', 'prefix') + cb = CommandBuilder(metplus_config) + cb.app_name = app_name + + # smoke test run_all_times + cb.run_all_times() + assert cb.isOK + + # test get_output_prefix without time_info + actual = cb.get_output_prefix(time_info=None) + assert actual == 'prefix' + + # test handle_climo_dict errors counted correctly + starting_errs = cb.errors + with mock.patch.object(cb_wrapper, 'handle_climo_dict', return_value=False): + for x in range(2): + cb.handle_climo_dict() + assert starting_errs + 2 == cb.errors + + # test missing FLAGS returns none + actual = cb.handle_flags('foo') + assert actual is None + + # test get_env_var_value empty and list + actual = cb.get_env_var_value('foo',{'foo':''},'list') + assert actual == '[]' + + # test add_met_config_dict not OK + assert cb.isOK + with mock.patch.object(cb_wrapper, 'add_met_config_dict', return_value=False): + actual = cb.add_met_config_dict('foo', 'bar') + assert actual is False + assert not cb.isOK + + # test build when no cmd + with mock.patch.object(cb, 'get_command', return_value=None): + actual = cb.build() + assert actual == False + assert _in_last_err('Could not generate command', cb.logger) + + # test python embedding error + with mock.patch.object(cb_wrapper, 'is_python_script', return_value=True): + actual = cb.check_for_python_embedding('FCST',{'fcst_name':'pyEmbed'}) + assert actual == None + assert _in_last_err('must be set to a valid Python Embedding type', cb.logger) + + cb.c_dict['FCST_INPUT_DATATYPE'] = 'PYTHON_XARRAY' + with mock.patch.object(cb_wrapper, 'is_python_script', return_value=True): + actual = cb.check_for_python_embedding('FCST',{'fcst_name':'pyEmbed'}) + assert actual == 'python_embedding' + + # test field_info not set + cb.c_dict['CURRENT_VAR_INFO'] = None + actual = cb.set_current_field_config() + assert actual is None + + # test check_gempaktocf + cb.isOK = True + cb.check_gempaktocf(False) + assert cb.isOK == False + assert _in_last_err('[exe] GEMPAKTOCF_JAR was not set in configuration file.', cb.logger) + + # test expected ensemble mismatch + cb.c_dict['N_MEMBERS'] = 1 + actual = cb._check_expected_ensembles(['file1', 'file2']) + assert actual is False + assert _in_last_err('Found more files than expected!', cb.logger) + + # format field info + with mock.patch.object(cb_wrapper, 'format_field_info', return_value='bar'): + actual = cb.format_field_info({},'foo') + assert actual is None + assert _in_last_err('bar', cb.logger) + + # check get_field_info + with mock.patch.object(cb_wrapper, 'get_field_info', return_value='bar'): + actual = cb.get_field_info({},'foo') + assert actual is None + assert _in_last_err('bar', cb.logger) + diff --git a/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py b/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py index aa71f0eb56..9183821f1e 100644 --- a/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py +++ b/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py @@ -1,13 +1,12 @@ # !/usr/bin/env python3 import pytest - +from unittest import mock import os import datetime from metplus.wrappers.extract_tiles_wrapper import ExtractTilesWrapper - def extract_tiles_wrapper(metplus_config): config = metplus_config config.set('config', 'PROCESS_LIST', 'ExtractTiles') @@ -34,26 +33,42 @@ def extract_tiles_wrapper(metplus_config): config.set('config', 'EXTRACT_TILES_OUTPUT_DIR', '{OUTPUT_BASE}/extract_tiles') + config.set('config','FCST_EXTRACT_TILES_INPUT_TEMPLATE', '{INPUT_BASE}/fcst{lead?fmt=%HHH}.grb2') + config.set('config','OBS_EXTRACT_TILES_INPUT_TEMPLATE', '{INPUT_BASE}/obs{lead?fmt=%HHH}.grb2') + config.set('config','FCST_EXTRACT_TILES_OUTPUT_TEMPLATE', 'fcst_out.nc') + config.set('config','OBS_EXTRACT_TILES_OUTPUT_TEMPLATE', 'obs_out.nc') + config.set('config','FCST_EXTRACT_TILES_INPUT_DIR', '{INPUT_BASE}/fcst_tiles') + config.set('config','OBS_EXTRACT_TILES_INPUT_DIR', '{INPUT_BASE}/obs_tiles') + + config.set('config','FCST_VAR1_NAME','TMP') + config.set('config','FCST_VAR1_LEVELS', 'Z2') + config.set('config','OBS_VAR1_NAME', 'TMP') + config.set('config','OBS_VAR1_LEVELS', 'Z2') + wrapper = ExtractTilesWrapper(config) return wrapper -def get_storm_lines(wrapper): - filter_file = os.path.join(wrapper.config.getdir('METPLUS_BASE'), - 'internal', 'tests', - 'data', - 'stat_data', - 'fake_filter_20141214_00.tcst') - return get_input_lines(filter_file) +def get_test_file(wrapper, input_type): + if input_type == "mtd": + return os.path.join(wrapper.config.getdir('METPLUS_BASE'), + 'internal', 'tests', + 'data', + 'mtd', + 'fake_mtd_2d.txt') + if input_type == "storm": + return os.path.join(wrapper.config.getdir('METPLUS_BASE'), + 'internal', 'tests', + 'data', + 'stat_data', + 'fake_filter_20141214_00.tcst') +def get_storm_lines(wrapper): + return get_input_lines(get_test_file(wrapper, 'storm')) + def get_mtd_lines(wrapper): - input_file = os.path.join(wrapper.config.getdir('METPLUS_BASE'), - 'internal', 'tests', - 'data', - 'mtd', - 'fake_mtd_2d.txt') - return get_input_lines(input_file) + return get_input_lines(get_test_file(wrapper, 'mtd')) def get_input_lines(filepath): @@ -197,11 +212,79 @@ def test_get_grid_info(metplus_config, lat, lon, expected_result): @pytest.mark.parametrize( 'lat, lon, expected_result', [ (-54.9, -168.6, 'latlon 60 60 -70.0 -183.5 0.5 0.5'), - + (-37.8136, 144.9631, 'latlon 60 60 -53.0 130.0 0.5 0.5'), ] ) @pytest.mark.wrapper def test_get_grid(metplus_config, lat, lon, expected_result): wrapper = extract_tiles_wrapper(metplus_config) - storm_data = {'ALAT': lat, 'ALON': lon} + storm_data = { + 'ALAT': lat, + 'ALON': lon, + 'BLAT': lat, + 'BLON': lon, + 'CENTROID_LAT': lat, + 'CENTROID_LON': lon, + } assert(wrapper.get_grid('FCST', storm_data) == expected_result) + assert(wrapper.get_grid('OBS', storm_data) == expected_result) + assert(wrapper.get_grid('foo', storm_data,'MTD') == expected_result) + + # check error is raised + wrapper.get_grid('TIGER', storm_data) + last_err = wrapper.logger.error.call_args_list[-1][0][0] + assert "Invalid data type provided to get_grid: TIGER" in last_err + + +@pytest.mark.parametrize( +'tool_config,input_type',[ + #TC stat + ({ + 'EXTRACT_TILES_TC_STAT_INPUT_TEMPLATE': 'filter_{init?fmt=%Y%m%d}.tcst', + 'EXTRACT_TILES_TC_STAT_INPUT_DIR': '{INPUT_BASE}', + }, + "storm"), + #MTD + ({ + 'EXTRACT_TILES_MTD_INPUT_TEMPLATE': 'filter_{init?fmt=%Y%m%d}.tcst', + 'EXTRACT_TILES_MTD_INPUT_DIR': '{INPUT_BASE}' + }, + "mtd"), +] +) +def test_run_extract_tiles(metplus_config, tool_config, input_type): + config = metplus_config + for key, value in tool_config.items(): + config.set('config', key, value) + + with mock.patch.object(os.path, "exists", return_value=True): + wrapper = extract_tiles_wrapper(config) + test_file = get_test_file(wrapper, input_type) + with mock.patch.object(wrapper, + "get_location_input_file", + return_value=test_file): + wrapper.run_all_times() + assert wrapper.isOK + + +def test_get_location_input_file(metplus_config): + config = metplus_config + config.set('config', 'EXTRACT_TILES_TC_STAT_INPUT_TEMPLATE', 'filter_{init?fmt=%Y%m%d}.tcst') + config.set('config', 'EXTRACT_TILES_TC_STAT_INPUT_DIR', '/input/base/') + + wrapper = extract_tiles_wrapper(config) + time_info = { + 'loop_by': 'init', + 'init': datetime.datetime(2014, 12, 14, 0, 0), + } + + # Check error on missing file + path = wrapper.get_location_input_file(time_info, 'TC_STAT') + last_err = wrapper.logger.error.call_args_list[-1][0][0] + assert 'Could not find TC_STAT file: /input/base/filter_20141214.tcst' in last_err + assert path == None + + with mock.patch.object(os.path, "exists", return_value=True): + path = wrapper.get_location_input_file(time_info, 'TC_STAT') + assert path == '/input/base/filter_20141214.tcst' + diff --git a/internal/tests/pytests/wrappers/gfdl_tracker/test_gfdl_tracker.py b/internal/tests/pytests/wrappers/gfdl_tracker/test_gfdl_tracker.py new file mode 100644 index 0000000000..e6a26aa9ab --- /dev/null +++ b/internal/tests/pytests/wrappers/gfdl_tracker/test_gfdl_tracker.py @@ -0,0 +1,247 @@ +import os +import pytest +from unittest import mock +from metplus.wrappers import gfdl_tracker_wrapper as gf + + +time_fmt = "%Y%m%d%H" +run_times = ["2023080700", "2023080712", "2023080800"] + +# Helper class for string matching +class MatchSubstring(str): + def __eq__(self, other): + return self in other + +def set_minimum_config_settings(config): + # set config variables to prevent command from running and bypass check + # if input files actually exist + config.set("config", "DO_NOT_RUN_EXE", True) + config.set("config", "INPUT_MUST_EXIST", False) + + # set process and time config variables + config.set("config", "PROCESS_LIST", "GFDLTracker") + config.set("config", "LOOP_BY", "INIT") + config.set("config", "INIT_TIME_FMT", time_fmt) + config.set("config", "INIT_BEG", run_times[0]) + config.set("config", "INIT_END", run_times[-1]) + config.set("config", "INIT_INCREMENT", "12H") + config.set("config", "LEAD_SEQ", "12H") + config.set("config", "LOOP_ORDER", "processes") + config.set('config', "GFDL_TRACKER_RUNTIME_FREQ","RUN_ONCE_PER_INIT_OR_VALID") + config.set("config", "GFDL_TRACKER_EXEC", "fake_exe") + config.set("config", "GFDL_TRACKER_GRIB_VERSION", 1) + config.set("config", "GFDL_TRACKER_SKIP_TIMES", "") + config.set("config", "GFDL_TRACKER_MANDATORY", True) + config.set("config", "GFDL_TRACKER_SKIP_IF_OUTPUT_EXISTS", False) + + config.set( + "config", + "GFDL_TRACKER_NML_TEMPLATE_FILE", + "nml_template_file{init?fmt=%Y%m%d%H}.nml", + ), + config.set( + "config", "GFDL_TRACKER_INPUT_TEMPLATE", "input_file{init?fmt=%Y%m%d%H}.txt" + ), + config.set( + "config", + "GFDL_TRACKER_TC_VITALS_INPUT_TEMPLATE", + "tc_vitals_template_file{init?fmt=%Y%m%d%H}", + ), + config.set( + "config", + "GFDL_TRACKER_OUTPUT_TEMPLATE", + "out_template_file{init?fmt=%Y%m%d%H}.nml", + ), + config.set("config", "GFDL_TRACKER_OUTPUT_DIR", "outdir/") + config.set("config", "GFDL_TRACKER_SGV_TEMPLATE_FILE", "sgv_template") + + +@pytest.mark.wrapper_b +def test_gfdl_tracker_basic(metplus_config, monkeypatch): + config = metplus_config + set_minimum_config_settings(config) + + # GFDLTrackerWrapper does a lot of file manipulation. The approach + # here is to ignore all those operations and just create and run a + # basic wrapper object. A more complete test would create all the + # input files and then check files are created/removed as expected. + with mock.patch.object(gf.os, "symlink", return_value=mock.MagicMock): + with mock.patch.object(gf.os.path, "exists"): + with mock.patch.object(gf.shutil, "copyfile"): + with mock.patch.object(gf.os, "remove"): + wrapper = gf.GFDLTrackerWrapper(config) + wrapper.create_fort_14_file = mock.MagicMock + wrapper.create_fort_15_file = mock.MagicMock + wrapper.sub_template = mock.MagicMock + all_cmds = wrapper.run_all_times() + assert wrapper.isOK + assert len(all_cmds) == 6 + + # Check some config items are set correctly + expected_values = { + "INPUT_GRIB_VERSION": 1, + "INDEX_APP": "fake_exe/grbindex.exe", + "TRACKER_APP": "fake_exe/gettrk.exe", + "INPUT_TEMPLATE": "input_file{init?fmt=%Y%m%d%H}.txt", + "TC_VITALS_INPUT_TEMPLATE": "tc_vitals_template_file{init?fmt=%Y%m%d%H}", + "NML_TEMPLATE_FILE": "nml_template_file{init?fmt=%Y%m%d%H}.nml", + "KEEP_INTERMEDIATE": False, + } + + for key, expected_value in expected_values.items(): + assert expected_value == wrapper.c_dict[key] + + +@pytest.mark.wrapper_b +def test_conf_error_log(metplus_config): + '''Check correct error messages are logged''' + config = metplus_config + + with pytest.raises( + ValueError, match="GFDL_TRACKER_EXEC cannot be set to or contain '/path/to'" + ): + gf.GFDLTrackerWrapper(config) + + config.set("config", "GFDL_TRACKER_EXEC", "fake_exe") + with mock.patch.object(gf.os.path, "exists"): + wrapper = gf.GFDLTrackerWrapper(config) + wrapper.logger.error.assert_called_once_with( + MatchSubstring("GFDL_TRACKER_GRIB_VERSION () must be 1 or 2") + ) + + config.set("config", "GFDL_TRACKER_GRIB_VERSION", 2) + with mock.patch.object(gf.os.path, "exists"): + wrapper = gf.GFDLTrackerWrapper(config) + + expected_errs = [ + "Must set GFDL_TRACKER_NML_TEMPLATE_FILE", + "GFDL_TRACKER_INPUT_TEMPLATE must be set", + "GFDL_TRACKER_TC_VITALS_INPUT_TEMPLATE must be set", + "GFDL_TRACKER_OUTPUT_TEMPLATE must be set", + "GFDL_TRACKER_OUTPUT_DIR must be set", + ] + + for msg in expected_errs: + wrapper.logger.error.assert_any_call(MatchSubstring(msg)) + + wrapper = gf.GFDLTrackerWrapper(config) + wrapper.logger.error.assert_any_call( + MatchSubstring("GRIB index exe does not exist: ") + ) + + config.set("config", "TRACKER_APP", __file__) + wrapper = gf.GFDLTrackerWrapper(config) + wrapper.logger.error.assert_any_call( + MatchSubstring("Must set GFDL_TRACKER_NML_TEMPLATE_FILE") + ) + + config.set("config", "GFDL_TRACKER_NML_TEMPLATE_FILE", "gfdl_nml_template_file") + wrapper = gf.GFDLTrackerWrapper(config) + wrapper.logger.error.assert_any_call( + MatchSubstring("GFDL_TRACKER_NML_TEMPLATE_FILE does not exist: ") + ) + + +@pytest.mark.wrapper_b +def test_handle_gen_vitals(tmp_path_factory, metplus_config): + tmp_dir = tmp_path_factory.mktemp('gfdl') + file_name = 'input_tmplate' + open(os.path.join(tmp_dir,file_name), 'a').close() + + config = metplus_config + + set_minimum_config_settings(config) + config.set('config','GFDL_TRACKER_GEN_VITALS_INPUT_TEMPLATE', file_name) + config.set('config','GFDL_TRACKER_OUTPUT_DIR', tmp_dir) + config.set('config','GFDL_TRACKER_GEN_VITALS_INPUT_DIR', tmp_dir) + + wrapper = gf.GFDLTrackerWrapper(config) + + result = wrapper.handle_gen_vitals({}) + assert result == True + assert os.path.exists(os.path.join(tmp_dir, 'fort.67')) + assert os.path.exists(os.path.join(tmp_dir, 'tcvit_genesis_storms.txt')) + + result = wrapper.handle_gen_vitals({}) + assert result == True + wrapper.logger.debug.assert_any_call( + MatchSubstring('Gen vitals file already exists: ') + ) + + +@pytest.mark.parametrize( + 'file_exists,run_type', + [ + (False,'foo'), + (True,'midlat'), + ], +) +@pytest.mark.wrapper_b +def test_create_fort_14_file(tmp_path_factory, metplus_config, file_exists, run_type): + tmp_dir = tmp_path_factory.mktemp('fort14') + tc_vitals = os.path.join(tmp_dir,'tc_vitals') + full_path = os.path.join(tmp_dir,'fort.14') + if file_exists: + open(full_path, 'w').close() + + config = metplus_config + set_minimum_config_settings(config) + config.set('config','GFDL_TRACKER_OUTPUT_DIR', tmp_dir) + wrapper = gf.GFDLTrackerWrapper(config) + wrapper.c_dict['REPLACE_CONF_TRACKERINFO_TYPE'] = run_type + + actual = wrapper.create_fort_14_file(tc_vitals) + + if file_exists: + assert os.path.islink(full_path) + else: + assert os.path.exists(full_path) + assert actual == None + + +@pytest.mark.wrapper_b +def test_create_fort_15_file(tmp_path_factory, metplus_config): + tmp_dir = tmp_path_factory.mktemp('fort15') + full_path = os.path.join(tmp_dir,'fort.15') + lead_mins = [5,555,55555] + expected = '\n'.join([' 1 5',' 2 555',' 3 55555']) + + + config = metplus_config + set_minimum_config_settings(config) + config.set('config','GFDL_TRACKER_OUTPUT_DIR', tmp_dir) + wrapper = gf.GFDLTrackerWrapper(config) + + wrapper.create_fort_15_file(lead_mins) + assert os.path.exists(full_path) + with open(full_path, 'r') as f: + actual = f.read() + + assert actual == expected + + +@pytest.mark.wrapper_b +def test_sub_template(tmp_path_factory, metplus_config): + tmp_dir = tmp_path_factory.mktemp('sub_template') + out_path = os.path.join(tmp_dir,'outfile.txt') + template_file = os.path.join(tmp_dir,'template.txt') + + sub_dict = {'feature1': 'tornado', 'feature2': 'hurricane'} + content = 'Sometimes we call a twister a ${feature1}, and a cyclone a ${feature2}!' + expected = 'Sometimes we call a twister a tornado, and a cyclone a hurricane!\n' + + with open(template_file, 'w') as tp: + tp.write(content) + + config = metplus_config + set_minimum_config_settings(config) + wrapper = gf.GFDLTrackerWrapper(config) + + wrapper.sub_template(template_file, out_path, sub_dict) + + assert os.path.exists(out_path) + with open(out_path, 'r') as f: + actual = f.read() + + assert expected == actual + diff --git a/internal/tests/pytests/wrappers/grid_stat/test_grid_stat_wrapper.py b/internal/tests/pytests/wrappers/grid_stat/test_grid_stat_wrapper.py index 5c6c629996..15e4b0ce23 100644 --- a/internal/tests/pytests/wrappers/grid_stat/test_grid_stat_wrapper.py +++ b/internal/tests/pytests/wrappers/grid_stat/test_grid_stat_wrapper.py @@ -657,6 +657,8 @@ def test_grid_stat_is_prob(metplus_config, config_overrides, expected_values): ({'GRID_STAT_SEEPS_P1_THRESH': 'ge0.1&&le0.85', }, {'METPLUS_SEEPS_P1_THRESH': 'seeps_p1_thresh = ge0.1&&le0.85;'}), + ({'GRID_STAT_CAT_THRESH': 'NA', }, + {'METPLUS_CAT_THRESH': 'cat_thresh = [NA];'}), ] ) diff --git a/internal/tests/pytests/wrappers/met_db_load/test_met_db_load.py b/internal/tests/pytests/wrappers/met_db_load/test_met_db_load.py index 6003be50e5..ba6eaf2c67 100644 --- a/internal/tests/pytests/wrappers/met_db_load/test_met_db_load.py +++ b/internal/tests/pytests/wrappers/met_db_load/test_met_db_load.py @@ -1,20 +1,141 @@ #!/usr/bin/env python3 +import datetime import pytest - +import os +from unittest import mock from metplus.wrappers.met_db_load_wrapper import METDbLoadWrapper +time_fmt = "%Y%m%d%H" +run_times = ["2023080700", "2023080712", "2023080800"] + +time_info = { + "loop_by": "init", + "init": datetime.datetime(2023, 8, 7, 0, 0), + "now": datetime.datetime(2023, 8, 7, 0, 0), + "today": "20230830", + "instance": "", + "valid": "*", + "lead": "*", +} + +xml_template = """ + + + ${METPLUS_MV_HOST} + ${METPLUS_MV_DATABASE} + ${METPLUS_MV_USER} + ${METPLUS_MV_PASSWORD} + + + ${METPLUS_MV_VERBOSE} + ${METPLUS_MV_INSERT_SIZE} + ${METPLUS_MV_MODE_HEADER_DB_CHECK} + ${METPLUS_MV_DROP_INDEXES} + ${METPLUS_MV_APPLY_INDEXES} + ${METPLUS_MV_GROUP} + ${METPLUS_MV_LOAD_STAT} + ${METPLUS_MV_LOAD_MODE} + ${METPLUS_MV_LOAD_MTD} + ${METPLUS_MV_LOAD_MPR} + +""" + +xml_expected = """ + + + db_host + db + user + big_secret + + + true + 128 + true + false + true + group + true + true + true + true + + +""" + +tmp_file_dict = { + "dir1": {"subdir1": ["file1.stat", "file2.tcst"]}, + "dir2": ["file2.stat"], +} + + +def make_tmp_files(tmp_dir, structure=tmp_file_dict): + """ + Recursive function to make a directory structure + and populate with empty files. + """ + for key, val in structure.items(): + this_dir = os.path.join(tmp_dir, key) + os.mkdir(this_dir) + if isinstance(val, dict): + make_tmp_files(os.path.join(tmp_dir, key), val) + elif isinstance(val, list): + # make empty files + for f in val: + open(os.path.join(this_dir, f), "w").close() + + +# Helper class for string matching +class MatchSubstring(str): + def __eq__(self, other): + return self in other + + +def set_minimum_config_settings(config): + # set config variables to prevent command from running and bypass check + # if input files actually exist + config.set("config", "DO_NOT_RUN_EXE", True) + config.set("config", "INPUT_MUST_EXIST", False) + + # set process and time config variables + config.set("config", "PROCESS_LIST", "METDbLoad") + config.set("config", "LOOP_BY", "INIT") + config.set("config", "INIT_TIME_FMT", time_fmt) + config.set("config", "INIT_BEG", run_times[0]) + config.set("config", "INIT_END", run_times[-1]) + config.set("config", "INIT_INCREMENT", "12H") + config.set("config", "LEAD_SEQ", "12H") + config.set("config", "LOOP_ORDER", "processes") + + config.set("config", "MET_DB_LOAD_RUNTIME_FREQ", "RUN_ONCE_PER_INIT_OR_VALID") + config.set("config", "MET_DB_LOAD_MV_HOST", "db_host") + config.set("config", "MET_DB_LOAD_MV_DATABASE", "db") + config.set("config", "MET_DB_LOAD_MV_USER", "user") + config.set("config", "MET_DB_LOAD_MV_PASSWORD", "big_secret") + config.set("config", "MET_DB_LOAD_MV_VERBOSE", True) + config.set("config", "MET_DB_LOAD_MV_INSERT_SIZE", 128) + config.set("config", "MET_DB_LOAD_MV_MODE_HEADER_DB_CHECK", True) + config.set("config", "MET_DB_LOAD_MV_DROP_INDEXES", False) + config.set("config", "MET_DB_LOAD_MV_APPLY_INDEXES", True) + config.set("config", "MET_DB_LOAD_MV_GROUP", "group") + config.set("config", "MET_DB_LOAD_MV_LOAD_STAT", True) + config.set("config", "MET_DB_LOAD_MV_LOAD_MODE", True) + config.set("config", "MET_DB_LOAD_MV_LOAD_MTD", True) + config.set("config", "MET_DB_LOAD_MV_LOAD_MPR", True) + @pytest.mark.parametrize( - 'filename, expected_result', [ - ('myfile.png', False), - ('anotherfile.txt', False), - ('goodfile.stat', True), - ('goodfile.tcst', True), - ('mode_goodfile.txt', True), - ('mtd_goodfile.txt', True), - ('monster_badfile.txt', False), - ] + "filename, expected_result", + [ + ("myfile.png", False), + ("anotherfile.txt", False), + ("goodfile.stat", True), + ("goodfile.tcst", True), + ("mode_goodfile.txt", True), + ("mtd_goodfile.txt", True), + ("monster_badfile.txt", False), + ], ) @pytest.mark.wrapper def test_is_loadable_file(filename, expected_result): @@ -22,23 +143,112 @@ def test_is_loadable_file(filename, expected_result): @pytest.mark.parametrize( - 'filenames, expected_result', [ - (['myfile.png', - 'anotherfile.txt'], False), - (['myfile.png', - 'goodfile.stat'], True), - (['myfile.png', - 'goodfile.tcst', - 'anotherfile.txt'], True), - (['myfile.png', - 'mode_goodfile.txt'], True), - (['myfile.png', - 'mtd_goodfile.txt'], True), - (['myfile.png', - 'monster_badfile.txt'], False), + "filenames, expected_result", + [ + (["myfile.png", "anotherfile.txt"], False), + (["myfile.png", "goodfile.stat"], True), + (["myfile.png", "goodfile.tcst", "anotherfile.txt"], True), + (["myfile.png", "mode_goodfile.txt"], True), + (["myfile.png", "mtd_goodfile.txt"], True), + (["myfile.png", "monster_badfile.txt"], False), ([], False), - ] + ], ) @pytest.mark.wrapper def test_has_loadable_file(filenames, expected_result): assert METDbLoadWrapper._has_loadable_file(filenames) == expected_result + + +@pytest.mark.wrapper +def test_METDbLoadWrapper_config(metplus_config): + config = metplus_config + set_minimum_config_settings(config) + + expected = { + "MV_HOST": "", + "FIND_FILES": False, + "INPUT_TEMPLATE": "template.file", + "XML_TEMPLATE": "xml.file", + "MV_DATABASE": "db", + "MV_USER": "user", + "MV_PASSWORD": "big_secret", + "MV_VERBOSE": True, + "MV_INSERT_SIZE": 128, + } + + wrapper = METDbLoadWrapper(config) + wrapper.logger.error.assert_any_call(MatchSubstring("Must supply an XML file")) + + config.set("config", "MET_DB_LOAD_XML_FILE", "xml.file") + wrapper = METDbLoadWrapper(config) + wrapper.logger.error.assert_any_call( + MatchSubstring("Must supply an input template with") + ) + + config.set("config", "MET_DB_LOAD_INPUT_TEMPLATE", "template.file") + wrapper = METDbLoadWrapper(config) + + config.set("config", "MET_DB_LOAD_MV_HOST", "") + wrapper = METDbLoadWrapper(config) + wrapper.logger.error.assert_any_call(MatchSubstring("Must set MET_DB_LOAD_MV_HOST")) + + for k, v in expected.items(): + assert wrapper.c_dict[k] == v + + wrapper.c_dict["XML_TMP_FILE"] = "xml_tmp" + assert wrapper.get_command() == f"python3 {wrapper.app_path}.py xml_tmp" + + +@pytest.mark.wrapper +def test_METDbLoadWrapper(tmp_path_factory, metplus_config): + config = metplus_config + set_minimum_config_settings(config) + + # make the temp files needed to run wrapper + tmp_dir = tmp_path_factory.mktemp("METdbLoad") + file_name = "tmplate.xml" + xml_file = os.path.join(tmp_dir, file_name) + with open(xml_file, "w") as f: + f.write(xml_template) + + make_tmp_files(tmp_dir) + + # check wrapper runs + config.set("config", "TMP_DIR", tmp_dir) + config.set("config", "MET_DB_LOAD_REMOVE_TMP_XML", False) + config.set("config", "MET_DB_LOAD_RUNTIME_FREQ", "RUN_ONCE_PER_INIT_OR_VALID") + config.set("config", "MET_DB_LOAD_XML_FILE", xml_file) + config.set("config", "MET_DB_LOAD_INPUT_TEMPLATE", tmp_dir) + wrapper = METDbLoadWrapper(config) + all_cmds = wrapper.run_all_times() + + assert wrapper.isOK + assert wrapper.logger.error.assert_not_called + assert len(all_cmds) == 3 + + # check first tmp file has correct content + actual_xml = all_cmds[0][0].split()[-1] + with open(actual_xml, "r") as f: + assert f.read() == xml_expected + + # check temp files deleted + config.set("config", "MET_DB_LOAD_REMOVE_TMP_XML", True) + wrapper = METDbLoadWrapper(config) + all_cmds = wrapper.run_all_times() + assert not os.path.exists(all_cmds[0][0].split()[-1]) + + # check correct return on failure + with mock.patch.object(wrapper, "build", return_value=False): + assert wrapper.run_at_time_once(time_info) == False + + with mock.patch.object(wrapper, "replace_values_in_xml", return_value=False): + assert wrapper.run_at_time_once(time_info) == None + + with mock.patch.dict(wrapper.c_dict, {"XML_TEMPLATE": False}): + # wrapper.c_dict['XML_TEMPLATE'] = None + assert wrapper.replace_values_in_xml(time_info) == False + + # check handelling other times + time_info["lead"] = 3600 + assert wrapper.run_at_time_once(time_info) == True + diff --git a/internal/tests/pytests/wrappers/pb2nc/test_pb2nc_wrapper.py b/internal/tests/pytests/wrappers/pb2nc/test_pb2nc_wrapper.py index 5e612e93ce..64bea4e074 100644 --- a/internal/tests/pytests/wrappers/pb2nc/test_pb2nc_wrapper.py +++ b/internal/tests/pytests/wrappers/pb2nc/test_pb2nc_wrapper.py @@ -255,7 +255,7 @@ def test_pb2nc_all_fields(metplus_config, config_overrides, '{PARM_BASE}/met_config/PB2NCConfig_wrapped') config.set('config', 'PB2NC_INPUT_DIR', input_dir) config.set('config', 'PB2NC_INPUT_TEMPLATE', - 'ndas.t{da_init?fmt=%2H}z.prepbufr.tm{offset?fmt=%2H}.{da_init?fmt=%Y%m%d}.nr') + 'ndas.t{da_init?fmt=%H}z.prepbufr.tm{offset?fmt=%2H}.{da_init?fmt=%Y%m%d}.nr') config.set('config', 'PB2NC_OUTPUT_DIR', '{OUTPUT_BASE}/PB2NC/output') config.set('config', 'PB2NC_OUTPUT_TEMPLATE', '{valid?fmt=%Y%m%d%H}.nc') diff --git a/internal/tests/pytests/wrappers/py_embed_ingest/test_py_embed_ingest.py b/internal/tests/pytests/wrappers/py_embed_ingest/test_py_embed_ingest.py new file mode 100644 index 0000000000..0df1615aad --- /dev/null +++ b/internal/tests/pytests/wrappers/py_embed_ingest/test_py_embed_ingest.py @@ -0,0 +1,200 @@ +import os +import datetime +import pytest +from unittest import mock +from metplus.wrappers.py_embed_ingest_wrapper import PyEmbedIngestWrapper +from metplus.wrappers.command_builder import CommandBuilder + + +time_fmt = "%Y%m%d%H" +run_times = ["2023100600", "2023100612", "2023100700"] +time_info = { + "loop_by": "init", + "init": datetime.datetime(2023, 10, 6, 0, 0), + "now": datetime.datetime(2023, 10, 6, 0, 0), + "today": "20231010", + "instance": "", + "valid": "*", + "lead": "*", +} + +# Helper class for string matching +class MatchSubstring(str): + def __eq__(self, other): + return self in other + +def mock_get_ingest_items(item_type, index, ingest_script_addons): + # mock `get_ingest_items` to create a test case for config error log where number of + # output fields does not the same as number of script. + if item_type=="OUTPUT_FIELD_NAME": + return ["field_1", "field_2"] + else: + return ["field_1"] + +def set_minimum_config_settings(config): + # set config variables to prevent command from running and bypass check + # if input files actually exist + config.set("config", "DO_NOT_RUN_EXE", True) + config.set("config", "INPUT_MUST_EXIST", False) + + # set process and time config variables + config.set("config", "PROCESS_LIST", "PyEmbedIngest") + config.set("config", "LOOP_BY", "INIT") + config.set("config", "INIT_TIME_FMT", time_fmt) + config.set("config", "INIT_BEG", run_times[0]) + config.set("config", "INIT_END", run_times[-1]) + config.set("config", "INIT_INCREMENT", "12H") + config.set("config", "LEAD_SEQ", "12H") + + +@pytest.mark.parametrize( + 'config_overrides, mock_file_check, expected_values, expected_error_numbers', [ + # 0 a case with one index while find_and_check_output_file returns True + ( + { + 'PY_EMBED_INGEST_1_OUTPUT_DIR': "outdir/", + "PY_EMBED_INGEST_1_OUTPUT_TEMPLATE": "output_file.nc", + "PY_EMBED_INGEST_1_SCRIPT": "fake_script", + "PY_EMBED_INGEST_1_TYPE": "NUMPY", + "PY_EMBED_INGEST_1_OUTPUT_GRID": "fake_grid", + "PY_EMBED_INGEST_1_OUTPUT_FIELD_NAME": "fake_filed" + }, + True, + [ + { + "output_dir": "outdir/", + "output_template": "output_file.nc", + "output_field_names": ["fake_filed"], + "scripts": ["fake_script"], + "input_type": "NUMPY", + "output_grid": "fake_grid", + "index": "1", + } + ], + 1, + ), + # 1 a case with one index while find_and_check_output_file returns False + ( + { + 'PY_EMBED_INGEST_1_OUTPUT_DIR': "outdir/", + "PY_EMBED_INGEST_1_OUTPUT_TEMPLATE": "output_file.nc", + "PY_EMBED_INGEST_1_SCRIPT": "fake_script", + "PY_EMBED_INGEST_1_TYPE": "NUMPY", + "PY_EMBED_INGEST_1_OUTPUT_GRID": "fake_grid", + "PY_EMBED_INGEST_1_OUTPUT_FIELD_NAME": "fake_filed" + }, + False, + [{ + "output_dir": "outdir/", + "output_template": "output_file.nc", + "output_field_names": ["fake_filed"], + "scripts": ["fake_script"], + "input_type": "NUMPY", + "output_grid": "fake_grid", + "index": "1", + }], + 0, + ), + # 2 a case with two indices while find_and_check_output_file returns True + ( + { + 'PY_EMBED_INGEST_1_OUTPUT_DIR': "outdir/", + "PY_EMBED_INGEST_1_OUTPUT_TEMPLATE": "first_output_file.nc", + "PY_EMBED_INGEST_1_SCRIPT": "first_fake_script", + "PY_EMBED_INGEST_1_TYPE": "NUMPY", + "PY_EMBED_INGEST_1_OUTPUT_GRID": "first_fake_grid", + "PY_EMBED_INGEST_1_OUTPUT_FIELD_NAME": "first_fake_filed", + 'PY_EMBED_INGEST_2_OUTPUT_DIR': "outdir/", + "PY_EMBED_INGEST_2_OUTPUT_TEMPLATE": "second_output_file.nc", + "PY_EMBED_INGEST_2_SCRIPT": "second_fake_script", + "PY_EMBED_INGEST_2_TYPE": "NUMPY", + "PY_EMBED_INGEST_2_OUTPUT_GRID": "second_fake_grid", + "PY_EMBED_INGEST_2_OUTPUT_FIELD_NAME": "second_fake_filed", + }, + True, + [ + { + "output_dir": "outdir/", + "output_template": "first_output_file.nc", + "output_field_names": ["first_fake_filed"], + "scripts": ["first_fake_script"], + "input_type": "NUMPY", + "output_grid": "first_fake_grid", + "index": "1", + }, + { + "output_dir": "outdir/", + "output_template": "second_output_file.nc", + "output_field_names": ["second_fake_filed"], + "scripts": ["second_fake_script"], + "input_type": "NUMPY", + "output_grid": "second_fake_grid", + "index": "2", + }, + ], + 2, + ), + ] +) +@pytest.mark.wrapper_b +def test_required_job_template( + metplus_config, + mock_file_check, + config_overrides, + expected_values, + expected_error_numbers +): + config = metplus_config + + set_minimum_config_settings(config) + with mock.patch.object(CommandBuilder, "build", return_value=False): + with mock.patch.object( + CommandBuilder, "find_and_check_output_file", return_value=mock_file_check + ): + # set config variable overrides + for key, value in config_overrides.items(): + config.set('config', key, value) + + wrapper = PyEmbedIngestWrapper(config) + assert wrapper.isOK + assert wrapper.c_dict["INGESTERS"] == expected_values + assert wrapper.run_at_time_once(time_info) == True + assert wrapper.errors == expected_error_numbers + +@pytest.mark.wrapper +def test_conf_error_log(metplus_config, monkeypatch): + '''Check correct error messages are logged''' + config = metplus_config + set_minimum_config_settings(config) + + config_overrides = { + 'PY_EMBED_INGEST_1_OUTPUT_DIR': "outdir/", + "PY_EMBED_INGEST_1_OUTPUT_TEMPLATE": "output_file.nc", + "PY_EMBED_INGEST_1_SCRIPT": "fake_script xv mv", + "PY_EMBED_INGEST_1_TYPE": "PANDAS", + "PY_EMBED_INGEST_1_OUTPUT_GRID": "fake_grid", + "PY_EMBED_INGEST_1_OUTPUT_FIELD_NAME": "fake_filed", + 'PY_EMBED_INGEST_2_OUTPUT_DIR': "outdir/", + "PY_EMBED_INGEST_2_OUTPUT_TEMPLATE": "output_file.nc", + "PY_EMBED_INGEST_2_SCRIPT": "fake_script", + "PY_EMBED_INGEST_2_TYPE": "FAKE", + "PY_EMBED_INGEST_2_OUTPUT_GRID": "", + "PY_EMBED_INGEST_2_OUTPUT_FIELD_NAME": "fake_filed", + "PY_EMBED_INGEST_2_OUTPUT_FIELD_NAME_2": "fake_filed2" + } + # set config variable overrides + for key, value in config_overrides.items(): + config.set('config', key, value) + wrapper = PyEmbedIngestWrapper(config) + expected_error = [ + 'Running PyEmbedIngester on pandas data not yet implemented', + 'PY_EMBED_INGEST_2_TYPE (FAKE) not valid. Valid types are NUMPY, XARRAY, PANDAS', + 'Must set PY_EMBED_INGEST_2_OUTPUT_GRID', + "If using PY_EMBED_INGEST_1_OUTPUT_FIELD_NAME*, the number of output names must" + " match the number of PY_EMBED_INGEST_1_SCRIPT* values" + ] + with mock.patch.object(wrapper, "get_ingest_items", mock_get_ingest_items): + wrapper.create_c_dict() + + for msg in expected_error: + wrapper.logger.error.assert_any_call(MatchSubstring(msg)) diff --git a/internal/tests/pytests/wrappers/series_analysis/test_series_analysis.py b/internal/tests/pytests/wrappers/series_analysis/test_series_analysis.py index 4e7f002b1b..679f888f8f 100644 --- a/internal/tests/pytests/wrappers/series_analysis/test_series_analysis.py +++ b/internal/tests/pytests/wrappers/series_analysis/test_series_analysis.py @@ -1,10 +1,11 @@ import pytest - +from unittest import mock import os from datetime import datetime from dateutil.relativedelta import relativedelta from metplus.wrappers.series_analysis_wrapper import SeriesAnalysisWrapper +from metplus.wrappers import series_analysis_wrapper as saw fcst_dir = '/some/fcst/dir' obs_dir = '/some/obs/dir' @@ -1002,3 +1003,76 @@ def test_get_config_file(metplus_config): config.set('config', 'SERIES_ANALYSIS_CONFIG_FILE', fake_config_name) wrapper = SeriesAnalysisWrapper(config) assert wrapper.c_dict['CONFIG_FILE'] == fake_config_name + + +@pytest.mark.wrapper_a +def test_run_once_per_lead(metplus_config): + config = metplus_config + set_minimum_config_settings(config) + wrapper = SeriesAnalysisWrapper(config) + + # basic test + actual = wrapper.run_once_per_lead(None) + assert wrapper.isOK + assert actual is True + + # lead_hours = None + with mock.patch.object(saw, 'ti_get_hours_from_lead', return_value=None): + actual = wrapper.run_once_per_lead(None) + assert actual is True + + # run_at_time_once returns a failure + with mock.patch.object(wrapper, 'run_at_time_once', return_value=None): + actual = wrapper.run_once_per_lead(None) + assert actual is False + + +@pytest.mark.wrapper_a +def test_get_fcst_obs_not_embedding(metplus_config): + config = metplus_config + set_minimum_config_settings(config) + wrapper = SeriesAnalysisWrapper(config) + with mock.patch.object(wrapper, "_check_python_embedding", return_value=False): + actual = wrapper._get_fcst_and_obs_path({}, '*', None) + assert actual == (None, None) + + +@pytest.mark.parametrize( + 'lead_group, use_both, mock_exists, expected', [ + (('Group1', [0, 21600]), True, True, ('both_path', 'both_path')), + (('F012', [relativedelta(hours=12)]), True, False, (None, None)), + (('Group2', [0, 200]), False, True, ('fcst_path', 'obs_path')), + ((None, [0, 200]), False, False, (None, None)), + ] +) +@pytest.mark.wrapper_a +def test_get_fcst_and_obs_path(metplus_config, + lead_group, + use_both, + mock_exists, + expected): + config = metplus_config + set_minimum_config_settings(config) + wrapper = SeriesAnalysisWrapper(config) + wrapper.c_dict['EXPLICIT_FILE_LIST'] = True + wrapper.c_dict['FCST_INPUT_FILE_LIST'] = 'fcst_path' + wrapper.c_dict['OBS_INPUT_FILE_LIST'] = 'obs_path' + wrapper.c_dict['BOTH_INPUT_FILE_LIST'] = 'both_path' + wrapper.c_dict['USING_BOTH'] = use_both + + time_info = {'loop_by': 'init', + 'init': datetime(2005, 8, 7, 0, 0), + 'instance': '', + 'valid': '*', + 'lead': '*', + 'lead_string':'ALL', + 'date': datetime(2005, 8, 7, 0, 0), + 'storm_id': '*'} + + if mock_exists: + with mock.patch.object(os.path, "exists", return_value=True): + actual = wrapper._get_fcst_and_obs_path(time_info, '*', lead_group) + else: + actual = wrapper._get_fcst_and_obs_path(time_info, '*', lead_group) + assert actual == expected + diff --git a/internal/tests/pytests/wrappers/tc_diag/test_tc_diag_wrapper.py b/internal/tests/pytests/wrappers/tc_diag/test_tc_diag_wrapper.py index d62db8b247..ec3458c8ea 100644 --- a/internal/tests/pytests/wrappers/tc_diag/test_tc_diag_wrapper.py +++ b/internal/tests/pytests/wrappers/tc_diag/test_tc_diag_wrapper.py @@ -204,7 +204,8 @@ def set_minimum_config_settings(config): ({'TC_DIAG_CIRA_DIAG_FLAG': 'True', }, {'METPLUS_CIRA_DIAG_FLAG': 'cira_diag_flag = TRUE;'}), ({'TC_DIAG_OUTPUT_PREFIX': 'my_prefix', }, {'METPLUS_OUTPUT_PREFIX': 'output_prefix = "my_prefix";'}), - + ({'TC_DIAG_ONE_TIME_PER_FILE_FLAG': 'false', }, + {'METPLUS_ONE_TIME_PER_FILE_FLAG': 'one_time_per_file_flag = FALSE;'}), ] ) @pytest.mark.wrapper diff --git a/internal/tests/pytests/wrappers/tc_pairs/test_tc_pairs_wrapper.py b/internal/tests/pytests/wrappers/tc_pairs/test_tc_pairs_wrapper.py index 8e901c141f..0edb935b29 100644 --- a/internal/tests/pytests/wrappers/tc_pairs/test_tc_pairs_wrapper.py +++ b/internal/tests/pytests/wrappers/tc_pairs/test_tc_pairs_wrapper.py @@ -1,11 +1,12 @@ #!/usr/bin/env python3 import pytest - +from unittest import mock import os from datetime import datetime from metplus.wrappers.tc_pairs_wrapper import TCPairsWrapper +import metplus.wrappers.tc_pairs_wrapper as tcp bdeck_template = 'b{basin?fmt=%s}q{date?fmt=%Y%m}*.gfso.{cyclone?fmt=%s}' adeck_template = 'a{basin?fmt=%s}q{date?fmt=%Y%m}*.gfso.{cyclone?fmt=%s}' @@ -222,30 +223,53 @@ def test_get_basin_cyclone_from_bdeck(metplus_config, template, filename, assert actual_cyclone == expected_cyclone +@pytest.mark.wrapper +def test_get_basin_cyclone_from_bdeck_error(metplus_config): + full_filename = os.path.join('/fake/dir', '20141009bal.dat') + config = metplus_config + set_minimum_config_settings(config) + wrapper = TCPairsWrapper(config) + wrapper.c_dict['BDECK_DIR'] = '/fake/dir' + wrapper.c_dict['BDECK_TEMPLATE'] = '{date?fmt=%Y}{cyclone?fmt=%s}b{basin?fmt=%s}.dat' + with mock.patch.object(tcp, 'get_tags', return_value = 50 * [0]): + actual = wrapper._get_basin_cyclone_from_bdeck(full_filename, + True, + 'al', + '1009', + {'date': datetime(2014, 12, 31, 18)}, + ) + assert actual == (None, None) + last_err = wrapper.logger.error.call_args_list[0][0][0] + assert "Number of regex match groups does not match" in last_err + + @pytest.mark.parametrize( - 'config_overrides, storm_type, values_to_check', [ + 'config_overrides, storm_type, values_to_check, reformat', [ # 0: storm_id ({'TC_PAIRS_STORM_ID': 'AL092019, ML102019'}, - 'storm_id', ['AL092019', 'ML102019']), + 'storm_id', ['AL092019', 'ML102019'], False), # 1: basin ({'TC_PAIRS_BASIN': 'AL, ML'}, - 'basin', ['AL', 'AL', 'ML', 'ML']), + 'basin', ['AL', 'AL', 'ML', 'ML'], False), # 2: cyclone ({'TC_PAIRS_CYCLONE': '09, 10'}, - 'cyclone', ['09', '09', '10', '10']), + 'cyclone', ['09', '09', '10', '10'], False), # 3: both, check basin ({'TC_PAIRS_BASIN': 'AL, ML', 'TC_PAIRS_CYCLONE': '09, 10'}, - 'basin', ['AL', 'AL', 'ML', 'ML']), + 'basin', ['AL', 'AL', 'ML', 'ML'], False), # 4: both, check cyclone - basin is outer loop, so alternate cyclones ({'TC_PAIRS_BASIN': 'AL, ML', 'TC_PAIRS_CYCLONE': '09, 10'}, - 'cyclone', ['09', '10', '09', '10']), + 'cyclone', ['09', '10', '09', '10'], False), + # 5: cyclone with reformat + ({'TC_PAIRS_CYCLONE': '09, 10'}, + 'cyclone', ['0109', '0109', '0110', '0110'], True), ] ) @pytest.mark.wrapper def test_tc_pairs_storm_id_lists(metplus_config, config_overrides, - storm_type, values_to_check): + storm_type, values_to_check, reformat): config = metplus_config set_minimum_config_settings(config) @@ -270,6 +294,11 @@ def test_tc_pairs_storm_id_lists(metplus_config, config_overrides, for key, value in config_overrides.items(): config.set('config', key, value) + if reformat: + config.set('config', 'TC_PAIRS_REFORMAT_DECK', True) + config.set('config', 'TC_PAIRS_REFORMAT_DECK_TYPE', 'SBU') + config.set('config', 'TC_PAIRS_REFORMAT_DIR', '{OUTPUT_BASE}') + wrapper = TCPairsWrapper(config) assert wrapper.isOK @@ -465,16 +494,16 @@ def test_tc_pairs_storm_id_lists(metplus_config, config_overrides, # 40: interp12 ('VALID', {'TC_PAIRS_INTERP12': 'replace', }, {'METPLUS_INTERP12': 'interp12 = REPLACE;'}), - # 41 match_points + # 41: match_points ('VALID', {'TC_PAIRS_MATCH_POINTS': 'False', }, {'METPLUS_MATCH_POINTS': 'match_points = FALSE;'}), - # 42 -diag argument + # 42: -diag argument ('VALID', { 'TC_PAIRS_DIAG_TEMPLATE1': '/some/path/{valid?fmt=%Y%m%d%H}.dat', 'TC_PAIRS_DIAG_SOURCE1': 'TCDIAG', }, {'DIAG_ARG': '-diag TCDIAG /some/path/2014121318.dat'}), - # 43 2 -diag arguments + # 43: 2 -diag arguments ('VALID', { 'TC_PAIRS_DIAG_TEMPLATE1': '/some/path/{valid?fmt=%Y%m%d%H}.dat', 'TC_PAIRS_DIAG_SOURCE1': 'TCDIAG', @@ -483,7 +512,7 @@ def test_tc_pairs_storm_id_lists(metplus_config, config_overrides, }, {'DIAG_ARG': ('-diag TCDIAG /some/path/2014121318.dat ' '-diag LSDIAG_RT /some/path/rt_2014121318.dat')}), - # 44 diag_convert_map 1 dictionary in list + # 44: diag_convert_map 1 dictionary in list ('VALID', { 'TC_PAIRS_DIAG_CONVERT_MAP1_DIAG_SOURCE': 'CIRA_DIAG', 'TC_PAIRS_DIAG_CONVERT_MAP1_KEY': '(10C),(10KT),(10M/S)', @@ -493,7 +522,7 @@ def test_tc_pairs_storm_id_lists(metplus_config, config_overrides, 'diag_convert_map = [{diag_source = "CIRA_DIAG";' 'key = ["(10C)", "(10KT)", "(10M/S)"];convert(x) = x/10;}];' )}), - # 45 diag_convert_map 2 dictionaries in list + # 45: diag_convert_map 2 dictionaries in list ('VALID', { 'TC_PAIRS_DIAG_CONVERT_MAP1_DIAG_SOURCE': 'CIRA_DIAG', 'TC_PAIRS_DIAG_CONVERT_MAP1_KEY': '(10C),(10KT),(10M/S)', @@ -508,7 +537,7 @@ def test_tc_pairs_storm_id_lists(metplus_config, config_overrides, '{diag_source = "SHIPS_DIAG";key = ["LAT", "LON", "CSST", ' '"RSST", "DSST", "DSTA"];convert(x) = x/100;}];' )}), - # 46 diag_info_map 1 dictionary in list + # 46: diag_info_map 1 dictionary in list ('VALID', { 'TC_PAIRS_DIAG_INFO_MAP1_DIAG_SOURCE': 'CIRA_DIAG_RT', 'TC_PAIRS_DIAG_INFO_MAP1_TRACK_SOURCE': 'GFS', @@ -520,7 +549,7 @@ def test_tc_pairs_storm_id_lists(metplus_config, config_overrides, 'diag_info_map = [{diag_source = "CIRA_DIAG_RT";' 'track_source = "GFS";field_source = "GFS_0p50";' 'match_to_track = ["GFS"];diag_name = ["MY_NAME"];}];')}), - # 47 diag_info_map 2 dictionaries in list + # 47: diag_info_map 2 dictionaries in list ('VALID', { 'TC_PAIRS_DIAG_INFO_MAP1_DIAG_SOURCE': 'CIRA_DIAG_RT', 'TC_PAIRS_DIAG_INFO_MAP1_TRACK_SOURCE': 'GFS', @@ -768,3 +797,120 @@ def test_get_config_file(metplus_config): config.set('config', 'TC_PAIRS_CONFIG_FILE', fake_config_name) wrapper = TCPairsWrapper(config) assert wrapper.c_dict['CONFIG_FILE'] == fake_config_name + + # Check correct error raised + config.set('config', 'TC_PAIRS_REFORMAT_DECK', True) + wrapper = TCPairsWrapper(config) + wrapper.create_c_dict() + last_err = wrapper.logger.error.call_args_list[-1][0][0] + assert 'Must set TC_PAIRS_REFORMAT_DIR if TC_PAIRS_REFORMAT_DECK is True' in last_err + + +@pytest.mark.wrapper +def test_validate_runtime_freq_loop_order(metplus_config): + config = metplus_config + config.set('config','LOOP_ORDER','times') + wrapper = TCPairsWrapper(config) + + # Check warning message when LOOP_ORDER set + warn_msg = wrapper.logger.warning.call_args_list[-1][0][0] + assert 'LOOP_ORDER has been deprecated.' in warn_msg + assert wrapper.c_dict['RUNTIME_FREQ'] == 'RUN_ONCE_FOR_EACH' + + +@pytest.mark.parametrize( + 'bool_value, expected_config', + [ + (True, 'RUN_ONCE'), + (False, 'RUN_ONCE_FOR_EACH'), + ] +) +@pytest.mark.wrapper +def test_validate_runtime_freq_tc_pairs(metplus_config, + bool_value, + expected_config): + config = metplus_config + config.set('config','TC_PAIRS_RUN_ONCE', bool_value) + wrapper = TCPairsWrapper(config) + + # Check warn and handle deprecated TC_PAIRS_RUN_ONCE + warn_msg = wrapper.logger.warning.call_args_list[-1][0][0] + assert f'Setting TC_PAIRS_RUNTIME_FREQ={expected_config}.' in warn_msg + assert f'Please remove TC_PAIRS_RUN_ONCE' in warn_msg + assert wrapper.c_dict['RUNTIME_FREQ'] == expected_config + + +@pytest.mark.wrapper +def test_bad_add_config(metplus_config): + config = metplus_config + wrapper = TCPairsWrapper(config) + with mock.patch.object(tcp, + "add_met_config_dict_list", + return_value=False): + wrapper.isOK = True + wrapper._handle_consensus() + assert not wrapper.isOK + + wrapper.isOK = True + wrapper._handle_diag_info_map() + assert not wrapper.isOK + + wrapper.isOK = True + wrapper._handle_diag_convert_map() + assert not wrapper.isOK + + +# Test data for test_read_modify_write_file +csv_in1 = '''STM, 0006, del this, -9.1, 100, 143.3, -37.987 +STM, 0005, del this, -9, 100, 145.0, foo\r\n''' +csv_out1 = '''STM, 050006, -9.1, 100, 143.3, -37.987 +STM, 050005, -9999, 100, 145.0, foo\n''' + +csv_in2 = '''STM, 0006, -9, -9.1 +STM, 0005, ??, -9 +STM1, -9, -9999, -9\n''' +csv_out2 = '''STM, 050006, -9.1 +STM, 050005, -9999 +STM1, 05-9, -9999\n''' + +csv_in3 = '''STM, 0006, -9, -9.1 +STM2, 0005, -9, -9 +STM1, -9, -9999, -9\r''' +csv_out3 = '''STM, 050006, -9.1 +STM, 050005, -9999 +STM1, 05-9, -9999\n''' + +@pytest.mark.parametrize( + 'replace_tuple, content, expected', + [ + # 1: Basic test + (('d','x'),'a, b, c, d\r\n', 'a, 05b, x\n'), + # 2: Multi row + (('-9','-9999'), csv_in1, csv_out1 ), + # 3: Multi row with multi replacement + (('-9','-9999'),csv_in2, csv_out2), + # 4: Repeated values and \r + (('-9','-9999'),csv_in2, csv_out2), + #5: empty file + (('foo', 'bar'),'',''), + ] +) +def test_read_modify_write_file(tmp_path_factory, + metplus_config, + replace_tuple, + content, + expected): + config = metplus_config + wrapper = TCPairsWrapper(config) + tmp_file = os.path.join(tmp_path_factory.mktemp('tc_pairs'), 'tc_test.csv') + out_file = os.path.join(tmp_path_factory.mktemp('tc_pairs'), 'tc_out.csv') + + with open(tmp_file, 'w') as f: + f.write(content) + + wrapper.read_modify_write_file(tmp_file,'05', replace_tuple,out_file) + + with open(out_file, 'r') as f: + actual = f.read() + assert actual == expected + diff --git a/metplus/util/config_metplus.py b/metplus/util/config_metplus.py index f898039818..c842f96840 100644 --- a/metplus/util/config_metplus.py +++ b/metplus/util/config_metplus.py @@ -291,19 +291,23 @@ def _set_logvars(config): # add LOG_TIMESTAMP to the final configuration file config.set('config', 'LOG_TIMESTAMP', log_filenametimestamp) - metplus_log = config.strinterp( - 'config', - '{LOG_METPLUS}', - LOG_TIMESTAMP_TEMPLATE=log_filenametimestamp - ) - - # add log directory to log file path if only filename was provided - if metplus_log: - if os.path.basename(metplus_log) == metplus_log: - metplus_log = os.path.join(config.getdir('LOG_DIR'), metplus_log) - print('Logging to %s' % metplus_log) + if config.getbool('config', 'LOG_TO_TERMINAL_ONLY'): + metplus_log = '' else: + metplus_log = config.strinterp( + 'config', + '{LOG_METPLUS}', + LOG_TIMESTAMP_TEMPLATE=log_filenametimestamp + ) + + # add log directory to log file path if only filename was provided + if metplus_log and os.path.basename(metplus_log) == metplus_log: + metplus_log = os.path.join(config.getdir('LOG_DIR'), metplus_log) + + if not metplus_log: print('Logging to terminal only') + else: + print('Logging to %s' % metplus_log) # set LOG_METPLUS with timestamp substituted config.set('config', 'LOG_METPLUS', metplus_log) @@ -342,6 +346,13 @@ def get_logger(config): f' {log_level_terminal}') sys.exit(1) + # create log formatter from config settings + formatter = METplusLogFormatter(config) + + # do not send logs up to root logger handlers + logger.propagate = False + + # set up logging file handler if logging to a file metpluslog = config.getstr('config', 'LOG_METPLUS', '') if not metpluslog: logger.setLevel(log_level_terminal_val) @@ -355,23 +366,17 @@ def get_logger(config): if not os.path.exists(dir_name): mkdir_p(dir_name) - # do not send logs up to root logger handlers - logger.propagate = False - - # create log formatter from config settings - formatter = METplusLogFormatter(config) - # set up the file logging file_handler = logging.FileHandler(metpluslog, mode='a') file_handler.setFormatter(formatter) file_handler.setLevel(log_level_val) logger.addHandler(file_handler) - # set up console logging - stream_handler = logging.StreamHandler() - stream_handler.setFormatter(formatter) - stream_handler.setLevel(log_level_terminal_val) - logger.addHandler(stream_handler) + # set up console logging + stream_handler = logging.StreamHandler() + stream_handler.setFormatter(formatter) + stream_handler.setLevel(log_level_terminal_val) + logger.addHandler(stream_handler) # set add the logger to the config config.logger = logger diff --git a/metplus/util/config_validate.py b/metplus/util/config_validate.py index 1ba275336e..d47bda2337 100644 --- a/metplus/util/config_validate.py +++ b/metplus/util/config_validate.py @@ -1,6 +1,6 @@ import os -from .constants import DEPRECATED_DICT, DEPRECATED_MET_LIST +from .constants import DEPRECATED_DICT from .constants import UPGRADE_INSTRUCTIONS_URL from .string_manip import find_indices_in_config_section, getlist from .string_manip import is_python_script, get_wrapper_name @@ -29,11 +29,11 @@ def validate_config_variables(config): input_real_path = os.path.realpath(config.getdir_nocheck('INPUT_BASE', '')) output_real_path = os.path.realpath(config.getdir('OUTPUT_BASE')) if input_real_path == output_real_path: - config.logger.error("INPUT_BASE AND OUTPUT_BASE are set to the " - f"exact same path: {input_real_path}") - config.logger.error("Please change one of these paths to avoid risk " - "of losing input data") - inoutbase_is_ok = False + config.logger.error("INPUT_BASE AND OUTPUT_BASE are set to the " + f"exact same path: {input_real_path}") + config.logger.error("Please change one of these paths to avoid risk " + "of losing input data") + inoutbase_is_ok = False check_user_environment(config) @@ -120,10 +120,10 @@ def handle_deprecated(old, alt, depr_info, config, all_sed_cmds, e_list, # if it is required to remove, add to error list if not alt: - e_list.append("{} should be removed".format(old)) + e_list.append(f"{old} should be removed") return - e_list.append("{} should be replaced with {}".format(old, alt)) + e_list.append(f"{old} should be replaced with {alt}") config_files = config.getstr('config', 'CONFIG_INPUT', '').split(',') if 'copy' not in depr_info.keys() or depr_info['copy']: @@ -177,21 +177,38 @@ def check_for_deprecated_met_config_file(config, met_config, met_tool): with open(met_config, 'r') as file_handle: lines = file_handle.read().splitlines() - all_good = True + error_logs = [] for line in lines: for deprecated_item in deprecated_met_list: if '${' + deprecated_item + '}' not in line: continue - all_good = False - config.logger.error("Deprecated environment variable" - f" ${{{deprecated_item}}} found in MET config " - f"file: {met_config}. Please unset " - f"{met_tool}_CONFIG_FILE to use the wrapped " - "MET config that is provided with the " - "METplus wrappers and set values that differ " - "from the defaults in a METplus config file.") + error_logs.append(f"Deprecated environment variable ${{{deprecated_item}}} found") + + if error_logs: + config.logger.error(f"Deprecated environment variables found in {met_tool}_CONFIG_FILE: {met_config}") + for error_log in error_logs: + config.logger.error(error_log) + + met_install_dir = config.getdir('MET_INSTALL_DIR') + config_dir = os.path.join(met_install_dir, 'share', 'met', 'config') + default_config = f"{get_wrapper_name(met_tool)}Config_default" + default_path = os.path.join(config_dir, default_config) + config.logger.error( + "Please set values that differ from the defaults in a METplus " + f"config file and unset {met_tool}_CONFIG_FILE to use the " + "wrapped MET config that is provided with the METplus wrappers." + ) + config.logger.error( + f"Compare values set in {met_config} to {default_path}" + ) + config.logger.error( + "See https://metplus.readthedocs.io/en/latest/Users_Guide/" + "release-notes.html#metplus-wrappers-upgrade-instructions" + " for more information." + ) + return False - return all_good + return True def _get_deprecated_met_list(config, met_tool): @@ -304,9 +321,9 @@ def check_user_environment(config): for env_var in config.keys('user_env_vars'): if env_var in os.environ: - msg = '{} is already set in the environment. '.format(env_var) +\ - 'Overwriting from conf file' - config.logger.warning(msg) + config.logger.warning( + f'{env_var} is already set in the environment. Overwriting from conf file' + ) def is_var_item_valid(item_list, index, ext, config): diff --git a/metplus/util/run_util.py b/metplus/util/run_util.py index d84fafa4fb..994c68d7b5 100644 --- a/metplus/util/run_util.py +++ b/metplus/util/run_util.py @@ -1,10 +1,13 @@ import sys import os import shutil -import logging from datetime import datetime +from typing import NamedTuple, Union +from logging import Logger +import shlex + +from produtil.run import exe, run -from .constants import NO_COMMAND_WRAPPERS from .string_manip import get_logfile_info, log_terminal_includes_info from .system_util import get_user_info, write_list_to_file from .config_util import get_process_list, handle_env_var_config @@ -12,7 +15,103 @@ from .config_validate import validate_config_variables from .. import get_metplus_version from .config_metplus import setup -from . import camel_to_underscore, get_wrapper_instance +from . import get_wrapper_instance + + +class RunArgs(NamedTuple): + logger: Union[Logger, None] = None + log_path: Union[str, None] = None + skip_run: bool = False + log_met_to_metplus: bool = True + env: os._Environ = os.environ + copyable_env: str = '' + + +class PrintLogger(object): + def __init__(self): + self.info = print + self.debug = print + self.error = print + self.warning = print + + +def run_cmd(cmd, run_args): + if not cmd: + return 0 + + # if env not set, use os.environ + env = os.environ if run_args.env is None else run_args.env + if run_args.logger is not None: + logger = run_args.logger + else: + logger = PrintLogger() + + logger.info("COMMAND: %s" % cmd) + + # don't run app if DO_NOT_RUN_EXE is set to True + if run_args.skip_run: + logger.info("Not running command (DO_NOT_RUN_EXE = True)") + return 0 + + log_path = run_args.log_path + + # determine if command must be run in a shell + run_in_shell = '*' in cmd or ';' in cmd or '<' in cmd or '>' in cmd + + # Run the executable and pass the arguments as a sequence. + # Split the command in to a sequence using shell syntax. + the_exe = shlex.split(cmd)[0] + the_args = shlex.split(cmd)[1:] + if log_path: + logger.debug("Logging command output to: %s" % log_path) + _log_header_info(log_path, run_args.copyable_env, cmd, run_args.log_met_to_metplus) + + if run_in_shell: + cmd_exe = exe('sh')['-c', cmd].env(**env).err2out() >> log_path + else: + cmd_exe = exe(the_exe)[the_args].env(**env).err2out() >> log_path + else: + if run_in_shell: + cmd_exe = exe('sh')['-c', cmd].env(**env) + else: + cmd_exe = exe(the_exe)[the_args].env(**env).err2out() + + # get current time to calculate total time to run command + start_cmd_time = datetime.now() + + # run command + try: + ret = run(cmd_exe) + except Exception as err: + logger.error(f'Exception occurred: {err}') + ret = -1 + else: + # calculate time to run + end_cmd_time = datetime.now() + total_cmd_time = end_cmd_time - start_cmd_time + logger.info(f'Finished running {the_exe} - took {total_cmd_time}') + + return ret + + +def _log_header_info(log_path, copyable_env, cmd, log_met_to_metplus): + with open(log_path, 'a+') as log_file_handle: + # if logging MET command to its own log file, + # add command that was run to that log + if not log_met_to_metplus: + # if environment variables were set and available, + # write them to MET tool log + if copyable_env: + log_file_handle.write( + "\nCOPYABLE ENVIRONMENT FOR NEXT COMMAND:\n") + log_file_handle.write(f"{copyable_env}\n\n") + else: + log_file_handle.write('\n') + + log_file_handle.write(f"COMMAND:\n{cmd}\n\n") + + # write line to designate where MET tool output starts + log_file_handle.write("OUTPUT:\n") def pre_run_setup(config_inputs): @@ -63,19 +162,13 @@ def pre_run_setup(config_inputs): f"generated in {sed_file}") logger.error("Correct configuration variables and rerun. Exiting.") - logger.info("Check the log file for more information: " - f"{get_logfile_info(config)}") + logger.info(f"Check the log file for more information: {log_file}") sys.exit(1) if not config.getdir('MET_INSTALL_DIR', must_exist=True): logger.error('MET_INSTALL_DIR must be set correctly to run METplus') sys.exit(1) - # set staging dir to OUTPUT_BASE/stage if not set - if not config.has_option('config', 'STAGING_DIR'): - config.set('config', 'STAGING_DIR', - os.path.join(config.getdir('OUTPUT_BASE'), "stage")) - # handle dir to write temporary files handle_tmp_dir(config) diff --git a/metplus/util/string_manip.py b/metplus/util/string_manip.py index 8fcfeab8dd..ee23b4fc9c 100644 --- a/metplus/util/string_manip.py +++ b/metplus/util/string_manip.py @@ -570,6 +570,33 @@ def find_indices_in_config_section(regex, config, sec='config', return indices +def get_log_path(config, logfile=None): + """!Returns the location of where the command output will be sent. + The METplus log, the MET log, or tty. + + @param config METplusConfig object to read + @param logfile file name to use if logging to a separate file + @returns Log file path or None if logging to terminal + """ + # if LOG_METPLUS is unset or empty, log to terminal + metplus_log = config.getstr('config', 'LOG_METPLUS', '') + if not metplus_log: + return None + + # return METplus log file if logging all output there + if config.getbool('config', 'LOG_MET_OUTPUT_TO_METPLUS') or logfile is None: + return metplus_log + + log_path = os.path.join(config.getdir('LOG_DIR'), logfile) + + # add log timestamp to log filename if set + log_timestamp = config.getstr('config', 'LOG_TIMESTAMP', '') + if log_timestamp: + log_path = f'{log_path}.{log_timestamp}' + + return log_path + + def get_logfile_info(config): """!Get path to log file from LOG_METPLUS config variable or return a useful message if it is not set to instruct users how to set it. @@ -577,6 +604,8 @@ def get_logfile_info(config): @param config METplusConfig object to read LOG_METPLUS from @returns path to log file or message if unset """ + if config.getbool('config', 'LOG_TO_TERMINAL_ONLY'): + return 'Set LOG_TO_TERMINAL_ONLY=False to write logs to a file' log_file = config.getstr('config', 'LOG_METPLUS', '') return log_file if log_file else 'Set LOG_METPLUS to write logs to a file' diff --git a/metplus/util/string_template_substitution.py b/metplus/util/string_template_substitution.py index d181332b9f..424c15c46d 100644 --- a/metplus/util/string_template_substitution.py +++ b/metplus/util/string_template_substitution.py @@ -127,7 +127,7 @@ def format_hms(fmt, obj): # i.e. 90 minutes %M => 90, but %H%M => 0130 days = obj // 86400 hours = obj // 3600 - minutes = obj // 60 + minutes = obj // 60 seconds = obj # if days are specified, change hours, minutes, and seconds to relative diff --git a/metplus/wrappers/command_builder.py b/metplus/wrappers/command_builder.py index 058a9e93f7..13ee4b5a38 100755 --- a/metplus/wrappers/command_builder.py +++ b/metplus/wrappers/command_builder.py @@ -10,14 +10,11 @@ """ import os -import sys import glob from datetime import datetime from abc import ABCMeta from inspect import getframeinfo, stack -from .command_runner import CommandRunner - from ..util.constants import PYTHON_EMBEDDING_TYPES, COMPRESSION_EXTENSIONS from ..util import getlist, preprocess_file, loop_over_times_and_call from ..util import do_string_sub, ti_calculate, get_seconds_from_string @@ -32,6 +29,8 @@ from ..util import get_wrapper_name, is_python_script from ..util.met_config import add_met_config_dict, handle_climo_dict from ..util import mkdir_p, get_skip_times +from ..util import get_log_path, RunArgs, run_cmd + # pylint:disable=pointless-string-statement '''!@namespace CommandBuilder @@ -119,12 +118,6 @@ def __init__(self, config, instance=None): self.check_for_externals() - self.cmdrunner = CommandRunner( - self.config, logger=self.logger, - verbose=self.c_dict['VERBOSITY'], - skip_run=self.c_dict.get('DO_NOT_RUN_EXE', False), - ) - # set log name to app name by default # any wrappers with a name different than the primary app that is run # should override this value in their init function after the call @@ -1075,7 +1068,7 @@ def check_for_gempak(self): def check_gempaktocf(self, gempaktocf_jar): if not gempaktocf_jar: - self.log_error("[exe] GEMPAKTOCF_JAR was not set if configuration file. " + self.log_error("[exe] GEMPAKTOCF_JAR was not set in configuration file. " "This is required to process Gempak data.") self.logger.info("Refer to the GempakToCF use case documentation for information " "on how to obtain the tool: parm/use_cases/met_tool_wrapper/GempakToCF/GempakToCF.py") @@ -1275,27 +1268,35 @@ def run_command(self, cmd, cmd_name=None): if self.instance: log_name = f"{log_name}.{self.instance}" - ret, out_cmd = self.cmdrunner.run_cmd(cmd, - env=self.env, - log_name=log_name, - copyable_env=self.get_env_copy()) + log_name = log_name if log_name else os.path.basename(cmd.split()[0]) + + # Determine where to send the output from the MET command. + log_path = get_log_path(self.config, logfile=log_name+'.log') + + run_arguments = RunArgs( + logger=self.logger, + log_path=log_path, + skip_run=self.c_dict.get('DO_NOT_RUN_EXE', False), + log_met_to_metplus=self.config.getbool('config', 'LOG_MET_OUTPUT_TO_METPLUS'), + env=self.env, + copyable_env=self.get_env_copy(), + ) + ret = self.run_cmd(cmd, run_arguments) if not ret: return True self.log_error(f"Command returned a non-zero return code: {cmd}") - logfile_path = self.config.getstr('config', 'LOG_METPLUS') - if not logfile_path: + if log_path is None: return False - # if MET output is written to its own logfile, get that filename - if not self.config.getbool('config', 'LOG_MET_OUTPUT_TO_METPLUS'): - logfile_path = logfile_path.replace('run_metplus', log_name) - self.logger.info("Check the logfile for more information on why " - f"it failed: {logfile_path}") + f"it failed: {log_path}") return False + def run_cmd(self, cmd, run_args): + return run_cmd(cmd, run_args) + def run_all_times(self, custom=None): """! Loop over time range specified in conf file and call METplus wrapper for each time diff --git a/metplus/wrappers/command_runner.py b/metplus/wrappers/command_runner.py deleted file mode 100755 index 9c94738b5d..0000000000 --- a/metplus/wrappers/command_runner.py +++ /dev/null @@ -1,181 +0,0 @@ -""" -File Name: command_runner.py -Contact(s): Jim Frimel -Abstract: -History Log: Initial version -Usage: Use as a has-a relationship with your object or module. - Object has-a command runner. -Parameters: None -Input Files: N/A -Output Files: N/A -""" - -##@namespace command_runner -# The purpose of this class is to run the external MET executables -# and other ancillary external programs used in METplus, such as -# wgrib2, ncdump, plot_tcmpr.R -# -# It also centralizes the output redirection to the -# METplus logs, MET logs or TTY. -# -# One BIG underlying assumption is that all commands are run -# the same way in terms of the Runner object and the Run command -# executed. -# -# Originally this capability (the methods) was placed in the -# CommandBuilder but it seemed to separating out made sense. -# CommandBuilder now has-a CommandRunner. But being in its own class -# allows it to be used elsewhere if needed. -# -# It creates a produtil Runnable object -# It determines where to redirect the output -# METplus log file, MET logs, or TTY -# It runs the Runnable object -# - -import os -from produtil.run import exe, run -import shlex -from datetime import datetime, timezone - - -class CommandRunner(object): - """! Class for Creating and Running External Programs - """ - def __init__(self, config, logger=None, verbose=2, skip_run=False): - """!Class for Creating and Running External Programs. - It was intended to handle the MET executables but - can be used by other executables.""" - self.logger = logger - self.config = config - self.verbose = verbose - self.skip_run = skip_run - self.log_met_to_metplus = config.getbool('config', - 'LOG_MET_OUTPUT_TO_METPLUS') - - def run_cmd(self, cmd, env=None, log_name=None, - copyable_env=None, **kwargs): - """!The command cmd is a string which is converted to a produtil - exe Runner object and than run. Output of the command may also - be redirected to either METplus log, MET log, or TTY. - - Some subclasses of CommandBuilder ie. series_by_init_wrapper, run - non MET commands ie. convert, in addition to MET binary commands, - ie. regrid_data_plane. - - Args: - @param cmd: A string, Command used in the produtil exe Runner object. - @param env: Default None, environment for run to pass in, uses - os.environ if not set. - @param log_name: Used only when ismetcmd=True, The name of the exectable - being run. - @param kwargs Other options sent to the produtil Run constructor - """ - if cmd is None: - return cmd - - # if env not set, use os.environ - env = os.environ if env is None else env - - self.logger.info("COMMAND: %s" % cmd) - - # don't run app if DO_NOT_RUN_EXE is set to True - if self.skip_run: - self.logger.info("Not running command (DO_NOT_RUN_EXE = True)") - return 0, cmd - - log_name = log_name if log_name else os.path.basename(cmd.split()[0]) - - # Determine where to send the output from the MET command. - log_dest = self.get_log_path(log_filename=log_name+'.log') - - # determine if command must be run in a shell - run_inshell = '*' in cmd or ';' in cmd or '<' in cmd or '>' in cmd - - # KEEP This comment as a reference note. - # Run the executable in a new process instead of through a shell. - # FYI. We were originally running the command through a shell - # which also works just fine. IF we go back to running through - # a shell, The string ,cmd, is formatted exactly as is needed. - # By formatted, it is as it would be when typed at the shell prompt. - # This includes, for example, quoting or backslash escaping filenames - # with spaces in them. - - # Run the executable and pass the arguments as a sequence. - # Split the command in to a sequence using shell syntax. - the_exe = shlex.split(cmd)[0] - the_args = shlex.split(cmd)[1:] - if log_dest: - self.logger.debug("Logging command output to: %s" % log_dest) - self.log_header_info(log_dest, copyable_env, cmd) - - if run_inshell: - cmd_exe = exe('sh')['-c', cmd].env(**env).err2out() >> log_dest - else: - cmd_exe = exe(the_exe)[the_args].env(**env).err2out() >> log_dest - else: - if run_inshell: - cmd_exe = exe('sh')['-c', cmd].env(**env) - else: - cmd_exe = exe(the_exe)[the_args].env(**env).err2out() - - # get current time to calculate total time to run command - start_cmd_time = datetime.now() - - # run command - try: - ret = run(cmd_exe, **kwargs) - except Exception: - ret = -1 - else: - # calculate time to run - end_cmd_time = datetime.now() - total_cmd_time = end_cmd_time - start_cmd_time - self.logger.info(f'Finished running {the_exe} ' - f'- took {total_cmd_time}') - - return ret, cmd - - def log_header_info(self, log_dest, copyable_env, cmd): - with open(log_dest, 'a+') as log_file_handle: - # if logging MET command to its own log file, - # add command that was run to that log - if not self.log_met_to_metplus: - # if environment variables were set and available, - # write them to MET tool log - if copyable_env: - log_file_handle.write( - "\nCOPYABLE ENVIRONMENT FOR NEXT COMMAND:\n") - log_file_handle.write(f"{copyable_env}\n\n") - else: - log_file_handle.write('\n') - - log_file_handle.write(f"COMMAND:\n{cmd}\n\n") - - # write line to designate where MET tool output starts - log_file_handle.write("OUTPUT:\n") - - def get_log_path(self, log_filename): - """!Returns the location of where the command output will be sent. - The METplus log, the MET log, or tty. - - @param log_filename file name to use if logging to a separate file - @returns Log file path or None if logging to terminal - """ - # if LOG_METPLUS is unset or empty, log to terminal - metplus_log = self.config.getstr('config', 'LOG_METPLUS', '') - if not metplus_log: - return None - - # return METplus log file if logging all output there - if self.log_met_to_metplus: - return metplus_log - - log_path = os.path.join(self.config.getdir('LOG_DIR'), log_filename) - - # add log timestamp to log filename if set - log_timestamp = self.config.getstr('config', 'LOG_TIMESTAMP', '') - if log_timestamp: - log_path = f'{log_path}.{log_timestamp}' - - return log_path diff --git a/metplus/wrappers/grid_stat_wrapper.py b/metplus/wrappers/grid_stat_wrapper.py index 8e7ebbf78e..95245dd1f8 100755 --- a/metplus/wrappers/grid_stat_wrapper.py +++ b/metplus/wrappers/grid_stat_wrapper.py @@ -55,6 +55,7 @@ class GridStatWrapper(CompareGriddedWrapper): 'METPLUS_CENSOR_THRESH', 'METPLUS_CENSOR_VAL', 'METPLUS_SEEPS_P1_THRESH', + 'METPLUS_CAT_THRESH', ] # deprecated env vars that are no longer supported in the wrapped MET conf @@ -179,24 +180,21 @@ def create_c_dict(self): c_dict['ALLOW_MULTIPLE_FILES'] = False - self.add_met_config(name='cov_thresh', - data_type='list', + self.add_met_config(name='cov_thresh', data_type='list', env_var_name='METPLUS_NBRHD_COV_THRESH', metplus_configs=[ 'GRID_STAT_NEIGHBORHOOD_COV_THRESH' ], extra_args={'remove_quotes': True}) - self.add_met_config(name='width', - data_type='list', + self.add_met_config(name='width', data_type='list', env_var_name='METPLUS_NBRHD_WIDTH', metplus_configs=[ 'GRID_STAT_NEIGHBORHOOD_WIDTH' ], extra_args={'remove_quotes': True}) - self.add_met_config(name='shape', - data_type='string', + self.add_met_config(name='shape', data_type='string', env_var_name='METPLUS_NBRHD_SHAPE', metplus_configs=[ 'GRID_STAT_NEIGHBORHOOD_SHAPE' @@ -222,18 +220,15 @@ def create_c_dict(self): self.handle_interp_dict(uses_field=True) - self.add_met_config(name='nc_pairs_var_name', - data_type='string', + self.add_met_config(name='nc_pairs_var_name', data_type='string', metplus_configs=['GRID_STAT_NC_PAIRS_VAR_NAME']) - self.add_met_config(name='grid_weight_flag', - data_type='string', + self.add_met_config(name='grid_weight_flag', data_type='string', metplus_configs=['GRID_STAT_GRID_WEIGHT_FLAG'], extra_args={'remove_quotes': True, 'uppercase': True}) - self.add_met_config(name='file_type', - data_type='string', + self.add_met_config(name='file_type', data_type='string', env_var_name='FCST_FILE_TYPE', metplus_configs=['GRID_STAT_FCST_FILE_TYPE', 'FCST_GRID_STAT_FILE_TYPE', @@ -241,8 +236,7 @@ def create_c_dict(self): extra_args={'remove_quotes': True, 'uppercase': True}) - self.add_met_config(name='file_type', - data_type='string', + self.add_met_config(name='file_type', data_type='string', env_var_name='OBS_FILE_TYPE', metplus_configs=['GRID_STAT_OBS_FILE_TYPE', 'OBS_GRID_STAT_FILE_TYPE', @@ -250,8 +244,7 @@ def create_c_dict(self): extra_args={'remove_quotes': True, 'uppercase': True}) - self.add_met_config(name='hss_ec_value', - data_type='float', + self.add_met_config(name='hss_ec_value', data_type='float', metplus_configs=['GRID_STAT_HSS_EC_VALUE']) self.add_met_config_dict('distance_map', { @@ -267,16 +260,16 @@ def create_c_dict(self): 'wave_1d_end': ('list', 'remove_quotes'), }) - self.add_met_config(name='censor_thresh', - data_type='list', + self.add_met_config(name='censor_thresh', data_type='list', extra_args={'remove_quotes': True}) - self.add_met_config(name='censor_val', - data_type='list', + self.add_met_config(name='censor_val', data_type='list', extra_args={'remove_quotes': True}) - self.add_met_config(name='seeps_p1_thresh', - data_type='string', + self.add_met_config(name='cat_thresh', data_type='list', + extra_args={'remove_quotes': True}) + + self.add_met_config(name='seeps_p1_thresh', data_type='string', extra_args={'remove_quotes': True}) return c_dict diff --git a/metplus/wrappers/series_analysis_wrapper.py b/metplus/wrappers/series_analysis_wrapper.py index c33b4d6440..a16989416e 100755 --- a/metplus/wrappers/series_analysis_wrapper.py +++ b/metplus/wrappers/series_analysis_wrapper.py @@ -645,7 +645,7 @@ def _get_fcst_and_obs_path(self, time_info, storm_id, lead_group): @param time_info dictionary containing time information @param storm_id storm ID to process - @param lead_group dictionary where key is label and value is a + @param lead_group tuple where first value is label and second is a list of forecast leads to process. If no label was defined, the key will match the format "NoLabel_" and if no lead groups are defined, the dictionary should be replaced with None diff --git a/metplus/wrappers/tc_diag_wrapper.py b/metplus/wrappers/tc_diag_wrapper.py index 56bf83bcc0..52797d9824 100755 --- a/metplus/wrappers/tc_diag_wrapper.py +++ b/metplus/wrappers/tc_diag_wrapper.py @@ -64,6 +64,7 @@ class TCDiagWrapper(RuntimeFreqWrapper): 'METPLUS_NC_RNG_AZI_FLAG', 'METPLUS_CIRA_DIAG_FLAG', 'METPLUS_OUTPUT_PREFIX', + 'METPLUS_ONE_TIME_PER_FILE_FLAG', ] def __init__(self, config, instance=None): @@ -220,6 +221,8 @@ def create_c_dict(self): self.add_met_config(name='vortex_removal', data_type='bool') + self.add_met_config(name='one_time_per_file_flag', data_type='bool') + self.add_met_config(name='nc_rng_azi_flag', data_type='bool') self.add_met_config(name='nc_diag_flag', data_type='bool') self.add_met_config(name='cira_diag_flag', data_type='bool') diff --git a/metplus/wrappers/tc_pairs_wrapper.py b/metplus/wrappers/tc_pairs_wrapper.py index 5065fe0a4d..c7b5a7cf9c 100755 --- a/metplus/wrappers/tc_pairs_wrapper.py +++ b/metplus/wrappers/tc_pairs_wrapper.py @@ -593,14 +593,6 @@ class attributes cyclone_fmt = f"cyclone = {cyclone};" self.env_var_dict['METPLUS_CYCLONE'] = cyclone_fmt - # STORM_NAME - storm_name = '[]' - if self.c_dict.get('STORM_NAME'): - storm_name = str(self.c_dict['STORM_NAME']).replace("'", '"') - - storm_name_fmt = f"storm_name = {storm_name};" - self.env_var_dict['METPLUS_STORM_NAME'] = storm_name_fmt - super().set_environment_variables(time_info) def process_data(self, basin, cyclone, time_info): @@ -903,9 +895,9 @@ def read_modify_write_file(in_csvfile, storm_month, missing_values, row[1] = " " + storm_month + (row[1]).strip() # Iterate over the items, deleting or modifying the columns - for item in row: + for index, item in enumerate(row): # Delete the third column - if item == row[2]: + if index == 2: continue # Replace MISSING_VAL_TO_REPLACE=missing_values[0] with # MISSING_VAL=missing_values[1] diff --git a/parm/met_config/GridStatConfig_wrapped b/parm/met_config/GridStatConfig_wrapped index c3c382916e..4bb4636f17 100644 --- a/parm/met_config/GridStatConfig_wrapped +++ b/parm/met_config/GridStatConfig_wrapped @@ -39,7 +39,8 @@ ${METPLUS_REGRID_DICT} ${METPLUS_CENSOR_THRESH} //censor_val = ${METPLUS_CENSOR_VAL} -cat_thresh = []; +//cat_thresh = +${METPLUS_CAT_THRESH} cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/parm/met_config/TCDiagConfig_wrapped b/parm/met_config/TCDiagConfig_wrapped index d20be1a55b..d081f2430d 100644 --- a/parm/met_config/TCDiagConfig_wrapped +++ b/parm/met_config/TCDiagConfig_wrapped @@ -162,6 +162,9 @@ ${METPLUS_VORTEX_REMOVAL} //////////////////////////////////////////////////////////////////////////////// +//one_time_per_file_flag = +${METPLUS_ONE_TIME_PER_FILE_FLAG} + // // Flags to control output files // diff --git a/parm/metplus_config/defaults.conf b/parm/metplus_config/defaults.conf index 850eb68434..ba67ccd233 100644 --- a/parm/metplus_config/defaults.conf +++ b/parm/metplus_config/defaults.conf @@ -78,6 +78,7 @@ SCRUB_STAGING_DIR = True # Log File Information (Where to write logs files) # ############################################################################### +LOG_TO_TERMINAL_ONLY = False LOG_METPLUS = {LOG_DIR}/metplus.log.{LOG_TIMESTAMP} diff --git a/parm/use_cases/met_tool_wrapper/GridStat/GridStat.conf b/parm/use_cases/met_tool_wrapper/GridStat/GridStat.conf index 94f563d660..cf7e103c24 100644 --- a/parm/use_cases/met_tool_wrapper/GridStat/GridStat.conf +++ b/parm/use_cases/met_tool_wrapper/GridStat/GridStat.conf @@ -208,3 +208,4 @@ GRID_STAT_NC_PAIRS_FLAG_APPLY_MASK = FALSE #GRID_STAT_CENSOR_THRESH = #GRID_STAT_CENSOR_VAL = +#GRID_STAT_CAT_THRESH = diff --git a/parm/use_cases/met_tool_wrapper/TCDiag/TCDiag.conf b/parm/use_cases/met_tool_wrapper/TCDiag/TCDiag.conf index b489eec5ba..385148ee0b 100644 --- a/parm/use_cases/met_tool_wrapper/TCDiag/TCDiag.conf +++ b/parm/use_cases/met_tool_wrapper/TCDiag/TCDiag.conf @@ -127,6 +127,7 @@ TC_DIAG_DOMAIN_INFO2_DELTA_RANGE_KM = 2.0 #TC_DIAG_RADIAL_VELOCITY_FIELD_NAME = #TC_DIAG_RADIAL_VELOCITY_LONG_FIELD_NAME = #TC_DIAG_VORTEX_REMOVAL = +#TC_DIAG_ONE_TIME_PER_FILE_FLAG = #TC_DIAG_NC_RNG_AZI_FLAG = #TC_DIAG_NC_DIAG_FLAG = #TC_DIAG_CIRA_DIAG_FLAG =