diff --git a/.github/jobs/build_docker_image.sh b/.github/jobs/build_docker_image.sh index f1f023e303..81ce302b44 100755 --- a/.github/jobs/build_docker_image.sh +++ b/.github/jobs/build_docker_image.sh @@ -17,3 +17,9 @@ if [ $? != 0 ]; then cat ${GITHUB_WORKSPACE}/docker_build.log exit 1 fi + +# Copy the log directory from the image +id=$(docker create ${DOCKERHUB_TAG}) +time_command docker cp $id:/met/logs met_logs +mv met_logs/*.log ${GITHUB_WORKSPACE}/. +docker rm -v $id diff --git a/.github/jobs/free_disk_space.sh b/.github/jobs/free_disk_space.sh new file mode 100755 index 0000000000..cfe30cf06d --- /dev/null +++ b/.github/jobs/free_disk_space.sh @@ -0,0 +1,15 @@ +#! /bin/bash + +echo Checking disk usage before cleanup +df -h + +printf "\nRemoving files as suggested by https://github.com/actions/virtual-environments/issues/2840" + +sudo rm -rf /usr/share/dotnet +sudo rm -rf /opt/ghc +sudo rm -rf "/usr/local/share/boost" +sudo rm -rf "$AGENT_TOOLSDIRECTORY" + +printf "\nChecking disk usage after cleanup" + +df -h diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 7eca635eb6..685638ecb3 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -30,6 +30,6 @@ See the [METplus Workflow](https://metplus.readthedocs.io/en/latest/Contributors Select: **Reviewer(s)** Select: **Organization** level software support **Project** or **Repository** level development cycle **Project** Select: **Milestone** as the version that will include these changes -- [ ] After submitting the PR, select **Development** issue with the original issue number. +- [ ] After submitting the PR, select the :gear: icon in the **Development** section of the right hand sidebar. Search for the issue that this PR will close and select it, if it is not already selected. - [ ] After the PR is approved, merge your changes. If permissions do not allow this, request that the reviewer do the merge. - [ ] Close the linked issue and delete your feature or bugfix branch from GitHub. diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 3550a30a5c..7a9a1f28dc 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -1,7 +1,7 @@ name: Testing # Compile MET for feature branches -# Run unit tests for pull requests +# Run unit tests for pull requests on: @@ -88,9 +88,9 @@ jobs: MET_BASE_REPO: ${{ needs.job_control.outputs.met_base_repo }} MET_BASE_TAG: ${{ needs.job_control.outputs.met_base_tag }} - - name: Copy Docker build log into logs directory + - name: Copy all build log files into logs directory if: always() - run: cp ${GITHUB_WORKSPACE}/docker_build.log ${RUNNER_WORKSPACE}/logs/ + run: cp ${GITHUB_WORKSPACE}/*.log ${RUNNER_WORKSPACE}/logs/ - name: Push Docker Image run: .github/jobs/push_docker_image.sh @@ -138,6 +138,9 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Free disk space + run: .github/jobs/free_disk_space.sh + - name: Run Unit Tests in Docker run: .github/jobs/run_unit_docker.sh env: @@ -173,6 +176,9 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Free disk space + run: .github/jobs/free_disk_space.sh + - name: Run Unit Tests in Docker run: .github/jobs/run_unit_docker.sh env: @@ -209,6 +215,9 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Free disk space + run: .github/jobs/free_disk_space.sh + - name: Run Unit Tests in Docker run: .github/jobs/run_unit_docker.sh env: @@ -243,6 +252,9 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Free disk space + run: .github/jobs/free_disk_space.sh + - name: Download ref_config_leads output from artifact uses: actions/download-artifact@v3 with: @@ -286,6 +298,9 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Free disk space + run: .github/jobs/free_disk_space.sh + - name: Download 1a output from artifact uses: actions/download-artifact@v3 with: @@ -329,6 +344,9 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Free disk space + run: .github/jobs/free_disk_space.sh + - name: Download 1a output from artifact uses: actions/download-artifact@v3 with: @@ -403,6 +421,9 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Free disk space + run: .github/jobs/free_disk_space.sh + - name: Download data from previous jobs uses: actions/download-artifact@v3 diff --git a/data/config/GridStatConfig_default b/data/config/GridStatConfig_default index ab414177c2..fb9d4db60b 100644 --- a/data/config/GridStatConfig_default +++ b/data/config/GridStatConfig_default @@ -207,6 +207,13 @@ distance_map = { //////////////////////////////////////////////////////////////////////////////// +// +// Threshold for SEEPS p1 (Probability of being dry) +// +seeps_p1_thresh = >=0.1&&<=0.85; + +//////////////////////////////////////////////////////////////////////////////// + // // Statistical output types // May be set separately in each "obs.field" entry @@ -255,11 +262,6 @@ nc_pairs_flag = { apply_mask = TRUE; } -//////////////////////////////////////////////////////////////////////////////// -// Threshold for SEEPS p1 (Probability of being dry) - -seeps_p1_thresh = NA; - //////////////////////////////////////////////////////////////////////////////// grid_weight_flag = NONE; diff --git a/data/config/PointStatConfig_default b/data/config/PointStatConfig_default index a10c04df91..4f7caad921 100644 --- a/data/config/PointStatConfig_default +++ b/data/config/PointStatConfig_default @@ -261,6 +261,13 @@ hira = { //////////////////////////////////////////////////////////////////////////////// +// +// Threshold for SEEPS p1 (Probability of being dry) +// +seeps_p1_thresh = >=0.1&&<=0.85; + +//////////////////////////////////////////////////////////////////////////////// + // // Statistical output types // May be set separately in each "obs.field" entry @@ -290,10 +297,6 @@ output_flag = { seeps_mpr = NONE; } -//////////////////////////////////////////////////////////////////////////////// -// Threshold for SEEPS p1 (Probability of being dry) - -seeps_p1_thresh = NA; //////////////////////////////////////////////////////////////////////////////// tmp_dir = "/tmp"; diff --git a/data/config/TCDiagConfig_default b/data/config/TCDiagConfig_default index 2f4adaa86d..1660d8a09c 100644 --- a/data/config/TCDiagConfig_default +++ b/data/config/TCDiagConfig_default @@ -79,7 +79,7 @@ domain_info = [ // // Data censoring and conversion -// May be set separately in each diag_data "field" entry +// May be set separately in each data "field" array entry // // censor_thresh = []; // censor_val = []; diff --git a/data/table_files/ndbc_stations.xml b/data/table_files/ndbc_stations.xml index 114957cd5a..ec1d252dc2 100644 --- a/data/table_files/ndbc_stations.xml +++ b/data/table_files/ndbc_stations.xml @@ -53,14 +53,14 @@ - + - + - + @@ -150,9 +150,9 @@ - + - + @@ -165,7 +165,7 @@ - + @@ -196,14 +196,14 @@ - + - + - + @@ -217,6 +217,7 @@ + @@ -236,6 +237,7 @@ + @@ -243,7 +245,7 @@ - + @@ -259,7 +261,7 @@ - + @@ -277,8 +279,8 @@ - - + + @@ -286,7 +288,7 @@ - + @@ -305,10 +307,10 @@ - + - - + + @@ -330,9 +332,9 @@ - + - + @@ -354,12 +356,12 @@ - + - + @@ -401,7 +403,7 @@ - + @@ -443,7 +445,7 @@ - + @@ -462,7 +464,7 @@ - + @@ -470,9 +472,9 @@ - + - + @@ -501,9 +503,9 @@ - - - + + + @@ -532,7 +534,8 @@ - + + @@ -542,6 +545,8 @@ + + @@ -555,7 +560,7 @@ - + @@ -593,27 +598,27 @@ - - + + - + - + - + - + @@ -705,7 +710,7 @@ - + @@ -732,26 +737,28 @@ - + + + - + - + - + - + @@ -768,6 +775,8 @@ + + @@ -850,7 +859,7 @@ - + @@ -860,7 +869,7 @@ - + @@ -875,7 +884,7 @@ - + @@ -994,7 +1003,7 @@ - + @@ -1018,7 +1027,7 @@ - + @@ -1116,7 +1125,7 @@ - + @@ -1172,7 +1181,7 @@ - + @@ -1353,7 +1362,7 @@ - + @@ -1361,7 +1370,7 @@ - + @@ -1400,8 +1409,8 @@ - - + + @@ -1427,11 +1436,11 @@ - + - + @@ -1490,7 +1499,7 @@ - + @@ -1513,11 +1522,12 @@ - + + @@ -1537,7 +1547,7 @@ - + @@ -1561,7 +1571,7 @@ - + @@ -1627,14 +1637,14 @@ - + - + @@ -1659,12 +1669,12 @@ - - + + - + @@ -1702,7 +1712,7 @@ - + @@ -1768,7 +1778,7 @@ - + @@ -1819,7 +1829,7 @@ - + @@ -1834,6 +1844,7 @@ + @@ -1873,7 +1884,7 @@ - + @@ -2301,6 +2312,7 @@ + @@ -2569,6 +2581,7 @@ + diff --git a/docs/Flowchart/MET_flowchart.pptx b/docs/Flowchart/MET_flowchart.pptx index cc386d57d2..cc62a9a960 100644 Binary files a/docs/Flowchart/MET_flowchart.pptx and b/docs/Flowchart/MET_flowchart.pptx differ diff --git a/docs/Flowchart/MET_flowchart_v11.1.0.png b/docs/Flowchart/MET_flowchart_v11.1.0.png new file mode 100644 index 0000000000..b7b11f32c2 Binary files /dev/null and b/docs/Flowchart/MET_flowchart_v11.1.0.png differ diff --git a/docs/Users_Guide/appendixB.rst b/docs/Users_Guide/appendixB.rst index ea3120c10e..a4d155a04f 100644 --- a/docs/Users_Guide/appendixB.rst +++ b/docs/Users_Guide/appendixB.rst @@ -11,6 +11,8 @@ The following map projections are currently supported in MET: * Lambert Conformal Projection +* Lambert Azimuthal Equal Area Projection + * Polar Stereographic Projection (Northern) * Polar Stereographic Projection (Southern) @@ -46,6 +48,8 @@ As an example of specifying a Lambert grid, suppose you have a northern hemisphe To grid = "lambert 614 428 12.190 -133.459 -95.0 12.19058 6367.47 25.0 N"; +For a Lambert Azimuthal Equal Area grid, grid specification strings are not supported. + For a Polar Stereographic grid, the syntax is .. code-block:: none diff --git a/docs/Users_Guide/config_options.rst b/docs/Users_Guide/config_options.rst index aace75f995..48be5c556a 100644 --- a/docs/Users_Guide/config_options.rst +++ b/docs/Users_Guide/config_options.rst @@ -287,7 +287,7 @@ To run this utility: .. code-block:: none - build_ndbc_stations_from_web.py <-d> <-p> <-o OUTPUT_FILE> + build_ndbc_stations_from_web.py <-d> <-p> <-o OUTPUT_FILE> <-e EXISTING_FILE> Usage: build_ndbc_stations_from_web.py [options] Options: @@ -296,6 +296,8 @@ To run this utility: -p, --prune Prune files that are no longer online (optional, default: False) -o OUT_FILE, --out=OUT_FILE Save the text into the named file (optional, default: merged.txt) + -e EXISTING_FILE, --existing=EXISTING_FILE + Save the text into the named file (optional, default: ../../../data/table_files/ndbc_stations.xml) NOTE: The downloaded files are written to a subdirectory ndbc_temp_data which can be deleted once the final output file is created. @@ -1469,7 +1471,7 @@ all pairs into a single climatological bin. direct_prob = FALSE; or TRUE } -climato_data +climate_data ^^^^^^^^^^^^ When specifying climatology data for probability forecasts, either supply a @@ -1497,13 +1499,15 @@ In this way, the number of bins impacts the resolution of the climatological probabilities. These derived probability values are used to compute the climatological Brier Score and Brier Skill Score. +seeps_p1_thresh +^^^^^^^^^^^^^^^ The "seeps_p1_thresh" option controls the threshold of p1 (probability of being dry) values. +The default setting is >=0.1&&<=0.85. .. code-block:: none - - seeps_p1_thresh = >=0.1&&<=0.85; + seeps_p1_thresh = >=0.1&&<=0.85; mask_missing_flag ^^^^^^^^^^^^^^^^^ diff --git a/docs/Users_Guide/data_io.rst b/docs/Users_Guide/data_io.rst index 395b66a96d..7003a123a0 100644 --- a/docs/Users_Guide/data_io.rst +++ b/docs/Users_Guide/data_io.rst @@ -307,7 +307,7 @@ The following is a summary of the input and output formats for each of the tools * **Output**: One ASCII file containing 2D object attributes, four ASCII files containing 3D object attributes, and one NetCDF file containing object indices for the gridded simple and cluster object fields. -#. **TC-Dland Tool** +#. **TC-DLand Tool** * **Input**: One or more files containing the longitude (Degrees East) and latitude (Degrees North) of all the coastlines and islands considered to be a significant landmass. diff --git a/docs/Users_Guide/figure/overview-figure.png b/docs/Users_Guide/figure/overview-figure.png index 201e9b7a53..b7b11f32c2 100644 Binary files a/docs/Users_Guide/figure/overview-figure.png and b/docs/Users_Guide/figure/overview-figure.png differ diff --git a/docs/Users_Guide/installation.rst b/docs/Users_Guide/installation.rst index a198fb8fab..cdfeb91e1c 100644 --- a/docs/Users_Guide/installation.rst +++ b/docs/Users_Guide/installation.rst @@ -55,7 +55,7 @@ Three external libraries are required for compiling/building MET and should be d Two additional utilities are strongly recommended for use with MET: -1. The Unified Post-Processor is recommended for post-processing the raw WRF model output prior to verifying the model forecasts with MET. The Unified Post-Processor is freely available for `download `_. MET can read data on a standard, de-staggered grid and on pressure or regular levels in the vertical. The Unified Post-Processor outputs model data in this format from both WRF cores, the NMM and the ARW. However, the Unified Post-Processor is not strictly required as long as the user can produce gridded model output on a standard de-staggered grid on pressure or regular levels in the vertical. Two-dimensional fields (e.g., precipitation amount) are also accepted for some modules. +1. The Unified Post-Processor is recommended for post-processing the raw WRF model output prior to verifying the model forecasts with MET. The Unified Post-Processor is freely available for `download `_. MET can read data on a standard, de-staggered grid and on pressure or regular levels in the vertical. The Unified Post-Processor outputs model data in this format from both WRF cores, the NMM and the ARW. However, the Unified Post-Processor is not strictly required as long as the user can produce gridded model output on a standard de-staggered grid on pressure or regular levels in the vertical. Two-dimensional fields (e.g., precipitation amount) are also accepted for some modules. 2. The copygb utility is recommended for re-gridding model and observation datasets in GRIB version 1 format to a common verification grid. The copygb utility is distributed as part of the Unified Post-Processor and is available from other sources as well. While earlier versions of MET required that all gridded data be placed on a common grid, MET version 5.1 added support for automated re-gridding on the fly. After version 5.1, users have the option of running copygb to regrid their GRIB1 data ahead of time or leveraging the automated regridding capability within MET. @@ -113,7 +113,7 @@ Installation of Optional Utilities As described in the introduction to this section, two additional utilities are strongly recommended for use with MET. -1. The `Unified Post-Processor `_ is recommended for post-processing the raw WRF model output prior to verifying the data with MET. The Unified Post-Processor may be used on WRF output from both the ARW and NMM cores. +1. The `Unified Post-Processor `_ is recommended for post-processing the raw WRF model output prior to verifying the data with MET. The Unified Post-Processor may be used on WRF output from both the ARW and NMM cores. 2. The copygb utility is recommended for re-gridding model and observation datasets in GRIB format to a common verification grid. The copygb utility is distributed as part of the Unified Post-Processor and is available from other sources as well. Please refer to the "Unified Post-processor" utility mentioned above for information on availability and installation. diff --git a/docs/Users_Guide/met-tc_overview.rst b/docs/Users_Guide/met-tc_overview.rst index 41ad7e5fc0..d7930b6a75 100644 --- a/docs/Users_Guide/met-tc_overview.rst +++ b/docs/Users_Guide/met-tc_overview.rst @@ -9,14 +9,14 @@ Introduction The purpose of this User's Guide is to provide basic information to the users of the Model Evaluation Tools - Tropical Cyclone (MET-TC) to enable users to apply MET-TC to their tropical cyclone datasets and evaluation studies. MET-TC is intended for use with model forecasts run through a vortex tracking software or with operational model forecasts in Automated Tropical Cyclone Forecast (ATCF) file format. -The following sections provide an overview of MET-TC and its components, as well as basic information on the software build. The required input, including file format and the MET-TC are discussed followed by a description of the TC-Dland tool, TC-Pairs, and TC-Stat tools. Each section covers the input, output and practical usage including a description of the configuration files. This is followed by a short overview of graphical utilities available within the MET-TC release. +The following sections provide an overview of MET-TC and its components, as well as basic information on the software build. The required input, including file format and the MET-TC are discussed followed by a description of the TC-DLand, TC-Diag, TC-Pairs, TC-Stat, TC-RMW, and RMW-Analysis tools. Each section covers the input, output and practical usage including a description of the configuration files. This is followed by a short overview of graphical utilities available within the MET-TC release. MET-TC components ================= The MET tools used in the verification of Tropical Cyclones are referred to as MET-TC. These tools are shown across the bottom of the flowchart in :numref:`overview-figure`. The MET-TC tools are described in more detail in later sections. -The TC-Dland tool is used to generate a gridded file that determines the location of coastlines and islands, and is used as input to the TC-Pairs tool to determine the distance from land of a particular track point. The TC-Pairs tool matches pairs of input model data and BEST track (or any reference forecast) and calculates position errors. The TC-Stat tool uses the TC-Pairs output to perform filter and summary jobs over the matched pair dataset. The TC-Gen tool performs a categorical analysis for tropical cyclone genesis forecasts. The TC-RMW tool performs a coordinate transformation of gridded model data, centered on the storm's location. The RMW-Analysis tool aggregates TC-RMW output across multiple cases. +Tropical cyclone forecasts and observations are quite different than numerical model forecasts, and thus they have their own set of tools. These consist of TC-DLand, TC-Diag, TC-Pairs, TC-Stat, TC-Gen, TC-RMW, and RMW-Analysis. The TC-DLand module calculates the distance to land from all locations on a specified grid. This information can be used in later modules to eliminate tropical cyclones that are over land from being included in the statistics. TC-Diag converts gridded model output into cylindrical coordinates for each storm location, calls Python scripts to compute storm-relative diagnostics, and writes ASCII output to be read by TC-Pairs. TC-Pairs matches up tropical cyclone forecasts and observations and writes all output to a file. In TC-Stat, these forecast / observation pairs are analyzed according to user preference to produce statistics. TC-Gen evaluates the performance of Tropical Cyclone genesis forecast using contingency table counts and statistics. TC-RMW performs a coordinate transformation for gridded model or analysis fields centered on the current storm location. RMW-Analysis filters and aggregates the output of TC-RMW across multiple cases. Input data format ================= @@ -112,4 +112,4 @@ If a user has gridded model output, the model data must be run through a vortex Output data format ================== -The MET package produces output in four basic file formats: STAT files, ASCII files, NetCDF files, and Postscript plots. The MET-TC tool produces output in TCSTAT, which stands for Tropical Cyclone - STAT. This output format consists of tabular ASCII data that can be easily read by many analysis tools and software packages, making the output from MET-TC very versatile. Like STAT, TCSTAT is a specialized ASCII format containing one record on each line. Currently, the only line type available in MET-TC is TCMPR (Tropical Cyclone Matched Pairs). As more line types are included in future releases, all line types will be included in a single TCSTAT file. MET-TC also outputs a NetCDF format file in the TC-Dland tool, as input to the TC-Pairs tool. +The MET package produces output in four basic file formats: STAT files, ASCII files, NetCDF files, and PostScript plots. The MET-TC tool produces output in TCSTAT, which stands for Tropical Cyclone - STAT. This output format consists of tabular ASCII data that can be easily read by many analysis tools and software packages, making the output from MET-TC very versatile. Like STAT, TCSTAT is a specialized ASCII format containing one record on each line. Currently, the only line type available in MET-TC is TCMPR (Tropical Cyclone Matched Pairs). As more line types are included in future releases, all line types will be included in a single TCSTAT file. The TC-DLand, TC-Diag, TC-RMW, and RMW-Analysis tools also write NetCDF files containing a variety of output data types. diff --git a/docs/Users_Guide/overview.rst b/docs/Users_Guide/overview.rst index 9e7d26d882..dff4c81fc1 100644 --- a/docs/Users_Guide/overview.rst +++ b/docs/Users_Guide/overview.rst @@ -9,7 +9,7 @@ Purpose and organization of the User's Guide The goal of this User's Guide is to provide basic information for users of the Model Evaluation Tools (MET) to enable them to apply MET to their datasets and evaluation studies. MET was originally designed for application to the post-processed output of the `Weather Research and Forecasting (WRF) `_ model. However, MET may also be used for the evaluation of forecasts from other models or applications, including the `Unified Forecast System (UFS) `_, and the `System for Integrated Modeling of the Atmosphere (SIMA) `_ if certain file format definitions (described in this document) are followed. -The MET User's Guide is organized as follows. :numref:`overview` provides an overview of MET and its components. :numref:`installation` contains basic information about how to get started with MET - including system requirements, required software (and how to obtain it), how to download MET, and information about compilers, libraries, and how to build the code. :numref:`data_io` - :numref:`masking` focuses on the data needed to run MET, including formats for forecasts, observations, and output. These sections also document the reformatting and masking tools available in MET. :numref:`point-stat` - :numref:`gsi_tools` focuses on the main statistics modules contained in MET, including the Point-Stat, Grid-Stat, Ensemble-Stat, Wavelet-Stat and GSI Diagnostic Tools. These sections include an introduction to the statistical verification methodologies utilized by the tools, followed by a section containing practical information, such as how to set up configuration files and the format of the output. :numref:`stat-analysis` and :numref:`series-analysis` focus on the analysis modules, Stat-Analysis and Series-Analysis, which aggregate the output statistics from the other tools across multiple cases. :numref:`mode` - :numref:`mode-td` describes a suite of object-based tools, including MODE, MODE-Analysis, and MODE-TD. :numref:`met-tc_overview` - :numref:`rmw-analysis` describes tools focused on tropical cyclones, including MET-TC Overview, TC-Dland, TC-Pairs, TC-Stat, TC-Gen, TC-RMW and RMW-Analysis. Finally, :numref:`plotting` includes plotting tools included in the MET release for checking and visualizing data, as well as some additional tools and information for plotting MET results. The appendices provide further useful information, including answers to some typical questions (:numref:`Appendix A, Section %s `) and links and information about map projections, grids, and polylines (:numref:`Appendix B, Section %s `). :numref:`Appendix C, Section %s ` and :numref:`Appendix D, Section %s ` provide more information about the verification measures and confidence intervals that are provided by MET. Sample code that can be used to perform analyses on the output of MET and create particular types of plots of verification results is posted on the `MET website `_). Note that the MET development group also accepts contributed analysis and plotting scripts which may be posted on the MET website for use by the community. It should be noted there are References (:numref:`refs`) in this User's Guide as well. +The MET User's Guide is organized as follows. :numref:`overview` provides an overview of MET and its components. :numref:`installation` contains basic information about how to get started with MET - including system requirements, required software (and how to obtain it), how to download MET, and information about compilers, libraries, and how to build the code. :numref:`data_io` - :numref:`masking` focuses on the data needed to run MET, including formats for forecasts, observations, and output. These sections also document the reformatting and masking tools available in MET. :numref:`point-stat` - :numref:`gsi_tools` focuses on the main statistics modules contained in MET, including the Point-Stat, Grid-Stat, Ensemble-Stat, Wavelet-Stat and GSI Diagnostic Tools. These sections include an introduction to the statistical verification methodologies utilized by the tools, followed by a section containing practical information, such as how to set up configuration files and the format of the output. :numref:`stat-analysis` and :numref:`series-analysis` focus on the analysis modules, Stat-Analysis and Series-Analysis, which aggregate the output statistics from the other tools across multiple cases. :numref:`mode` - :numref:`mode-td` describes a suite of object-based tools, including MODE, MODE-Analysis, and MODE-TD. :numref:`met-tc_overview` - :numref:`rmw-analysis` describes tools focused on tropical cyclones, including MET-TC Overview, TC-DLand, TC-Diag, TC-Pairs, TC-Stat, TC-Gen, TC-RMW and RMW-Analysis. Finally, :numref:`plotting` includes plotting tools included in the MET release for checking and visualizing data, as well as some additional tools and information for plotting MET results. The appendices provide further useful information, including answers to some typical questions (:numref:`Appendix A, Section %s `) and links and information about map projections, grids, and polylines (:numref:`Appendix B, Section %s `). :numref:`Appendix C, Section %s ` and :numref:`Appendix D, Section %s ` provide more information about the verification measures and confidence intervals that are provided by MET. Sample code that can be used to perform analyses on the output of MET and create particular types of plots of verification results is posted on the `MET website `_). Note that the MET development group also accepts contributed analysis and plotting scripts which may be posted on the MET website for use by the community. It should be noted there are References (:numref:`refs`) in this User's Guide as well. The remainder of this section includes information about the context for MET development, as well as information on the design principles used in developing MET. In addition, this section includes an overview of the MET package and its specific modules. @@ -66,7 +66,7 @@ Results from the statistical analysis stage are output in ASCII, NetCDF and Post The Stat-Analysis and MODE-Analysis tools aggregate the output statistics from the previous steps across multiple cases. The Stat-Analysis tool reads the STAT output of Point-Stat, Grid-Stat, Ensemble-Stat, and Wavelet-Stat and can be used to filter the STAT data and produce aggregated continuous and categorical statistics. Stat-Analysis also reads matched pair data (i.e. MPR line type) via python embedding. The MODE-Analysis tool reads the ASCII output of the MODE tool and can be used to produce summary information about object location, size, and intensity (as well as other object characteristics) across one or more cases. -Tropical cyclone forecasts and observations are quite different than numerical model forecasts, and thus they have their own set of tools. These consist of TC-Dland, TC-Pairs, TC-Stat, TC-Gen, TC-RMW, and RMW-Analysis. The TC-Dland module calculates the distance to land from all locations on a specified grid. This information can be used in later modules to eliminate tropical cyclones that are over land from being included in the statistics. TC-Pairs matches up tropical cyclone forecasts and observations and writes all output to a file. In TC-Stat, these forecast / observation pairs are analyzed according to user preference to produce statistics. TC-Gen evaluates the performance of Tropical Cyclone genesis forecast using contingency table counts and statistics. TC-RMW performs a coordinate transformation for gridded model or analysis fields centered on the current storm location. RMW-Analysis filters and aggregates the output of TC-RMW across multiple cases. +Tropical cyclone forecasts and observations are quite different than numerical model forecasts, and thus they have their own set of tools. These consist of TC-DLand, TC-Diag, TC-Pairs, TC-Stat, TC-Gen, TC-RMW, and RMW-Analysis. The TC-DLand module calculates the distance to land from all locations on a specified grid. This information can be used in later modules to eliminate tropical cyclones that are over land from being included in the statistics. TC-Diag converts gridded model output into cylindrical coordinates for each storm location, calls Python scripts to compute storm-relative diagnostics, and writes ASCII output to be read by TC-Pairs. TC-Pairs matches up tropical cyclone forecasts and observations and writes all output to a file. In TC-Stat, these forecast / observation pairs are analyzed according to user preference to produce statistics. TC-Gen evaluates the performance of Tropical Cyclone genesis forecast using contingency table counts and statistics. TC-RMW performs a coordinate transformation for gridded model or analysis fields centered on the current storm location. RMW-Analysis filters and aggregates the output of TC-RMW across multiple cases. The following sections of this MET User's Guide contain usage statements for each tool, which may be viewed if you type the name of the tool. Alternatively, the user can also type the name of the tool followed by **-help** to obtain the usage statement. Each tool also has a **-version** command line option associated with it so that the user can determine what version of the tool they are using. diff --git a/docs/Users_Guide/release-notes.rst b/docs/Users_Guide/release-notes.rst index a14dabee73..30a115abc1 100644 --- a/docs/Users_Guide/release-notes.rst +++ b/docs/Users_Guide/release-notes.rst @@ -9,98 +9,30 @@ When applicable, release notes are followed by the GitHub issue number which des enhancement, or new feature (`MET GitHub issues `_). Important issues are listed **in bold** for emphasis. -MET Version 11.1.0-rc1 release notes (20230616) ------------------------------------------------ +MET Version 11.1.0 release notes (20230731) +------------------------------------------- .. dropdown:: Repository, build, and test + * Add modulefiles for supported systems to the repository (`#2415 `_). + * Add LICENSE.md to the repository (`#2461 `_). + * Update the copyright year to 2023 and increase the version number to 11.1.0 (`#2469 `_). * Enhance compile_MET_all.sh to allow the user to specify the compiler and Python versions to load (`#2485 `_). * Enhance compile_MET_all.sh to include the library/app name in the log filename (`#2540 `_). + * Add free_disk_space.sh script to the MET repository (`#2597 `_). - .. dropdown:: Documentation - - * Update the documentation for the HSS and HSS_EC statistics (`#2492 `_). - * Update the documentation for the ens, NEP, and NMEP configuration options (`#2513 `_). - - .. dropdown:: Enhancements - - .. dropdown:: Common Libraries - - * Add support for the Lambert Azimuthal Equal Area grids (`#1693 `_). - * Update the default ASCII2NC message_type_map configuration option for Little R input data (`#2487 `_). - * Merge older and newer MRMS GRIB2 table files (`#2508 `_). - * SonarQube: Further reduce findings for MET-11.1.0-rc1 (`#2521 `_). - - .. dropdown:: Application Code - - * **Enhance Gen-Vx-Mask shapefile masking to support multiple shapes and specify shape metadata** (`#1060 `_). - * **Enhance Multivariate MODE to generate object statistics for each input field requested by the user** (`#1283 `_). - * Enhance MODE to bound check interest_function corner points in the range 0 to 1 (`#2545 `_). - - .. dropdown:: Tropical Cyclone Tools - - * **Create an initial development version of a new TC-Diag tool to support the computation of tropical cyclone diagnostics** (`#2168 `_). - * **Enhance TC-Stat to write the RIRW job CTC/CTS output to a .stat output file** (`#2425 `_). - * **Enhance TC-Pairs to derive the full circle wind radius from the wind radius quadrants** (`#2532 `_). - * Enhance TC-RMW to reorder the dimensions of the NetCDF output to store the gridded dimensions last (`#2523 `_). - * Enhance TC-Gen to parse GTWO shapefile lead times from the data rather than assuming them to be 2, 5, and 7 days (`#2552 `_). - - .. dropdown:: Bugfixes - - * Bugfix: Fix the Clang compilation of MET version 11 (`#2514 `_). - * Bugfix: Fix the fill value setting used in the write_tmp_dataplane internal Python embedding script (`#2525 `_). - * Bugfix: Fix the TC-Stat RIRW runtime error when computing CTS statistics from an empty contingency table (`#2542 `_). - * Bugfix: Fix logic for Python embedding with data censoring and/or conversion (`#2575 `_). - -MET Version 11.1.0-beta2 release notes (20230505) -------------------------------------------------- - -**Note** that the 11.1.0-beta2 release was originally created on 20230423 but was recreated on 20230428 and 20230505 to include critical bugfixes. - - .. dropdown:: Documentation + .. dropdown:: Documentation + * Enhance the Release Notes by adding dropdown menus (`#2146 `_). * Improve documentation on Python Embedding for point observations (`#2303 `_). * Create dropdown menus for Appendix A (`#2460 `_). * Clarify MET Compile Time Python requirements (`#2490 `_). - - .. dropdown:: Enhancements - - * Enhance the MET point processing tools to read the Python 'point_data' variable instead of just 'met_point_data' (`#2285 `_). - * SonarQube: Further reduce bugs for MET-11.1.0-beta2 (`#2474 `_). - * SonarQube: Replace all instances of NULL with nullptr (`#2504 `_). - * SonarQube: Remove code that will never be executed (`#2506 `_). + * Update the documentation for the HSS and HSS_EC statistics (`#2492 `_). + * Update the documentation for the ens, NEP, and NMEP configuration options (`#2513 `_). + * Revise TC-Diag documentation for version 11.1.0 (`#2558 `_). .. dropdown:: Bugfixes - * Bugfix: Correct the branch name for the SonarQube scanning nightly (`#2401 `_). - * Bugfix: Fix support for the YYYYMMDD format in NetCDF level timestrings (`#2482 `_). - * Bugfix: AERONET the lat/lon is not changed with different station ID (`#2493 `_). - * Bugfix: dtype in Python embedding example script and appendixF correction (`#2518 `_). - * Bugfix: write_tmp_dataplane uses fill_value unrecognized by MET (`#2525 `_). - * **Bugfix: Resolve compilation problems due to need for \-std=c++11** (`#2531 `_). - -MET Version 11.1.0-beta1 release notes (20230228) -------------------------------------------------- - - .. dropdown:: Repository, build, and test - - * Add modulefiles for supported systems to the repository (`#2415 `_). - * Add LICENSE.md to the repository (`#2461 `_). - * Update the copyright year to 2023 and increase the version number to 11.1.0 (`#2469 `_). - - .. dropdown:: Documentation - - * Enhance the Release Notes by adding dropdown menus (`#2146 `_). - - .. dropdown:: Enhancements - - * Convert the python list to the numpy array for the python embedding at the base class (`#2386 `_). - * Refine Python runtime environment (`#2388 `_). - * Upgrade to using Python 3.10.4 (`#2421 `_). - * **Enhance TC-Pairs to disable the output of consensus track members** (`#2429 `_). - - .. dropdown:: Bugfixes - * Bugfix: Fix the MET CF-Compliant NetCDF library code to Polar Stereographic data from NSIDC Sea Ice Edge NetCDF files (`#2218 `_). * Bugfix: Remove override keyword to avoid C++11 dependency (`#2380 `_). * Bugfix: Fix ASCII2NC to not compute AOD 550 if other inputs are negative values (`#2383 `_). @@ -108,6 +40,7 @@ MET Version 11.1.0-beta1 release notes (20230228) * Bugfix: Update the MET flowchart for version 11.0.0 (`#2389 `_). * Bugfix: Fix issues with the met_compile_all.sh script and associated tar files (`#2390 `_). * Bugfix: Correct definitions of NCEP grid numbers 172 and 220 (`#2399 `_). + * Bugfix: Correct the branch name for the SonarQube scanning nightly (`#2401 `_). * Bugfix: Address MET-11.0.0 SonarQube Blocker Bugs (`#2402 `_). * Bugfix: Refine fix for handling empty configuration files (`#2408 `_). * Bugfix: Fix time interpolation of monthly climatology data between December 15 and January 15 (`#2412 `_). @@ -116,6 +49,56 @@ MET Version 11.1.0-beta1 release notes (20230228) * Bugfix: Refine the regrid dictionary's data conversion and censoring operations and fix climo time matching logic for a single monthly climo file (`#2437 `_). * Bugfix: Fix the creation of the MET User's Guide PDF (`#2449 `_). * Bugfix: Fix inconsistent ASCII2NC AIRNOW location lookup logic (`#2452 `_). + * Bugfix: Fix support for the YYYYMMDD format in NetCDF level timestrings (`#2482 `_). + * Bugfix: AERONET the lat/lon is not changed with different station ID (`#2493 `_). + * Bugfix: Fix the Clang compilation of MET version 11 (`#2514 `_). + * Bugfix: dtype in Python embedding example script and appendixF correction (`#2518 `_). + * Bugfix: Fix the fill value setting used in the write_tmp_dataplane internal Python embedding script (`#2525 `_). + * **Bugfix: Resolve compilation problems due to need for \-std=c++11** (`#2531 `_). + * Bugfix: Fix the TC-Stat RIRW runtime error when computing CTS statistics from an empty contingency table (`#2542 `_).\ + * Bugfix: Refine support for LAEA grids via NetCDF and GRIB2 files (`#2565 `_). + * Bugfix: Fix logic for Python embedding with data censoring and/or conversion (`#2575 `_). + * Bugfix: Fix reading of upside-down CF-compliant NetCDF Rotated Lat/Lon data (`#2578 `_). + * Bugfix: Unknown ld Flag on Macos causes MET compilation to fail (`#2596 `_). + * Bugfix: Problem compiling MET on MacOS using GCC 12.3.0 (`#2615 `_). + + .. dropdown:: Enhancements + + .. dropdown:: SonarQube + + * SonarQube: Further reduce bugs for MET-11.1.0-beta2 (`#2474 `_). + * SonarQube: Replace all instances of NULL with nullptr (`#2504 `_). + * SonarQube: Remove code that will never be executed (`#2506 `_). + * SonarQube: Further reduce findings for MET-11.1.0-rc1 (`#2521 `_). + + .. dropdown:: Python Embedding + + * Convert the python list to the numpy array for the python embedding at the base class (`#2386 `_). + * Refine Python runtime environment (`#2388 `_). + * **Upgrade to using Python 3.10.4** (`#2421 `_). + * **Enhance the MET point processing tools to read the Python 'point_data' variable instead of just 'met_point_data'** (`#2285 `_). + + .. dropdown:: Common Libraries + + * **Add support for the Lambert Azimuthal Equal Area grids** (`#1693 `_). + * Update the default ASCII2NC message_type_map configuration option for Little R input data (`#2487 `_). + * Merge older and newer MRMS GRIB2 table files (`#2508 `_). + + .. dropdown:: Application Code + + * **Enhance Gen-Vx-Mask shapefile masking to support multiple shapes and specify shape metadata** (`#1060 `_). + * **Enhance Multivariate MODE to generate object statistics for each input field requested by the user** (`#1283 `_). + * Update NDBC locations prior to the MET-11.1.0 release (`#2511 `_). + * Enhance MODE to bound check interest_function corner points in the range 0 to 1 (`#2545 `_). + + .. dropdown:: Tropical Cyclone Tools + + * **Create an initial development version of a new TC-Diag tool to support the computation of tropical cyclone diagnostics** (`#2168 `_). + * **Enhance TC-Stat to write the RIRW job CTC/CTS output to a .stat output file** (`#2425 `_). + * **Enhance TC-Pairs to disable the output of consensus track members** (`#2429 `_). + * Enhance TC-RMW to reorder the dimensions of the NetCDF output to store the gridded dimensions last (`#2523 `_). + * **Enhance TC-Pairs to derive the full circle wind radius from the wind radius quadrants** (`#2532 `_). + * Enhance TC-Gen to parse GTWO shapefile lead times from the data rather than assuming them to be 2, 5, and 7 days (`#2552 `_). MET Version 11.0.0 release notes (20221209) ------------------------------------------- @@ -256,6 +239,14 @@ MET Version 11.1.0 upgrade instructions * If running TC-Pairs to generate consensus tracks, update your TC-Pairs configuration file to include the new **write_members** option (`#2429 `_). +* If using Python embedding for point observations, and the following lines of code are in your Python script please remove them and refactor your Python script following the instructions in the `User's Guide for Python embedding for point observations `_: + + .. code-block:: Python + + from met_point_obs import convert_point_data + ... + met_point_data = convert_point_data(point_data) + MET Version 11.0.0 upgrade instructions --------------------------------------- diff --git a/docs/Users_Guide/tc-diag.rst b/docs/Users_Guide/tc-diag.rst index f9cef3d479..53c1ee1b0d 100644 --- a/docs/Users_Guide/tc-diag.rst +++ b/docs/Users_Guide/tc-diag.rst @@ -1,13 +1,40 @@ .. _tc-diag: ************ -TC-DIAG Tool +TC-Diag Tool ************ Introduction ============ -The TC-Diag tool compute Tropical Cyclone diagnostics. More details to be added. +.. note:: As of MET version 11.1.0, the TC-Diag tool is a beta release that lacks full functionality. The current version of the tool generates intermediate NetCDF output files of the input model’s data transformed onto an azimuth-range grid. When the full functionality of the tc_diag tool is released in MET v12.0.0, the tool will also output environmental diagnostics computed from callable Python scripts. For now, each time it is run, the warning message listed below is printed. + +.. code-block:: none + + WARNING: + WARNING: The TC-Diag tool is provided in BETA status for MET V11.1.0. + WARNING: Please see the release notes of future MET versions for updates. + WARNING: + +A diagnosis of the large-scale environment of tropical cyclones (TCs) is foundational for many prediction techniques, including statistical-dynamical forecast aids and techniques based on artificial intelligence. Such diagnostics can also be used by forecasters seeking to understand how a given model's forecast will pan out. Finally, TC diagnostics can be useful in verification to stratify the performance of models in different environmental regimes over a longer period of time, thereby providing useful insights on model biases or deficiencies for model developers and forecasters. + +Originally developed for the Statistical Hurricane Intensity Prediction Scheme (SHIPS), and later as a stand-alone package called 'Model Diagnostics', by the Cooperative Institute for Research in the Atmosphere (CIRA), MET now integrates these capabilities into the an extensible framework called the TC-Diag tool. This tool allows users to compute diagnostics for the large-scale environment of TCs using ATCF track and gridded model data inputs. The current version of the TC-Diag tool requires that the tracks and fields be self-consistent [i.e., the track should be the model's (or ensemble's) own predicted track(s)]. The reason is that the diagnostics are computed in a coordinate system centered on the model's moving model storm and the current version of the tool does not yet include vortex removal. If the track is not consistent with the underlying fields, the diagnostics output are unlikely to be useful because the model's simulated storm would contaminate the diagnostics calculations. + +.. note:: A future version of the tool will include the capability to remove the model's own vortex, which will allow the user to specify any arbitrary track (such as the operational center's official forecast). Until then, users are advised that the track selected must be consistent with the model's predicted track. + +TC-Diag is run once for each initialization time to produce diagnostics for each user-specified combination of TC tracks and model fields. The user provides track data (such as one or more ATCF a-deck track files), along with track filtering criteria as needed, to select one or more tracks to be processed. The user also provides gridded model data from which diagnostics should be computed. Gridded data can be provided for multiple concurrent storms, multiple models, and/or multiple domains (i.e. parent and nest) in a single run. + +TC-Diag first determines the list of valid times that appear in any one of the tracks. For each valid time, it processes all track points for that time. For each track point, it reads the gridded model fields requested in the configuration file and transforms the gridded data to a range-azimuth cylindrical coordinates grid. For each domain, it writes the range-azimuth data to a temporary NetCDF file. + +.. note:: The current version of the tool does not yet include the capabilities described in the next three paragraphs. These additional capabilities are planned to be added in the MET v12.0.0 release later in 2023. + +Once the input data have been processed into the temporary NetCDF files, TC-Diag then calls one or more Python diagnostics scripts, as specified in the configuration file, to compute tropical cyclone diagnostic values. The computed diagnostics values are retrieved from the Python script and stored in memory. + +After processing all valid times and all corresponding track points, the computed diagnostics are written to ASCII and/or NetCDF output files. If requested in the configuration file, the temporary range-azimuth cylindrical coordinates files are combined into a single NetCDF file and written to the output for each combination of model track and domain. + +The default Python diagnostics scripts included with the MET release provide the standard set of CIRA diagnostics. However, users can copy/modify the logic in those scripts as they see fit to refine and/or add to the diagnostics computed. + +.. _tc-diag_practical_info: Practical information ===================== @@ -20,10 +47,10 @@ The following sections describe the usage statement, required arguments, and opt .. code-block:: none Usage: tc_diag - -data file_1 ... file_n | data_file_list + -data domain tech_id_list [ file_1 ... file_n | data_file_list ] -deck file -config file - -out file + [-outdir path] [-log file] [-v level] @@ -32,17 +59,17 @@ tc_diag has required arguments and can accept several optional arguments. Required arguments for tc_diag ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -1. The **-data file_1 ... file_n | data_file_list** options specify the gridded data files or an ASCII file containing a list of files to be used. - -2. The **-deck source** argument is the ATCF format data source. +1. The **-data domain tech_id_list [ file_1 ... file_n | data_file_list ]** option specifies a domain name, a comma-separated list of ATCF tech ID's, and a list of gridded data files or an ASCII file containing a list of files to be used. Specify **-data** one for each gridded data source. -3. The **-config file** argument is the configuration file to be used. The contents of the configuration file are discussed below. +2. The **-deck source** option is the ATCF format track data source. -4. The **-out** argument is the NetCDF output file to be written. +3. The **-config file** option is the TCDiagConfig file to be used. The contents of the configuration file are discussed below. Optional arguments for tc_diag ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +4. The **-outdir path** option overrides the default output directory (current working directory) with the output directory path provided. + 5. The **-log file** option directs output and errors to the specified log file. All messages will be written to that file as well as standard out and error. Thus, users can save the messages without having to redirect the output on the command line. The default behavior is no logfile. 6. The **-v level** option indicates the desired level of verbosity. The contents of "level" will override the default setting of 2. Setting the verbosity to 0 will make the tool run with no log messages, while increasing the verbosity above 1 will increase the amount of logging. @@ -50,11 +77,10 @@ Optional arguments for tc_diag tc_diag configuration file -------------------------- -The default configuration file for the TC-Diag tool named **TCDiagConfig_default** can be found in the installed *share/met/config/* directory. It is encouraged for users to copy these default files before modifying their contents. The contents of the configuration file are described in the subsections below. - -The TC-Diag tool should be configured to filter the input track data (**-deck**) down to the subset of tracks that correspond to the gridded data files provided (**-data**). The filtered tracks should contain data for only one initialization time but may contain tracks for multiple models. +The default configuration file for the TC-Diag tool named **TCDiagConfig_default** can be found in the installed *share/met/config/* directory. Users are encouraged to copy these default files before modifying their contents. The contents of the configuration file are described in the subsections below. -_______________________ +Configuring input tracks and time +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: none @@ -70,123 +96,262 @@ _______________________ valid_hour = []; lead = []; - censor_thresh = []; - censor_val = []; - convert(x) = x; +The TC-Diag tool should be configured to filter the input track data (**-deck**) down to the subset of tracks that correspond to the gridded data files provided (**-data**). The filtered tracks should contain data for only *one initialization time* but may contain tracks for multiple models. - data = { - field = [ - { - name = "PRMSL"; - level = ["L0"]; - }, - { - name = "TMP"; - level = ["P1000", "P500"]; - }, - { - name = "UGRD"; - level = ["P1000", "P500"]; - }, - { - name = "VGRD"; - level = ["P1000", "P500"]; - } - ]; - } - regrid = { ... } +The configuration options listed above are used to filter the input track data down to those that should be processed in the current run. These options are common to multiple MET tools and are described in :numref:`config_options_tc`. -The configuration options listed above are common to many MET tools and are described in :numref:`config_options`. The name and level entries in the data dictionary define the data to be processed. The regrid dictionary defines if and how regridding will be performed. - -_______________________ +Configuring domain information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: none - n_range = 100; - -The **n_range** parameter is the number of equally spaced range intervals in the range-azimuth grid. + diag_script = [ "MET_BASE/python/tc_diag/compute_tc_diagnostics.py" ]; -_______________________ + domain_info = [ + { + domain = "parent"; + n_range = 150; + n_azimuth = 8; + delta_range_km = 10.0; + }, + { + domain = "nest"; + n_range = 150; + n_azimuth = 8; + delta_range_km = 2.0; + } + ]; -.. code-block:: none - - n_azimuth = 180; +The **domain_info** entry is an array of dictionaries. Each dictionary consists of five entries. The **domain** entry is a user-specified string that provides a name for the domain. Each **domain** name must also appear in a **-deck** command line option, and the reverse is also true. -The **n_azimuth** parameter is the number of equally spaced azimuth intervals in the range-azimuth grid. The azimuthal grid spacing is 360 / **n_azimuth** degrees. +The **n_range** entry is an integer specifying the number of equally spaced range intervals in the range-azimuth grid to be used for this data source. -_______________________ +The **n_azimuth** entry is an integer specifying the number of equally spaced azimuth intervals in the range-azimuth grid to be used for this data source. The azimuthal grid spacing is 360 / **n_azimuth** degrees. -.. code-block:: none +The **delta_range_km** entry is a floating point value specifying the spacing of the range rings in kilometers. - max_range_km = 100.0; +The **diag_script** entry is an array of strings. Each string specifies the path to a Python script to be executed to compute diagnostics from the transformed cylindrical coordinates data for this domain. While the **diag_script** entry can be specified separately for each **domain_info** array entry, specifying it once at a higher level of context, as seen above, allows the same setting to be applied to all array entries. When multiple Python diagnostics scripts are run, the union of the diagnostics computed are written to the output. -The **max_range_km** parameter specifies the maximum range of the range-azimuth grid, in kilometers. If this parameter is specified and not **rmw_scale**, the radial grid spacing will be **max_range_km / n_range**. +.. note:: As of MET version 11.1.0, no tropical cyclone diagnostics are actually computed or written to the output. -_______________________ +Configuring data censoring and conversion options +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: none - delta_range_km = 10.0; + censor_thresh = []; + censor_val = []; + convert(x) = x; -The **delta_range_km** parameter specifies the spacing of the range rings, in kilometers. +These data censoring and conversion options are common to multiple MET tools and are described in :numref:`config_options`. They can be specified separately in each **data.field** array entry, described below. If provided, those operations are performed after reading the gridded data but prior to converting to the cylindrical coordinate range-azimuth grid. -_______________________ +Configuring fields, levels, and domains +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: none - rmw_scale = 0.2; + data = { -The **rmw_scale** parameter overrides the **max_range_km** parameter. When this is set the radial grid spacing will be **rmw_scale** in units of the RMW, which varies along the storm track. + // If empty, the field is processed for all domains + domain = []; -_______________________ - -.. code-block:: none + // Pressure levels to be used, unless overridden below + level = [ "P1000", "P925", "P850", "P700", "P500", + "P400", "P300", "P250", "P200", "P150", + "P100" ]; - compute_tangential_and_radial_winds = TRUE; + field = [ + { name = "TMP"; }, + { name = "UGRD"; }, + { name = "VGRD"; }, + { name = "RH"; }, + { name = "HGT"; }, + { name = "PRMSL"; level = "Z0"; }, + { name = "PWAT"; level = "L0"; }, + { name = "TMP"; level = "Z0"; }, + { name = "TMP"; level = "Z2"; }, + { name = "RH"; level = "Z2"; }, + { name = "UGRD"; level = "Z10"; }, + { name = "VGRD"; level = "Z10"; } + ]; + } -The **compute_tangential_and_radial_winds** parameter is a flag controlling whether a conversion from U/V to Tangential/Radial winds is done or not. If set to TRUE, additional parameters are used, otherwise they are not. +The **data** entry is a dictionary that contains the **field** entry to define what gridded data should be processed. The **field** entry is an array of dictionaries. Each **field** dictionary consists of at least three entries. -_______________________ +The **name** and **level** entries are common to multiple MET tools and are described in :numref:`config_options`. -.. code-block:: none +The **domain** entry is an array of strings. Each string specifies a domain name. If the **domain_info** domain name appears in this **domain** list, then this field will be read from that **domain_info** data source. If **domain** is set to an empty list, then this field will be read from all domain data sources. - u_wind_field_name = "UGRD"; - v_wind_field_name = "VGRD"; - -The **u_wind_field_name** and **v_wind_field_name** parameters identify which input data to use in converting to tangential/radial winds. The parameters are used only if **compute_tangential_and_radial_winds** is set to TRUE. - -_______________________ +Configuring regridding options +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: none - tangential_velocity_field_name = "VT"; - tangential_velocity_long_field_name = "Tangential Velocity"; + regrid = { ... } + +These **regrid** dictionary is common to multiple MET tools and is described in :numref:`config_options`. These regridding options control the transformation to cylindrical coordinates. - -The **tangential_velocity_field_name** and **tangential_velocity_long_field_name** parameters define the field names to give the output tangential velocity grid in the netCDF output file. The parameters are used only if **compute_tangential_and_radial_winds** is set to TRUE. +.. note:: As of MET version 11.1.0, the nearest neighbor regridding method is used rather than this configuration file option. -_______________________ +Configuring vortex removal option +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: none - radial_velocity_field_name = "VT"; - radial_velocity_long_field_name = "Radial Velocity"; + vortex_removel = FALSE; - -The **radial_velocity_field_name** and **radial_velocity_long_field_name** parameters define the field names to give the output radial velocity grid in the netCDF output file. The parameters are used only if **compute_radial_and_radial_winds** is set to TRUE. +The **vortex_removal** flag entry is a boolean specifying whether or not vortex removal logic should be applied. +.. note:: As of MET version 11.1.0, vortex removal logic is not yet supported. -tc_diag output file -------------------- +Configuring data output options +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The NetCDF output file contains the following dimensions: +.. code-block:: none -1. *range* - the radial dimension of the range-azimuth grid + nc_rng_azi_flag = TRUE; + nc_diag_flag = FALSE; + cira_diag_flag = FALSE; -2. *azimuth* - the azimuthal dimension of the range-azimuth grid +These three flag entries are booleans specifying what output data types should be written. The **nc_rng_azi_flag** entry controls the writing of a NetCDF file containing the cylindrical coordinate range-azimuth data used to compute the diagnostics. The **nc_diag_file** entry controls the writing of the computed diagnostics to a NetCDF file. The **cira_diag_flage** entry controls the writing of the computed diagnostics to a formatted ASCII output file. At least one of these flags must be set to true. -3. *pressure* - if any pressure levels are specified in the data variable list, they will be sorted and combined into a 3D NetCDF variable, which pressure as the vertical dimension and range and azimuth as the horizontal dimensions +.. note:: As of MET version 11.1.0, **nc_rng_azi_flag** is the only supported output type. These configuration options will automatically be reset at runtime to the settings listed above. -4. *track_point* - the track points corresponding to the model output valid times +Configuring MET version, output prefix, and temp directory +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: none -For each data variable specified in the data variable list, a corresponding NetCDF variable will be created with the same name and units. + tmp_dir = "/tmp"; + output_prefix = ""; + version = "V11.1.0"; + +These options are common to multiple MET tools and are described in :numref:`config_options`. + +tc_diag output +-------------- + +The TC-Diag tool writes up to three output data types, as specified by flags in the configuration file. Each time TC-Diag is run it processes track data for a single initialization time. The actual number of output files varies depending on the number of model tracks provided. + +.. note:: As of MET version 11.1.0, **nc_rng_azi_flag** is the only supported output type. + +**CIRA Diagnostics Output** + +When the **cira_diag_flag** configuration entry is set to true, an ASCII CIRA diagnostics output file is written for each model track provided. + +Details will be provided when support for this output type is added. + +**NetCDF Diagnostics Output** + +When the **nc_diag_flag** configuration entry is set to true, a NetCDF output file containing the computed diagnostics is written for each model track provided. + +Details will be provided when support for this output type is added. + +**NetCDF Range-Azimuth Output** + +When the **nc_rng_azi_flag** configuration entry is set to true, a NetCDF output file containing the cylindrical coordinate range-azimuth data is written for each combination of model track provided and domain specified. For example, if three model tracks are provided and data for both *parent* and *nest* domains are provided, six of these NetCDF output files will be written. + +The NetCDF range-azimuth output is named using the following naming convention: + +**tc_diag_STORMID_TECH_YYYYMMDDHH_cyl_grid_DOMAIN.nc** where STORMID is the 2-letter basin name, 2-digit storm number, and 4-digit year, TECH is the acronym for the objective technique, YYYYMMDDHH is the track initialization time, and DOMAIN is the domain name. + +The NetCDF range-azimuth file contains the dimensions and variables shown in :numref:`table_TC-Diag_Dimensions_NetCDF_range_azimuth` and :numref:`table_TC-Diag_Variables_NetCDF_range_azimuth`. + +.. _table_TC-Diag_Dimensions_NetCDF_range_azimuth: + +.. list-table:: Dimensions defined in NetCDF Range-Azimuth output + :widths: auto + :header-rows: 2 + + * - tc_diag NETCDF DIMENSIONS + - + * - NetCDF Dimension + - Description + * - track_line + - Dimension for the raw ATCF track lines written to the **TrackLines** variable + * - time + - Time dimension for the number of track point valid times + * - range + - Dimension for the number of range rings in the range-azimuth grid + * - azimuth + - Dimension for the number of azimuths in the range-azimuth grid + * - pressure + - Vertical dimension for the number of pressure levels + +.. role:: raw-html(raw) + :format: html + +.. _table_TC-Diag_Variables_NetCDF_range_azimuth: + +.. list-table:: Variables defined in NetCDF Range-Azimuth output + :widths: auto + :header-rows: 2 + + * - tc_diag NETCDF VARIABLES + - + - + * - NetCDF Variable + - Dimension + - Description + * - storm_id + - NA + - Tropical Cyclone Storm ID (BBNNYYYY) consisting of 2-letter basin name, 2-digit storm number, and 4-digit year + * - model + - NA + - Track ATCF ID model name + * - TrackLines + - track_lines + - Raw input ATCF track lines + * - TrackLat + - time + - Track point location latitude + * - TrackLon + - time + - Track point location longitude + * - TrackMSLP + - time + - Track point minimum sea level pressure + * - TrackVMax + - time + - Track point maximum wind speed + * - init_time + - NA + - Track initialization time string in YYYYMMDD_HHMMSS format + * - init_time_ut + - NA + - Track initialization time string in unixtime (seconds since January 1, 1970) format + * - valid_time + - time + - Track point valid time string in YYYYMMDD_HHMMSS format + * - valid_time_ut + - time + - Track point valid time string in unixtime (seconds since January 1, 1970) format + * - lead_time + - time + - Track point forecast lead time string in HHMMSS format + * - lead_time_sec + - time + - Track point forecast lead time integer number of seconds + * - range + - range + - Range ring coordinate variable in kilometers + * - azimuth + - azimuth + - Azimuth coordinate variable in degrees clockwise from north + * - pressure + - pressure + - Vertical level pressure coordinate variable in millibars + * - lat + - time, range, azimuth + - Latitude in degrees north for each range-azimuth grid point + * - lon + - time, range, azimuth + - Longitude in degrees east for each range-azimuth grid point + * - single level data + (e.g. TMP_Z2, PRMSL_L0) + - time, range, azimuth + - Gridded range-azimuth data on a single level + * - pressure level data + (e.g. TMP, HGT) + - time, pressure, range, azimuth + - Gridded range-azimuth data on pressure levels diff --git a/docs/Users_Guide/tc-dland.rst b/docs/Users_Guide/tc-dland.rst index 078d4d3a9e..c88ea33e0b 100644 --- a/docs/Users_Guide/tc-dland.rst +++ b/docs/Users_Guide/tc-dland.rst @@ -1,7 +1,7 @@ .. _tc-dland: ************* -TC-Dland Tool +TC-DLand Tool ************* Introduction diff --git a/docs/conf.py b/docs/conf.py index 2ce8140943..c3f0ca37c1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -20,11 +20,11 @@ project = 'MET' author = 'UCAR/NCAR, NOAA, CSU/CIRA, and CU/CIRES' author_list = 'Jensen, T., J. Prestopnik, H. Soh, L. Goodrich, B. Brown, R. Bullock, J. Halley Gotway, K. Newman, J. Opatz' -version = '11.1.0-rc1' +version = '11.1.0' verinfo = version release = f'{version}' release_year = '2023' -release_date = f'{release_year}-06-16' +release_date = f'{release_year}-07-31' copyright = f'{release_year}, {author}' # -- General configuration --------------------------------------------------- diff --git a/internal/scripts/installation/compile_MET_all.sh b/internal/scripts/installation/compile_MET_all.sh index 47333ca25e..2adf80a45f 100644 --- a/internal/scripts/installation/compile_MET_all.sh +++ b/internal/scripts/installation/compile_MET_all.sh @@ -15,10 +15,10 @@ # either PYTHON_MODULE or by setting PYTHON_NAME and PYTHON_VERSION: # - PYTHON_MODULE (only used if USE_MODULES=TRUE) - format is the name # of the Python module to load followed by an underscore and then the -# version number (e.g. python_3.8.6, The script will then run "module -# load python/3.8.6") +# version number (e.g. python_3.10.4, The script will then run "module +# load python/3.10.4") # - PYTHON_NAME = python (or e.g. python3, etc.) -# - PYTHON_VERSION = 3.8.6 +# - PYTHON_VERSION = 3.10.4 # # For a description of these and other variables, visit the MET # downloads page under "Sample Script For Compiling External @@ -64,6 +64,14 @@ # MET_HDF, MET_HDFEOS, MET_FREETYPEINC, MET_FREETYPELIB, # MET_CAIROINC, MET_CAIROLIB. # +# Users can speed up the compilation of MET and its dependent libraries +# by adding the following to their environment configuration file: +# export MAKE_ARGS=-j # +# replacing the # with the number of cores to use (integer) or simply +# specifying: +# export MAKE_ARGS=-j +# with no integer argument to start as many processes in parallel as +# possible. #================================================ # print command, run it, then error and exit if non-zero value is returned @@ -276,6 +284,7 @@ echo "COMPILER = $COMPILER" echo "COMPILER_FAMILY = $COMPILER_FAMILY" echo "COMPILER_VERSION = $COMPILER_VERSION" COMPILER_MAJOR_VERSION=`echo $COMPILER_VERSION | cut -d'.' -f1` +COMPILER_MINOR_VERSION=`echo $COMPILER_VERSION | cut -d'.' -f2` echo echo "USE_MODULES = ${USE_MODULES}" @@ -337,6 +346,22 @@ echo "export F77=${F77}" echo "export F90=${F90}" echo +# Figure out what kind of OS is being used +unameOut="$(uname -s)" +case "${unameOut}" in + Linux*) machine=Linux;; + Darwin*) machine=Mac;; + CYGWIN*) machine=Cygwin;; + MINGW*) machine=MinGw;; + *) machine="UNKNOWN:${unameOut}" +esac + +if [[ $machine == "Mac" ]]; then + sed_inline="sed -i ''" +else + sed_inline="sed -i''" +fi + # Load Python module if [ ${USE_MODULES} = "TRUE" ]; then @@ -469,17 +494,19 @@ if [ $COMPILE_G2CLIB -eq 1 ]; then rm -rf ${LIB_DIR}/g2clib/g2clib* tar -xf ${TAR_DIR}/g2clib*.tar -C ${LIB_DIR}/g2clib cd ${LIB_DIR}/g2clib/g2clib* + # Sed commands use double-quotes to support variable expansion. - sed -i "s|INC=.*|INC=-I${LIB_DIR}/include -I${LIB_DIR}/include/jasper|g" makefile + $sed_inline "s|INC=.*|INC=-I${LIB_DIR}/include -I${LIB_DIR}/include/jasper|g" makefile # Allow other compilers besides gcc - sed -i "s|CC=gcc|CC=${CC}|g" makefile + $sed_inline "s|CC=gcc|CC=${CC}|g" makefile # remove -D__64BIT__ flag because compiling with it has # shown issues with GRIB/GRIB2 files that are over 2GB in size # This flag was removed in g2clib 1.6.4 # so this can be removed if the version is updated - sed -i 's/-D__64BIT__//g' makefile + $sed_inline 's/-D__64BIT__//g' makefile + echo "cd `pwd`" # g2clib appears to compile but causes failure compiling MET if -j argument is used # so exclude it from this call @@ -541,7 +568,7 @@ fi # Compile NetCDF if [ $COMPILE_NETCDF -eq 1 ]; then - + echo echo "Compiling HDF5 at `date`" mkdir -p ${LIB_DIR}/hdf5 @@ -563,13 +590,18 @@ if [ $COMPILE_NETCDF -eq 1 ]; then echo "cd `pwd`" run_cmd "./configure --prefix=${LIB_DIR} CFLAGS=-fPIC CXXFLAGS=-fPIC LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > netcdf-c.configure.log 2>&1" run_cmd "make ${MAKE_ARGS} install > netcdf-c.make_install.log 2>&1" - + echo echo "Compiling NetCDF-CXX at `date`" tar -xzf ${TAR_DIR}/netcdf-cxx*.tar.gz -C ${LIB_DIR}/netcdf cd ${LIB_DIR}/netcdf/netcdf-cxx* echo "cd `pwd`" - run_cmd "./configure --prefix=${LIB_DIR} LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > netcdf-cxx.configure.log 2>&1" + configure_lib_args="" + if [[ $machine == "Mac" ]]; then + configure_lib_args="-lhdf5_hl -lhdf5 -lz" + fi + run_cmd "./configure --prefix=${LIB_DIR} LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include LIBS=\"${LIBS} ${configure_lib_args}\" > netcdf-cxx.configure.log 2>&1" + run_cmd "make ${MAKE_ARGS} install > netcdf-cxx.make_install.log 2>&1" fi @@ -665,6 +697,11 @@ export MET_PYTHON_BIN_EXE=${MET_PYTHON_BIN_EXE:=${MET_PYTHON}/bin/python3} export MET_PYTHON_LD export MET_PYTHON_CC export LDFLAGS="-Wl,--disable-new-dtags" + +if [[ $machine == "Mac" ]]; then + export LDFLAGS="" +fi + # https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html # ${parameter:+word} # If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted. diff --git a/internal/scripts/installation/config/install_MET_env.cray b/internal/scripts/installation/config/install_MET_env.cray deleted file mode 100644 index 4adea40a2c..0000000000 --- a/internal/scripts/installation/config/install_MET_env.cray +++ /dev/null @@ -1,45 +0,0 @@ -module load PrgEnv-intel/5.2.56 -module unload intel/15.0.3.187 -module load intel/18.1.163 -module swap craype-haswell craype-sandybridge -module load cray-mpich/7.2.0 -module load python/3.6.3 -module load gsl-intel-haswell/2.1 -module use /usrx/local/dev/modulefiles -module load NetCDF-intel-sandybridge/4.7.4 -module load HDF5-parallel-intel-sandybridge/1.10.6 -module use /gpfs/hps/nco/ops/nwprod/lib/modulefiles -module load bufr-intel/11.0.1 -module load jasper-gnu-sandybridge/1.900.1 -module load png-intel-sandybridge/1.2.44 -module load zlib-intel-sandybridge/1.2.7 -module load g2c-intel/1.6.3 - -export FC=ftn -export F77=ftn -export F90=ftn -export CC=cc -export CXX=CC -export CRAYPE_LINK_TYPE=dynamic -export TEST_BASE=/gpfs/hps3/emc/meso/noscrub/emc.metplus/met/10.0.0 -export BIN_DIR_PATH=${TEST_BASE}/exec -export COMPILER=intel_18.1.163 -export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=met-10.0.0.20210510.tar.gz -export USE_MODULES=TRUE -export PYTHON_MODULE=python_3.6.3 -export MET_PYTHON=/gpfs/hps/usrx/local/prod/python/3.6.3 -export MET_PYTHON_CC=-I/gpfs/hps/usrx/local/prod/python/3.6.3/include/python3.6m -export MET_PYTHON_LD=-L/gpfs/hps/usrx/local/prod/python/3.6.3/lib\ -lpython3.6m\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm\ -Xlinker\ -export-dynamic -export MET_NETCDF=$NETCDF -export MET_HDF5=$HDF5 -export MET_BUFRLIB=/gpfs/hps/nco/ops/nwprod/lib/bufr/v11.3.0/intel -export MET_GRIB2CLIB=/gpfs/hps/nco/ops/nwprod/lib/g2c/v1.6.3/intel -export MET_GRIB2CINC=/gpfs/hps/nco/ops/nwprod/lib/g2c/v1.6.3/intel/include/libg2c_v1.6.3_4 -export MET_GSL=$GSL_ROOT -export BUFRLIB_NAME=-lbufr_v11.3.0_4_64 -export GRIB2CLIB_NAME=-lg2c_v1.6.3_4 -export LIB_JASPER=/usrx/local/prod/jasper/1.900.1/gnu/sandybridge/lib -export LIB_LIBPNG=/usrx/local/prod/png/1.2.44/intel/sandybridge/lib -export LIB_Z=/usrx/local/prod/zlib/1.2.7/intel/sandybridge/lib -export SET_D64BIT=FALSE diff --git a/internal/scripts/installation/config/install_MET_env.dell b/internal/scripts/installation/config/install_MET_env.dell deleted file mode 100644 index 76eae86a2c..0000000000 --- a/internal/scripts/installation/config/install_MET_env.dell +++ /dev/null @@ -1,34 +0,0 @@ -module load ips/18.0.5.274 -module load python/3.6.3 -module load NetCDF/4.5.0 -module load HDF5-serial/1.10.1 -module load bufr/11.3.0 -module load zlib/1.2.11 -module load jasper/1.900.1 -module load libpng/1.2.59 -module load gsl/2.1 -module load g2c/1.6.3 - -export TEST_BASE=/gpfs/dell2/emc/verification/noscrub/emc.metplus/met/10.1.0 -export LIB_DIR=${TEST_BASE}/external_libs -export BIN_DIR_PATH=${TEST_BASE}/exec -export COMPILER=ips_18.0.5.274 -export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=met-10.1.0.20220314.tar.gz -export USE_MODULES=TRUE -export PYTHON_MODULE=python_3.6.3 -export MET_PYTHON=/usrx/local/prod/packages/python/3.6.3/ -export MET_PYTHON_CC=-I/usrx/local/prod/packages/python/3.6.3/include/python3.6m\ -I/usrx/local/prod/packages/python/3.6.3/include/python3.6m -export MET_PYTHON_LD=-L/usrx/local/prod/packages/python/3.6.3/lib/\ -lpython3.6m\ -lpthread\ -ldl\ -lutil\ -lm\ -Xlinker\ -export-dynamic -export MET_NETCDF=/usrx/local/prod/packages/ips/18.0.1/netcdf/4.5.0 -export MET_HDF5=/usrx/local/prod/packages/ips/18.0.1/hdf5/1.10.1 -export MET_BUFRLIB=/gpfs/dell1/nco/ops/nwprod/lib/bufr/v11.3.0/ips/18.0.1 -export MET_GRIB2CLIB=/gpfs/dell1/nco/ops/nwprod/lib/g2c/v1.6.3/ips/18.0.1/lib -export MET_GRIB2CINC=/gpfs/dell1/nco/ops/nwprod/lib/g2c/v1.6.3/ips/18.0.1/include/libg2c_v1.6.3_4 -export MET_GSL=$GSL_ROOT -export BUFRLIB_NAME=-lbufr_v11.3.0_4_64 -export GRIB2CLIB_NAME=-lg2c_v1.6.3_4 -export LIB_JASPER=/usrx/local/prod/packages/gnu/4.8.5/jasper/1.900.1/lib -export LIB_LIBPNG=/usrx/local/prod/packages/gnu/4.8.5/libpng/1.2.59/lib -export LIB_Z=/usrx/local/prod/packages/ips/18.0.1/zlib/1.2.11/lib -export SET_D64BIT=FALSE diff --git a/internal/scripts/installation/config/install_met_env.acorn b/internal/scripts/installation/config/install_met_env.acorn deleted file mode 100644 index 33bc4de786..0000000000 --- a/internal/scripts/installation/config/install_met_env.acorn +++ /dev/null @@ -1,35 +0,0 @@ -module use /apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304/ -module load intel -module load python/3.8.6 -module load netcdf/4.7.4 -module load hdf5/1.12.2 -module load bufr/11.5.0 -module load zlib/1.2.11 -module load jasper/2.0.25 -module load libpng/1.6.37 -module load gsl/2.7 -module load g2c/1.6.4 - -export TEST_BASE=/apps/sw_review/emc/MET/11.0.0 -export LIB_DIR=${TEST_BASE}/external_libs -export BIN_DIR_PATH=${TEST_BASE}/exec -export COMPILER=intel_19.1.3.304 -export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=v11.0.0.tar.gz -export USE_MODULES=TRUE -export PYTHON_MODULE=python_3.8.6 -export MET_PYTHON=/apps/spack/python/3.8.6/intel/19.1.3.304/pjn2nzkjvqgmjw4hmyz43v5x4jbxjzpk -export MET_PYTHON_CC=-I/apps/spack/python/3.8.6/intel/19.1.3.304/pjn2nzkjvqgmjw4hmyz43v5x4jbxjzpk/include/python3.8 -export MET_PYTHON_LD=-L/apps/spack/python/3.8.6/intel/19.1.3.304/pjn2nzkjvqgmjw4hmyz43v5x4jbxjzpk/lib\ -lpython3.8\ -lpthread\ -ldl\ -lutil\ -lm\ -Xlinker\ -export-dynamic -export MET_NETCDF=/apps/prod/hpc-stack/intel-19.1.3.304/netcdf/4.7.4 -export MET_HDF5=/apps/prod/hpc-stack/intel-19.1.3.304/hdf5/1.12.2 -export MET_BUFRLIB=/apps/ops/prod/libs/intel/19.1.3.304/bufr/11.5.0/lib64 -export MET_GRIB2CLIB=/apps/ops/prod/libs/intel/19.1.3.304/g2c/1.6.4/lib64 -export MET_GRIB2CINC=/apps/ops/prod/libs/intel/19.1.3.304/g2c/1.6.4/include -export MET_GSL=/apps/spack/gsl/2.7/intel/19.1.3.304/xks7dxbowrdxhjck5zxc4rompopocevb -export BUFRLIB_NAME=-lbufr_4 -export GRIB2CLIB_NAME=-lg2c -export LIB_JASPER=/apps/spack/jasper/2.0.25/intel/19.1.3.304/sjib74krrorkyczqpqah4tvewmlnqdx4/lib64 -export LIB_LIBPNG=/apps/spack/libpng/1.6.37/intel/19.1.3.304/4ohkronuhlyherusoszzrmur5ewvlwzh/lib -export LIB_Z=/apps/spack/zlib/1.2.11/intel/19.1.3.304/hjotqkckeoyt6j6tibalwzrlfljcjtdh/lib -export SET_D64BIT=FALSE \ No newline at end of file diff --git a/internal/scripts/installation/config/install_met_env.acorn_py3.10 b/internal/scripts/installation/config/install_met_env.acorn_py3.10 index 9e725f6fac..1dd5cb16ca 100644 --- a/internal/scripts/installation/config/install_met_env.acorn_py3.10 +++ b/internal/scripts/installation/config/install_met_env.acorn_py3.10 @@ -1,8 +1,9 @@ module use /apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304/ module load intel python/3.10.4 +module use /apps/dev/modulefiles/ module load ve/evs/1.0 module load netcdf/4.7.4 -module load hdf5/1.12.2 +module load hdf5/1.10.6 module load bufr/11.5.0 module load zlib/1.2.11 module load jasper/2.0.25 @@ -10,11 +11,11 @@ module load libpng/1.6.37 module load gsl/2.7 module load g2c/1.6.4 -export TEST_BASE=/apps/sw_review/emc/MET/11.0.1 +export TEST_BASE=/apps/sw_review/emc/MET/11.1.0 export LIB_DIR=${TEST_BASE}/external_libs export COMPILER=intel_19.1.3.304 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=v11.0.1.tar.gz +export MET_TARBALL=v11.1.0.tar.gz export USE_MODULES=TRUE export ADDTL_DIR=/apps/spack/gettext/0.21/intel/19.1.3.304/at2kdo4edvuhyzrt5g6zhwrdb7bdui4s/lib64 export PYTHON_MODULE=python_3.10.4 @@ -23,7 +24,7 @@ export MET_PYTHON_LIB=/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xn export MET_PYTHON_CC=-I/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp/include/python3.10 export MET_PYTHON_LD=-L/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp/lib64\ -lpython3.10\ -lintl\ -lcrypt\ -ldl\ -lutil\ -lm\ -lm export MET_NETCDF=/apps/prod/hpc-stack/intel-19.1.3.304/netcdf/4.7.4 -export MET_HDF5=/apps/prod/hpc-stack/intel-19.1.3.304/hdf5/1.12.2 +export MET_HDF5=/apps/prod/hpc-stack/intel-19.1.3.304/hdf5/1.10.6 export MET_BUFRLIB=/apps/ops/prod/libs/intel/19.1.3.304/bufr/11.5.0/lib64 export MET_GRIB2CLIB=/apps/ops/prod/libs/intel/19.1.3.304/g2c/1.6.4/lib64 export MET_GRIB2CINC=/apps/ops/prod/libs/intel/19.1.3.304/g2c/1.6.4/include @@ -33,4 +34,6 @@ export GRIB2CLIB_NAME=-lg2c export LIB_JASPER=/apps/spack/jasper/2.0.25/intel/19.1.3.304/sjib74krrorkyczqpqah4tvewmlnqdx4/lib64 export LIB_LIBPNG=/apps/spack/libpng/1.6.37/intel/19.1.3.304/4ohkronuhlyherusoszzrmur5ewvlwzh/lib export LIB_Z=/apps/spack/zlib/1.2.11/intel/19.1.3.304/hjotqkckeoyt6j6tibalwzrlfljcjtdh/lib -export SET_D64BIT=FALSE \ No newline at end of file +export SET_D64BIT=FALSE +export export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env.casper b/internal/scripts/installation/config/install_met_env.casper index 78c632e305..c9e9f06a91 100644 --- a/internal/scripts/installation/config/install_met_env.casper +++ b/internal/scripts/installation/config/install_met_env.casper @@ -2,20 +2,17 @@ module load ncarenv/1.3 module load intel/2021.2 module load netcdf/4.8.0 -export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/casper/11.0.0 +export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/casper/11.1.0 export COMPILER=intel_2021.2 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=v11.0.0.tar.gz +export MET_TARBALL=v11.1.0.tar.gz export USE_MODULES=TRUE -export MET_PYTHON=/glade/p/ral/jntp/MET/METplus/miniconda/miniconda3/envs/metplus_v5.0_py3.8 -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.8 -export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.8\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm -#export MET_PYTHON=/glade/p/ral/jntp/MET/METplus/casper/miniconda/miniconda3 -#export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.8 -#export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.8\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm +export MET_PYTHON=/glade/p/ral/jntp/MET/METplus/miniconda/miniconda3/envs/metplus_v5.1_py3.10 +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.10 +export MET_PYTHON_LD=`${MET_PYTHON}/bin/python3-config --ldflags --embed` export MET_NETCDF=/glade/u/apps/ch/opt/netcdf/4.8.0/intel/2021.2/ export MET_HDF5=/glade/u/apps/ch/opt/netcdf/4.8.0/intel/2021.2/ -#export EXTERNAL_LIBS=/glade/p/ral/jntp/MET/MET_releases/casper/11.0.0/external_libs +export EXTERNAL_LIBS=${TEST_BASE}/external_libs #export MET_GSL=${EXTERNAL_LIBS} #export MET_BUFRLIB=${EXTERNAL_LIBS} #export BUFRLIB_NAME=-lbufr @@ -29,3 +26,5 @@ export MET_HDF5=/glade/u/apps/ch/opt/netcdf/4.8.0/intel/2021.2/ export SET_D64BIT=FALSE #export CFLAGS="-Wall -g" #export CXXFLAGS="-Wall -g" +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env.cheyenne b/internal/scripts/installation/config/install_met_env.cheyenne index b9f23b7990..8686c817a1 100644 --- a/internal/scripts/installation/config/install_met_env.cheyenne +++ b/internal/scripts/installation/config/install_met_env.cheyenne @@ -2,17 +2,17 @@ module load ncarenv/1.3 module load intel/2021.2 module load netcdf/4.8.0 -export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/11.0.0 +export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/11.1.0 export COMPILER=intel_2021.2 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=v11.0.0.tar.gz +export MET_TARBALL=v11.1.0.tar.gz export USE_MODULES=TRUE -export MET_PYTHON=/glade/p/ral/jntp/MET/METplus/miniconda/miniconda3/envs/metplus_v5.0_py3.8 -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.8 -export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.8\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm +export MET_PYTHON=/glade/p/ral/jntp/MET/METplus/miniconda/miniconda3/envs/metplus_v5.1_py3.10 +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.10 +export MET_PYTHON_LD=`${MET_PYTHON}/bin/python3-config --ldflags --embed` export MET_NETCDF=/glade/u/apps/ch/opt/netcdf/4.8.0/intel/2021.2/ export MET_HDF5=/glade/u/apps/ch/opt/netcdf/4.8.0/intel/2021.2/ -export EXTERNAL_LIBS=/glade/p/ral/jntp/MET/MET_releases/11.0.0/external_libs +export EXTERNAL_LIBS=${TEST_BASE}/external_libs #export MET_GSL=${EXTERNAL_LIBS} #export MET_BUFRLIB=${EXTERNAL_LIBS} #export BUFRLIB_NAME=-lbufr @@ -25,4 +25,6 @@ export EXTERNAL_LIBS=/glade/p/ral/jntp/MET/MET_releases/11.0.0/external_libs #export LIB_Z=${EXTERNAL_LIBS}/lib #export SET_D64BIT=FALSE ##export CFLAGS="-Wall -g" -##export CXXFLAGS="-Wall -g" \ No newline at end of file +##export CXXFLAGS="-Wall -g" +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env.cheyenne_gcc b/internal/scripts/installation/config/install_met_env.cheyenne_gcc deleted file mode 100644 index 57e013ebd2..0000000000 --- a/internal/scripts/installation/config/install_met_env.cheyenne_gcc +++ /dev/null @@ -1,29 +0,0 @@ -module load ncarenv/1.3 -module load gnu/10.1.0 -module load python/3.7.9 -module load netcdf/4.7.4 -ncar_pylib - -export TEST_BASE=/glade/p/ral/jntp/MET/MET_cross_platform_testing/met-10.0.0-beta4/gcc -export COMPILER=gnu_10.1.0 -export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=met-10.0.0-beta4.20210302.tar.gz -export USE_MODULES=TRUE -export MET_PYTHON=/glade/u/apps/ch/opt/python/3.7.9/gnu/9.1.0 -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m -export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm -export MET_NETCDF=/glade/u/apps/ch/opt/netcdf/4.7.4/gnu/10.1.0/ -export EXTERNAL_LIBS=/glade/p/ral/jntp/MET/MET_cross_platform_testing/met-10.0.0-beta4/gcc/external_libs/ -export MET_GSL=${EXTERNAL_LIBS} -export MET_BUFRLIB=${EXTERNAL_LIBS} -export BUFRLIB_NAME=-lbufr -export MET_HDF5=/glade/u/apps/ch/opt/netcdf/4.7.4/gnu/10.1.0/ -export MET_GRIB2CLIBS=${EXTERNAL_LIBS}/lib -export MET_GRIB2CINC=${EXTERNAL_LIBS}/include -export GRIB2CLIB_NAME=-lgrib2c -export LIB_JASPER=${EXTERNAL_LIBS}/lib -export LIB_LIBPNG=${EXTERNAL_LIBS}/lib -export LIB_Z=${EXTERNAL_LIBS}/lib -#export SET_D64BIT=FALSE -export CFLAGS="-Wall -g" -export CXXFLAGS="-Wall -g" diff --git a/internal/scripts/installation/config/install_met_env.cheyenne_pgi b/internal/scripts/installation/config/install_met_env.cheyenne_pgi deleted file mode 100644 index 635f93e8f3..0000000000 --- a/internal/scripts/installation/config/install_met_env.cheyenne_pgi +++ /dev/null @@ -1,29 +0,0 @@ -module load ncarenv/1.3 -module load pgi/20.4 -module load python/3.7.9 -ncar_pylib - -export TEST_BASE=/glade/p/ral/jntp/MET/MET_cross_platform_testing/met-10.0.0-beta4/pgi -export COMPILER=pgi_20.4 -export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=met-10.0.0-beta4.20210302.tar.gz -export USE_MODULES=TRUE -export MET_PYTHON=/glade/u/apps/ch/opt/python/3.7.9/gnu/9.1.0 -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m -export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm -export EXTERNAL_LIBS=/glade/p/ral/jntp/MET/MET_cross_platform_testing/met-10.0.0-beta4/pgi/external_libs/ -export MET_NETCDF=${EXTERNAL_LIBS} -export MET_GSL=${EXTERNAL_LIBS} -export MET_BUFRLIB=${EXTERNAL_LIBS} -export BUFRLIB_NAME=-lbufr -export MET_HDF5=${EXTERNAL_LIBS} -export MET_GRIB2CLIB=${EXTERNAL_LIBS}/lib -export MET_GRIB2CINC=${EXTERNAL_LIBS}/include -export GRIB2CLIB_NAME=-lgrib2c -export LIB_JASPER=${EXTERNAL_LIBS}/lib -export LIB_LIBPNG=${EXTERNAL_LIBS}/lib -export LIB_Z=${EXTERNAL_LIBS}/lib -export SET_D64BIT=FALSE -export CFLAGS="-Wall -g" -export CXXFLAGS="-Wall -g -lcurl" - diff --git a/internal/scripts/installation/config/install_met_env.dogwood b/internal/scripts/installation/config/install_met_env.dogwood deleted file mode 100644 index e1644ae7e7..0000000000 --- a/internal/scripts/installation/config/install_met_env.dogwood +++ /dev/null @@ -1,36 +0,0 @@ -module use /apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304/ -module load intel -module load python/3.8.6 -module load netcdf/4.7.4 -module load hdf5/1.10.6 -module load bufr/11.6.0 -module load zlib/1.2.11 -module load jasper/2.0.25 -module load libpng/1.6.37 -module load gsl/2.6 -module load g2c/1.6.4 - -export TEST_BASE=/lfs/h2/emc/vpppg/noscrub/Julie.Prestopnik/MET/10.1.0 -export LIB_DIR=${TEST_BASE}/external_libs -export BIN_DIR_PATH=${TEST_BASE}/exec -export COMPILER=intel_19.1.3.304 -export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=met-10.1.0.20220314.tar.gz -export USE_MODULES=TRUE -export PYTHON_MODULE=python_3.8.6 -export MET_PYTHON=/apps/spack/python/3.8.6/intel/19.1.3.304/pjn2nzkjvqgmjw4hmyz43v5x4jbxjzpk -export MET_PYTHON_CC=-I/apps/spack/python/3.8.6/intel/19.1.3.304/pjn2nzkjvqgmjw4hmyz43v5x4jbxjzpk/include/python3.8 -export MET_PYTHON_LD=-L/apps/spack/python/3.8.6/intel/19.1.3.304/pjn2nzkjvqgmjw4hmyz43v5x4jbxjzpk/lib\ -lpython3.8\ -lpthread\ -ldl\ -lutil\ -lm\ -Xlinker\ -export-dynamic -export MET_NETCDF=/apps/prod/hpc-stack/intel-19.1.3.304/netcdf/4.7.4 -export MET_HDF5=/apps/prod/hpc-stack/intel-19.1.3.304/hdf5/1.10.6 -export MET_BUFRLIB=/apps/ops/prod/libs/intel/19.1.3.304/bufr/11.5.0/lib64 -export MET_GRIB2CLIB=/apps/ops/prod/libs/intel/19.1.3.304/g2c/1.6.4/lib64 -export MET_GRIB2CINC=/apps/ops/prod/libs/intel/19.1.3.304/g2c/1.6.4/include -export MET_GSL=$GSL_ROOT -export BUFRLIB_NAME=-lbufr_4 -export GRIB2CLIB_NAME=-lg2c -export LIB_JASPER=/apps/spack/jasper/2.0.25/intel/19.1.3.304/sjib74krrorkyczqpqah4tvewmlnqdx4/lib64 -export LIB_LIBPNG=/apps/spack/libpng/1.6.37/intel/19.1.3.304/4ohkronuhlyherusoszzrmur5ewvlwzh/lib -export LIB_Z=/apps/spack/zlib/1.2.11/intel/19.1.3.304/hjotqkckeoyt6j6tibalwzrlfljcjtdh/lib -export SET_D64BIT=FALSE - diff --git a/internal/scripts/installation/config/install_met_env.frontera b/internal/scripts/installation/config/install_met_env.frontera index e8e3feffec..9890743689 100644 --- a/internal/scripts/installation/config/install_met_env.frontera +++ b/internal/scripts/installation/config/install_met_env.frontera @@ -2,14 +2,14 @@ module load intel/19.1.1 module load hdf5/1.12.0 module load netcdf/4.7.4 -export TEST_BASE=/work2/06612/tg859120/frontera/MET/11.0.0 +export TEST_BASE=/work2/06612/tg859120/frontera/MET/11.1.0 export COMPILER=intel_19.1.1 export MET_SUBDIR=${TEST_BASE}/ -export MET_TARBALL=v11.0.0.tar.gz +export MET_TARBALL=v11.1.0.tar.gz export USE_MODULES=TRUE -export MET_PYTHON=/work2/06612/tg859120/frontera/miniconda/miniconda3/envs/metplus_v5.0_py3.8 -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.8 -export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.8\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm +export MET_PYTHON=/work2/06612/tg859120/frontera/miniconda/miniconda3/envs/metplus_v5.1_py3.10 +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.10 +export MET_PYTHON_LD=`python3-config --ldflags --embed` export MET_HDF5=/opt/apps/intel19/hdf5/1.12.0/x86_64/ export MET_NETCDF=/opt/apps/intel19/netcdf/4.7.4/x86_64/ export EXTERNAL_LIBS=${TEST_BASE}/external_libs @@ -25,3 +25,5 @@ export EXTERNAL_LIBS=${TEST_BASE}/external_libs export SET_D64BIT=FALSE #export CFLAGS="-Wall -g" #export CXXFLAGS="-Wall -g" +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env.gaea b/internal/scripts/installation/config/install_met_env.gaea index 312c1ecea1..348b93cb5d 100644 --- a/internal/scripts/installation/config/install_met_env.gaea +++ b/internal/scripts/installation/config/install_met_env.gaea @@ -1,12 +1,14 @@ module load intel/19.0.5.281 -export TEST_BASE=/usw/met/11.0.0 +export TEST_BASE=/usw/met/11.1.0 export COMPILER=intel_19.0.5.281 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=v11.0.0.tar.gz +export MET_TARBALL=v11.1.0.tar.gz export USE_MODULES=TRUE -export MET_PYTHON=/lustre/f2/dev/esrl/Julie.Prestopnik/projects/miniconda/miniconda3/envs/metplus_v5.0_py3.8/ -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.8 -export MET_PYTHON_LD=-L${MET_PYTHON}/lib/python3.8/config-3.8-x86_64-linux-gnu\ -L${MET_PYTHON}/lib\ -lpython3.8\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm -export EXTERNAL_LIBS=/usw/met/11.0.0/external_libs +export MET_PYTHON=/lustre/f2/dev/esrl/Julie.Prestopnik/projects/miniconda/miniconda3/envs/metplus_v5.1_py3.10/ +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.10 +export MET_PYTHON_LD=`python3-config --ldflags --embed` +export EXTERNAL_LIBS=${TEST_BASE}/external_libs export LIB_Z=${EXTERNAL_LIBS}/lib +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env.hera b/internal/scripts/installation/config/install_met_env.hera index 1b938cddfd..cd0d0a4c81 100755 --- a/internal/scripts/installation/config/install_met_env.hera +++ b/internal/scripts/installation/config/install_met_env.hera @@ -23,4 +23,5 @@ export EXTERNAL_LIBS=/contrib/met/11.1.0/external_libs/ #export LIB_Z=${EXTERNAL_LIBS}/lib #export CFLAGS="-Wall -g" #export CXXFLAGS="-Wall -g -lcurl" -export MAKE_ARGS=-j \ No newline at end of file +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" \ No newline at end of file diff --git a/internal/scripts/installation/config/install_met_env.jet b/internal/scripts/installation/config/install_met_env.jet index 0d88a2f0fc..0f93cc0615 100644 --- a/internal/scripts/installation/config/install_met_env.jet +++ b/internal/scripts/installation/config/install_met_env.jet @@ -12,7 +12,7 @@ export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.10 export MET_PYTHON_LD=-L${MET_PYTHON}/lib/python3.10/config-3.10-x86_64-linux-gnu\ -L${MET_PYTHON}/lib\ -lpython3.10\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm\ -lm export MET_NETCDF=/apps/netcdf/4.7.0/intel/18.0.5.274 export MET_HDF5=/apps/hdf5/1.10.5/intel/18.0.5.274 -export EXTERNAL_LIBS=/contrib/met/11.1.0/external_libs/ +export EXTERNAL_LIBS=${TEST_BASE}/external_libs/ #export MET_GSL=${EXTERNAL_LIBS} #export MET_BUFRLIB=${EXTERNAL_LIBS} #export BUFRLIB_NAME=-lbufr @@ -24,3 +24,4 @@ export EXTERNAL_LIBS=/contrib/met/11.1.0/external_libs/ #export LIB_Z=${EXTERNAL_LIBS}/lib export MAKE_ARGS=-j export SET_D64BIT=FALSE +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env.narya b/internal/scripts/installation/config/install_met_env.narya new file mode 100644 index 0000000000..7a4fd0834d --- /dev/null +++ b/internal/scripts/installation/config/install_met_env.narya @@ -0,0 +1,27 @@ +export TEST_BASE=/Volumes/d1/jpresto/projects/MET/MET_installation/11.1.0 +export COMPILER=gnu_12.3.0 +export MET_SUBDIR=${TEST_BASE} +export MET_TARBALL=v11.1.0.tar.gz +export USE_MODULES=FALSE +export MET_PYTHON=/opt/local +export MET_PYTHON_CC=-I${MET_PYTHON}/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10 +export MET_PYTHON_LD=`python3-config --ldflags --embed` +export SET_D64BIT=FALSE +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" +#export FFLAGS="-std=legacy" + +# If you've already compiled these and don't need to compile them again, set the following; +# Otherwise, if you do need to install these libraries, comment out the variables below +export EXTERNAL_LIBS=${TEST_BASE}/external_libs +#export MET_GRIB2CLIB=${EXTERNAL_LIBS}/lib +#export MET_GRIB2CINC=${EXTERNAL_LIBS}/include +#export GRIB2CLIB_NAME=-lgrib2c +#export MET_BUFRLIB=${EXTERNAL_LIBS}/lib +#export BUFRLIB_NAME=-lbufr +#export MET_NETCDF=${EXTERNAL_LIBS} +#export MET_HDF5=${EXTERNAL_LIBS} +#export MET_GSL=${EXTERNAL_LIBS} +#export LIB_JASPER=${EXTERNAL_LIBS}/lib +#export LIB_LIBPNG=${EXTERNAL_LIBS}/lib +#export LIB_Z=${EXTERNAL_LIBS}/lib \ No newline at end of file diff --git a/internal/scripts/installation/config/install_met_env.orion b/internal/scripts/installation/config/install_met_env.orion index 4a25f75b57..5f8b03bafb 100644 --- a/internal/scripts/installation/config/install_met_env.orion +++ b/internal/scripts/installation/config/install_met_env.orion @@ -8,7 +8,7 @@ export USE_MODULES=TRUE export MET_PYTHON=/work/noaa/ovp/miniconda/miniconda3/envs/metplus_v5.1_py3.10 export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.10 export MET_PYTHON_LD=-L${MET_PYTHON}/lib/python3.10/config-3.10-x86_64-linux-gnu\ -L${MET_PYTHON}/lib\ -lpython3.10\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm\ -lm -export EXTERNAL_LIBS=/apps/contrib/MET/11.1.0/external_libs +export EXTERNAL_LIBS=${TEST_BASE}/external_libs export LIB_Z=${EXTERNAL_LIBS}/lib #export MET_GSL=${EXTERNAL_LIBS} #export MET_BUFRLIB=${EXTERNAL_LIBS} @@ -24,4 +24,6 @@ export LIB_Z=${EXTERNAL_LIBS}/lib export MAKE_ARGS=-j #export CFLAGS="-Wall -g" #export CXXFLAGS="-Wall -g" +export CXXFLAGS="-std=c++11" + diff --git a/internal/scripts/installation/config/install_met_env.stampede b/internal/scripts/installation/config/install_met_env.stampede deleted file mode 100644 index 8b961c99e8..0000000000 --- a/internal/scripts/installation/config/install_met_env.stampede +++ /dev/null @@ -1,28 +0,0 @@ -module load intel/18.0.2 -module load python3/3.7.0 -module load hdf5/1.10.4 -module load netcdf/4.6.2 - -export TEST_BASE=/work2/06612/tg859120/stampede2/met/10.1.0 -export COMPILER=intel_18.0.2 -export MET_SUBDIR=${TEST_BASE}/ -export MET_TARBALL=met-10.1.0.20220314.tar.gz -export USE_MODULES=TRUE -export MET_PYTHON=/opt/apps/intel18/python3/3.7.0 -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m -export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm -export MET_HDF5=/opt/apps/intel18/hdf5/1.10.4/x86_64/ -export MET_NETCDF=/opt/apps/intel18/netcdf/4.6.2/x86_64/ -#export EXTERNAL_LIBS=/work2/06612/tg859120/stampede2/met/10.1.0/external_libs -#export MET_GSL=${EXTERNAL_LIBS} -#export MET_BUFRLIB=${EXTERNAL_LIBS} -#export BUFRLIB_NAME=-lbufr -#export MET_GRIB2CLIB=${EXTERNAL_LIBS}/lib -#export MET_GRIB2CINC=${EXTERNAL_LIBS}/include -#export GRIB2CLIB_NAME=-lgrib2c -#export LIB_JASPER=${EXTERNAL_LIBS}/lib -#export LIB_LIBPNG=${EXTERNAL_LIBS}/lib -#export LIB_Z=${EXTERNAL_LIBS}/lib -#export SET_D64BIT=FALSE -#export CFLAGS="-Wall -g" -#export CXXFLAGS="-Wall -g" diff --git a/internal/scripts/installation/config/install_met_env.wcoss2_py3.10 b/internal/scripts/installation/config/install_met_env.wcoss2_py3.10 index e8c83f6ca5..ea9589e838 100644 --- a/internal/scripts/installation/config/install_met_env.wcoss2_py3.10 +++ b/internal/scripts/installation/config/install_met_env.wcoss2_py3.10 @@ -1,10 +1,8 @@ -# JY module use /apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304/ -module load intel -# JY add following two -module load craype/2.7.13 -module load cray-mpich/8.1.12 - -module load python/3.10.4 +module reset +module use /apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304 +export HPC_OPT=/apps/ops/para/libs +module use /apps/dev/modulefiles/ +module load ve/evs/1.0 module load netcdf/4.7.4 module load hdf5/1.10.6 module load bufr/11.6.0 @@ -14,13 +12,13 @@ module load libpng/1.6.37 module load gsl/2.7 module load g2c/1.6.4 -#export TEST_BASE=/apps/ops/para/libs/intel/19.1.3.304/met/11.0.1 +#export TEST_BASE=/apps/ops/para/libs/intel/19.1.3.304/met/11.1.0-rc1 export TEST_BASE=$(pwd) export LIB_DIR=${TEST_BASE}/external_libs export BIN_DIR_PATH=${TEST_BASE}/bin export COMPILER=intel_19.1.3.304 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=v11.0.1.tar.gz +export MET_TARBALL=v11.1.0-rc1.tar.gz export USE_MODULES=TRUE export ADDTL_DIR=/apps/spack/gettext/0.21/intel/19.1.3.304/at2kdo4edvuhyzrt5g6zhwrdb7bdui4s/lib64 export PYTHON_MODULE=python_3.10.4 @@ -29,7 +27,7 @@ export MET_PYTHON_LIB=/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xn export MET_PYTHON_CC=-I/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp/include/python3.10 export MET_PYTHON_LD=-L/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp/lib64\ -lpython3.10\ -lcrypt\ -lintl\ -ldl\ -lutil\ -lm\ -lm export MET_NETCDF=/apps/prod/hpc-stack/intel-19.1.3.304/netcdf/4.7.4 -# JY export MET_HDF5=/apps/prod/hpc-stack/intel-19.1.3.304/hdf5/1.12.2 +# JY export MET_HDF5=/apps/prod/hpc-stack/intel-19.1.3.304/hdf5/1.10.6 export MET_HDF5=${HDF5_ROOT} export MET_BUFRLIB=/apps/ops/prod/libs/intel/19.1.3.304/bufr/11.6.0/lib64 # JY export MET_GRIB2CLIB=/apps/ops/prod/libs/intel/19.1.3.304/g2c/1.6.4/lib64 @@ -46,3 +44,5 @@ export LIB_LIBPNG=${LIBPNG_LIBDIR} # JY export LIB_Z=/apps/spack/zlib/1.2.11/intel/19.1.3.304/hjotqkckeoyt6j6tibalwzrlfljcjtdh/lib export LIB_Z=${ZLIB_LIBDIR} export SET_D64BIT=FALSE +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env.wcoss2 b/internal/scripts/installation/config/install_met_env.wcoss2_py3.10_secondary similarity index 59% rename from internal/scripts/installation/config/install_met_env.wcoss2 rename to internal/scripts/installation/config/install_met_env.wcoss2_py3.10_secondary index a8ed47974b..fb0220c5a6 100644 --- a/internal/scripts/installation/config/install_met_env.wcoss2 +++ b/internal/scripts/installation/config/install_met_env.wcoss2_py3.10_secondary @@ -1,10 +1,11 @@ -# JY module use /apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304/ +module reset +module use /apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304 module load intel -# JY add following two -module load craype/2.7.13 -module load cray-mpich/8.1.12 - -module load python/3.8.6 +module load PrgEnv-intel/8.3.3 +module load craype/2.7.17 +module load python/3.10.4 +module use /apps/dev/modulefiles/ +module load ve/evs/1.0 module load netcdf/4.7.4 module load hdf5/1.10.6 module load bufr/11.6.0 @@ -14,20 +15,22 @@ module load libpng/1.6.37 module load gsl/2.7 module load g2c/1.6.4 -#export TEST_BASE=/apps/ops/para/libs/intel/19.1.3.304/met/11.0.0 +#export TEST_BASE=/apps/ops/para/libs/intel/19.1.3.304/met/11.1.0-rc1 export TEST_BASE=$(pwd) export LIB_DIR=${TEST_BASE}/external_libs export BIN_DIR_PATH=${TEST_BASE}/bin export COMPILER=intel_19.1.3.304 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=v11.0.0.tar.gz +export MET_TARBALL=v11.1.0-rc1.tar.gz export USE_MODULES=TRUE -export PYTHON_MODULE=python_3.8.6 -export MET_PYTHON=/apps/spack/python/3.8.6/intel/19.1.3.304/pjn2nzkjvqgmjw4hmyz43v5x4jbxjzpk -export MET_PYTHON_CC=-I/apps/spack/python/3.8.6/intel/19.1.3.304/pjn2nzkjvqgmjw4hmyz43v5x4jbxjzpk/include/python3.8 -export MET_PYTHON_LD=-L/apps/spack/python/3.8.6/intel/19.1.3.304/pjn2nzkjvqgmjw4hmyz43v5x4jbxjzpk/lib\ -lpython3.8\ -lpthread\ -ldl\ -lutil\ -lm\ -Xlinker\ -export-dynamic +export ADDTL_DIR=/apps/spack/gettext/0.21/intel/19.1.3.304/at2kdo4edvuhyzrt5g6zhwrdb7bdui4s/lib64 +export PYTHON_MODULE=python_3.10.4 +export MET_PYTHON=/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp +export MET_PYTHON_LIB=/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp/lib64 +export MET_PYTHON_CC=-I/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp/include/python3.10 +export MET_PYTHON_LD=-L/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp/lib64\ -lpython3.10\ -lcrypt\ -lintl\ -ldl\ -lutil\ -lm\ -lm export MET_NETCDF=/apps/prod/hpc-stack/intel-19.1.3.304/netcdf/4.7.4 -# JY export MET_HDF5=/apps/prod/hpc-stack/intel-19.1.3.304/hdf5/1.12.2 +# JY export MET_HDF5=/apps/prod/hpc-stack/intel-19.1.3.304/hdf5/1.10.6 export MET_HDF5=${HDF5_ROOT} export MET_BUFRLIB=/apps/ops/prod/libs/intel/19.1.3.304/bufr/11.6.0/lib64 # JY export MET_GRIB2CLIB=/apps/ops/prod/libs/intel/19.1.3.304/g2c/1.6.4/lib64 @@ -44,3 +47,5 @@ export LIB_LIBPNG=${LIBPNG_LIBDIR} # JY export LIB_Z=/apps/spack/zlib/1.2.11/intel/19.1.3.304/hjotqkckeoyt6j6tibalwzrlfljcjtdh/lib export LIB_Z=${ZLIB_LIBDIR} export SET_D64BIT=FALSE +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env_met_only.casper b/internal/scripts/installation/config/install_met_env_met_only.casper index e84e5d3ff1..beb46d927d 100644 --- a/internal/scripts/installation/config/install_met_env_met_only.casper +++ b/internal/scripts/installation/config/install_met_env_met_only.casper @@ -2,20 +2,17 @@ module load ncarenv/1.3 module load intel/2021.2 module load netcdf/4.8.0 -export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/casper/11.0.0 +export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/casper/11.1.0 export COMPILER=intel_2021.2 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=v11.0.0.tar.gz +export MET_TARBALL=v11.1.0.tar.gz export USE_MODULES=TRUE -export MET_PYTHON=/glade/p/ral/jntp/MET/METplus/miniconda/miniconda3/envs/metplus_v5.0_py3.8 -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.8 -export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.8\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm -#export MET_PYTHON=/glade/p/ral/jntp/MET/METplus/casper/miniconda/miniconda3 -#export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.8 -#export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.8\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm +export MET_PYTHON=/glade/p/ral/jntp/MET/METplus/miniconda/miniconda3/envs/metplus_v5.1_py3.10 +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.10 +export MET_PYTHON_LD=`${MET_PYTHON}/bin/python3-config --ldflags --embed` export MET_NETCDF=/glade/u/apps/ch/opt/netcdf/4.8.0/intel/2021.2/ export MET_HDF5=/glade/u/apps/ch/opt/netcdf/4.8.0/intel/2021.2/ -export EXTERNAL_LIBS=/glade/p/ral/jntp/MET/MET_releases/casper/11.0.0/external_libs +export EXTERNAL_LIBS=${TEST_BASE}/external_libs export MET_GSL=${EXTERNAL_LIBS} export MET_BUFRLIB=${EXTERNAL_LIBS} export BUFRLIB_NAME=-lbufr @@ -29,3 +26,5 @@ export LIB_Z=${EXTERNAL_LIBS}/lib export SET_D64BIT=FALSE #export CFLAGS="-Wall -g" #export CXXFLAGS="-Wall -g" +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env_met_only.cheyenne b/internal/scripts/installation/config/install_met_env_met_only.cheyenne index d1bc4a47a0..4049fc774a 100644 --- a/internal/scripts/installation/config/install_met_env_met_only.cheyenne +++ b/internal/scripts/installation/config/install_met_env_met_only.cheyenne @@ -2,17 +2,17 @@ module load ncarenv/1.3 module load intel/2021.2 module load netcdf/4.8.0 -export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/11.0.0 +export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/11.1.0 export COMPILER=intel_2021.2 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=v11.0.0.tar.gz +export MET_TARBALL=v11.1.0.tar.gz export USE_MODULES=TRUE -export MET_PYTHON=/glade/p/ral/jntp/MET/METplus/miniconda/miniconda3/envs/metplus_v5.0_py3.8 -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.8 -export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.8\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm +export MET_PYTHON=/glade/p/ral/jntp/MET/METplus/miniconda/miniconda3/envs/metplus_v5.1_py3.10 +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.10 +export MET_PYTHON_LD=`${MET_PYTHON}/bin/python3-config --ldflags --embed` export MET_NETCDF=/glade/u/apps/ch/opt/netcdf/4.8.0/intel/2021.2/ export MET_HDF5=/glade/u/apps/ch/opt/netcdf/4.8.0/intel/2021.2/ -export EXTERNAL_LIBS=/glade/p/ral/jntp/MET/MET_releases/11.0.0/external_libs +export EXTERNAL_LIBS=${TEST_BASE}/external_libs export MET_GSL=${EXTERNAL_LIBS} export MET_BUFRLIB=${EXTERNAL_LIBS} export BUFRLIB_NAME=-lbufr @@ -25,4 +25,6 @@ export LIB_LIBPNG=${EXTERNAL_LIBS}/lib export LIB_Z=${EXTERNAL_LIBS}/lib export SET_D64BIT=FALSE ##export CFLAGS="-Wall -g" -##export CXXFLAGS="-Wall -g" \ No newline at end of file +##export CXXFLAGS="-Wall -g" +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env_met_only.gaea b/internal/scripts/installation/config/install_met_env_met_only.gaea index 63420b15d8..b5167c7f9c 100644 --- a/internal/scripts/installation/config/install_met_env_met_only.gaea +++ b/internal/scripts/installation/config/install_met_env_met_only.gaea @@ -1,14 +1,14 @@ module load intel/19.0.5.281 -export TEST_BASE=/usw/met/11.0.0 +export TEST_BASE=/usw/met/11.1.0 export COMPILER=intel_19.0.5.281 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=v11.0.0.tar.gz +export MET_TARBALL=v11.1.0.tar.gz export USE_MODULES=TRUE -export MET_PYTHON=/lustre/f2/dev/esrl/Julie.Prestopnik/projects/miniconda/miniconda3/envs/metplus_v5.0_py3.8/ -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.8 -export MET_PYTHON_LD=-L${MET_PYTHON}/lib/python3.8/config-3.8-x86_64-linux-gnu\ -L${MET_PYTHON}/lib\ -lpython3.8\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm -export EXTERNAL_LIBS=/usw/met/11.0.0/external_libs +export MET_PYTHON=/lustre/f2/dev/esrl/Julie.Prestopnik/projects/miniconda/miniconda3/envs/metplus_v5.1_py3.10/ +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.10 +export MET_PYTHON_LD=`${MET_PYTHON}/bin/python3-config --ldflags --embed` +export EXTERNAL_LIBS=${TEST_BASE}/external_libs export MET_NETCDF=${EXTERNAL_LIBS} export MET_GSL=${EXTERNAL_LIBS} export MET_BUFRLIB=${EXTERNAL_LIBS} @@ -23,3 +23,5 @@ export LIB_Z=${EXTERNAL_LIBS}/lib export SET_D64BIT=FALSE #export CFLAGS="-Wall -g" #export CXXFLAGS="-Wall -g -lcurl" +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env_met_only.hera b/internal/scripts/installation/config/install_met_env_met_only.hera index b4ac247f75..ba0327e17a 100644 --- a/internal/scripts/installation/config/install_met_env_met_only.hera +++ b/internal/scripts/installation/config/install_met_env_met_only.hera @@ -23,4 +23,5 @@ export LIB_LIBPNG=${EXTERNAL_LIBS}/lib export LIB_Z=${EXTERNAL_LIBS}/lib #export CFLAGS="-Wall -g" #export CXXFLAGS="-Wall -g -lcurl" -export MAKE_ARGS=-j \ No newline at end of file +export MAKE_ARGS=-j +export CXXFLAGS="-std=c++11" \ No newline at end of file diff --git a/internal/scripts/installation/config/install_met_env_met_only.jet b/internal/scripts/installation/config/install_met_env_met_only.jet index c4c66ebfc3..99cf673403 100644 --- a/internal/scripts/installation/config/install_met_env_met_only.jet +++ b/internal/scripts/installation/config/install_met_env_met_only.jet @@ -2,17 +2,17 @@ module load intel/2022.1.2 module load netcdf/4.7.0 module load hdf5/1.10.5 -export TEST_BASE=/contrib/met/11.0.0 +export TEST_BASE=/contrib/met/11.1.0 export COMPILER=intel_18.0.5.274 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=v11.0.0.tar.gz +export MET_TARBALL=v11.1.0.tar.gz export USE_MODULES=TRUE export MET_PYTHON=/mnt/lfs1/HFIP/dtc-hurr/METplus/miniconda/miniconda3/envs/metplus_v5.1_py3.10 export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.10 -export MET_PYTHON_LD=-L${MET_PYTHON}/lib/python3.10/config-3.10-x86_64-linux-gnu\ -L${MET_PYTHON}/lib\ -lpython3.10\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm\ -lm +export MET_PYTHON_LD=`${MET_PYTHON}/bin/python3-config --ldflags --embed` export MET_NETCDF=/apps/netcdf/4.7.0/intel/18.0.5.274 export MET_HDF5=/apps/hdf5/1.10.5/intel/18.0.5.274 -export EXTERNAL_LIBS=/contrib/met/11.0.0/external_libs/ +export EXTERNAL_LIBS=${TEST_BASE}/external_libs/ export MET_GSL=${EXTERNAL_LIBS} export MET_BUFRLIB=${EXTERNAL_LIBS} export BUFRLIB_NAME=-lbufr @@ -24,3 +24,4 @@ export LIB_LIBPNG=${EXTERNAL_LIBS}/lib export LIB_Z=${EXTERNAL_LIBS}/lib export MAKE_ARGS=-j export SET_D64BIT=FALSE +export CXXFLAGS="-std=c++11" diff --git a/internal/scripts/installation/config/install_met_env_met_only.orion b/internal/scripts/installation/config/install_met_env_met_only.orion index 49ab2ebd68..66cea2a43c 100644 --- a/internal/scripts/installation/config/install_met_env_met_only.orion +++ b/internal/scripts/installation/config/install_met_env_met_only.orion @@ -7,8 +7,8 @@ export MET_TARBALL=v11.1.0.tar.gz export USE_MODULES=TRUE export MET_PYTHON=/work/noaa/ovp/miniconda/miniconda3/envs/metplus_v5.1_py3.10 export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.10 -export MET_PYTHON_LD=-L${MET_PYTHON}/lib/python3.10/config-3.10-x86_64-linux-gnu\ -L${MET_PYTHON}/lib\ -lpython3.10\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm\ -lm -export EXTERNAL_LIBS=/apps/contrib/MET/11.1.0/external_libs +export MET_PYTHON_LD=`${MET_PYTHON}/bin/python3-config --ldflags --embed` +export EXTERNAL_LIBS=${TEST_BASE}/external_libs export MET_GSL=${EXTERNAL_LIBS} export MET_BUFRLIB=${EXTERNAL_LIBS} export BUFRLIB_NAME=-lbufr @@ -24,3 +24,5 @@ export SET_D64BIT=FALSE export MAKE_ARGS=-j #export CFLAGS="-Wall -g" #export CXXFLAGS="-Wall -g" +export CXXFLAGS="-std=c++11" + diff --git a/internal/scripts/installation/config/install_met_env_met_only.stampede b/internal/scripts/installation/config/install_met_env_met_only.stampede deleted file mode 100644 index 18495660ab..0000000000 --- a/internal/scripts/installation/config/install_met_env_met_only.stampede +++ /dev/null @@ -1,28 +0,0 @@ -module load intel/18.0.2 -module load python3/3.7.0 -module load hdf5/1.10.4 -module load netcdf/4.6.2 - -export TEST_BASE=/work2/06612/tg859120/stampede2/met/10.1.0 -export COMPILER=intel_18.0.2 -export MET_SUBDIR=${TEST_BASE}/ -export MET_TARBALL=met-10.1.0.20220314.tar.gz -export USE_MODULES=TRUE -export MET_PYTHON=/opt/apps/intel18/python3/3.7.0 -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m -export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm -export MET_HDF5=/opt/apps/intel18/hdf5/1.10.4/x86_64/ -export MET_NETCDF=/opt/apps/intel18/netcdf/4.6.2/x86_64/ -export EXTERNAL_LIBS=/work2/06612/tg859120/stampede2/met/10.1.0/external_libs -export MET_GSL=${EXTERNAL_LIBS} -export MET_BUFRLIB=${EXTERNAL_LIBS} -export BUFRLIB_NAME=-lbufr -export MET_GRIB2CLIB=${EXTERNAL_LIBS}/lib -export MET_GRIB2CINC=${EXTERNAL_LIBS}/include -export GRIB2CLIB_NAME=-lgrib2c -export LIB_JASPER=${EXTERNAL_LIBS}/lib -export LIB_LIBPNG=${EXTERNAL_LIBS}/lib -export LIB_Z=${EXTERNAL_LIBS}/lib -export SET_D64BIT=FALSE -#export CFLAGS="-Wall -g" -#export CXXFLAGS="-Wall -g" diff --git a/internal/scripts/installation/modulefiles/11.1.0.lua_wcoss2 b/internal/scripts/installation/modulefiles/11.1.0.lua_wcoss2 new file mode 100644 index 0000000000..457753be13 --- /dev/null +++ b/internal/scripts/installation/modulefiles/11.1.0.lua_wcoss2 @@ -0,0 +1,27 @@ +help([[ +]]) + +local pkgName = myModuleName() +local pkgVersion = myModuleVersion() +local pkgNameVer = myModuleFullName() + +local hierA = hierarchyA(pkgNameVer,1) +local compNameVer = hierA[1] + + +conflict(pkgName) + +local opt = os.getenv("HPC_OPT") or os.getenv("OPT") or "/opt/modules" + +local base = pathJoin(opt,compNameVer,pkgName,pkgVersion) + +prepend_path("PATH", pathJoin(base,"bin")) + +setenv("MET_ROOT", base) +setenv("MET_BASE", pathJoin(base, "share", "met")) +setenv("MET_VERSION", pkgVersion) + +whatis("Name: ".. pkgName) +whatis("Version: " .. pkgVersion) +whatis("Category: applications") +whatis("Description: Model Evaluation Tools (MET)") \ No newline at end of file diff --git a/internal/scripts/installation/modulefiles/11.1.0_acorn b/internal/scripts/installation/modulefiles/11.1.0_acorn new file mode 100644 index 0000000000..3712812827 --- /dev/null +++ b/internal/scripts/installation/modulefiles/11.1.0_acorn @@ -0,0 +1,33 @@ +#%Module###################################################################### +## +## Model Evaluation Tools +## +proc ModulesHelp { } { + puts stderr "Sets up the paths and environment variables to use the Model Evaluation Tools v11.1.0-rc1 + *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" +} + +# The intel compiler is required to run MET + +module use /apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304/ +module load intel python/3.10.4 +module use /apps/dev/modulefiles/ +module load ve/evs/1.0 +module load netcdf/4.7.4 +module load hdf5/1.10.6 +module load bufr/11.5.0 +module load zlib/1.2.11 +module load jasper/2.0.25 +module load libpng/1.6.37 +module load gsl/2.7 +module load g2c/1.6.4 + +set base /apps/sw_review/emc/MET/11.1.0-rc1 +set ver 11.1.0-rc1 +set share $base/share/met +set lib_base $base + +prepend-path PATH $base/bin + +setenv METversion V$ver +setenv MET_ROOT $base diff --git a/internal/scripts/installation/modulefiles/11.1.0_cheyenne b/internal/scripts/installation/modulefiles/11.1.0_cheyenne new file mode 100644 index 0000000000..70032e4f5d --- /dev/null +++ b/internal/scripts/installation/modulefiles/11.1.0_cheyenne @@ -0,0 +1,29 @@ +#%Module###################################################################### +## +## Model Evaluation Tools +## +proc ModulesHelp { } { + puts stderr "Sets up the paths and environment variables to use the Model Evaluation Tools v11.1.0 + *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" +} + +# If they exist, remove ncdump and ncgen from /glade/p/ral/jntp/MET/MET_releases/11.1.0/external_libs/bin + +# The intel compiler is required to run MET +module load ncarenv/1.3 +module load intel/2021.2 +module load netcdf/4.8.0 + +set base /glade/p/ral/jntp/MET/MET_releases/11.1.0 +set ver 11.1.0 +set share $base/share/met + +prepend-path PATH $base/bin:/glade/p/ral/jntp/MET/MET_releases/11.1.0/external_libs/bin:/glade/p/ral/jntp/MET/METplus/miniconda/miniconda3/envs/metplus_v5.1_py3.10/bin + +setenv METversion V$ver + +# setenv MET_BUFRLIB /glade/p/ral/jntp/MET/MET_releases/11.1.0/external_libs/libs +# setenv MET_GRIB2C /glade/p/ral/jntp/MET/MET_releases/11.1.0/external_libs +# setenv MET_GSL /glade/p/ral/jntp/MET/MET_releases/11.1.0/external_libs + + diff --git a/internal/test_unit/config/TCDiagConfig_ian b/internal/test_unit/config/TCDiagConfig_ian index 8c9d199f62..b74fa5f238 100644 --- a/internal/test_unit/config/TCDiagConfig_ian +++ b/internal/test_unit/config/TCDiagConfig_ian @@ -73,7 +73,7 @@ domain_info = [ // // Data censoring and conversion -// May be set separately in each "data.field" entry +// May be set separately in each data "field" array entry // // censor_thresh = []; // censor_val = []; diff --git a/internal/test_unit/xml/unit_plot_data_plane.xml b/internal/test_unit/xml/unit_plot_data_plane.xml index 7c2a68b0b2..e9e5ae965f 100644 --- a/internal/test_unit/xml/unit_plot_data_plane.xml +++ b/internal/test_unit/xml/unit_plot_data_plane.xml @@ -522,9 +522,6 @@ - &MET_BIN;/plot_data_plane diff --git a/scripts/python/utility/build_ndbc_stations_from_web.py b/scripts/python/utility/build_ndbc_stations_from_web.py index cc20b6d02d..8d21102ba3 100755 --- a/scripts/python/utility/build_ndbc_stations_from_web.py +++ b/scripts/python/utility/build_ndbc_stations_from_web.py @@ -9,7 +9,7 @@ The list contains latitude, longitude and elevation data for all known stations. The local list can be read by ascii2nc for processing of NDBC data inputs. Algorithm: - Read the current default ndbc_stations.xml file and create a list of default station information objects. + Read the current existing ndbc_stations.xml file and create a list of existing station information objects. Pull down active station xml file from web and create a list of active information objects. Write the list to an active stations text file. Pull down complete index list from web. @@ -18,22 +18,22 @@ Write the list of complete station info objects to a text file. Save all the individual web page data that was pulled down into a subdirectory. - Compare the complete stations information to the default station information objects. - If a station is on the complete list but not on the default list, add it to the default list. + Compare the complete stations information to the existing station information objects. + If a station is on the complete list but not on the existing list, add it to the existing list. If a station is on both lists, but has different location info, change the locaiton info to that of the complete, (unless the complete has no meaningful lat/lon information, typically 0,0). - Compare the augmented default list to the active stations list. - If a station is on the active list but not on the default list, add it to the default list. - If a station is on both lists, but has different location info, keep the default list values - (unless the default has no meaningful lat/lon information, typically 0,0, then change to the active). + Compare the augmented existing list to the active stations list. + If a station is on the active list but not on the existing list, add it to the existing list. + If a station is on both lists, but has different location info, keep the existing list values + (unless the existing has no meaningful lat/lon information, typically 0,0, then change to the active). Log Warnings about discrepancies. Keep counts of everything. - Write the final default list a a new output. + Write the final existing list a a new output. - Optionally prune the default list, removing all stations that are not active or complete. + Optionally prune the existing list, removing all stations that are not active or complete. ''' @@ -44,9 +44,8 @@ import errno from subprocess import Popen, PIPE -# this needs to change! -# hardwired location of current default stations file -DEFAULT_STATIONS_FILE = "../../data/table_files/ndbc_stations.xml" +# default location of current existing stations file, can be changed via command line +DEFAULT_STATIONS_FILE = "../../../data/table_files/ndbc_stations.xml" # hardwired NOAA top webpage TOP_WEBSITE = "https://www.ndbc.noaa.gov" @@ -81,9 +80,10 @@ MISSING = -99.9 def usage(): - print(f'Usage: BuildNdbcStationsFromWeb.py , <--diagnostic> <--out=out_filename> <--prune>') - print(f' -d/--diagnostic: special mode to rerun using already downloaded files, skips all downloading if True (Downloaded files are in ./{DATA_SUBDIR}') - print(f' -o/--out=out_filename: save final text into the named file (default: file name is {DEFAULT_OUTPUT_FILE})"') + print(f'Usage: build_ndbc_stations_from_web.py , <--diagnostic> <--out=out_filename> <--prune>') + print(f' -d/--diagnostic: special mode to rerun using already downloaded files, skips all downloading if True (Downloaded files are in .{DATA_SUBDIR})') + print(f' -o/--out=out_filename: save final text into the named file (default: file name is {DEFAULT_OUTPUT_FILE})') + print(f' -e/--existing=existing_filename: set the existing stations file to read and merge with new info from the web (default is {DEFAULT_STATIONS_FILE})') print(f' -p/--prune: Delete all stations from the local ndbc_stations file that are no longer online') print(f' Note: <> indicates optional arguments') @@ -93,6 +93,8 @@ def create_parser_options(parser): parser.add_option("-p", "--prune", dest="prune", action="store_true", default=False, help="Prune files that are no longer online (optional, default:False)") parser.add_option("-o", "--out", dest="out_file", default=DEFAULT_OUTPUT_FILE, help=" Save the text into the named file (default: " + DEFAULT_OUTPUT_FILE +" )") + parser.add_option("-e", "--existing", dest="existing_file", + default=DEFAULT_STATIONS_FILE, help=" Save the text into the named file (default: " + DEFAULT_STATIONS_FILE +" )") parser.add_option("-H", "--Help", dest="full_usage", action="store_true", default=False, help = " show more usage information (optional, default = False)") return parser.parse_args() @@ -206,7 +208,7 @@ def makeOrScrub(path, debug=False): #---------------------------------------------- -def main(diagnostic, out_file, prune): +def main(diagnostic, out_file, existing_file, prune): cwd = os.getcwd() @@ -238,13 +240,13 @@ def main(diagnostic, out_file, prune): # move back to top directory os.chdir(cwd) - # prepare to compare to the default stations file to see what has changed - default_stations = parse("Default", DEFAULT_STATIONS_FILE) - numDefault = len(default_stations) - print("PARSED DEFAUILT STATIONS FILE NUM=", len(default_stations)) + # prepare to compare to the existing stations file to see what has changed + existing_stations = parse("Existing", existing_file) + numExisting = len(existing_stations) + print("PARSED EXISTING STATIONS FILE NUM=", len(existing_stations)) # make a copy of this as the final outputs - final_stations = default_stations + final_stations = existing_stations for f in final_stations: f.setName("Final") @@ -277,24 +279,24 @@ def main(diagnostic, out_file, prune): numCompleteNotActive = 0 numActiveNotComplete = 0 - # compare complete stations to default stations + # compare complete stations to existing stations for complete in complete_stations: numComplete = numComplete + 1 id = complete._id - default = matchingId(id, default_stations) + existing = matchingId(id, existing_stations) active = matchingId(id, active_stations) if active.empty(): numCompleteNotActive = numCompleteNotActive + 1 - if default.empty(): - # station is on the complete list but not on the default list, add it + if existing.empty(): + # station is on the complete list but not on the existing list, add it f = complete f.setName("Final") final_stations.append(f) numNew = numNew+1 numNewComplete = numNewComplete + 1 else: - # compare complete and default - if not complete.location_match(default): + # compare complete and existing + if not complete.location_match(existing): numConflict = numConflict + 1 if replaceLatLonIfGood("Complete to Final", "Final", final_stations, complete): numConflictChanged = numConflictChanged + 1 @@ -315,18 +317,18 @@ def main(diagnostic, out_file, prune): numNew = numNew+1 numNewActive = numNewActive + 1 else: - # compare complete and default + # compare complete and existing if not final.location_match(active): numConflict = numConflict + 1 if replaceLatLonIfListIsBad("Active to Final", "Final", final_stations, active): numConflictChanged = numConflictChanged + 1 - # see which id's have vanished from the current default list, to be used when prune is true + # see which id's have vanished from the current existing list, to be used when prune is true numVanished = 0 purgeIds = [] - print("Comparing current default stations to final list") - for default in default_stations: - id = default._id + print("Comparing current existing stations to final list") + for existing in existing_stations: + id = existing._id active = matchingId(id, active_stations) complete = matchingId(id, complete_stations) if active.empty() and complete.empty(): @@ -336,8 +338,8 @@ def main(diagnostic, out_file, prune): for f in final_stations: id = f._id - default = matchingId(id, default_stations) - if default.empty(): + existing = matchingId(id, existing_stations) + if existing.empty(): #print("New station on web not in local table file:", id) numNew = numNew+1 @@ -363,7 +365,7 @@ def main(diagnostic, out_file, prune): print("Num complete: ", numComplete) print("Num active: ", numActive) - print("Num default: ", numDefault) + print("Num existing: ", numExisting) print("Num final: ", nout) print("Num pruned: ", nprune) print("Num vanished: ", numVanished) @@ -497,12 +499,14 @@ def parseStationInfo(name, fname, index): #---------------------------------------------- def setStationId(fname): stationId = "" - cmd = 'grep "var currentstnid" ' + fname + #cmd = 'grep "var currentstnid" ' + fname + cmd = 'grep "const currentstnid = " ' + fname s = doCmd(cmd, True) if s: index6 = s.find("'", 0) index7 = s.find("'", index6+1) stationId = s[index6+1:index7] + #print("Station id parsed ", stationId) return stationId #---------------------------------------------- @@ -528,12 +532,14 @@ def setElev(fname): #---------------------------------------------- def setLat(fname): lat = MISSING - cmd = 'grep "var currentstnlat" ' + fname + #cmd = 'grep "var currentstnlat" ' + fname + cmd = 'grep "currentstnlat = " ' + fname s = doCmd(cmd, True) if s: - index6 = s.find("=") - index7 = s.find(";") + index6 = s.find("'", 0) + index7 = s.find("'", index6+1) lat = float(s[index6+1:index7]) + #print("Parsed lat=", lat) else: print("ERROR No Lat for ", fname) return lat @@ -541,12 +547,13 @@ def setLat(fname): #---------------------------------------------- def setLon(fname): lon = MISSING - cmd = 'grep "var currentstnlng" ' + fname + cmd = 'grep "currentstnlng = " ' + fname s = doCmd(cmd, True) if s: - index6 = s.find("=") - index7 = s.find(";") + index6 = s.find("'", 0) + index7 = s.find("'", index6+1) lon = float(s[index6+1:index7]) + #print("Parsed lon=", lon) else: print("ERROR No Lon for ", fname) return lon @@ -630,5 +637,5 @@ def parse(name, fname, debug=False): if options.full_usage: usage() exit(0) - main(options.diagnostic, options.out_file, options.prune) + main(options.diagnostic, options.out_file, options.existing_file, options.prune) diff --git a/src/basic/vx_config/celltype_to_string.cc b/src/basic/vx_config/celltype_to_string.cc index 6270c79e8d..a1646688b3 100644 --- a/src/basic/vx_config/celltype_to_string.cc +++ b/src/basic/vx_config/celltype_to_string.cc @@ -24,12 +24,12 @@ //////////////////////////////////////////////////////////////////////// -#include +using namespace std; -#include "celltype_to_string.h" +#include -using namespace std; +#include "celltype_to_string.h" //////////////////////////////////////////////////////////////////////// @@ -39,7 +39,7 @@ ConcatString celltype_to_string(const CellType t) { -const char * s = (const char *) nullptr; +const char * s = (const char *) 0; switch ( t ) { @@ -73,7 +73,7 @@ switch ( t ) { } // switch -return ConcatString (s); +return ( ConcatString (s) ); } @@ -85,33 +85,33 @@ bool string_to_celltype(const char * text, CellType & t) { - if ( strcmp(text, "integer" ) == 0 ) { t = integer; return true; } -else if ( strcmp(text, "floating_point" ) == 0 ) { t = floating_point; return true; } -else if ( strcmp(text, "boolean" ) == 0 ) { t = boolean; return true; } -else if ( strcmp(text, "cell_mark" ) == 0 ) { t = cell_mark; return true; } -else if ( strcmp(text, "op_add" ) == 0 ) { t = op_add; return true; } - -else if ( strcmp(text, "op_multiply" ) == 0 ) { t = op_multiply; return true; } -else if ( strcmp(text, "op_divide" ) == 0 ) { t = op_divide; return true; } -else if ( strcmp(text, "op_subtract" ) == 0 ) { t = op_subtract; return true; } -else if ( strcmp(text, "op_power" ) == 0 ) { t = op_power; return true; } -else if ( strcmp(text, "op_square" ) == 0 ) { t = op_square; return true; } - -else if ( strcmp(text, "op_negate" ) == 0 ) { t = op_negate; return true; } -else if ( strcmp(text, "op_store" ) == 0 ) { t = op_store; return true; } -else if ( strcmp(text, "op_recall" ) == 0 ) { t = op_recall; return true; } -else if ( strcmp(text, "identifier" ) == 0 ) { t = identifier; return true; } -else if ( strcmp(text, "user_func" ) == 0 ) { t = user_func; return true; } - -else if ( strcmp(text, "builtin_func" ) == 0 ) { t = builtin_func; return true; } -else if ( strcmp(text, "local_var" ) == 0 ) { t = local_var; return true; } -else if ( strcmp(text, "character_string") == 0 ) { t = character_string; return true; } -else if ( strcmp(text, "no_cell_type" ) == 0 ) { t = no_cell_type; return true; } + if ( strcmp(text, "integer" ) == 0 ) { t = integer; return ( true ); } +else if ( strcmp(text, "floating_point" ) == 0 ) { t = floating_point; return ( true ); } +else if ( strcmp(text, "boolean" ) == 0 ) { t = boolean; return ( true ); } +else if ( strcmp(text, "cell_mark" ) == 0 ) { t = cell_mark; return ( true ); } +else if ( strcmp(text, "op_add" ) == 0 ) { t = op_add; return ( true ); } + +else if ( strcmp(text, "op_multiply" ) == 0 ) { t = op_multiply; return ( true ); } +else if ( strcmp(text, "op_divide" ) == 0 ) { t = op_divide; return ( true ); } +else if ( strcmp(text, "op_subtract" ) == 0 ) { t = op_subtract; return ( true ); } +else if ( strcmp(text, "op_power" ) == 0 ) { t = op_power; return ( true ); } +else if ( strcmp(text, "op_square" ) == 0 ) { t = op_square; return ( true ); } + +else if ( strcmp(text, "op_negate" ) == 0 ) { t = op_negate; return ( true ); } +else if ( strcmp(text, "op_store" ) == 0 ) { t = op_store; return ( true ); } +else if ( strcmp(text, "op_recall" ) == 0 ) { t = op_recall; return ( true ); } +else if ( strcmp(text, "identifier" ) == 0 ) { t = identifier; return ( true ); } +else if ( strcmp(text, "user_func" ) == 0 ) { t = user_func; return ( true ); } + +else if ( strcmp(text, "builtin_func" ) == 0 ) { t = builtin_func; return ( true ); } +else if ( strcmp(text, "local_var" ) == 0 ) { t = local_var; return ( true ); } +else if ( strcmp(text, "character_string") == 0 ) { t = character_string; return ( true ); } +else if ( strcmp(text, "no_cell_type" ) == 0 ) { t = no_cell_type; return ( true ); } // // nope // -return false; +return ( false ); } diff --git a/src/basic/vx_log/concat_string.h b/src/basic/vx_log/concat_string.h index e26c30d9a8..c5d6e0f8c3 100644 --- a/src/basic/vx_log/concat_string.h +++ b/src/basic/vx_log/concat_string.h @@ -146,7 +146,7 @@ class ConcatString { void chomp(const char *); // removes trailing suffix, if possible - operator const std::string() const; + operator std::string() const; bool startswith(const char *) const; bool endswith(const char *) const; @@ -205,7 +205,7 @@ inline const char * ConcatString::float_format() const { return FloatFormat; } inline bool ConcatString::empty() const { return ( s ? s->empty() : true ); } inline bool ConcatString::nonempty() const { return ( s ? !s->empty() : false ); } -inline ConcatString::operator const std::string () const { return ( s ? *s : nullptr ); } +inline ConcatString::operator std::string () const { return ( s ? *s : nullptr ); } //////////////////////////////////////////////////////////////////////// diff --git a/src/libcode/vx_data2d_grib2/data2d_grib2.cc b/src/libcode/vx_data2d_grib2/data2d_grib2.cc index 04fd761d5c..6a3f40574d 100644 --- a/src/libcode/vx_data2d_grib2/data2d_grib2.cc +++ b/src/libcode/vx_data2d_grib2/data2d_grib2.cc @@ -41,6 +41,7 @@ using namespace std; //////////////////////////////////////////////////////////////////////// double scaled2dbl(int scale_factor, int scale_value); +int parse_int4(g2int); //////////////////////////////////////////////////////////////////////// // @@ -1294,45 +1295,101 @@ void MetGrib2DataFile::read_grib2_grid( gribfield *gfld) { // Lambert Azimuthal Equal Area else if ( gfld->igdtnum == 140 ) { - const g2int * p = gfld->igdtmpl; - - ScanMode = p[16]; + ScanMode = gfld->igdtmpl[16]; - // build an LaeaGrib2Data struct with the projection information - LaeaGrib2Data laea; + // build an LaeaData struct with the projection information + LaeaData laea; laea.name = laea_proj_type; laea.spheroid_name = "Grib template"; - int earth_shape_int = p[0]; - if(earth_shape_int == 4) { - laea.radius_km = 0; - laea.equatorial_radius_km = 0.5*6378.1370; - laea.polar_radius_km = 0.5*6356.752314; - laea.is_sphere = false; - } - else { - mlog << Error << "\nMetGrib2DataFile::read_grib2_grid() -> " - << "unsupported earth shape value of " << earth_shape_int << "!\n\n"; - exit(1); + + // earth shape + // Reference: https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_table3-2.shtml + int earth_shape_int = gfld->igdtmpl[0]; + switch(earth_shape_int){ + case 0: + laea.radius_km = 6367.47; + laea.equatorial_radius_km = 0; + laea.polar_radius_km = 0; + laea.is_sphere = true; + break; + + case 1: + laea.radius_km = scaled2dbl(gfld->igdtmpl[1], gfld->igdtmpl[2]) / 1000.0; + laea.equatorial_radius_km = 0; + laea.polar_radius_km = 0; + laea.is_sphere = true; + break; + + case 2: + laea.radius_km = 0; + laea.equatorial_radius_km = 6378.1600; + laea.polar_radius_km = 6356.7750; + laea.is_sphere = false; + break; + + case 3: + laea.radius_km = 0; + laea.equatorial_radius_km = scaled2dbl(gfld->igdtmpl[3], gfld->igdtmpl[4]); + laea.polar_radius_km = scaled2dbl(gfld->igdtmpl[5], gfld->igdtmpl[6]); + laea.is_sphere = false; + break; + + case 4: + laea.radius_km = 0; + laea.equatorial_radius_km = 6378.1370; + laea.polar_radius_km = 6356.752314; + laea.is_sphere = false; + break; + + case 6: + laea.radius_km = 6371.2290; + laea.equatorial_radius_km = 0; + laea.polar_radius_km = 0; + laea.is_sphere = true; + break; + + case 7: + laea.radius_km = 0; + laea.equatorial_radius_km = scaled2dbl(gfld->igdtmpl[3], gfld->igdtmpl[4]) / 1000.0; + laea.polar_radius_km = scaled2dbl(gfld->igdtmpl[5], gfld->igdtmpl[6]) / 1000.0; + laea.is_sphere = false; + break; + + default: + mlog << Error << "\nMetGrib2DataFile::read_grib2_grid() -> " + << "unsupported earth shape value of " << earth_shape_int << "!\n\n"; + exit(1); } - laea.nx = p[7]; - laea.ny = p[8]; - laea.lat_first = (double)p[9] / 1000000.0; - // TODO: Suspect a bug in g2clib - // laea.lon_first = -1.0*rescale_lon( (double)p[10] / 1000000.0 ); + + // + // MET#2565: + // Fix a bug when parsing laea.lon_first and laea.central_lon + // in gfld->igdtmpl[10] and gfld->igdtmpl[12] for GRIB2 UKV data. + // These longitudes are negative which the GRIB2C library does not + // parse properly. The parse_int4() function is a workaround to + // reprocesses the data as unsigned chars and check for negative + // values, mimicing logic from the int4() function in wgrib2. // - // grib_dump: longitudeOfFirstGridPointInDegrees = -17.1171; - // wgrib2: Lon1 2164.600777 - // 3-43=129,5,47,201 - // g2clib-1.6.0 grid_templates.h - // 3.140: Lambert Azimuthal Equal Area Projection - // BAD? {140, 17, 0, {1,1,4,1,4,1,4,4,4,-4,4,4,4,1,4,4,1} }, - // FIX? {140, 17, 0, {1,1,4,1,4,1,4,4,4,-4,4,-4,4,1,4,4,1} }, - cout << "TODO LAEA p[10] should be 17.1171 = "<< (double)p[10] / 1000000.0 << "\n"; - laea.lon_first = 17.1171; - laea.standard_lat = (double)p[11] / 1000000.0; - laea.central_lon = -1.0*rescale_lon( (double)p[12] / 1000000.0 ); - laea.dx_km = (double)p[14] / 1000000.0; - laea.dy_km = (double)p[15] / 1000000.0; + // The grib_dump utility already handles negative longitudes well. + // The wgrib2 utility does NOT when populating gfld->igdtmpl. + // However, the wgrib2 -get_byte and -get_int options do work, + // as shown below: + // wgrib2 ukv_agl_temperature_1.5_12.grib2 \ + // -get_byte 3 43 4 -get_int 3 43 1 \ + // -get_byte 3 51 4 -get_int 3 51 1 + // + // The longitudes are correctly parsed as -17.117129 and -2.5, respectively. + // 1:0:3-43=129,5,47,201:3-43=-17117129:3-51=128,38,37,160:3-51=-2500000 + // + + laea.nx = gfld->igdtmpl[7]; + laea.ny = gfld->igdtmpl[8]; + laea.lat_first = (double)gfld->igdtmpl[9] / 1000000.0; + laea.lon_first = -1.0*rescale_lon( (double)parse_int4(gfld->igdtmpl[10]) / 1000000.0); + laea.standard_lat = (double)gfld->igdtmpl[11] / 1000000.0; + laea.central_lon = -1.0*rescale_lon( (double)parse_int4(gfld->igdtmpl[12]) / 1000000.0); + laea.dx_km = (double)gfld->igdtmpl[14] / 1000000.0; + laea.dy_km = (double)gfld->igdtmpl[15] / 1000000.0; // store the grid information @@ -1567,3 +1624,27 @@ double scaled2dbl(int scale_factor, int scale_value) { } //////////////////////////////////////////////////////////////////////// + +int parse_int4(g2int i) { + unsigned char c[4]; + unsigned long n = i; + + c[0] = (n >> 24) & 0xFF; + c[1] = (n >> 16) & 0xFF; + c[2] = (n >> 8) & 0xFF; + c[3] = n & 0xFF; + + // convert unsigned char to signed integer + int i_val; + if(c[0] & 0x80) { + i_val = -(((c[0] & 0x7f) << 24) + (c[1] << 16) + (c[2] << 8) + c[3]); + } + else { + i_val = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3]; + } + + return(i_val); +} + +//////////////////////////////////////////////////////////////////////// + diff --git a/src/libcode/vx_data2d_nccf/nccf_file.cc b/src/libcode/vx_data2d_nccf/nccf_file.cc index 0acfb0ba93..9c562bb74f 100644 --- a/src/libcode/vx_data2d_nccf/nccf_file.cc +++ b/src/libcode/vx_data2d_nccf/nccf_file.cc @@ -1483,10 +1483,299 @@ void NcCfFile::get_grid_mapping_azimuthal_equidistant(const NcVar *grid_mapping_ void NcCfFile::get_grid_mapping_lambert_azimuthal_equal_area(const NcVar *grid_mapping_var) { static const string method_name = "NcCfFile::get_grid_mapping_lambert_azimuthal_equal_area()"; + double x_coord_to_m_cf = 1.0; + double y_coord_to_m_cf = 1.0; + + // Look for the x/y dimensions + + for (int dim_num = 0; dim_num < _numDims; ++dim_num) + { + // Get the standard name for the coordinate variable + + const NcVar coord_var = get_var(_ncFile, _dims[dim_num]->getName().c_str()); + if (IS_INVALID_NC(coord_var)) continue; + + const NcVarAtt *std_name_att = get_nc_att(&coord_var, (string)"standard_name"); + if (IS_INVALID_NC_P(std_name_att)) { + if (std_name_att) delete std_name_att; + continue; + } + + ConcatString dim_std_name; + if (!get_att_value_chars(std_name_att, dim_std_name)) { + if (std_name_att) delete std_name_att; + continue; + } + + if (std_name_att) { + delete std_name_att; + std_name_att = (NcVarAtt *)0; + } + + // See if this is an X or Y dimension + + if ( dim_std_name == x_dim_key_name ) + { + _xDim = _dims[dim_num]; + + x_dim_var_name = GET_NC_NAME_P(_xDim).c_str(); + for (int var_num = 0; var_num < Nvars; ++var_num) + { + if ( Var[var_num].name == x_dim_var_name) + { + _xCoordVar = Var[var_num].var; + break; + } + } + } + + if ( dim_std_name == y_dim_key_name) + { + _yDim = _dims[dim_num]; + + y_dim_var_name = GET_NC_NAME_P(_yDim).c_str(); + for (int var_num = 0; var_num < Nvars; ++var_num) + { + if (Var[var_num].name == y_dim_var_name) + { + _yCoordVar = Var[var_num].var; + break; + } + } + } + + } + + if (_xDim == 0) + { + mlog << Error << "\n" << method_name << " -> " + << "Didn't find X dimension (projection_x_coordinate) in netCDF file.\n\n"; + exit(1); + } + + if (_yDim == 0) + { + mlog << Error << "\n" << method_name << " -> " + << "Didn't find Y dimension (projection_y_coordinate) in netCDF file.\n\n"; + exit(1); + } + + if (_xCoordVar == 0) + { + mlog << Error << "\n" << method_name << " -> " + << "Didn't find X coord variable (" << GET_NC_NAME_P(_xDim) + << ") in netCDF file.\n\n"; + exit(1); + } + + if (_yCoordVar == 0) + { + mlog << Error << "\n" << method_name << " -> " + << "Didn't find Y coord variable (" << GET_NC_NAME_P(_yDim) + << ") in netCDF file.\n\n"; + exit(1); + } + + if (get_data_size(_xCoordVar) != (int) GET_NC_SIZE_P(_xDim) || + get_data_size(_yCoordVar) != (int) GET_NC_SIZE_P(_yDim)) + { + mlog << Error << "\n" << method_name << " -> " + << "Coordinate variables don't match dimension sizes in netCDF file.\n\n"; + exit(1); + } + + // Handle coordinate variable units + + ConcatString x_coord_units_name; + if (!get_var_units(_xCoordVar, x_coord_units_name)) { + mlog << Warning << "\n" << method_name << " -> " + << "Units not given for X coordinate variable -- " + << "assuming meters.\n\n"; + } + else { + if (0 == x_coord_units_name.length()) { + mlog << Warning << "\n" << method_name << " -> " + << "Cannot extract X coordinate units from netCDF file -- " + << "assuming meters.\n\n"; + } + else { + if ( x_coord_units_name == "m" || + x_coord_units_name == "meter" || + x_coord_units_name == "meters") x_coord_to_m_cf = 1.0; + else if (x_coord_units_name == "km") x_coord_to_m_cf = 1000.0; + else { + mlog << Error << "\n" << method_name << " -> " + << "The X coordinates must be in meters or kilometers for MET.\n\n"; + exit(1); + } + } + } + + ConcatString y_coord_units_name; + if (!get_var_units(_yCoordVar, y_coord_units_name)) { + mlog << Warning << "\n" << method_name << " -> " + << "Units not given for Y coordinate variable -- " + << "assuming meters.\n\n"; + } + else { + if (0 == y_coord_units_name.length()) { + mlog << Warning << "\n" << method_name << " -> " + << "Cannot extract Y coordinate units from netCDF file -- " + << "assuming meters.\n\n"; + } + else { + if ( y_coord_units_name == "m" || + y_coord_units_name == "meter" || + y_coord_units_name == "meters" ) y_coord_to_m_cf = 1.0; + else if (y_coord_units_name == "km") y_coord_to_m_cf = 1000.0; + else { + mlog << Error << "\n" << method_name << " -> " + << "The X coordinates must be in meters or kilometers for MET.\n\n"; + exit(1); + } + } + } + + // Figure out the dx/dy and x/y pin values from the dimension variables + + long x_counts = GET_NC_SIZE_P(_xDim); + double x_values[x_counts]; + + get_nc_data(_xCoordVar, x_values); + + long y_counts = GET_NC_SIZE_P(_yDim); + double y_values[y_counts]; + + get_nc_data(_yCoordVar, y_values); + + // Unit conversion + + for (int i = 0; i DELTA_TOLERANCE) + { + mlog << Error << "\n" << method_name << " -> " + << "MET can only process Lambert Azimuthal Equal Area files " + << "where the delta along the x-axis is constant (" + << curr_delta << " != " << dx_m_a << ")\n\n"; + exit(1); + } + } + + for (int i = 1; i < (int)y_counts; ++i) + { + double curr_delta = fabs(y_values[i] - y_values[i-1]); + if (fabs(curr_delta - dy_m_a) > DELTA_TOLERANCE) + { + mlog << Error << "\n" << method_name << " -> " + << "MET can only process Lambert Azimuthal Equal Area files " + << "where the delta along the y-axis is constant (" + << curr_delta << " != " << dy_m_a << ")\n\n"; + exit(1); + } + } + + // Fill in the data structure. Remember to negate the longitude + // values since MET uses the mathematical coordinate system centered on + // the center of the earth rather than the regular map coordinate system. + + LaeaNetcdfData data; + data.name = laea_proj_type; + + // longitude_of_projection_origin (convert degrees east to west) + + data.prime_meridian_lon = get_nc_var_att_double( + grid_mapping_var, "longitude_of_prime_meridian", false); + + if(is_bad_data(data.prime_meridian_lon)) data.prime_meridian_lon = 0.0; + else data.prime_meridian_lon *= -1.0; + + // semi_major_axis (convert m to km) + + data.semi_major_axis_km = get_nc_var_att_double( + grid_mapping_var, "semi_major_axis", false); + + if(is_bad_data(data.semi_major_axis_km)) data.semi_major_axis_km = EARTH_MAJOR_AXIS_km; + else data.semi_major_axis_km /= m_per_km; + + // semi_minor_axis (convert m to km) + + data.semi_minor_axis_km = get_nc_var_att_double( + grid_mapping_var, "semi_minor_axis", false); + + if(is_bad_data(data.semi_minor_axis_km)) data.semi_minor_axis_km = EARTH_MAJOR_AXIS_km; + else data.semi_minor_axis_km /= m_per_km; + + // latitude_of_projection_origin + + data.proj_origin_lat = get_nc_var_att_double( + grid_mapping_var, "latitude_of_projection_origin"); + + // longitude_of_projection_origin (convert degrees east to west) + + data.proj_origin_lon = -1.0 * get_nc_var_att_double( + grid_mapping_var, "longitude_of_projection_origin"); + + // false_easting + + double false_easting = get_nc_var_att_double( + grid_mapping_var, "false_easting", false); + + if(!is_bad_data(false_easting) && !is_eq(false_easting, 0.0)) + { + mlog << Error << "\n" << method_name << " -> " + << "MET cannot process Lambert Azimuthal Equal Area files " + << "with non-zero false_easting (" << false_easting + << ").\n\n"; + exit(1); + } + + // false_northing + + double false_northing = get_nc_var_att_double( + grid_mapping_var, "false_northing", false); + + if(!is_bad_data(false_northing) && !is_eq(false_northing, 0.0)) + { + mlog << Error << "\n" << method_name << " -> " + << "MET cannot process Lambert Azimuthal Equal Area files " + << "with non-zero false_northing (" << false_northing + << ").\n\n"; + exit(1); + } + + // Calculate the pin indices. The pin will be located at the grid's reference + // location since that's the only lat/lon location we know about. + + data.x_pin = -(x_values[0] / dx_m); + data.y_pin = -(y_values[0] / dy_m); + + data.dx_km = dx_m / m_per_km; + data.dy_km = dy_m / m_per_km; + data.nx = _xDim->getSize(); + data.ny = _yDim->getSize(); + + data.dump(); + + // Instantiate grid + + grid.set(data); + if (dy_m < 0) grid.set_swap_to_north(true); - mlog << Error << "\n" << method_name << " -> " - << "Lambert azimuthal equal area grid not handled in MET.\n\n"; - exit(1); } @@ -1643,7 +1932,6 @@ void NcCfFile::get_grid_mapping_lambert_conformal_conic(const NcVar *grid_mappin << "Units not given for X coordinate variable -- assuming meters.\n\n"; } else { - //const char *x_coord_units_name = x_coord_units_att->getValues(att->as_string(0); if (0 == x_coord_units_name.length()) { mlog << Warning << "\n" << method_name << " -> " << "Cannot extract X coordinate units from netCDF file -- " @@ -1668,7 +1956,6 @@ void NcCfFile::get_grid_mapping_lambert_conformal_conic(const NcVar *grid_mappin << "Units not given for Y coordinate variable -- assuming meters.\n\n"; } else { - //const char *y_coord_units_name = y_coord_units_att->getValues(att->as_string(0); if (0 == y_coord_units_name.length()) { mlog << Warning << "\n" << method_name << " -> " << "Cannot extract Y coordinate units from netCDF file -- " @@ -1692,13 +1979,11 @@ void NcCfFile::get_grid_mapping_lambert_conformal_conic(const NcVar *grid_mappin long x_counts = GET_NC_SIZE_P(_xDim); double x_values[x_counts]; - //_xCoordVar->get(x_values, &x_counts); get_nc_data(_xCoordVar, x_values); long y_counts = GET_NC_SIZE_P(_yDim); double y_values[y_counts]; - //_yCoordVar->get(y_values, &y_counts); get_nc_data(_yCoordVar, y_values); // Unit conversion @@ -1780,6 +2065,8 @@ void NcCfFile::get_grid_mapping_lambert_conformal_conic(const NcVar *grid_mappin data.ny = _yDim->getSize(); data.so2_angle = 0.0; + data.dump(); + grid.set(data); if (dy_m < 0) grid.set_swap_to_north(true); @@ -2277,6 +2564,8 @@ void NcCfFile::get_grid_mapping_polar_stereographic(const NcVar *grid_mapping_va data.false_east = false_east; data.false_north = false_north; + data.dump(); + grid.set(data); //Note: do not set grid.set_swap_to_north() @@ -2579,7 +2868,10 @@ void NcCfFile::get_grid_mapping_rotated_latitude_longitude(const NcVar *grid_map data.aux_rotation = 0; + data.dump(); + grid.set(data); + grid.set_swap_to_north(swap_to_north); if(grid_np_lat_att) delete grid_np_lat_att; if(grid_np_lon_att) delete grid_np_lon_att; @@ -2888,6 +3180,8 @@ void NcCfFile::get_grid_mapping_geostationary( data.scene_id = scene_id_str; } + data.dump(); + // Note: Computing lat/lon was deferred because it took 1 minutes grid.set(data); @@ -3171,6 +3465,8 @@ void NcCfFile::get_grid_from_lat_lon_vars(NcVar *lat_var, NcVar *lon_var, lat_counts, lon_counts, swap_to_north); + data.dump(); + grid.set(data); // resets swap_to_north to false if (swap_to_north) grid.set_swap_to_north(true); } diff --git a/src/libcode/vx_grid/find_grid_by_name.cc b/src/libcode/vx_grid/find_grid_by_name.cc index 00365cb6f3..8197bbec49 100644 --- a/src/libcode/vx_grid/find_grid_by_name.cc +++ b/src/libcode/vx_grid/find_grid_by_name.cc @@ -60,8 +60,7 @@ if ( i.st ) { g.set( *(i.st) ); status = true; } if ( i.ll ) { g.set( *(i.ll) ); status = true; } if ( i.m ) { g.set( *(i.m) ); status = true; } if ( i.g ) { g.set( *(i.g) ); status = true; } -// if ( i.la ) { g.set( *(i.la) ); status = true; } -if ( i.lg ) { g.set( *(i.lg) ); status = true; } +if ( i.la ) { g.set( *(i.la) ); status = true; } return ( status ); @@ -205,22 +204,6 @@ for (j=0; jlat_LL == g2->lat_LL && - g1->lat_UL == g2->lat_UL && - g1->lat_LR == g2->lat_LR && - is_eq (rescale_lon(g1->lon_LL), - rescale_lon(g2->lon_LL), loose_tol) && - is_eq (rescale_lon(g1->lon_UL), - rescale_lon(g2->lon_UL), loose_tol) && - is_eq (rescale_lon(g1->lon_LR), - rescale_lon(g2->lon_LR), loose_tol) && - g1->nx == g2->nx && - g1->ny == g2->ny ) status = true; - -return ( status ); - -} -*/ - -//////////////////////////////////////////////////////////////////////// - - -bool is_eq(const LaeaGrib2Data * g1, const LaeaGrib2Data * g2) +bool is_eq(const LaeaData * g1, const LaeaData * g2) { diff --git a/src/libcode/vx_grid/grid_base.h b/src/libcode/vx_grid/grid_base.h index efc810b85e..81059c0353 100644 --- a/src/libcode/vx_grid/grid_base.h +++ b/src/libcode/vx_grid/grid_base.h @@ -70,8 +70,7 @@ class GridInfo { void set(const GaussianData &); void set(const GoesImagerData &); void set(const TcrmwData &); - // void set(const LaeaData &); - void set(const LaeaGrib2Data &); + void set(const LaeaData &); void set(const SemiLatLonData &); void create_grid(Grid &) const; @@ -88,8 +87,7 @@ class GridInfo { const GaussianData * g; // allocated const GoesImagerData * gi; // allocated const TcrmwData * tc; // allocated - // const LaeaData * la; // allocated - const LaeaGrib2Data * lg; // allocated + const LaeaData * la; // allocated const SemiLatLonData * sl; // allocated }; @@ -209,8 +207,8 @@ class Grid : public GridInterface { Grid(const GaussianData &); Grid(const GoesImagerData &); Grid(const TcrmwData &); - // Grid(const LaeaData &); - Grid(const LaeaGrib2Data &); + Grid(const LaeaData &); + Grid(const LaeaNetcdfData &); Grid(const SemiLatLonData &); virtual ~Grid(); Grid(const Grid &); @@ -231,8 +229,8 @@ class Grid : public GridInterface { void set (const GaussianData &); void set (const GoesImagerData &); void set (const TcrmwData &); - // void set (const LaeaData &); - void set (const LaeaGrib2Data &); + void set (const LaeaData &); + void set (const LaeaNetcdfData &); void set (const SemiLatLonData &); void set_swap_to_north(bool swap_to_north); @@ -293,8 +291,7 @@ extern bool is_eq(const RotatedLatLonData *, const RotatedLatLonData *); extern bool is_eq(const MercatorData *, const MercatorData *); extern bool is_eq(const GaussianData *, const GaussianData *); extern bool is_eq(const GoesImagerData *, const GoesImagerData *); -// extern bool is_eq(const LaeaData *, const LaeaData *); -extern bool is_eq(const LaeaGrib2Data *, const LaeaGrib2Data *); +extern bool is_eq(const LaeaData *, const LaeaData *); extern bool is_eq(const SemiLatLonData *, const SemiLatLonData *); diff --git a/src/libcode/vx_grid/laea_grid.cc b/src/libcode/vx_grid/laea_grid.cc index 914873662b..b9b84c1f48 100644 --- a/src/libcode/vx_grid/laea_grid.cc +++ b/src/libcode/vx_grid/laea_grid.cc @@ -68,143 +68,132 @@ clear(); //////////////////////////////////////////////////////////////////////// -/* + LaeaGrid::LaeaGrid(const LaeaData & data) { clear(); -memset(&Grib2Data, 0, sizeof(Grib2Data)); +memset(&Data, 0, sizeof(Data)); Data = data; +lat_LL = data.lat_first; +lon_LL = data.lon_first; + +lat_pole = data.standard_lat; +lon_pole = data.central_lon; + +Name = data.name; +SpheroidName = data.spheroid_name; +Data.spheroid_name = SpheroidName.c_str(); + Nx = data.nx; Ny = data.ny; - -Name = data.name; -SpheroidName = data.geoid; -if ( strcmp(data.geoid, "WGS_84") == 0 ) { +geoid.set_ab(data.equatorial_radius_km, data.polar_radius_km); - geoid.set_ab(6378.137, 6356.752); +geoid.set_name(data.spheroid_name); - geoid.set_name("WGS_84"); +aff.set_mb(1.0/(data.dx_km), 0.0, 0.0, 1.0/(data.dy_km), 0.0, 0.0); -} else { +double xx, yy; - mlog << Error << "\nLaeaGrid::LaeaGrid(const LaeaData &) -> " - << "unrecognized geoid ... \"" << data.geoid << "\"\n\n"; +latlon_to_xy(data.lat_first, data.lon_first, xx, yy); - exit ( 1 ); +aff.set_translation(-xx, -yy); -} + // + // done + // -calc_aff(); +return; } -*/ + //////////////////////////////////////////////////////////////////////// -LaeaGrid::LaeaGrid(const LaeaGrib2Data & grib2_data) +LaeaGrid::LaeaGrid(const LaeaNetcdfData & nc) { -clear(); - -memset(&Data, 0, sizeof(Data)); -Data = grib2_data; +double u, v, lat, lon; +const double tol = 1.0e-5; -lat_LL = grib2_data.lat_first; -lon_LL = grib2_data.lon_first; +clear(); -lat_pole = grib2_data.standard_lat; -lon_pole = grib2_data.central_lon; +Data.name = nc.name; -Name = grib2_data.name; -SpheroidName = grib2_data.spheroid_name; -Data.spheroid_name = SpheroidName.c_str(); +Data.radius_km = 0.0; -Nx = grib2_data.nx; -Ny = grib2_data.ny; +Data.is_sphere = false; -geoid.set_ab(grib2_data.equatorial_radius_km, grib2_data.polar_radius_km); +Data.equatorial_radius_km = nc.semi_major_axis_km; +Data.polar_radius_km = nc.semi_minor_axis_km; -geoid.set_name(grib2_data.spheroid_name); +Data.dx_km = nc.dx_km; +Data.dy_km = nc.dy_km; -// aff.set_mb(1.0, 0.0, 0.0, 1.0, 1.0, 1.0); -// aff.set_mb(2.0, 0.0, 0.0, 2.0, 1.0, 1.0); +Data.standard_lat = nc.proj_origin_lat; +Data.central_lon = nc.proj_origin_lon; -double s = 1.0; +Data.nx = nc.nx; +Data.ny = nc.ny; -aff.set_mb(s, 0.0, 0.0, s, 1.0, 1.0); +Nx = Data.nx; +Ny = Data.ny; -// aff.set_mb(grib2_data.dx_km, 0.0, 0.0, grib2_data.dy_km, 1.0, 1.0); -double xx, yy; +lat_pole = nc.proj_origin_lat; +lon_pole = nc.proj_origin_lon; -// latlon_to_xy(Data.lat_pole, Data.lon_pole, xx, yy); -// aff.set_pin(xx, yy, 0.5*(Nx - 1.0), 0.5*(Ny - 1.0)); +Name = Data.name; -latlon_to_xy(grib2_data.lat_first, grib2_data.lon_first, xx, yy); -aff.set_pin(xx, yy, 0.0, 0.0); +if ( fabs((nc.semi_major_axis_km - nc.semi_minor_axis_km)/(nc.semi_major_axis_km)) < tol ) { - // - // done - // + Data.radius_km = nc.semi_major_axis_km; -return; + Data.is_sphere = true; } +geoid.set_ab(Data.equatorial_radius_km, Data.polar_radius_km); -//////////////////////////////////////////////////////////////////////// +Data.spheroid_name = "Undefined"; -/* -void LaeaGrid::calc_aff() - -{ +geoid.set_name(Data.spheroid_name); -double u_LL, v_LL; -double u_LR, v_LR; -double u_UL, v_UL; +aff.set_mb(1.0/(Data.dx_km), 0.0, 0.0, 1.0/(Data.dy_km), 0.0, 0.0); -double x_LL, y_LL; -double x_LR, y_LR; -double x_UL, y_UL; +latlon_to_xy(nc.proj_origin_lat, nc.proj_origin_lon, u, v); +aff.set_translation(nc.x_pin - u, nc.y_pin - v); -snyder_latlon_to_xy(Data.lat_LL, Data.lon_LL, u_LL, v_LL); -snyder_latlon_to_xy(Data.lat_LR, Data.lon_LR, u_LR, v_LR); -snyder_latlon_to_xy(Data.lat_UL, Data.lon_UL, u_UL, v_UL); + //////////////////////// +xy_to_latlon(0.0, 0.0, lat, lon); -x_LL = 0.0; -y_LL = 0.0; +Data.lat_first = lat; +Data.lon_first = lon; -x_LR = Data.nx - 1.0; -y_LR = 0.0; +xy_to_latlon(Nx - 1.0, 0.0, lat, lon); -x_UL = 0.0; -y_UL = Data.ny - 1.0; +lat_LR = lat; +lon_LR = lon; +xy_to_latlon(0.0, Ny - 1.0, lat, lon); -aff.set_three_points( +lat_UL = lat; +lon_UL = lon; - u_LL, v_LL, x_LL, y_LL, - - u_LR, v_LR, x_LR, y_LR, - - u_UL, v_UL, x_UL, y_UL - -); - - -return; + // + // done + // } -*/ + //////////////////////////////////////////////////////////////////////// @@ -234,8 +223,7 @@ lon_LR = 0.0; lat_pole = 0.0; -memset(&Data, 0, sizeof(Data)); -// memset(&Grib2Data, 0, sizeof(Grib2Data)); +memset(&Data, 0, sizeof(Data)); return; @@ -251,13 +239,10 @@ void LaeaGrid::latlon_to_xy(double lat, double lon, double & x, double & y) cons double u, v; - snyder_latlon_to_xy(lat, lon, u, v); - uv_to_xy(u, v, x, y); - return; } @@ -289,7 +274,6 @@ lat1 = lat_pole; lambda0 = -lon_pole; - beta1 = geoid.beta(lat1); m1 = geoid.m_func(lat1); @@ -306,7 +290,6 @@ rho = sqrt( uu*uu + vv*vv ); // Eq 24-28, page 189 ce = 2.0*asind(rho/(2.0*Rq)); // Eq 24-29, page 189 - beta = asind( cosd(ce)*sind(beta1) + ((D*v)/rho)*sind(ce)*cosd(beta1) ); // Eq 24-30, page 189 s2 = sind(2.0*beta); @@ -317,25 +300,20 @@ num = u*sind(ce); denom = D*rho*cosd(beta1)*cosd(ce) - D*D*v*sind(beta1)*sind(ce); - -// lon = lambda0 + atand(num/denom); // maybe want atan2 here? // Eq 24-26, page 188 -lon = lambda0 + atan2d(num, denom); // maybe want atan2 here? +lon = lambda0 + atan2d(num, denom); // Eq 24-26, page 188 lon = -lon; - t2 = E2/3.0 + (31.0*E4)/180.0 + (517.0*E6)/5040.0; t4 = (23.0*E4)/360.0 + (251.0*E6)/3780.0; t6 = (761.0*E6)/45360.0; - cor = t2*s2 + t4*s4 + t6*s6; // Eq 3-18, page 189 lat = beta + cor*deg_per_rad; - // // done // @@ -355,13 +333,11 @@ double LaeaGrid::calc_area(int x, int y) const double u[4], v[4]; double sum; - xy_to_uv(x - 0.5, y - 0.5, u[0], v[0]); // lower left xy_to_uv(x + 0.5, y - 0.5, u[1], v[1]); // lower right xy_to_uv(x + 0.5, y + 0.5, u[2], v[2]); // upper right xy_to_uv(x - 0.5, y + 0.5, u[3], v[3]); // upper left - sum = uv_closedpolyline_area(u, v, 4); sum *= earth_radius_km*earth_radius_km; @@ -426,7 +402,7 @@ const char * LaeaGrid::projection_name() const { -return "Polar Laea"; +return "Laea"; } @@ -537,8 +513,6 @@ void LaeaGrid::dump(ostream & out, int depth) const Indent prefix(depth); - - out << prefix << "Name = "; out << prefix << "SpheroidName = "; @@ -572,14 +546,21 @@ ConcatString LaeaGrid::serialize(const char *sep) const { ConcatString a; +char junk[256]; -a << "Projection: Labmbert Azimuthal Equal Area" << sep; +a << "Projection: Lambert Azimuthal Equal Area" << sep; a << "Nx: " << Nx << sep; a << "Ny: " << Ny << sep; a << "SpheroidName: " << SpheroidName << sep; +snprintf(junk, sizeof(junk), "Lat_LL: %.3f", lat_LL); a << junk << sep; +snprintf(junk, sizeof(junk), "Lon_LL: %.3f", lon_LL); a << junk << sep; + +snprintf(junk, sizeof(junk), "Lat_Pole: %.3f", lat_pole); a << junk << sep; +snprintf(junk, sizeof(junk), "Lon_Pole: %.3f", lon_pole); a << junk << sep; + // // done // @@ -665,13 +646,11 @@ const double S = sind(lat); const double E = geoid.e(); const double es = E*S; - z = sqrt(1.0 - es*es); z = C/z; - return z; } @@ -694,56 +673,43 @@ double beta1, beta; double m1, lambda, lambda0, lat1, delta; A = geoid.a_km(); -// A = 1.0; - lambda = -lon; lambda0 = -lon_pole; lat1 = lat_pole; - delta = lambda - lambda0; - beta1 = geoid.beta(lat1); beta = geoid.beta(lat); - Qp = geoid.qp_direct(); Rq = A*sqrt(0.5*Qp); - m1 = snyder_m_func(lat1); - - B = 1.0 + sind(beta1)*sind(beta) + cosd(beta1)*cosd(beta)*cosd(delta); B = sqrt(2.0/B); B = Rq*B; - D = Rq*cosd(beta1); D = (A*m1)/D; - x_snyder = cosd(beta)*sind(delta); x_snyder *= B*D; - - y_snyder = cosd(beta1)*sind(beta) - sind(beta1)*cosd(beta)*cosd(delta); y_snyder *= B/D; - return; } @@ -812,7 +778,7 @@ exit ( 1 ); //////////////////////////////////////////////////////////////////////// -/* + Grid::Grid(const LaeaData & data) { @@ -822,11 +788,11 @@ init_from_scratch(); set(data); } -*/ + //////////////////////////////////////////////////////////////////////// -/* + void Grid::set(const LaeaData & data) { @@ -838,7 +804,7 @@ rep = new LaeaGrid (data); if ( !rep ) { mlog << Error << "\nGrid::set(const LaeaData &) -> " - << "memory allocation error\n\n"; + << "memory allocation error\n\n"; exit ( 1 ); @@ -847,18 +813,18 @@ if ( !rep ) { return; } -*/ + //////////////////////////////////////////////////////////////////////// -Grid::Grid(const LaeaGrib2Data & grib2_data) +Grid::Grid(const LaeaNetcdfData & data) { init_from_scratch(); -set(grib2_data); +set(data); } @@ -866,17 +832,17 @@ set(grib2_data); //////////////////////////////////////////////////////////////////////// -void Grid::set(const LaeaGrib2Data & grib2_data) +void Grid::set(const LaeaNetcdfData & data) { clear(); -rep = new LaeaGrid (grib2_data); +rep = new LaeaGrid (data); if ( !rep ) { - mlog << Error << "\nGrid::set(const LaeaGrib2Data &) -> " + mlog << Error << "\nGrid::set(const LaeaNetcdfData &) -> " << "memory allocation error\n\n"; exit ( 1 ); diff --git a/src/libcode/vx_grid/laea_grid.h b/src/libcode/vx_grid/laea_grid.h index 52347cf632..3a9c92751a 100644 --- a/src/libcode/vx_grid/laea_grid.h +++ b/src/libcode/vx_grid/laea_grid.h @@ -47,37 +47,30 @@ class LaeaGrid : public GridRep { LaeaGrid(); ~LaeaGrid(); - // LaeaGrid(const LaeaData &); - LaeaGrid(const LaeaGrib2Data &); + LaeaGrid(const LaeaData &); + LaeaGrid(const LaeaNetcdfData &); Spheroid geoid; - // LaeaData Data; - // LaeaGrib2Data Grib2Data; - LaeaGrib2Data Data; + LaeaData Data; ///////////////////////////////////// - // from the old Laea_Data class + double lat_LL; // lower left + double lon_LL; + double lat_UL; // upper left + double lon_UL; - double lat_LL; // lower left - double lon_LL; + double lat_LR; // lower right + double lon_LR; - double lat_UL; // upper left - double lon_UL; - - double lat_LR; // lower right - double lon_LR; - - double lat_pole; - double lon_pole; + double lat_pole; + double lon_pole; ///////////////////////////////////// - // bool UseGrib2Data; - double snyder_m_func(double lat) const; void snyder_latlon_to_xy(double lat, double lon, double & x_snyder, double & y_snyder) const; @@ -88,9 +81,6 @@ class LaeaGrid : public GridRep { void clear(); - - void calc_aff(); - void xy_to_uv(double x, double y, double & u, double & v) const; void uv_to_xy(double u, double v, double & x, double & y) const; diff --git a/src/libcode/vx_grid/laea_grid_defs.h b/src/libcode/vx_grid/laea_grid_defs.h index 925d977fa2..5382aa752b 100644 --- a/src/libcode/vx_grid/laea_grid_defs.h +++ b/src/libcode/vx_grid/laea_grid_defs.h @@ -16,23 +16,24 @@ //////////////////////////////////////////////////////////////////////// -/* -struct LaeaData { - const char * name; // not allocated - const char * geoid; // not allocated +struct LaeaNetcdfData { - double lat_LL; // lower left - double lon_LL; + const char * name; - double lat_UL; // upper left - double lon_UL; + double prime_meridian_lon; - double lat_LR; // lower right - double lon_LR; + double semi_major_axis_km; + double semi_minor_axis_km; - double lat_pole; - double lon_pole; + double proj_origin_lat; + double proj_origin_lon; + + double x_pin; + double y_pin; + + double dx_km; + double dy_km; int nx; int ny; @@ -40,7 +41,7 @@ struct LaeaData { void dump() const; }; -*/ + //////////////////////////////////////////////////////////////////////// @@ -56,7 +57,7 @@ struct LaeaData { // -struct LaeaGrib2Data { +struct LaeaData { const char * name; // not allocated const char * spheroid_name; // not allocated @@ -85,72 +86,6 @@ struct LaeaGrib2Data { }; -//////////////////////////////////////////////////////////////////////// - - - // - // Laea grid definitions - // - -/* -static const LaeaData laea_test_data = { - - - "laea_test", // name - - "WGS_84", // geoid - - 31.7462, // lat_LL // lower left - 10.4346, // lon_LL - - 67.0228, // lat_UL // upper left - 39.5358, // lon_UL - - 31.9877, // lat_LR // lower right - -29.421, // lon_LR - - 55.0, // lat_pole - -10.0, // lon_pole - - 1900, // nx - 2200, // ny - -}; -*/ - -static const LaeaGrib2Data laea_grib2_test_data = { - - - "laea_grib2_test", - - "Grib template 4", - - 0.0, // radius_km - - 0.5*6378.1370, // equatorial_radius_km - 0.5*6356.752314, // polar_radius_km - - 44.5172, // lat_first - 17.1171, // lon_first - - 54.900000, // standard_lat - 2.500000, // central_lon - - 2.000000, // dx_km - 2.000000, // dy_km - - 1042, // nx - 970, // ny - - // 970, // ny - // 1042, // nx - - false // is_sphere - - -}; - - //////////////////////////////////////////////////////////////////////// @@ -159,5 +94,3 @@ static const LaeaGrib2Data laea_grib2_test_data = { //////////////////////////////////////////////////////////////////////// - - diff --git a/src/libcode/vx_nc_util/grid_output.cc b/src/libcode/vx_nc_util/grid_output.cc index e0d2e57280..5d5cfbcfb8 100644 --- a/src/libcode/vx_nc_util/grid_output.cc +++ b/src/libcode/vx_nc_util/grid_output.cc @@ -36,8 +36,7 @@ static void rotated_latlon_grid_output (const GridInfo &, NcFile * ncfile); static void stereographic_grid_output (const GridInfo &, NcFile * ncfile); static void mercator_grid_output (const GridInfo &, NcFile * ncfile); static void gaussian_grid_output (const GridInfo &, NcFile * ncfile); -// static void laea_grid_output (const GridInfo &, NcFile * ncfile); -static void laea_grib2_grid_output (const GridInfo &, NcFile * ncfile); +static void laea_grid_output (const GridInfo &, NcFile * ncfile); static void semilatlon_grid_output (const GridInfo &, NcFile * ncfile, NcDim &, NcDim &); static void write_semilatlon_var (NcFile * ncfile, const char *, NcDim *, const NumArray &, const char *, @@ -67,8 +66,7 @@ else if ( info.ll ) latlon_grid_output (info, ncfile); else if ( info.rll ) rotated_latlon_grid_output (info, ncfile); else if ( info.m ) mercator_grid_output (info, ncfile); else if ( info.g ) gaussian_grid_output (info, ncfile); -// else if ( info.la ) laea_grid_output (info, ncfile); -else if ( info.lg ) laea_grib2_grid_output (info, ncfile); +else if ( info.la ) laea_grid_output (info, ncfile); else if ( info.sl ) semilatlon_grid_output (info, ncfile, lat_dim, lon_dim); else { @@ -646,7 +644,7 @@ return; //////////////////////////////////////////////////////////////////////// -/* + void laea_grid_output(const GridInfo & info, NcFile * ncfile) { @@ -657,126 +655,6 @@ const LaeaData & data = *(info.la); ncfile->putAtt("Projection", "Lambert Azimuthal Equal Area"); -if(data.geoid) ncfile->putAtt("geoid", data.geoid); - - // - // lat_LL - // - -snprintf(junk, sizeof(junk), "%f degrees_north", data.lat_LL); - -ncfile->putAtt("lat_LL", junk); - - // - // lon_LL - // - -t = data.lon_LL; - -if ( !west_longitude_positive ) t = -t; - -snprintf(junk, sizeof(junk), "%f degrees_east", t); - -ncfile->putAtt("lon_LL", junk); - - // - // lat_UL - // - -snprintf(junk, sizeof(junk), "%f degrees_north", data.lat_UL); - -ncfile->putAtt("lat_UL", junk); - - // - // lon_UL - // - -t = data.lon_UL; - -if ( !west_longitude_positive ) t = -t; - -snprintf(junk, sizeof(junk), "%f degrees_east", t); - -ncfile->putAtt("lon_UL", junk); - - // - // lat_LR - // - -snprintf(junk, sizeof(junk), "%f degrees_north", data.lat_LR); - -ncfile->putAtt("lat_LR", junk); - - // - // lon_LR - // - -t = data.lon_LR; - -if ( !west_longitude_positive ) t = -t; - -snprintf(junk, sizeof(junk), "%f degrees_east", t); - -ncfile->putAtt("lon_LR", junk); - - // - // lat_pole - // - -snprintf(junk, sizeof(junk), "%f degrees_north", data.lat_pole); - -ncfile->putAtt("lat_pole", junk); - - // - // lon_pole - // - -t = data.lon_pole; - -if ( !west_longitude_positive ) t = -t; - -snprintf(junk, sizeof(junk), "%f degrees_east", t); - -ncfile->putAtt("lon_pole", junk); - - // - // nx - // - -snprintf(junk, sizeof(junk), "%d", data.nx); - -ncfile->putAtt("nx", junk); - - // - // ny - // - -snprintf(junk, sizeof(junk), "%d", data.ny); - -ncfile->putAtt("ny", junk); - - // - // done - // - -return; - -} -*/ - -//////////////////////////////////////////////////////////////////////// - - -void laea_grib2_grid_output(const GridInfo & info, NcFile * ncfile) - -{ - -char junk[256]; -double t; -const LaeaGrib2Data & data = *(info.lg); - -ncfile->putAtt("Projection", "Grib2 Lambert Azimuthal Equal Area"); - ncfile->putAtt("spheroid_name", data.spheroid_name); // diff --git a/src/libcode/vx_nc_util/nc_utils.h b/src/libcode/vx_nc_util/nc_utils.h index 93bb2966ce..2e3380c358 100644 --- a/src/libcode/vx_nc_util/nc_utils.h +++ b/src/libcode/vx_nc_util/nc_utils.h @@ -145,7 +145,7 @@ static const std::string scale_factor_att_name = "scale_factor"; static const std::string standard_name_att_name = "standard_name"; static const std::string units_att_name = "units"; -static const char nc_time_unit_exp[] = "^[a-z|A-Z]* since [0-9]\\{1,4\\}-[0-9]\\{1,2\\}-[0-9]\\{1,2\\}"; +static const char nc_time_unit_exp[] = "^[a-z|A-Z]* *since *[0-9]\\{1,4\\}-[0-9]\\{1,2\\}-[0-9]\\{1,2\\}"; static const char MET_NC_Obs_ver_1_2[] = "1.02"; static const char MET_NC_Obs_version[] = "1.02"; diff --git a/src/tools/other/pb2nc/pb2nc.cc b/src/tools/other/pb2nc/pb2nc.cc index 84f9a0fd9c..260062de28 100644 --- a/src/tools/other/pb2nc/pb2nc.cc +++ b/src/tools/other/pb2nc/pb2nc.cc @@ -54,9 +54,10 @@ // 015 02/10/18 Halley Gotway Add message_type_group_map. // 016 07/23/18 Halley Gotway Support masks defined by gen_vx_mask. // 017 07/06/22 Howard Soh METplus-Internal #19 Rename main to met_main -// 018 09/12/22 Prestopnik MET #2227 Remove namespace std and netCDF +// 018 09/12/22 Prestopnik, J. MET #2227 Remove namespace std and netCDF // from header files -// +// 019 07/21/23 Prestopnik, J. MET #2615 Add #include to compile +// successfully using gcc12 //////////////////////////////////////////////////////////////////////// @@ -72,6 +73,7 @@ #include #include +#include #include #include "main.h"