├── .gitignore ├── Cargo.toml ├── LICENSE ├── README.md ├── crates ├── grib_tables │ ├── Cargo.toml │ ├── README.md │ ├── csv │ │ ├── README.md │ │ ├── grib2_center.csv │ │ ├── grib2_process.csv │ │ ├── grib2_subcenter.csv │ │ ├── grib2_table_4_2_0_0.csv │ │ ├── grib2_table_4_2_0_1.csv │ │ ├── grib2_table_4_2_0_13.csv │ │ ├── grib2_table_4_2_0_14.csv │ │ ├── grib2_table_4_2_0_15.csv │ │ ├── grib2_table_4_2_0_16.csv │ │ ├── grib2_table_4_2_0_17.csv │ │ ├── grib2_table_4_2_0_18.csv │ │ ├── grib2_table_4_2_0_19.csv │ │ ├── grib2_table_4_2_0_190.csv │ │ ├── grib2_table_4_2_0_191.csv │ │ ├── grib2_table_4_2_0_2.csv │ │ ├── grib2_table_4_2_0_20.csv │ │ ├── grib2_table_4_2_0_21.csv │ │ ├── grib2_table_4_2_0_3.csv │ │ ├── grib2_table_4_2_0_4.csv │ │ ├── grib2_table_4_2_0_5.csv │ │ ├── grib2_table_4_2_0_6.csv │ │ ├── grib2_table_4_2_0_7.csv │ │ ├── grib2_table_4_2_10_0.csv │ │ ├── grib2_table_4_2_10_1.csv │ │ ├── grib2_table_4_2_10_191.csv │ │ ├── grib2_table_4_2_10_2.csv │ │ ├── grib2_table_4_2_10_3.csv │ │ ├── grib2_table_4_2_10_4.csv │ │ ├── grib2_table_4_2_1_0.csv │ │ ├── grib2_table_4_2_1_1.csv │ │ ├── grib2_table_4_2_1_2.csv │ │ ├── grib2_table_4_2_20_0.csv │ │ ├── grib2_table_4_2_20_1.csv │ │ ├── grib2_table_4_2_20_2.csv │ │ ├── grib2_table_4_2_2_0.csv │ │ ├── grib2_table_4_2_2_3.csv │ │ ├── grib2_table_4_2_2_4.csv │ │ ├── grib2_table_4_2_2_5.csv │ │ ├── grib2_table_4_2_2_6.csv │ │ ├── grib2_table_4_2_3_0.csv │ │ ├── grib2_table_4_2_3_1.csv │ │ ├── grib2_table_4_2_3_2.csv │ │ ├── grib2_table_4_2_3_3.csv │ │ ├── grib2_table_4_2_3_4.csv │ │ ├── grib2_table_4_2_3_5.csv │ │ ├── grib2_table_4_2_3_6.csv │ │ ├── grib2_table_4_2_4_0.csv │ │ ├── grib2_table_4_2_4_1.csv │ │ ├── grib2_table_4_2_4_10.csv │ │ ├── grib2_table_4_2_4_2.csv │ │ ├── grib2_table_4_2_4_3.csv │ │ ├── grib2_table_4_2_4_4.csv │ │ ├── grib2_table_4_2_4_5.csv │ │ ├── grib2_table_4_2_4_6.csv │ │ ├── grib2_table_4_2_4_7.csv │ │ ├── grib2_table_4_2_4_8.csv │ │ ├── grib2_table_4_2_4_9.csv │ │ ├── grib2_table_4_2_local_Canada.csv │ │ ├── grib2_table_4_2_local_HPC.csv │ │ ├── grib2_table_4_2_local_MRMS.csv │ │ ├── grib2_table_4_2_local_NCEP.csv │ │ ├── grib2_table_4_2_local_NDFD.csv │ │ ├── grib2_table_4_2_local_index.csv │ │ ├── grib2_table_4_5.csv │ │ └── grib2_table_versions.csv │ └── src │ │ ├── csv_reader.rs │ │ ├── csv_reader │ │ ├── read_local_index.rs │ │ └── read_table_4_2.rs │ │ ├── lib.rs │ │ ├── parameter.rs │ │ └── parameter │ │ ├── database.rs │ │ └── numeric_id.rs ├── hypergrib │ ├── Cargo.toml │ └── src │ │ ├── datasets.rs │ │ ├── datasets │ │ ├── gefs.rs │ │ └── gefs │ │ │ ├── test_paths.csv │ │ │ ├── test_utils.rs │ │ │ └── version.rs │ │ ├── lib.rs │ │ └── main.rs ├── hypergrib_idx_parser │ ├── Cargo.toml │ ├── README.md │ └── src │ │ └── lib.rs └── hypergrib_indexer │ ├── Cargo.toml │ ├── README.md │ ├── datasets │ └── gefs │ │ └── index.yaml │ └── src │ ├── coord_labels_builder.rs │ ├── datasets.rs │ ├── datasets │ └── gefs.rs │ ├── ingest_yaml.rs │ ├── lib.rs │ └── main.rs └── design.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | debug/ 4 | target/ 5 | 6 | # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries 7 | # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html 8 | Cargo.lock 9 | 10 | # These are backup files generated by rustfmt 11 | **/*.rs.bk 12 | 13 | # MSVC Windows builds of rustc generate these, which store debugging information 14 | *.pdb 15 | 16 | # GRIB .idx files 17 | *.idx 18 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = ["crates/*"] 3 | resolver = "2" 4 | 5 | [workspace.package] 6 | edition = "2021" 7 | license = "MIT" 8 | homepage = "https://github.com/JackKelly/hypergrib" 9 | repository = "https://github.com/JackKelly/hypergrib" 10 | readme = "README.md" 11 | authors = ["Jack Kelly "] 12 | categories = ["science", "science::geo", "parser-implementations"] 13 | keywords = ["GRIB", "weather", "meteorology", "climate", "oceanography"] 14 | 15 | [workspace.dependencies] # In alphabetical order 16 | anyhow = "1.0" 17 | bytes = "1.9" 18 | chrono = { version = "0.4", default-features = false, features = ["std"] } 19 | clap = "4.5" # parse command line arguments etc. 20 | csv = "1.3" 21 | derive_more = { version = "1.0", features = ["display"]} 22 | futures-util = "0.3" 23 | gribberish = { git = "https://github.com/mpiannucci/gribberish.git" } 24 | glob = "0.3" 25 | hypergrib = { version = "0.0", path = "crates/hypergrib" } 26 | indicatif = "0.17" # progress bars etc. 27 | list_with_depth = "0.1" 28 | object_store = "0.11" 29 | regex = "1.11" 30 | serde = { version = "1.0", features = ["serde_derive"] } 31 | serde_yaml = "0.9" 32 | thiserror = "2.0" 33 | tokio = { version = "1.43", features = ["rt-multi-thread"]} 34 | url = "2.5" 35 | 36 | # Tell `reqwest` to use `hickory-dns` which provides an async DNS resolver 37 | # and a DNS cache. Without `hickory-dns`, `reqwest` uses the default *blocking* 38 | # DNS resolver, which causes `tokio` to create lots of blocking_threads 39 | # which is expensive and unnecessary. Note that we don't use `reqwest` directly. 40 | # Instead, we use `object_store`, which in turn uses `reqwest`. 41 | reqwest = { version = "0.12", features = ["hickory-dns"] } 42 | 43 | [profile.bench] 44 | debug = true # Enable debuginfo when profiling with cargo flamegraph. 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Jack Kelly 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hypergrib 2 | 3 | > [!WARNING] 4 | > Work on `hypergrib` is paused for now. It looks like [Dynamical.org](http://dynamical.org/), [IceChunk](https://www.linkedin.com/posts/earthmover_nasa-cloudcomputing-datascience-activity-7311385910879682560-Yuxq?utm_source=share&utm_medium=member_desktop&rcm=ACoAAAEnercBa7aVz-fCikGRwNaOXk-AoHlrPNc), 5 | > and modern Zarr libraries (like [`Zarr-Python`](https://zarr.readthedocs.io/en/stable/) v3 and [`zarrs`](https://github.com/LDeakin/zarrs)) 6 | > will solve the majority of the problems that `hypergrib` aimed to solve. 7 | > Please also note that this code is at a very early stage! 8 | 9 | This project is inspired by [kerchunk](https://fsspec.github.io/kerchunk/), [VirtualiZarr](https://github.com/zarr-developers/VirtualiZarr), [dynamical.org](https://dynamical.org), [gribberish](https://github.com/mpiannucci/gribberish), [xarray](https://docs.xarray.dev/en/stable/), [NODD](https://www.noaa.gov/nodd), [Camus Energy's work with GRIB files](https://discourse.pangeo.io/t/pangeo-showcase-optimizations-for-kerchunk-aggregation-and-zarr-i-o-at-scale-for-machine-learning/4074/3), and many other great projects! 10 | 11 | ## Goals 12 | - Allow users to lazily open petabyte-scale [GRIB](https://en.wikipedia.org/wiki/GRIB) datasets from their laptop with a single line of code: `xr.open_dataset`. 13 | - Lazily open a GRIB dataset with _trillions_ of GRIB messages in a fraction of a second, and minimal memory footprint (see https://github.com/JackKelly/hypergrib/discussions/14) 14 | - Create and constantly update metadata for the main public NWP datasets (so users don't have to do this themselves). 15 | - High performance reading of GRIB binary data: low latency and high bandwidth. A virtual machine with a 200 Gbps (gigabit per second) network interface card in the same region as the data should be able to read GRIBs at ~20 gigabytes per second from object storage. Each load should incur minimal latency. Random access should be as fast & efficient as possible. 16 | - Computational efficiency and "mechanical sympathy" with cloud object storage 17 | - Integrate with `xarray`. 18 | 19 | ## Background 20 | There are tens of petabytes of GRIB datasets in public cloud object stores. Wouldn't it be nice to be able to lazily open these datasets as easily as possible?! 21 | 22 | For example, the [NOAA Open Data Dissemination](https://www.noaa.gov/nodd) (NODD) programme has shared 59 petabytes so far (and growing rapidly), and [ECMWF](https://www.ecmwf.int/en/forecasts/datasets/open-data) are also busily sharing the bulk of their forecasts on cloud object storage. 23 | 24 | `hypergrib` is part of a [broader project which aims to make it as easy as possible to train, run, and research energy forecasting systems](https://github.com/JackKelly/lets_make_it_super_easy_to_use_weather_forecast_data). 25 | 26 | For more info on the background and motivation for `hypergrib`, please see [this blog post](https://openclimatefix.org/post/lazy-loading-making-it-easier-to-access-vast-datasets-of-weather-satellite-data). 27 | 28 | ## Planned design 29 | For the planned design, please see [design.md](https://github.com/JackKelly/hypergrib/blob/main/design.md). 30 | 31 | ## Why does `hypergrib` exist? 32 | At least to start with, `hypergrib` is an experiment (which stands on the shoulders of giants like `gribberish`, `kerchunk`, `Zarr`, `xarray`, `VirtualiZarr` etc.). The question we're asking with this experiment is: How fast can we go if we "cheat" by building a _special-purpose_ tool focused on reading multi-file GRIB datasets from cloud object storage. Let's throw in all the performance tricks we can think of. And let's also bake in a bunch of domain knowledge about GRIBs. 33 | 34 | We're explicitly _not_ trying to build a general-purpose tool like the awesome `kerchunk`. 35 | 36 | If `hypergrib` is faster than existing approaches, then maybe ideas from `hypergrib` could be merged into existing tools, and `hypergrib` will remain a testing ground rather than a production tool. Or maybe `hypergrib` will mature into a tool that can be used in production. 37 | 38 | ## Which read-patterns will perform well with `hypergrib`? 39 | Each GRIB message stores a 2D array: a single horizontal plane. For example, a single GRIB message might store the temperature across the entire globe at a particular timestep, and a particular vertical level. If your use-case reads all of (or a large portion of) the geographical scope of an NWP dataset then you should be able to read directly from GRIB datasets (without creating an intermediate dataset). 40 | 41 | For example, ML models that consider large geographical areas should be able to take advantage of the fact that each GRIB message is the entire horizontal plain. For example, energy generation or energy demand models that are trained across multiple countries. Or AI-NWP models which use global NWPs as the initialisation of the state of the atmosphere. But it's currently very hard to get energy data from across the entire globe. 42 | 43 | Alternatively, perhaps you are only reading a small geographical region (or even a single point). In this case, you can probably also still read directly from GRIBs *if* you don't need bandwidth of multiple gigabytes per second of useful data. 44 | 45 | ## Some read patterns will never be well-served by reading directly from GRIBs 46 | There are read-patterns which will never be well-served by reading from GRIBs (because of the way the data is structured on disk). For example, reading a long timeseries for a single geographical point will involve reading about one million times more data from disk than you need (assuming each 2D GRIB message is 1,000 x 1,000 pixels). So, even if you sustain 20 gigabytes per second from GRIBs in object storage, you'll only get 20 _kilobytes_ per second of useful data! For these use-cases, the data will almost certainly have to be converted to something like Zarr. (And, hopefully, `hypergrib` will help make the conversion from GRIB to Zarr as efficient as possible). 47 | 48 | That said, we're keen to explore ways to slice _into_ each GRIB message... See [`design.md`](https://github.com/JackKelly/hypergrib/blob/main/design.md#slice-into-each-grib-message). 49 | 50 | And, to help people obtain high performance even with read-patterns which aren't well-suited to GRIB, we're very interested in helping [create local high-performance caches of GRIB data](https://github.com/JackKelly/lets_make_it_super_easy_to_use_weather_forecast_data?tab=readme-ov-file#caching-grib-data-so-you-still-get-high-performance-for-read-patterns-which-dont-fit-with-gribs-data-layout) (which is perhaps more realistic than slicing _into_ each GRIB message). 51 | 52 | ## Name 53 | `hypergrib` uses "hyper" in its mathematical sense, like [hypercube](https://en.wikipedia.org/wiki/Hypercube) (an n-dimensional cube). Oh, and it's reminiscent of a very cool record label, too :) 54 | 55 | ## GRIB2 documentation 56 | 57 | 1. [WMO Manual on Codes, Volume I.2, 2023 edition](https://library.wmo.int/records/item/35625-manual-on-codes-volume-i-2-international-codes) - See overview diagram of GRIB messages on PDF page 21. 58 | 2. [wgrib C source code](https://github.com/NOAA-EMC/NCEPLIBS-grib_util/blob/develop/src/wgrib/wgrib.c) 59 | 3. [NCEP WMO GRIB2 Documentation](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/) 60 | 4. [GRIB2 use at NCEP](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/) 61 | 5. [`GDAL's CSV representation of the GRIB tables`](https://github.com/OSGeo/gdal/tree/master/frmts/grib/data). See the [README for that directory](https://github.com/OSGeo/gdal/blob/master/frmts/grib/degrib/README.TXT) 62 | -------------------------------------------------------------------------------- /crates/grib_tables/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "grib_tables" 3 | version = "0.1.2" 4 | edition.workspace = true 5 | license.workspace = true 6 | repository = "https://github.com/JackKelly/hypergrib/tree/main/crates/grib_tables" 7 | readme = "README.md" 8 | authors.workspace = true 9 | description = "Retrieve details of each GRIB parameter from the parameter abbreviation or from the numeric identifier" 10 | categories.workspace = true 11 | keywords.workspace = true 12 | 13 | [dependencies] 14 | anyhow.workspace = true 15 | csv.workspace = true 16 | derive_more.workspace = true 17 | glob.workspace = true 18 | regex.workspace = true 19 | serde.workspace = true 20 | thiserror.workspace = true 21 | -------------------------------------------------------------------------------- /crates/grib_tables/README.md: -------------------------------------------------------------------------------- 1 | ## grib_tables 2 | Retrieve details of each GRIB parameter from the parameter abbreviation (e.g. "TMP") or from the numeric identifier. 3 | 4 | `grib_tables` loads the [GDAL CSV files](https://github.com/OSGeo/gdal/tree/master/frmts/grib/data) into memory and allows the user to: 5 | - Map from parameter abbreviation strings to the numerical representation of that parameter, and the full parameter name and unit. 6 | - Map from the numerical representation of each parameter to the parameter name, abbreviation, and unit. 7 | 8 | [Documentation](https://docs.rs/grib_tables/latest/grib_tables/). 9 | 10 | ## Example 11 | 12 | ```rust 13 | use grib_tables::{Abbrev, MASTER_TABLE_VERSION, NumericId, Parameter, ParameterDatabase}; 14 | # fn main() -> anyhow::Result<()> { 15 | 16 | // Get a `ParameterDatabase` populated with the GRIB tables stored in the included CSV files: 17 | let param_db = ParameterDatabase::new().populate()?; 18 | 19 | // Get the numeric IDs and params associated with the abbreviation "TMP": 20 | let abbrev = Abbrev::from("TMP"); 21 | let params: Vec<(&NumericId, &Parameter)> = param_db.abbrev_to_parameter(&abbrev); 22 | // `params` is a `Vec` because 95 abbreviations are associated with multiple parameters. 23 | // See https://github.com/JackKelly/hypergrib/issues/20 24 | // (The type of `params` can be deduced by the compiler. The type is written out in 25 | // this example to make it easier to follow the documentation!) 26 | 27 | // "TMP" is associated with exactly one parameter: 28 | assert_eq!(params.len(), 1); 29 | 30 | // Let's get the `&NumericId` and `&Parameter` associated with the "TMP" abbreviation: 31 | let (temperature_numeric_id, temperature_param) = params.first().as_ref().unwrap(); 32 | 33 | // Let's get the `name` and `unit` of the `Parameter`: 34 | assert_eq!(temperature_param.name(), "Temperature"); 35 | assert_eq!(temperature_param.unit(), "K"); 36 | 37 | // Let's investigate the `NumericId` associated with "TMP": 38 | assert_eq!(temperature_numeric_id.product_discipline(), 0); 39 | assert_eq!(temperature_numeric_id.parameter_category(), 0); 40 | assert_eq!(temperature_numeric_id.parameter_number(), 0); 41 | assert_eq!( 42 | temperature_numeric_id.master_table_version(), 43 | MASTER_TABLE_VERSION 44 | ); 45 | 46 | // `MAX` values indicate missing values in the GRIB spec. 47 | // "TMP" is part of the GRIB master tables, and so is not 48 | // from a local originating center: 49 | assert_eq!(temperature_numeric_id.originating_center(), u16::MAX); 50 | assert_eq!(temperature_numeric_id.subcenter(), u8::MAX); 51 | assert_eq!(temperature_numeric_id.local_table_version(), u8::MAX); 52 | # Ok(()) 53 | # } 54 | ``` 55 | 56 | ## Why does `grib_tables` exist? 57 | To build [`hypergrib`](https://github.com/jackkelly/hypergrib), we need to be able to decode GRIB `.idx` files. 58 | 59 | We're aware of two awesome existing GRIB readers implemented in Rust ([`gribberish`](https://crates.io/crates/gribberish) and [`grib-rs`](https://crates.io/crates/grib)) but, at the time of writing, neither can decode `.idx` files. 60 | 61 | Hence `grib_tables` exists to enable `hypergrib` to decode GRIB `.idx` files. 62 | 63 | ## Related 64 | 65 | - [GRIB tables represented as `.csv` files in GDAL](https://github.com/OSGeo/gdal/tree/master/frmts/grib/data). See [the README for that directory](https://github.com/OSGeo/gdal/blob/master/frmts/grib/degrib/README.TXT). 66 | - [Gribberish discussion](https://github.com/mpiannucci/gribberish/issues/41#issuecomment-2404916278). 67 | - [Post to the gdal-dev mailing list](https://lists.osgeo.org/pipermail/gdal-dev/2024-October/059612.html) about splitting the CSVs and/or copying the CSVs.) 68 | - [A previous design sketch](https://github.com/JackKelly/rust-playground/tree/main/grib_tables) 69 | where we try to faithfully capture the GRIB tables hierarchy (Discipline > Category > Parameter). 70 | But this feels overkill. It might be _slightly_ faster because we can create a perfect hash at compile time. 71 | But we only need to look things up in the GRIB table whilst indexing a new GRIB dataset. 72 | When "normal users" use the dataset, they can just read the metadata that we create for the dataset. 73 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/README.md: -------------------------------------------------------------------------------- 1 | ## CSV files copied from `gdal` 2 | 3 | These CSV files are copied from https://github.com/OSGeo/gdal/tree/master/frmts/grib/data/ 4 | 5 | Please see the [GDAL README.TXT file about these CSV files](https://github.com/OSGeo/gdal/blob/master/frmts/grib/degrib/README.TXT). 6 | 7 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_center.csv: -------------------------------------------------------------------------------- 1 | code,name 2 | 0,"WMO Secretariat" 3 | 1,"Melbourne" 4 | 2,"Melbourne" 5 | 3,"Melbourne" 6 | 4,"Moscow" 7 | 5,"Moscow" 8 | 6,"Moscow" 9 | 7,"US-NCEP" 10 | 8,"US-NWSTG" 11 | 9,"US-Other" 12 | 10,"Cairo" 13 | 11,"Cairo" 14 | 12,"Dakar" 15 | 13,"Dakar" 16 | 14,"Nairobi" 17 | 15,"Nairobi" 18 | 16,"Casablanca" 19 | 17,"Tunis" 20 | 18,"Tunis Casablanca" 21 | 19,"Tunis Casablanca" 22 | 20,"Las Palmas" 23 | 21,"Algiers" 24 | 22,"ACMAD" 25 | 23,"Mozambique" 26 | 24,"Pretoria" 27 | 25,"La Réunion" 28 | 26,"Khabarovsk" 29 | 27,"Khabarovsk" 30 | 28,"New Delhi" 31 | 29,"New Delhi" 32 | 30,"Novosibirsk" 33 | 31,"Novosibirsk" 34 | 32,"Tashkent" 35 | 33,"Jeddah" 36 | 34,"Tokyo" 37 | 35,"Tokyo" 38 | 36,"Bangkok" 39 | 37,"Ulan Bator" 40 | 38,"Beijing" 41 | 39,"Beijing" 42 | 40,"Seoul" 43 | 41,"Buenos Aires" 44 | 42,"Buenos Aires" 45 | 43,"Brasilia" 46 | 44,"Brasilia" 47 | 45,"Santiago" 48 | 46,"Brazilian Space Agency" 49 | 47,"Colombia" 50 | 48,"Ecuador" 51 | 49,"Peru" 52 | 50,"Venezuela" 53 | 51,"Miami" 54 | 52,"Miami-NHC" 55 | 53,"Montreal" 56 | 54,"Montreal" 57 | 55,"San Francisco" 58 | 56,"ARINC Centre" 59 | 57,"US-Air Force Weather" 60 | 58,"US-Fleet Meteorology and Oceanography" 61 | 59,"US-FSL" 62 | 60,"US-NCAR" 63 | 61,"US-Service ARGOS" 64 | 62,"US-Naval Oceanographic Office" 65 | 64,"Honolulu" 66 | 65,"Darwin" 67 | 66,"Darwin" 68 | 67,"Melbourne" 69 | 69,"Wellington" 70 | 70,"Wellington" 71 | 71,"Nadi" 72 | 72,"Singapore" 73 | 73,"Malaysia" 74 | 74,"UK-Met-Exeter" 75 | 75,"UK-Met-Exeter" 76 | 76,"Moscow" 77 | 78,"Offenbach" 78 | 79,"Offenbach" 79 | 80,"Rome" 80 | 81,"Rome" 81 | 82,"Norrköping" 82 | 83,"Norrköping" 83 | 84,"Toulouse" 84 | 85,"Toulouse" 85 | 86,"Helsinki" 86 | 87,"Belgrade" 87 | 88,"Oslo" 88 | 89,"Prague" 89 | 90,"Episkopi" 90 | 91,"Ankara" 91 | 92,"Frankfurt/Main" 92 | 93,"London" 93 | 94,"Copenhagen" 94 | 95,"Rota" 95 | 96,"Athens" 96 | 97,"ESA-European Space Agency" 97 | 98,"ECMWF" 98 | 99,"DeBilt" 99 | 100,"Brazzaville" 100 | 101,"Abidjan" 101 | 102,"Libyan Arab Jamahiriya" 102 | 103,"Madagascar" 103 | 104,"Mauritius" 104 | 105,"Niger" 105 | 106,"Seychelles" 106 | 107,"Uganda" 107 | 108,"Tanzania" 108 | 109,"Zimbabwe" 109 | 110,"Hong-Kong, China" 110 | 111,"Afghanistan" 111 | 112,"Bahrain" 112 | 113,"Bangladesh" 113 | 114,"Bhutan" 114 | 115,"Cambodia" 115 | 116,"Democratic People's Republic of Korea" 116 | 117,"Islamic Republic of Iran" 117 | 118,"Iraq" 118 | 119,"Kazakhstan" 119 | 120,"Kuwait" 120 | 121,"Kyrgyz Republic" 121 | 122,"Lao People's Democratic Republic" 122 | 123,"Macao, China" 123 | 124,"Maldives" 124 | 125,"Myanmar" 125 | 126,"Nepal" 126 | 127,"Oman" 127 | 128,"Pakistan" 128 | 129,"Qatar" 129 | 130,"Republic of Yemen" 130 | 131,"Sri Lanka" 131 | 132,"Tajikistan" 132 | 133,"Turkmenistan" 133 | 134,"United Arab Emirates" 134 | 135,"Uzbekistan" 135 | 136,"Socialist Republic of Viet Nam" 136 | 140,"Bolivia" 137 | 141,"Guyana" 138 | 142,"Paraguay" 139 | 143,"Suriname" 140 | 144,"Uruguay" 141 | 145,"French Guyana" 142 | 146,"Brazilian Navy Hydrographic Centre" 143 | 150,"Antigua and Barbuda" 144 | 151,"Bahamas" 145 | 152,"Barbados" 146 | 153,"Belize" 147 | 154,"British Caribbean Territories" 148 | 155,"San Jose" 149 | 156,"Cuba" 150 | 157,"Dominica" 151 | 158,"Dominican Republic" 152 | 159,"El Salvador" 153 | 160,"US-NESDIS" 154 | 161,"US-OAR" 155 | 162,"Guatemala" 156 | 163,"Haiti" 157 | 164,"Honduras" 158 | 165,"Jamaica" 159 | 166,"Mexico" 160 | 167,"Netherlands Antilles and Aruba" 161 | 168,"Nicaragua" 162 | 169,"Panama" 163 | 170,"Saint Lucia NMC" 164 | 171,"Trinidad and Tobago" 165 | 172,"French Departments" 166 | 190,"Cook Islands" 167 | 191,"French Polynesia" 168 | 192,"Tonga" 169 | 193,"Vanuatu" 170 | 194,"Brunei" 171 | 195,"Indonesia" 172 | 196,"Kiribati" 173 | 197,"Federated States of Micronesia" 174 | 198,"New Caledonia" 175 | 199,"Niue" 176 | 200,"Papua New Guinea" 177 | 201,"Philippines" 178 | 202,"Samoa" 179 | 203,"Solomon Islands" 180 | 210,"Frascati (ESA/ESRIN)" 181 | 211,"Lanion" 182 | 212,"Lisboa" 183 | 213,"Reykiavik" 184 | 214,"Madrid" 185 | 215,"Zürich" 186 | 216,"Service ARGOS Toulouse" 187 | 217,"Bratislava" 188 | 218,"Budapest" 189 | 219,"Ljubljana" 190 | 220,"Warsaw" 191 | 221,"Zagreb" 192 | 222,"Albania" 193 | 223,"Armenia" 194 | 224,"Austria" 195 | 225,"Azerbaijan" 196 | 226,"Belarus" 197 | 227,"Belgium" 198 | 228,"Bosnia and Herzegovina" 199 | 229,"Bulgaria" 200 | 230,"Cyprus" 201 | 231,"Estonia" 202 | 232,"Georgia" 203 | 233,"Dublin" 204 | 234,"Israel" 205 | 235,"Jordan" 206 | 236,"Latvia" 207 | 237,"Lebanon" 208 | 238,"Lithuania" 209 | 239,"Luxembourg" 210 | 240,"Malta" 211 | 241,"Monaco" 212 | 242,"Romania" 213 | 243,"Syrian Arab Republic" 214 | 244,"The former Yugoslav Republic of Macedonia" 215 | 245,"Ukraine" 216 | 246,"Republic of Moldova" 217 | 254,"EUMETSAT Operation Centre" 218 | 256,"Angola" 219 | 257,"Benin" 220 | 258,"Botswana" 221 | 259,"Burkina Faso" 222 | 260,"Burundi" 223 | 261,"Cameroon" 224 | 262,"Cape Verde" 225 | 263,"Central African republic" 226 | 264,"Chad" 227 | 265,"Comoros" 228 | 266,"Democratic Republic of the Congo" 229 | 267,"Djibouti" 230 | 268,"Eritrea" 231 | 269,"Ethiopia" 232 | 270,"Gabon" 233 | 271,"Gambia" 234 | 272,"Ghana" 235 | 273,"Guinea" 236 | 274,"Guinea Bissau" 237 | 275,"Lesotho" 238 | 276,"Liberia" 239 | 277,"Malawi" 240 | 278,"Mali" 241 | 279,"Mauritania" 242 | 280,"Namibia" 243 | 281,"Nigeria" 244 | 282,"Rwanda" 245 | 283,"Sao Tome and Principe" 246 | 284,"Sierra Leone" 247 | 285,"Somalia" 248 | 286,"Sudan" 249 | 287,"Swaziland" 250 | 288,"Togo" 251 | 289,"Zambia" 252 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_process.csv: -------------------------------------------------------------------------------- 1 | center_code,process_code,name 2 | 7,2,"Ultra Violet Index Model" 3 | 7,3,"NCEP/ARL Transport and Dispersion Model" 4 | 7,4,"NCEP/ARL Smoke Model" 5 | 7,5,"Satellite Derived Precipitation and temperatures, from IR" 6 | 7,6,"NCEP/ARL Dust Model" 7 | 7,10,"Global Wind-Wave Forecast Model" 8 | 7,11,"Global Multi-Grid Wave Model (Static Grids)" 9 | 7,12,"Probabilistic Storm Surge" 10 | 7,19,"Limited-area Fine Mesh (LFM) analysis" 11 | 7,25,"Snow Cover Analysis" 12 | 7,30,"Forecaster generated field" 13 | 7,31,"Value added post processed field" 14 | 7,39,"Nested Grid forecast Model (NGM)" 15 | 7,42,"Global Optimum Interpolation Analysis (GOI) from GFS model" 16 | 7,43,"Global Optimum Interpolation Analysis (GOI) from 'Final' run" 17 | 7,44,"Sea Surface Temperature Analysis" 18 | 7,45,"Coastal Ocean Circulation Model" 19 | 7,46,"HYCOM - Global" 20 | 7,47,"HYCOM - North Pacific basin" 21 | 7,48,"HYCOM - North Atlantic basin" 22 | 7,49,"Ozone Analysis from TIROS Observations" 23 | 7,52,"Ozone Analysis from Nimbus 7 Observations" 24 | 7,53,"LFM-Fourth Order Forecast Model" 25 | 7,64,"Regional Optimum Interpolation Analysis (ROI)" 26 | 7,68,"80 wave triangular, 18-layer Spectral model from GFS model" 27 | 7,69,"80 wave triangular, 18 layer Spectral model from 'Medium Range Forecast' run" 28 | 7,70,"Quasi-Lagrangian Hurricane Model (QLM)" 29 | 7,73,"Fog Forecast model - Ocean Prod. Center" 30 | 7,74,"Gulf of Mexico Wind/Wave" 31 | 7,75,"Gulf of Alaska Wind/Wave" 32 | 7,76,"Bias corrected Medium Range Forecast" 33 | 7,77,"126 wave triangular, 28 layer Spectral model from GFS model" 34 | 7,78,"126 wave triangular, 28 layer Spectral model from 'Medium Range Forecast' run" 35 | 7,79,"Backup from the previous run" 36 | 7,80,"62 wave triangular, 28 layer Spectral model from 'Medium Range Forecast' run" 37 | 7,81,"Analysis from GFS (Global Forecast System)" 38 | 7,82,"Analysis from GDAS (Global Data Assimilation System)" 39 | 7,84,"MESO ETA Model (currently 12 km)" 40 | 7,86,"RUC Model from FSL (isentropic; scale: 60km at 40N)" 41 | 7,87,"CAC Ensemble Forecasts from Spectral (ENSMB)" 42 | 7,88,"NOAA Wave Watch III (NWW3) Ocean Wave Model" 43 | 7,89,"Non-hydrostatic Meso Model (NMM) Currently 8 km)" 44 | 7,90,"62 wave triangular, 28 layer spectral model extension of the 'Medium Range Forecast' run" 45 | 7,91,"62 wave triangular, 28 layer spectral model extension of the GFS model" 46 | 7,92,"62 wave triangular, 28 layer spectral model run from the 'Medium Range Forecast' final analysis" 47 | 7,93,"62 wave triangular, 28 layer spectral model run from the T62 GDAS analysis of the 'Medium Range Forecast' run" 48 | 7,94,"T170/L42 Global Spectral Model from MRF run" 49 | 7,95,"T126/L42 Global Spectral Model from MRF run" 50 | 7,96,"Global Forecast System Model" 51 | 7,98,"Climate Forecast System Model" 52 | 7,100,"RUC Surface Analysis (scale: 60km at 40N)" 53 | 7,101,"RUC Surface Analysis (scale: 40km at 40N)" 54 | 7,105,"RUC Model from FSL (isentropic; scale: 20km at 40N)" 55 | 7,107,"Global Ensemble Forecast System (GEFS)" 56 | 7,108,"LAMP" 57 | 7,109,"RTMA (Real Time Mesoscale Analysis)" 58 | 7,110,"NAM Model - 15km version" 59 | 7,111,"NAM model, generic resolution" 60 | 7,112,"WRF-NMM (Nondydrostatic Mesoscale Model) model, generic resolution" 61 | 7,113,"Products from NCEP SREF processing" 62 | 7,114,"NAEFS Products from joined NCEP, CMC global ensembles" 63 | 7,115,"Downscaled GFS from NAM eXtension" 64 | 7,116,"WRF-EM (Eulerian Mass-core) model, generic resolution " 65 | 7,120,"Ice Concentration Analysis" 66 | 7,121,"Western North Atlantic Regional Wave Model" 67 | 7,122,"Alaska Waters Regional Wave Model" 68 | 7,123,"North Atlantic Hurricane Wave Model" 69 | 7,124,"Eastern North Pacific Regional Wave Model" 70 | 7,125,"North Pacific Hurricane Wave Model" 71 | 7,126,"Sea Ice Forecast Model" 72 | 7,127,"Lake Ice Forecast Model" 73 | 7,128,"Global Ocean Forecast Model" 74 | 7,129,"Global Ocean Data Analysis System (GODAS)" 75 | 7,130,"Merge of fields from the RUC, NAM, and Spectral Model" 76 | 7,131,"Great Lakes Wave Model" 77 | 7,140,"North American Regional Reanalysis (NARR)" 78 | 7,141,"Land Data Assimilation and Forecast System" 79 | 7,150,"NWS River Forecast System (NWSRFS)" 80 | 7,151,"NWS Flash Flood Guidance System (NWSFFGS)" 81 | 7,152,"WSR-88D Stage II Precipitation Analysis" 82 | 7,153,"WSR-88D Stage III Precipitation Analysis" 83 | 7,180,"Quantitative Precipitation Forecast" 84 | 7,181,"River Forecast Center Quantitative Precipitation Forecast mosaic" 85 | 7,182,"River Forecast Center Quantitative Precipitation estimate mosaic" 86 | 7,183,"NDFD product generated by NCEP/HPC" 87 | 7,184,"Climatological Calibrated Precipiation Analysis - CCPA" 88 | 7,190,"National Convective Weather Diagnostic" 89 | 7,191,"Current Icing Potential automated product" 90 | 7,192,"Analysis product from NCEP/AWC" 91 | 7,193,"Forecast product from NCEP/AWC" 92 | 7,195,"Climate Data Assimilation System 2 (CDAS2)" 93 | 7,196,"Climate Data Assimilation System 2 (CDAS2)" 94 | 7,197,"Climate Data Assimilation System (CDAS)" 95 | 7,198,"Climate Data Assimilation System (CDAS)" 96 | 7,199,"Climate Forecast System Reanalysis (CFSR)" 97 | 7,200,"CPC Manual Forecast Product" 98 | 7,201,"CPC Automated Product" 99 | 7,210,"EPA Air Quality Forecast" 100 | 7,211,"EPA Air Quality Forecast" 101 | 7,215,"SPC Manual Forecast Product" 102 | 7,220,"NCEP/OPC automated product" 103 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_subcenter.csv: -------------------------------------------------------------------------------- 1 | center_code,subcenter_code,name 2 | 7,1,"NCEP Re-Analysis Project" 3 | 7,2,"NCEP Ensemble Products" 4 | 7,3,"NCEP Central Operations" 5 | 7,4,"Environmental Modeling Center" 6 | 7,5,"Hydrometeorological Prediction Center" 7 | 7,6,"Ocean Prediction Center" 8 | 7,7,"Climate Prediction Center" 9 | 7,8,"Aviation Weather Center" 10 | 7,9,"Storm Prediction Center" 11 | 7,10,"Tropical Prediction Center" 12 | 7,11,"Techniques Development Laboratory" 13 | 7,12,"NESDIS Office of Research and Applications" 14 | 7,13,"FAA" 15 | 7,14,"Meteorological Development Laboratory (MDL)" 16 | 7,15,"North American Regional Reanalysis (NARR) Project" 17 | 7,16,"Space Environment Center" 18 | 8,0,"National Digital Forecast Database" 19 | 161,1,"Great Lakes Environmental Research Laboratory" 20 | 161,2,"Forecast Systems Laboratory" 21 | 74,1,"Shanwick Oceanic Area Control Centre" 22 | 74,2,"Fucino" 23 | 74,3,"Gatineau" 24 | 74,4,"Maspalomas" 25 | 74,5,"ESA ERS Central Facility" 26 | 74,6,"Prince Albert" 27 | 74,7,"West Freugh" 28 | 74,13,"Tromso" 29 | 74,21,"Agenzia Spaziale Italiana (Italy)" 30 | 74,22,"Centre National de la Recherche Scientifique (France)" 31 | 74,23,"GeoForschungsZentrum (Germany)" 32 | 74,24,"Geodetic Observatory Pecny (Czech Republic)" 33 | 74,25,"Institut d'Estudis Espacials de Catalunya (Spain)" 34 | 74,26,"Swiss Federal Office of Topography" 35 | 74,27,"Nordic Commission of Geodesy (Norway)" 36 | 74,28,"Nordic Commission of Geodesy (Sweden)" 37 | 74,29,"Institute de Geodesie National (France)" 38 | 74,30,"Bundesamt für Kartographie und Geodäsie (Germany)" 39 | 74,31,"Institute of Engineering Satellite Surveying and Geodesy (U.K.)" 40 | 254,10,"Tromso (Norway)" 41 | 254,10,"Maspalomas (Spain)" 42 | 254,30,"Kangerlussuaq (Greenland)" 43 | 254,40,"Edmonton (Canada)" 44 | 254,50,"Bedford (Canada)" 45 | 254,60,"Gander (Canada)" 46 | 254,70,"Monterey (USA)" 47 | 254,80,"Wallops Island (USA)" 48 | 254,90,"Gilmor Creek (USA)" 49 | 254,100,"Athens (Greece)" 50 | 98,231,"CNRM, Meteo France Climate Centre (HIRETYCS)" 51 | 98,232,"MPI, Max Planck Institute Climate Centre (HIRETYCS)" 52 | 98,233,"UKMO Climate Centre (HIRETYCS)" 53 | 98,234,"ECMWF (DEMETER)" 54 | 98,235,"INGV-CNR (Bologna, Italy)(DEMETER)" 55 | 98,236,"LODYC (Paris, France)(DEMETER)" 56 | 98,237,"DMI (Copenhagen, Denmark)(DEMETER)" 57 | 98,238,"INM (Madrid, Spain)(DEMETER)" 58 | 98,239,"CERFACS (Toulouse, France)(DEMETER)" 59 | 98,240,"ECMWF (PROVOST)" 60 | 98,241,"Meteo France (PROVOST)" 61 | 98,242,"EDF (PROVOST)" 62 | 98,243,"UKMO (PROVOST)" 63 | 98,244,"Biometeorology group, University of Veterinary Medicine, Vienna (ELDAS)" 64 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_0_13.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"AEROT","Aerosol type","0=Aerosol not present; 1=Aerosol present; 2-191=Reserved; 192-254=Reserved for local use; 255=Missing","UC_NONE" 7 | 1,"","Reserved","","UC_NONE" 8 | 2,"","Reserved","","UC_NONE" 9 | 3,"","Reserved","","UC_NONE" 10 | 4,"","Reserved","","UC_NONE" 11 | 5,"","Reserved","","UC_NONE" 12 | 6,"","Reserved","","UC_NONE" 13 | 7,"","Reserved","","UC_NONE" 14 | 8,"","Reserved","","UC_NONE" 15 | 9,"","Reserved","","UC_NONE" 16 | 10,"","Reserved","","UC_NONE" 17 | 11,"","Reserved","","UC_NONE" 18 | 12,"","Reserved","","UC_NONE" 19 | 13,"","Reserved","","UC_NONE" 20 | 14,"","Reserved","","UC_NONE" 21 | 15,"","Reserved","","UC_NONE" 22 | 16,"","Reserved","","UC_NONE" 23 | 17,"","Reserved","","UC_NONE" 24 | 18,"","Reserved","","UC_NONE" 25 | 19,"","Reserved","","UC_NONE" 26 | 20,"","Reserved","","UC_NONE" 27 | 21,"","Reserved","","UC_NONE" 28 | 22,"","Reserved","","UC_NONE" 29 | 23,"","Reserved","","UC_NONE" 30 | 24,"","Reserved","","UC_NONE" 31 | 25,"","Reserved","","UC_NONE" 32 | 26,"","Reserved","","UC_NONE" 33 | 27,"","Reserved","","UC_NONE" 34 | 28,"","Reserved","","UC_NONE" 35 | 29,"","Reserved","","UC_NONE" 36 | 30,"","Reserved","","UC_NONE" 37 | 31,"","Reserved","","UC_NONE" 38 | 32,"","Reserved","","UC_NONE" 39 | 33,"","Reserved","","UC_NONE" 40 | 34,"","Reserved","","UC_NONE" 41 | 35,"","Reserved","","UC_NONE" 42 | 36,"","Reserved","","UC_NONE" 43 | 37,"","Reserved","","UC_NONE" 44 | 38,"","Reserved","","UC_NONE" 45 | 39,"","Reserved","","UC_NONE" 46 | 40,"","Reserved","","UC_NONE" 47 | 41,"","Reserved","","UC_NONE" 48 | 42,"","Reserved","","UC_NONE" 49 | 43,"","Reserved","","UC_NONE" 50 | 44,"","Reserved","","UC_NONE" 51 | 45,"","Reserved","","UC_NONE" 52 | 46,"","Reserved","","UC_NONE" 53 | 47,"","Reserved","","UC_NONE" 54 | 48,"","Reserved","","UC_NONE" 55 | 49,"","Reserved","","UC_NONE" 56 | 50,"","Reserved","","UC_NONE" 57 | 51,"","Reserved","","UC_NONE" 58 | 52,"","Reserved","","UC_NONE" 59 | 53,"","Reserved","","UC_NONE" 60 | 54,"","Reserved","","UC_NONE" 61 | 55,"","Reserved","","UC_NONE" 62 | 56,"","Reserved","","UC_NONE" 63 | 57,"","Reserved","","UC_NONE" 64 | 58,"","Reserved","","UC_NONE" 65 | 59,"","Reserved","","UC_NONE" 66 | 60,"","Reserved","","UC_NONE" 67 | 61,"","Reserved","","UC_NONE" 68 | 62,"","Reserved","","UC_NONE" 69 | 63,"","Reserved","","UC_NONE" 70 | 64,"","Reserved","","UC_NONE" 71 | 65,"","Reserved","","UC_NONE" 72 | 66,"","Reserved","","UC_NONE" 73 | 67,"","Reserved","","UC_NONE" 74 | 68,"","Reserved","","UC_NONE" 75 | 69,"","Reserved","","UC_NONE" 76 | 70,"","Reserved","","UC_NONE" 77 | 71,"","Reserved","","UC_NONE" 78 | 72,"","Reserved","","UC_NONE" 79 | 73,"","Reserved","","UC_NONE" 80 | 74,"","Reserved","","UC_NONE" 81 | 75,"","Reserved","","UC_NONE" 82 | 76,"","Reserved","","UC_NONE" 83 | 77,"","Reserved","","UC_NONE" 84 | 78,"","Reserved","","UC_NONE" 85 | 79,"","Reserved","","UC_NONE" 86 | 80,"","Reserved","","UC_NONE" 87 | 81,"","Reserved","","UC_NONE" 88 | 82,"","Reserved","","UC_NONE" 89 | 83,"","Reserved","","UC_NONE" 90 | 84,"","Reserved","","UC_NONE" 91 | 85,"","Reserved","","UC_NONE" 92 | 86,"","Reserved","","UC_NONE" 93 | 87,"","Reserved","","UC_NONE" 94 | 88,"","Reserved","","UC_NONE" 95 | 89,"","Reserved","","UC_NONE" 96 | 90,"","Reserved","","UC_NONE" 97 | 91,"","Reserved","","UC_NONE" 98 | 92,"","Reserved","","UC_NONE" 99 | 93,"","Reserved","","UC_NONE" 100 | 94,"","Reserved","","UC_NONE" 101 | 95,"","Reserved","","UC_NONE" 102 | 96,"","Reserved","","UC_NONE" 103 | 97,"","Reserved","","UC_NONE" 104 | 98,"","Reserved","","UC_NONE" 105 | 99,"","Reserved","","UC_NONE" 106 | 100,"","Reserved","","UC_NONE" 107 | 101,"","Reserved","","UC_NONE" 108 | 102,"","Reserved","","UC_NONE" 109 | 103,"","Reserved","","UC_NONE" 110 | 104,"","Reserved","","UC_NONE" 111 | 105,"","Reserved","","UC_NONE" 112 | 106,"","Reserved","","UC_NONE" 113 | 107,"","Reserved","","UC_NONE" 114 | 108,"","Reserved","","UC_NONE" 115 | 109,"","Reserved","","UC_NONE" 116 | 110,"","Reserved","","UC_NONE" 117 | 111,"","Reserved","","UC_NONE" 118 | 112,"","Reserved","","UC_NONE" 119 | 113,"","Reserved","","UC_NONE" 120 | 114,"","Reserved","","UC_NONE" 121 | 115,"","Reserved","","UC_NONE" 122 | 116,"","Reserved","","UC_NONE" 123 | 117,"","Reserved","","UC_NONE" 124 | 118,"","Reserved","","UC_NONE" 125 | 119,"","Reserved","","UC_NONE" 126 | 120,"","Reserved","","UC_NONE" 127 | 121,"","Reserved","","UC_NONE" 128 | 122,"","Reserved","","UC_NONE" 129 | 123,"","Reserved","","UC_NONE" 130 | 124,"","Reserved","","UC_NONE" 131 | 125,"","Reserved","","UC_NONE" 132 | 126,"","Reserved","","UC_NONE" 133 | 127,"","Reserved","","UC_NONE" 134 | 128,"","Reserved","","UC_NONE" 135 | 129,"","Reserved","","UC_NONE" 136 | 130,"","Reserved","","UC_NONE" 137 | 131,"","Reserved","","UC_NONE" 138 | 132,"","Reserved","","UC_NONE" 139 | 133,"","Reserved","","UC_NONE" 140 | 134,"","Reserved","","UC_NONE" 141 | 135,"","Reserved","","UC_NONE" 142 | 136,"","Reserved","","UC_NONE" 143 | 137,"","Reserved","","UC_NONE" 144 | 138,"","Reserved","","UC_NONE" 145 | 139,"","Reserved","","UC_NONE" 146 | 140,"","Reserved","","UC_NONE" 147 | 141,"","Reserved","","UC_NONE" 148 | 142,"","Reserved","","UC_NONE" 149 | 143,"","Reserved","","UC_NONE" 150 | 144,"","Reserved","","UC_NONE" 151 | 145,"","Reserved","","UC_NONE" 152 | 146,"","Reserved","","UC_NONE" 153 | 147,"","Reserved","","UC_NONE" 154 | 148,"","Reserved","","UC_NONE" 155 | 149,"","Reserved","","UC_NONE" 156 | 150,"","Reserved","","UC_NONE" 157 | 151,"","Reserved","","UC_NONE" 158 | 152,"","Reserved","","UC_NONE" 159 | 153,"","Reserved","","UC_NONE" 160 | 154,"","Reserved","","UC_NONE" 161 | 155,"","Reserved","","UC_NONE" 162 | 156,"","Reserved","","UC_NONE" 163 | 157,"","Reserved","","UC_NONE" 164 | 158,"","Reserved","","UC_NONE" 165 | 159,"","Reserved","","UC_NONE" 166 | 160,"","Reserved","","UC_NONE" 167 | 161,"","Reserved","","UC_NONE" 168 | 162,"","Reserved","","UC_NONE" 169 | 163,"","Reserved","","UC_NONE" 170 | 164,"","Reserved","","UC_NONE" 171 | 165,"","Reserved","","UC_NONE" 172 | 166,"","Reserved","","UC_NONE" 173 | 167,"","Reserved","","UC_NONE" 174 | 168,"","Reserved","","UC_NONE" 175 | 169,"","Reserved","","UC_NONE" 176 | 170,"","Reserved","","UC_NONE" 177 | 171,"","Reserved","","UC_NONE" 178 | 172,"","Reserved","","UC_NONE" 179 | 173,"","Reserved","","UC_NONE" 180 | 174,"","Reserved","","UC_NONE" 181 | 175,"","Reserved","","UC_NONE" 182 | 176,"","Reserved","","UC_NONE" 183 | 177,"","Reserved","","UC_NONE" 184 | 178,"","Reserved","","UC_NONE" 185 | 179,"","Reserved","","UC_NONE" 186 | 180,"","Reserved","","UC_NONE" 187 | 181,"","Reserved","","UC_NONE" 188 | 182,"","Reserved","","UC_NONE" 189 | 183,"","Reserved","","UC_NONE" 190 | 184,"","Reserved","","UC_NONE" 191 | 185,"","Reserved","","UC_NONE" 192 | 186,"","Reserved","","UC_NONE" 193 | 187,"","Reserved","","UC_NONE" 194 | 188,"","Reserved","","UC_NONE" 195 | 189,"","Reserved","","UC_NONE" 196 | 190,"","Reserved","","UC_NONE" 197 | 191,"","Reserved","","UC_NONE" 198 | 192,"","Reserved for local use","","UC_NONE" 199 | 193,"","Reserved for local use","","UC_NONE" 200 | 194,"","Reserved for local use","","UC_NONE" 201 | 195,"","Reserved for local use","","UC_NONE" 202 | 196,"","Reserved for local use","","UC_NONE" 203 | 197,"","Reserved for local use","","UC_NONE" 204 | 198,"","Reserved for local use","","UC_NONE" 205 | 199,"","Reserved for local use","","UC_NONE" 206 | 200,"","Reserved for local use","","UC_NONE" 207 | 201,"","Reserved for local use","","UC_NONE" 208 | 202,"","Reserved for local use","","UC_NONE" 209 | 203,"","Reserved for local use","","UC_NONE" 210 | 204,"","Reserved for local use","","UC_NONE" 211 | 205,"","Reserved for local use","","UC_NONE" 212 | 206,"","Reserved for local use","","UC_NONE" 213 | 207,"","Reserved for local use","","UC_NONE" 214 | 208,"","Reserved for local use","","UC_NONE" 215 | 209,"","Reserved for local use","","UC_NONE" 216 | 210,"","Reserved for local use","","UC_NONE" 217 | 211,"","Reserved for local use","","UC_NONE" 218 | 212,"","Reserved for local use","","UC_NONE" 219 | 213,"","Reserved for local use","","UC_NONE" 220 | 214,"","Reserved for local use","","UC_NONE" 221 | 215,"","Reserved for local use","","UC_NONE" 222 | 216,"","Reserved for local use","","UC_NONE" 223 | 217,"","Reserved for local use","","UC_NONE" 224 | 218,"","Reserved for local use","","UC_NONE" 225 | 219,"","Reserved for local use","","UC_NONE" 226 | 220,"","Reserved for local use","","UC_NONE" 227 | 221,"","Reserved for local use","","UC_NONE" 228 | 222,"","Reserved for local use","","UC_NONE" 229 | 223,"","Reserved for local use","","UC_NONE" 230 | 224,"","Reserved for local use","","UC_NONE" 231 | 225,"","Reserved for local use","","UC_NONE" 232 | 226,"","Reserved for local use","","UC_NONE" 233 | 227,"","Reserved for local use","","UC_NONE" 234 | 228,"","Reserved for local use","","UC_NONE" 235 | 229,"","Reserved for local use","","UC_NONE" 236 | 230,"","Reserved for local use","","UC_NONE" 237 | 231,"","Reserved for local use","","UC_NONE" 238 | 232,"","Reserved for local use","","UC_NONE" 239 | 233,"","Reserved for local use","","UC_NONE" 240 | 234,"","Reserved for local use","","UC_NONE" 241 | 235,"","Reserved for local use","","UC_NONE" 242 | 236,"","Reserved for local use","","UC_NONE" 243 | 237,"","Reserved for local use","","UC_NONE" 244 | 238,"","Reserved for local use","","UC_NONE" 245 | 239,"","Reserved for local use","","UC_NONE" 246 | 240,"","Reserved for local use","","UC_NONE" 247 | 241,"","Reserved for local use","","UC_NONE" 248 | 242,"","Reserved for local use","","UC_NONE" 249 | 243,"","Reserved for local use","","UC_NONE" 250 | 244,"","Reserved for local use","","UC_NONE" 251 | 245,"","Reserved for local use","","UC_NONE" 252 | 246,"","Reserved for local use","","UC_NONE" 253 | 247,"","Reserved for local use","","UC_NONE" 254 | 248,"","Reserved for local use","","UC_NONE" 255 | 249,"","Reserved for local use","","UC_NONE" 256 | 250,"","Reserved for local use","","UC_NONE" 257 | 251,"","Reserved for local use","","UC_NONE" 258 | 252,"","Reserved for local use","","UC_NONE" 259 | 253,"","Reserved for local use","","UC_NONE" 260 | 254,"","Reserved for local use","","UC_NONE" 261 | 255,"","Missing","","UC_NONE" 262 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_0_14.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"TOZNE","Total ozone","Dobson","UC_NONE" 7 | 1,"O3MR","Ozone mixing ratio","kg/kg","UC_NONE" 8 | 2,"TCIOZ","Total column integrated ozone","Dobson","UC_NONE" 9 | 3,"","Reserved","","UC_NONE" 10 | 4,"","Reserved","","UC_NONE" 11 | 5,"","Reserved","","UC_NONE" 12 | 6,"","Reserved","","UC_NONE" 13 | 7,"","Reserved","","UC_NONE" 14 | 8,"","Reserved","","UC_NONE" 15 | 9,"","Reserved","","UC_NONE" 16 | 10,"","Reserved","","UC_NONE" 17 | 11,"","Reserved","","UC_NONE" 18 | 12,"","Reserved","","UC_NONE" 19 | 13,"","Reserved","","UC_NONE" 20 | 14,"","Reserved","","UC_NONE" 21 | 15,"","Reserved","","UC_NONE" 22 | 16,"","Reserved","","UC_NONE" 23 | 17,"","Reserved","","UC_NONE" 24 | 18,"","Reserved","","UC_NONE" 25 | 19,"","Reserved","","UC_NONE" 26 | 20,"","Reserved","","UC_NONE" 27 | 21,"","Reserved","","UC_NONE" 28 | 22,"","Reserved","","UC_NONE" 29 | 23,"","Reserved","","UC_NONE" 30 | 24,"","Reserved","","UC_NONE" 31 | 25,"","Reserved","","UC_NONE" 32 | 26,"","Reserved","","UC_NONE" 33 | 27,"","Reserved","","UC_NONE" 34 | 28,"","Reserved","","UC_NONE" 35 | 29,"","Reserved","","UC_NONE" 36 | 30,"","Reserved","","UC_NONE" 37 | 31,"","Reserved","","UC_NONE" 38 | 32,"","Reserved","","UC_NONE" 39 | 33,"","Reserved","","UC_NONE" 40 | 34,"","Reserved","","UC_NONE" 41 | 35,"","Reserved","","UC_NONE" 42 | 36,"","Reserved","","UC_NONE" 43 | 37,"","Reserved","","UC_NONE" 44 | 38,"","Reserved","","UC_NONE" 45 | 39,"","Reserved","","UC_NONE" 46 | 40,"","Reserved","","UC_NONE" 47 | 41,"","Reserved","","UC_NONE" 48 | 42,"","Reserved","","UC_NONE" 49 | 43,"","Reserved","","UC_NONE" 50 | 44,"","Reserved","","UC_NONE" 51 | 45,"","Reserved","","UC_NONE" 52 | 46,"","Reserved","","UC_NONE" 53 | 47,"","Reserved","","UC_NONE" 54 | 48,"","Reserved","","UC_NONE" 55 | 49,"","Reserved","","UC_NONE" 56 | 50,"","Reserved","","UC_NONE" 57 | 51,"","Reserved","","UC_NONE" 58 | 52,"","Reserved","","UC_NONE" 59 | 53,"","Reserved","","UC_NONE" 60 | 54,"","Reserved","","UC_NONE" 61 | 55,"","Reserved","","UC_NONE" 62 | 56,"","Reserved","","UC_NONE" 63 | 57,"","Reserved","","UC_NONE" 64 | 58,"","Reserved","","UC_NONE" 65 | 59,"","Reserved","","UC_NONE" 66 | 60,"","Reserved","","UC_NONE" 67 | 61,"","Reserved","","UC_NONE" 68 | 62,"","Reserved","","UC_NONE" 69 | 63,"","Reserved","","UC_NONE" 70 | 64,"","Reserved","","UC_NONE" 71 | 65,"","Reserved","","UC_NONE" 72 | 66,"","Reserved","","UC_NONE" 73 | 67,"","Reserved","","UC_NONE" 74 | 68,"","Reserved","","UC_NONE" 75 | 69,"","Reserved","","UC_NONE" 76 | 70,"","Reserved","","UC_NONE" 77 | 71,"","Reserved","","UC_NONE" 78 | 72,"","Reserved","","UC_NONE" 79 | 73,"","Reserved","","UC_NONE" 80 | 74,"","Reserved","","UC_NONE" 81 | 75,"","Reserved","","UC_NONE" 82 | 76,"","Reserved","","UC_NONE" 83 | 77,"","Reserved","","UC_NONE" 84 | 78,"","Reserved","","UC_NONE" 85 | 79,"","Reserved","","UC_NONE" 86 | 80,"","Reserved","","UC_NONE" 87 | 81,"","Reserved","","UC_NONE" 88 | 82,"","Reserved","","UC_NONE" 89 | 83,"","Reserved","","UC_NONE" 90 | 84,"","Reserved","","UC_NONE" 91 | 85,"","Reserved","","UC_NONE" 92 | 86,"","Reserved","","UC_NONE" 93 | 87,"","Reserved","","UC_NONE" 94 | 88,"","Reserved","","UC_NONE" 95 | 89,"","Reserved","","UC_NONE" 96 | 90,"","Reserved","","UC_NONE" 97 | 91,"","Reserved","","UC_NONE" 98 | 92,"","Reserved","","UC_NONE" 99 | 93,"","Reserved","","UC_NONE" 100 | 94,"","Reserved","","UC_NONE" 101 | 95,"","Reserved","","UC_NONE" 102 | 96,"","Reserved","","UC_NONE" 103 | 97,"","Reserved","","UC_NONE" 104 | 98,"","Reserved","","UC_NONE" 105 | 99,"","Reserved","","UC_NONE" 106 | 100,"","Reserved","","UC_NONE" 107 | 101,"","Reserved","","UC_NONE" 108 | 102,"","Reserved","","UC_NONE" 109 | 103,"","Reserved","","UC_NONE" 110 | 104,"","Reserved","","UC_NONE" 111 | 105,"","Reserved","","UC_NONE" 112 | 106,"","Reserved","","UC_NONE" 113 | 107,"","Reserved","","UC_NONE" 114 | 108,"","Reserved","","UC_NONE" 115 | 109,"","Reserved","","UC_NONE" 116 | 110,"","Reserved","","UC_NONE" 117 | 111,"","Reserved","","UC_NONE" 118 | 112,"","Reserved","","UC_NONE" 119 | 113,"","Reserved","","UC_NONE" 120 | 114,"","Reserved","","UC_NONE" 121 | 115,"","Reserved","","UC_NONE" 122 | 116,"","Reserved","","UC_NONE" 123 | 117,"","Reserved","","UC_NONE" 124 | 118,"","Reserved","","UC_NONE" 125 | 119,"","Reserved","","UC_NONE" 126 | 120,"","Reserved","","UC_NONE" 127 | 121,"","Reserved","","UC_NONE" 128 | 122,"","Reserved","","UC_NONE" 129 | 123,"","Reserved","","UC_NONE" 130 | 124,"","Reserved","","UC_NONE" 131 | 125,"","Reserved","","UC_NONE" 132 | 126,"","Reserved","","UC_NONE" 133 | 127,"","Reserved","","UC_NONE" 134 | 128,"","Reserved","","UC_NONE" 135 | 129,"","Reserved","","UC_NONE" 136 | 130,"","Reserved","","UC_NONE" 137 | 131,"","Reserved","","UC_NONE" 138 | 132,"","Reserved","","UC_NONE" 139 | 133,"","Reserved","","UC_NONE" 140 | 134,"","Reserved","","UC_NONE" 141 | 135,"","Reserved","","UC_NONE" 142 | 136,"","Reserved","","UC_NONE" 143 | 137,"","Reserved","","UC_NONE" 144 | 138,"","Reserved","","UC_NONE" 145 | 139,"","Reserved","","UC_NONE" 146 | 140,"","Reserved","","UC_NONE" 147 | 141,"","Reserved","","UC_NONE" 148 | 142,"","Reserved","","UC_NONE" 149 | 143,"","Reserved","","UC_NONE" 150 | 144,"","Reserved","","UC_NONE" 151 | 145,"","Reserved","","UC_NONE" 152 | 146,"","Reserved","","UC_NONE" 153 | 147,"","Reserved","","UC_NONE" 154 | 148,"","Reserved","","UC_NONE" 155 | 149,"","Reserved","","UC_NONE" 156 | 150,"","Reserved","","UC_NONE" 157 | 151,"","Reserved","","UC_NONE" 158 | 152,"","Reserved","","UC_NONE" 159 | 153,"","Reserved","","UC_NONE" 160 | 154,"","Reserved","","UC_NONE" 161 | 155,"","Reserved","","UC_NONE" 162 | 156,"","Reserved","","UC_NONE" 163 | 157,"","Reserved","","UC_NONE" 164 | 158,"","Reserved","","UC_NONE" 165 | 159,"","Reserved","","UC_NONE" 166 | 160,"","Reserved","","UC_NONE" 167 | 161,"","Reserved","","UC_NONE" 168 | 162,"","Reserved","","UC_NONE" 169 | 163,"","Reserved","","UC_NONE" 170 | 164,"","Reserved","","UC_NONE" 171 | 165,"","Reserved","","UC_NONE" 172 | 166,"","Reserved","","UC_NONE" 173 | 167,"","Reserved","","UC_NONE" 174 | 168,"","Reserved","","UC_NONE" 175 | 169,"","Reserved","","UC_NONE" 176 | 170,"","Reserved","","UC_NONE" 177 | 171,"","Reserved","","UC_NONE" 178 | 172,"","Reserved","","UC_NONE" 179 | 173,"","Reserved","","UC_NONE" 180 | 174,"","Reserved","","UC_NONE" 181 | 175,"","Reserved","","UC_NONE" 182 | 176,"","Reserved","","UC_NONE" 183 | 177,"","Reserved","","UC_NONE" 184 | 178,"","Reserved","","UC_NONE" 185 | 179,"","Reserved","","UC_NONE" 186 | 180,"","Reserved","","UC_NONE" 187 | 181,"","Reserved","","UC_NONE" 188 | 182,"","Reserved","","UC_NONE" 189 | 183,"","Reserved","","UC_NONE" 190 | 184,"","Reserved","","UC_NONE" 191 | 185,"","Reserved","","UC_NONE" 192 | 186,"","Reserved","","UC_NONE" 193 | 187,"","Reserved","","UC_NONE" 194 | 188,"","Reserved","","UC_NONE" 195 | 189,"","Reserved","","UC_NONE" 196 | 190,"","Reserved","","UC_NONE" 197 | 191,"","Reserved","","UC_NONE" 198 | 192,"","Reserved for local use","","UC_NONE" 199 | 193,"","Reserved for local use","","UC_NONE" 200 | 194,"","Reserved for local use","","UC_NONE" 201 | 195,"","Reserved for local use","","UC_NONE" 202 | 196,"","Reserved for local use","","UC_NONE" 203 | 197,"","Reserved for local use","","UC_NONE" 204 | 198,"","Reserved for local use","","UC_NONE" 205 | 199,"","Reserved for local use","","UC_NONE" 206 | 200,"","Reserved for local use","","UC_NONE" 207 | 201,"","Reserved for local use","","UC_NONE" 208 | 202,"","Reserved for local use","","UC_NONE" 209 | 203,"","Reserved for local use","","UC_NONE" 210 | 204,"","Reserved for local use","","UC_NONE" 211 | 205,"","Reserved for local use","","UC_NONE" 212 | 206,"","Reserved for local use","","UC_NONE" 213 | 207,"","Reserved for local use","","UC_NONE" 214 | 208,"","Reserved for local use","","UC_NONE" 215 | 209,"","Reserved for local use","","UC_NONE" 216 | 210,"","Reserved for local use","","UC_NONE" 217 | 211,"","Reserved for local use","","UC_NONE" 218 | 212,"","Reserved for local use","","UC_NONE" 219 | 213,"","Reserved for local use","","UC_NONE" 220 | 214,"","Reserved for local use","","UC_NONE" 221 | 215,"","Reserved for local use","","UC_NONE" 222 | 216,"","Reserved for local use","","UC_NONE" 223 | 217,"","Reserved for local use","","UC_NONE" 224 | 218,"","Reserved for local use","","UC_NONE" 225 | 219,"","Reserved for local use","","UC_NONE" 226 | 220,"","Reserved for local use","","UC_NONE" 227 | 221,"","Reserved for local use","","UC_NONE" 228 | 222,"","Reserved for local use","","UC_NONE" 229 | 223,"","Reserved for local use","","UC_NONE" 230 | 224,"","Reserved for local use","","UC_NONE" 231 | 225,"","Reserved for local use","","UC_NONE" 232 | 226,"","Reserved for local use","","UC_NONE" 233 | 227,"","Reserved for local use","","UC_NONE" 234 | 228,"","Reserved for local use","","UC_NONE" 235 | 229,"","Reserved for local use","","UC_NONE" 236 | 230,"","Reserved for local use","","UC_NONE" 237 | 231,"","Reserved for local use","","UC_NONE" 238 | 232,"","Reserved for local use","","UC_NONE" 239 | 233,"","Reserved for local use","","UC_NONE" 240 | 234,"","Reserved for local use","","UC_NONE" 241 | 235,"","Reserved for local use","","UC_NONE" 242 | 236,"","Reserved for local use","","UC_NONE" 243 | 237,"","Reserved for local use","","UC_NONE" 244 | 238,"","Reserved for local use","","UC_NONE" 245 | 239,"","Reserved for local use","","UC_NONE" 246 | 240,"","Reserved for local use","","UC_NONE" 247 | 241,"","Reserved for local use","","UC_NONE" 248 | 242,"","Reserved for local use","","UC_NONE" 249 | 243,"","Reserved for local use","","UC_NONE" 250 | 244,"","Reserved for local use","","UC_NONE" 251 | 245,"","Reserved for local use","","UC_NONE" 252 | 246,"","Reserved for local use","","UC_NONE" 253 | 247,"","Reserved for local use","","UC_NONE" 254 | 248,"","Reserved for local use","","UC_NONE" 255 | 249,"","Reserved for local use","","UC_NONE" 256 | 250,"","Reserved for local use","","UC_NONE" 257 | 251,"","Reserved for local use","","UC_NONE" 258 | 252,"","Reserved for local use","","UC_NONE" 259 | 253,"","Reserved for local use","","UC_NONE" 260 | 254,"","Reserved for local use","","UC_NONE" 261 | 255,"","Missing","","UC_NONE" 262 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_0_17.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"LTNGSD","Lightning Strike Density","m^2/s","UC_NONE" 7 | 1,"LTPINX","Lightning Potential Index (LPI) (see Note)","J/kg","UC_NONE" 8 | 2,"","Cloud-to-ground lightning flash density","km-2 day-1","UC_NONE" 9 | 3,"","Cloud-to-cloud lightning flash density","km-2 day-1","UC_NONE" 10 | 4,"","Total lightning flash density","km-2 day-1","UC_NONE" 11 | 5,"","Subgrid-scale lightning potential index","J kg-1","UC_NONE" 12 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_0_190.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Arbitrary text string","CCITTIA5","UC_NONE" 7 | 1,"","Reserved","","UC_NONE" 8 | 2,"","Reserved","","UC_NONE" 9 | 3,"","Reserved","","UC_NONE" 10 | 4,"","Reserved","","UC_NONE" 11 | 5,"","Reserved","","UC_NONE" 12 | 6,"","Reserved","","UC_NONE" 13 | 7,"","Reserved","","UC_NONE" 14 | 8,"","Reserved","","UC_NONE" 15 | 9,"","Reserved","","UC_NONE" 16 | 10,"","Reserved","","UC_NONE" 17 | 11,"","Reserved","","UC_NONE" 18 | 12,"","Reserved","","UC_NONE" 19 | 13,"","Reserved","","UC_NONE" 20 | 14,"","Reserved","","UC_NONE" 21 | 15,"","Reserved","","UC_NONE" 22 | 16,"","Reserved","","UC_NONE" 23 | 17,"","Reserved","","UC_NONE" 24 | 18,"","Reserved","","UC_NONE" 25 | 19,"","Reserved","","UC_NONE" 26 | 20,"","Reserved","","UC_NONE" 27 | 21,"","Reserved","","UC_NONE" 28 | 22,"","Reserved","","UC_NONE" 29 | 23,"","Reserved","","UC_NONE" 30 | 24,"","Reserved","","UC_NONE" 31 | 25,"","Reserved","","UC_NONE" 32 | 26,"","Reserved","","UC_NONE" 33 | 27,"","Reserved","","UC_NONE" 34 | 28,"","Reserved","","UC_NONE" 35 | 29,"","Reserved","","UC_NONE" 36 | 30,"","Reserved","","UC_NONE" 37 | 31,"","Reserved","","UC_NONE" 38 | 32,"","Reserved","","UC_NONE" 39 | 33,"","Reserved","","UC_NONE" 40 | 34,"","Reserved","","UC_NONE" 41 | 35,"","Reserved","","UC_NONE" 42 | 36,"","Reserved","","UC_NONE" 43 | 37,"","Reserved","","UC_NONE" 44 | 38,"","Reserved","","UC_NONE" 45 | 39,"","Reserved","","UC_NONE" 46 | 40,"","Reserved","","UC_NONE" 47 | 41,"","Reserved","","UC_NONE" 48 | 42,"","Reserved","","UC_NONE" 49 | 43,"","Reserved","","UC_NONE" 50 | 44,"","Reserved","","UC_NONE" 51 | 45,"","Reserved","","UC_NONE" 52 | 46,"","Reserved","","UC_NONE" 53 | 47,"","Reserved","","UC_NONE" 54 | 48,"","Reserved","","UC_NONE" 55 | 49,"","Reserved","","UC_NONE" 56 | 50,"","Reserved","","UC_NONE" 57 | 51,"","Reserved","","UC_NONE" 58 | 52,"","Reserved","","UC_NONE" 59 | 53,"","Reserved","","UC_NONE" 60 | 54,"","Reserved","","UC_NONE" 61 | 55,"","Reserved","","UC_NONE" 62 | 56,"","Reserved","","UC_NONE" 63 | 57,"","Reserved","","UC_NONE" 64 | 58,"","Reserved","","UC_NONE" 65 | 59,"","Reserved","","UC_NONE" 66 | 60,"","Reserved","","UC_NONE" 67 | 61,"","Reserved","","UC_NONE" 68 | 62,"","Reserved","","UC_NONE" 69 | 63,"","Reserved","","UC_NONE" 70 | 64,"","Reserved","","UC_NONE" 71 | 65,"","Reserved","","UC_NONE" 72 | 66,"","Reserved","","UC_NONE" 73 | 67,"","Reserved","","UC_NONE" 74 | 68,"","Reserved","","UC_NONE" 75 | 69,"","Reserved","","UC_NONE" 76 | 70,"","Reserved","","UC_NONE" 77 | 71,"","Reserved","","UC_NONE" 78 | 72,"","Reserved","","UC_NONE" 79 | 73,"","Reserved","","UC_NONE" 80 | 74,"","Reserved","","UC_NONE" 81 | 75,"","Reserved","","UC_NONE" 82 | 76,"","Reserved","","UC_NONE" 83 | 77,"","Reserved","","UC_NONE" 84 | 78,"","Reserved","","UC_NONE" 85 | 79,"","Reserved","","UC_NONE" 86 | 80,"","Reserved","","UC_NONE" 87 | 81,"","Reserved","","UC_NONE" 88 | 82,"","Reserved","","UC_NONE" 89 | 83,"","Reserved","","UC_NONE" 90 | 84,"","Reserved","","UC_NONE" 91 | 85,"","Reserved","","UC_NONE" 92 | 86,"","Reserved","","UC_NONE" 93 | 87,"","Reserved","","UC_NONE" 94 | 88,"","Reserved","","UC_NONE" 95 | 89,"","Reserved","","UC_NONE" 96 | 90,"","Reserved","","UC_NONE" 97 | 91,"","Reserved","","UC_NONE" 98 | 92,"","Reserved","","UC_NONE" 99 | 93,"","Reserved","","UC_NONE" 100 | 94,"","Reserved","","UC_NONE" 101 | 95,"","Reserved","","UC_NONE" 102 | 96,"","Reserved","","UC_NONE" 103 | 97,"","Reserved","","UC_NONE" 104 | 98,"","Reserved","","UC_NONE" 105 | 99,"","Reserved","","UC_NONE" 106 | 100,"","Reserved","","UC_NONE" 107 | 101,"","Reserved","","UC_NONE" 108 | 102,"","Reserved","","UC_NONE" 109 | 103,"","Reserved","","UC_NONE" 110 | 104,"","Reserved","","UC_NONE" 111 | 105,"","Reserved","","UC_NONE" 112 | 106,"","Reserved","","UC_NONE" 113 | 107,"","Reserved","","UC_NONE" 114 | 108,"","Reserved","","UC_NONE" 115 | 109,"","Reserved","","UC_NONE" 116 | 110,"","Reserved","","UC_NONE" 117 | 111,"","Reserved","","UC_NONE" 118 | 112,"","Reserved","","UC_NONE" 119 | 113,"","Reserved","","UC_NONE" 120 | 114,"","Reserved","","UC_NONE" 121 | 115,"","Reserved","","UC_NONE" 122 | 116,"","Reserved","","UC_NONE" 123 | 117,"","Reserved","","UC_NONE" 124 | 118,"","Reserved","","UC_NONE" 125 | 119,"","Reserved","","UC_NONE" 126 | 120,"","Reserved","","UC_NONE" 127 | 121,"","Reserved","","UC_NONE" 128 | 122,"","Reserved","","UC_NONE" 129 | 123,"","Reserved","","UC_NONE" 130 | 124,"","Reserved","","UC_NONE" 131 | 125,"","Reserved","","UC_NONE" 132 | 126,"","Reserved","","UC_NONE" 133 | 127,"","Reserved","","UC_NONE" 134 | 128,"","Reserved","","UC_NONE" 135 | 129,"","Reserved","","UC_NONE" 136 | 130,"","Reserved","","UC_NONE" 137 | 131,"","Reserved","","UC_NONE" 138 | 132,"","Reserved","","UC_NONE" 139 | 133,"","Reserved","","UC_NONE" 140 | 134,"","Reserved","","UC_NONE" 141 | 135,"","Reserved","","UC_NONE" 142 | 136,"","Reserved","","UC_NONE" 143 | 137,"","Reserved","","UC_NONE" 144 | 138,"","Reserved","","UC_NONE" 145 | 139,"","Reserved","","UC_NONE" 146 | 140,"","Reserved","","UC_NONE" 147 | 141,"","Reserved","","UC_NONE" 148 | 142,"","Reserved","","UC_NONE" 149 | 143,"","Reserved","","UC_NONE" 150 | 144,"","Reserved","","UC_NONE" 151 | 145,"","Reserved","","UC_NONE" 152 | 146,"","Reserved","","UC_NONE" 153 | 147,"","Reserved","","UC_NONE" 154 | 148,"","Reserved","","UC_NONE" 155 | 149,"","Reserved","","UC_NONE" 156 | 150,"","Reserved","","UC_NONE" 157 | 151,"","Reserved","","UC_NONE" 158 | 152,"","Reserved","","UC_NONE" 159 | 153,"","Reserved","","UC_NONE" 160 | 154,"","Reserved","","UC_NONE" 161 | 155,"","Reserved","","UC_NONE" 162 | 156,"","Reserved","","UC_NONE" 163 | 157,"","Reserved","","UC_NONE" 164 | 158,"","Reserved","","UC_NONE" 165 | 159,"","Reserved","","UC_NONE" 166 | 160,"","Reserved","","UC_NONE" 167 | 161,"","Reserved","","UC_NONE" 168 | 162,"","Reserved","","UC_NONE" 169 | 163,"","Reserved","","UC_NONE" 170 | 164,"","Reserved","","UC_NONE" 171 | 165,"","Reserved","","UC_NONE" 172 | 166,"","Reserved","","UC_NONE" 173 | 167,"","Reserved","","UC_NONE" 174 | 168,"","Reserved","","UC_NONE" 175 | 169,"","Reserved","","UC_NONE" 176 | 170,"","Reserved","","UC_NONE" 177 | 171,"","Reserved","","UC_NONE" 178 | 172,"","Reserved","","UC_NONE" 179 | 173,"","Reserved","","UC_NONE" 180 | 174,"","Reserved","","UC_NONE" 181 | 175,"","Reserved","","UC_NONE" 182 | 176,"","Reserved","","UC_NONE" 183 | 177,"","Reserved","","UC_NONE" 184 | 178,"","Reserved","","UC_NONE" 185 | 179,"","Reserved","","UC_NONE" 186 | 180,"","Reserved","","UC_NONE" 187 | 181,"","Reserved","","UC_NONE" 188 | 182,"","Reserved","","UC_NONE" 189 | 183,"","Reserved","","UC_NONE" 190 | 184,"","Reserved","","UC_NONE" 191 | 185,"","Reserved","","UC_NONE" 192 | 186,"","Reserved","","UC_NONE" 193 | 187,"","Reserved","","UC_NONE" 194 | 188,"","Reserved","","UC_NONE" 195 | 189,"","Reserved","","UC_NONE" 196 | 190,"","Reserved","","UC_NONE" 197 | 191,"","Reserved","","UC_NONE" 198 | 192,"","Reserved for local use","","UC_NONE" 199 | 193,"","Reserved for local use","","UC_NONE" 200 | 194,"","Reserved for local use","","UC_NONE" 201 | 195,"","Reserved for local use","","UC_NONE" 202 | 196,"","Reserved for local use","","UC_NONE" 203 | 197,"","Reserved for local use","","UC_NONE" 204 | 198,"","Reserved for local use","","UC_NONE" 205 | 199,"","Reserved for local use","","UC_NONE" 206 | 200,"","Reserved for local use","","UC_NONE" 207 | 201,"","Reserved for local use","","UC_NONE" 208 | 202,"","Reserved for local use","","UC_NONE" 209 | 203,"","Reserved for local use","","UC_NONE" 210 | 204,"","Reserved for local use","","UC_NONE" 211 | 205,"","Reserved for local use","","UC_NONE" 212 | 206,"","Reserved for local use","","UC_NONE" 213 | 207,"","Reserved for local use","","UC_NONE" 214 | 208,"","Reserved for local use","","UC_NONE" 215 | 209,"","Reserved for local use","","UC_NONE" 216 | 210,"","Reserved for local use","","UC_NONE" 217 | 211,"","Reserved for local use","","UC_NONE" 218 | 212,"","Reserved for local use","","UC_NONE" 219 | 213,"","Reserved for local use","","UC_NONE" 220 | 214,"","Reserved for local use","","UC_NONE" 221 | 215,"","Reserved for local use","","UC_NONE" 222 | 216,"","Reserved for local use","","UC_NONE" 223 | 217,"","Reserved for local use","","UC_NONE" 224 | 218,"","Reserved for local use","","UC_NONE" 225 | 219,"","Reserved for local use","","UC_NONE" 226 | 220,"","Reserved for local use","","UC_NONE" 227 | 221,"","Reserved for local use","","UC_NONE" 228 | 222,"","Reserved for local use","","UC_NONE" 229 | 223,"","Reserved for local use","","UC_NONE" 230 | 224,"","Reserved for local use","","UC_NONE" 231 | 225,"","Reserved for local use","","UC_NONE" 232 | 226,"","Reserved for local use","","UC_NONE" 233 | 227,"","Reserved for local use","","UC_NONE" 234 | 228,"","Reserved for local use","","UC_NONE" 235 | 229,"","Reserved for local use","","UC_NONE" 236 | 230,"","Reserved for local use","","UC_NONE" 237 | 231,"","Reserved for local use","","UC_NONE" 238 | 232,"","Reserved for local use","","UC_NONE" 239 | 233,"","Reserved for local use","","UC_NONE" 240 | 234,"","Reserved for local use","","UC_NONE" 241 | 235,"","Reserved for local use","","UC_NONE" 242 | 236,"","Reserved for local use","","UC_NONE" 243 | 237,"","Reserved for local use","","UC_NONE" 244 | 238,"","Reserved for local use","","UC_NONE" 245 | 239,"","Reserved for local use","","UC_NONE" 246 | 240,"","Reserved for local use","","UC_NONE" 247 | 241,"","Reserved for local use","","UC_NONE" 248 | 242,"","Reserved for local use","","UC_NONE" 249 | 243,"","Reserved for local use","","UC_NONE" 250 | 244,"","Reserved for local use","","UC_NONE" 251 | 245,"","Reserved for local use","","UC_NONE" 252 | 246,"","Reserved for local use","","UC_NONE" 253 | 247,"","Reserved for local use","","UC_NONE" 254 | 248,"","Reserved for local use","","UC_NONE" 255 | 249,"","Reserved for local use","","UC_NONE" 256 | 250,"","Reserved for local use","","UC_NONE" 257 | 251,"","Reserved for local use","","UC_NONE" 258 | 252,"","Reserved for local use","","UC_NONE" 259 | 253,"","Reserved for local use","","UC_NONE" 260 | 254,"","Reserved for local use","","UC_NONE" 261 | 255,"","Missing","","UC_NONE" 262 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_20_2.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Population density","Person m-2","UC_NONE" 7 | 1,"","Reserved","","UC_NONE" 8 | 2,"","Reserved","","UC_NONE" 9 | 3,"","Reserved","","UC_NONE" 10 | 4,"","Reserved","","UC_NONE" 11 | 5,"","Reserved","","UC_NONE" 12 | 6,"","Reserved","","UC_NONE" 13 | 7,"","Reserved","","UC_NONE" 14 | 8,"","Reserved","","UC_NONE" 15 | 9,"","Reserved","","UC_NONE" 16 | 10,"","Reserved","","UC_NONE" 17 | 11,"","Reserved","","UC_NONE" 18 | 12,"","Reserved","","UC_NONE" 19 | 13,"","Reserved","","UC_NONE" 20 | 14,"","Reserved","","UC_NONE" 21 | 15,"","Reserved","","UC_NONE" 22 | 16,"","Reserved","","UC_NONE" 23 | 17,"","Reserved","","UC_NONE" 24 | 18,"","Reserved","","UC_NONE" 25 | 19,"","Reserved","","UC_NONE" 26 | 20,"","Reserved","","UC_NONE" 27 | 21,"","Reserved","","UC_NONE" 28 | 22,"","Reserved","","UC_NONE" 29 | 23,"","Reserved","","UC_NONE" 30 | 24,"","Reserved","","UC_NONE" 31 | 25,"","Reserved","","UC_NONE" 32 | 26,"","Reserved","","UC_NONE" 33 | 27,"","Reserved","","UC_NONE" 34 | 28,"","Reserved","","UC_NONE" 35 | 29,"","Reserved","","UC_NONE" 36 | 30,"","Reserved","","UC_NONE" 37 | 31,"","Reserved","","UC_NONE" 38 | 32,"","Reserved","","UC_NONE" 39 | 33,"","Reserved","","UC_NONE" 40 | 34,"","Reserved","","UC_NONE" 41 | 35,"","Reserved","","UC_NONE" 42 | 36,"","Reserved","","UC_NONE" 43 | 37,"","Reserved","","UC_NONE" 44 | 38,"","Reserved","","UC_NONE" 45 | 39,"","Reserved","","UC_NONE" 46 | 40,"","Reserved","","UC_NONE" 47 | 41,"","Reserved","","UC_NONE" 48 | 42,"","Reserved","","UC_NONE" 49 | 43,"","Reserved","","UC_NONE" 50 | 44,"","Reserved","","UC_NONE" 51 | 45,"","Reserved","","UC_NONE" 52 | 46,"","Reserved","","UC_NONE" 53 | 47,"","Reserved","","UC_NONE" 54 | 48,"","Reserved","","UC_NONE" 55 | 49,"","Reserved","","UC_NONE" 56 | 50,"","Reserved","","UC_NONE" 57 | 51,"","Reserved","","UC_NONE" 58 | 52,"","Reserved","","UC_NONE" 59 | 53,"","Reserved","","UC_NONE" 60 | 54,"","Reserved","","UC_NONE" 61 | 55,"","Reserved","","UC_NONE" 62 | 56,"","Reserved","","UC_NONE" 63 | 57,"","Reserved","","UC_NONE" 64 | 58,"","Reserved","","UC_NONE" 65 | 59,"","Reserved","","UC_NONE" 66 | 60,"","Reserved","","UC_NONE" 67 | 61,"","Reserved","","UC_NONE" 68 | 62,"","Reserved","","UC_NONE" 69 | 63,"","Reserved","","UC_NONE" 70 | 64,"","Reserved","","UC_NONE" 71 | 65,"","Reserved","","UC_NONE" 72 | 66,"","Reserved","","UC_NONE" 73 | 67,"","Reserved","","UC_NONE" 74 | 68,"","Reserved","","UC_NONE" 75 | 69,"","Reserved","","UC_NONE" 76 | 70,"","Reserved","","UC_NONE" 77 | 71,"","Reserved","","UC_NONE" 78 | 72,"","Reserved","","UC_NONE" 79 | 73,"","Reserved","","UC_NONE" 80 | 74,"","Reserved","","UC_NONE" 81 | 75,"","Reserved","","UC_NONE" 82 | 76,"","Reserved","","UC_NONE" 83 | 77,"","Reserved","","UC_NONE" 84 | 78,"","Reserved","","UC_NONE" 85 | 79,"","Reserved","","UC_NONE" 86 | 80,"","Reserved","","UC_NONE" 87 | 81,"","Reserved","","UC_NONE" 88 | 82,"","Reserved","","UC_NONE" 89 | 83,"","Reserved","","UC_NONE" 90 | 84,"","Reserved","","UC_NONE" 91 | 85,"","Reserved","","UC_NONE" 92 | 86,"","Reserved","","UC_NONE" 93 | 87,"","Reserved","","UC_NONE" 94 | 88,"","Reserved","","UC_NONE" 95 | 89,"","Reserved","","UC_NONE" 96 | 90,"","Reserved","","UC_NONE" 97 | 91,"","Reserved","","UC_NONE" 98 | 92,"","Reserved","","UC_NONE" 99 | 93,"","Reserved","","UC_NONE" 100 | 94,"","Reserved","","UC_NONE" 101 | 95,"","Reserved","","UC_NONE" 102 | 96,"","Reserved","","UC_NONE" 103 | 97,"","Reserved","","UC_NONE" 104 | 98,"","Reserved","","UC_NONE" 105 | 99,"","Reserved","","UC_NONE" 106 | 100,"","Reserved","","UC_NONE" 107 | 101,"","Reserved","","UC_NONE" 108 | 102,"","Reserved","","UC_NONE" 109 | 103,"","Reserved","","UC_NONE" 110 | 104,"","Reserved","","UC_NONE" 111 | 105,"","Reserved","","UC_NONE" 112 | 106,"","Reserved","","UC_NONE" 113 | 107,"","Reserved","","UC_NONE" 114 | 108,"","Reserved","","UC_NONE" 115 | 109,"","Reserved","","UC_NONE" 116 | 110,"","Reserved","","UC_NONE" 117 | 111,"","Reserved","","UC_NONE" 118 | 112,"","Reserved","","UC_NONE" 119 | 113,"","Reserved","","UC_NONE" 120 | 114,"","Reserved","","UC_NONE" 121 | 115,"","Reserved","","UC_NONE" 122 | 116,"","Reserved","","UC_NONE" 123 | 117,"","Reserved","","UC_NONE" 124 | 118,"","Reserved","","UC_NONE" 125 | 119,"","Reserved","","UC_NONE" 126 | 120,"","Reserved","","UC_NONE" 127 | 121,"","Reserved","","UC_NONE" 128 | 122,"","Reserved","","UC_NONE" 129 | 123,"","Reserved","","UC_NONE" 130 | 124,"","Reserved","","UC_NONE" 131 | 125,"","Reserved","","UC_NONE" 132 | 126,"","Reserved","","UC_NONE" 133 | 127,"","Reserved","","UC_NONE" 134 | 128,"","Reserved","","UC_NONE" 135 | 129,"","Reserved","","UC_NONE" 136 | 130,"","Reserved","","UC_NONE" 137 | 131,"","Reserved","","UC_NONE" 138 | 132,"","Reserved","","UC_NONE" 139 | 133,"","Reserved","","UC_NONE" 140 | 134,"","Reserved","","UC_NONE" 141 | 135,"","Reserved","","UC_NONE" 142 | 136,"","Reserved","","UC_NONE" 143 | 137,"","Reserved","","UC_NONE" 144 | 138,"","Reserved","","UC_NONE" 145 | 139,"","Reserved","","UC_NONE" 146 | 140,"","Reserved","","UC_NONE" 147 | 141,"","Reserved","","UC_NONE" 148 | 142,"","Reserved","","UC_NONE" 149 | 143,"","Reserved","","UC_NONE" 150 | 144,"","Reserved","","UC_NONE" 151 | 145,"","Reserved","","UC_NONE" 152 | 146,"","Reserved","","UC_NONE" 153 | 147,"","Reserved","","UC_NONE" 154 | 148,"","Reserved","","UC_NONE" 155 | 149,"","Reserved","","UC_NONE" 156 | 150,"","Reserved","","UC_NONE" 157 | 151,"","Reserved","","UC_NONE" 158 | 152,"","Reserved","","UC_NONE" 159 | 153,"","Reserved","","UC_NONE" 160 | 154,"","Reserved","","UC_NONE" 161 | 155,"","Reserved","","UC_NONE" 162 | 156,"","Reserved","","UC_NONE" 163 | 157,"","Reserved","","UC_NONE" 164 | 158,"","Reserved","","UC_NONE" 165 | 159,"","Reserved","","UC_NONE" 166 | 160,"","Reserved","","UC_NONE" 167 | 161,"","Reserved","","UC_NONE" 168 | 162,"","Reserved","","UC_NONE" 169 | 163,"","Reserved","","UC_NONE" 170 | 164,"","Reserved","","UC_NONE" 171 | 165,"","Reserved","","UC_NONE" 172 | 166,"","Reserved","","UC_NONE" 173 | 167,"","Reserved","","UC_NONE" 174 | 168,"","Reserved","","UC_NONE" 175 | 169,"","Reserved","","UC_NONE" 176 | 170,"","Reserved","","UC_NONE" 177 | 171,"","Reserved","","UC_NONE" 178 | 172,"","Reserved","","UC_NONE" 179 | 173,"","Reserved","","UC_NONE" 180 | 174,"","Reserved","","UC_NONE" 181 | 175,"","Reserved","","UC_NONE" 182 | 176,"","Reserved","","UC_NONE" 183 | 177,"","Reserved","","UC_NONE" 184 | 178,"","Reserved","","UC_NONE" 185 | 179,"","Reserved","","UC_NONE" 186 | 180,"","Reserved","","UC_NONE" 187 | 181,"","Reserved","","UC_NONE" 188 | 182,"","Reserved","","UC_NONE" 189 | 183,"","Reserved","","UC_NONE" 190 | 184,"","Reserved","","UC_NONE" 191 | 185,"","Reserved","","UC_NONE" 192 | 186,"","Reserved","","UC_NONE" 193 | 187,"","Reserved","","UC_NONE" 194 | 188,"","Reserved","","UC_NONE" 195 | 189,"","Reserved","","UC_NONE" 196 | 190,"","Reserved","","UC_NONE" 197 | 191,"","Reserved","","UC_NONE" 198 | 192,"","Reserved for local use","","UC_NONE" 199 | 193,"","Reserved for local use","","UC_NONE" 200 | 194,"","Reserved for local use","","UC_NONE" 201 | 195,"","Reserved for local use","","UC_NONE" 202 | 196,"","Reserved for local use","","UC_NONE" 203 | 197,"","Reserved for local use","","UC_NONE" 204 | 198,"","Reserved for local use","","UC_NONE" 205 | 199,"","Reserved for local use","","UC_NONE" 206 | 200,"","Reserved for local use","","UC_NONE" 207 | 201,"","Reserved for local use","","UC_NONE" 208 | 202,"","Reserved for local use","","UC_NONE" 209 | 203,"","Reserved for local use","","UC_NONE" 210 | 204,"","Reserved for local use","","UC_NONE" 211 | 205,"","Reserved for local use","","UC_NONE" 212 | 206,"","Reserved for local use","","UC_NONE" 213 | 207,"","Reserved for local use","","UC_NONE" 214 | 208,"","Reserved for local use","","UC_NONE" 215 | 209,"","Reserved for local use","","UC_NONE" 216 | 210,"","Reserved for local use","","UC_NONE" 217 | 211,"","Reserved for local use","","UC_NONE" 218 | 212,"","Reserved for local use","","UC_NONE" 219 | 213,"","Reserved for local use","","UC_NONE" 220 | 214,"","Reserved for local use","","UC_NONE" 221 | 215,"","Reserved for local use","","UC_NONE" 222 | 216,"","Reserved for local use","","UC_NONE" 223 | 217,"","Reserved for local use","","UC_NONE" 224 | 218,"","Reserved for local use","","UC_NONE" 225 | 219,"","Reserved for local use","","UC_NONE" 226 | 220,"","Reserved for local use","","UC_NONE" 227 | 221,"","Reserved for local use","","UC_NONE" 228 | 222,"","Reserved for local use","","UC_NONE" 229 | 223,"","Reserved for local use","","UC_NONE" 230 | 224,"","Reserved for local use","","UC_NONE" 231 | 225,"","Reserved for local use","","UC_NONE" 232 | 226,"","Reserved for local use","","UC_NONE" 233 | 227,"","Reserved for local use","","UC_NONE" 234 | 228,"","Reserved for local use","","UC_NONE" 235 | 229,"","Reserved for local use","","UC_NONE" 236 | 230,"","Reserved for local use","","UC_NONE" 237 | 231,"","Reserved for local use","","UC_NONE" 238 | 232,"","Reserved for local use","","UC_NONE" 239 | 233,"","Reserved for local use","","UC_NONE" 240 | 234,"","Reserved for local use","","UC_NONE" 241 | 235,"","Reserved for local use","","UC_NONE" 242 | 236,"","Reserved for local use","","UC_NONE" 243 | 237,"","Reserved for local use","","UC_NONE" 244 | 238,"","Reserved for local use","","UC_NONE" 245 | 239,"","Reserved for local use","","UC_NONE" 246 | 240,"","Reserved for local use","","UC_NONE" 247 | 241,"","Reserved for local use","","UC_NONE" 248 | 242,"","Reserved for local use","","UC_NONE" 249 | 243,"","Reserved for local use","","UC_NONE" 250 | 244,"","Reserved for local use","","UC_NONE" 251 | 245,"","Reserved for local use","","UC_NONE" 252 | 246,"","Reserved for local use","","UC_NONE" 253 | 247,"","Reserved for local use","","UC_NONE" 254 | 248,"","Reserved for local use","","UC_NONE" 255 | 249,"","Reserved for local use","","UC_NONE" 256 | 250,"","Reserved for local use","","UC_NONE" 257 | 251,"","Reserved for local use","","UC_NONE" 258 | 252,"","Reserved for local use","","UC_NONE" 259 | 253,"","Reserved for local use","","UC_NONE" 260 | 254,"","Reserved for local use","","UC_NONE" 261 | 255,"","Missing","","UC_NONE" 262 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_2_5.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Glacier cover","Proportion","UC_NONE" 7 | 1,"","Glacier temperature","K","UC_NONE" 8 | 2,"","Reserved","","UC_NONE" 9 | 3,"","Reserved","","UC_NONE" 10 | 4,"","Reserved","","UC_NONE" 11 | 5,"","Reserved","","UC_NONE" 12 | 6,"","Reserved","","UC_NONE" 13 | 7,"","Reserved","","UC_NONE" 14 | 8,"","Reserved","","UC_NONE" 15 | 9,"","Reserved","","UC_NONE" 16 | 10,"","Reserved","","UC_NONE" 17 | 11,"","Reserved","","UC_NONE" 18 | 12,"","Reserved","","UC_NONE" 19 | 13,"","Reserved","","UC_NONE" 20 | 14,"","Reserved","","UC_NONE" 21 | 15,"","Reserved","","UC_NONE" 22 | 16,"","Reserved","","UC_NONE" 23 | 17,"","Reserved","","UC_NONE" 24 | 18,"","Reserved","","UC_NONE" 25 | 19,"","Reserved","","UC_NONE" 26 | 20,"","Reserved","","UC_NONE" 27 | 21,"","Reserved","","UC_NONE" 28 | 22,"","Reserved","","UC_NONE" 29 | 23,"","Reserved","","UC_NONE" 30 | 24,"","Reserved","","UC_NONE" 31 | 25,"","Reserved","","UC_NONE" 32 | 26,"","Reserved","","UC_NONE" 33 | 27,"","Reserved","","UC_NONE" 34 | 28,"","Reserved","","UC_NONE" 35 | 29,"","Reserved","","UC_NONE" 36 | 30,"","Reserved","","UC_NONE" 37 | 31,"","Reserved","","UC_NONE" 38 | 32,"","Reserved","","UC_NONE" 39 | 33,"","Reserved","","UC_NONE" 40 | 34,"","Reserved","","UC_NONE" 41 | 35,"","Reserved","","UC_NONE" 42 | 36,"","Reserved","","UC_NONE" 43 | 37,"","Reserved","","UC_NONE" 44 | 38,"","Reserved","","UC_NONE" 45 | 39,"","Reserved","","UC_NONE" 46 | 40,"","Reserved","","UC_NONE" 47 | 41,"","Reserved","","UC_NONE" 48 | 42,"","Reserved","","UC_NONE" 49 | 43,"","Reserved","","UC_NONE" 50 | 44,"","Reserved","","UC_NONE" 51 | 45,"","Reserved","","UC_NONE" 52 | 46,"","Reserved","","UC_NONE" 53 | 47,"","Reserved","","UC_NONE" 54 | 48,"","Reserved","","UC_NONE" 55 | 49,"","Reserved","","UC_NONE" 56 | 50,"","Reserved","","UC_NONE" 57 | 51,"","Reserved","","UC_NONE" 58 | 52,"","Reserved","","UC_NONE" 59 | 53,"","Reserved","","UC_NONE" 60 | 54,"","Reserved","","UC_NONE" 61 | 55,"","Reserved","","UC_NONE" 62 | 56,"","Reserved","","UC_NONE" 63 | 57,"","Reserved","","UC_NONE" 64 | 58,"","Reserved","","UC_NONE" 65 | 59,"","Reserved","","UC_NONE" 66 | 60,"","Reserved","","UC_NONE" 67 | 61,"","Reserved","","UC_NONE" 68 | 62,"","Reserved","","UC_NONE" 69 | 63,"","Reserved","","UC_NONE" 70 | 64,"","Reserved","","UC_NONE" 71 | 65,"","Reserved","","UC_NONE" 72 | 66,"","Reserved","","UC_NONE" 73 | 67,"","Reserved","","UC_NONE" 74 | 68,"","Reserved","","UC_NONE" 75 | 69,"","Reserved","","UC_NONE" 76 | 70,"","Reserved","","UC_NONE" 77 | 71,"","Reserved","","UC_NONE" 78 | 72,"","Reserved","","UC_NONE" 79 | 73,"","Reserved","","UC_NONE" 80 | 74,"","Reserved","","UC_NONE" 81 | 75,"","Reserved","","UC_NONE" 82 | 76,"","Reserved","","UC_NONE" 83 | 77,"","Reserved","","UC_NONE" 84 | 78,"","Reserved","","UC_NONE" 85 | 79,"","Reserved","","UC_NONE" 86 | 80,"","Reserved","","UC_NONE" 87 | 81,"","Reserved","","UC_NONE" 88 | 82,"","Reserved","","UC_NONE" 89 | 83,"","Reserved","","UC_NONE" 90 | 84,"","Reserved","","UC_NONE" 91 | 85,"","Reserved","","UC_NONE" 92 | 86,"","Reserved","","UC_NONE" 93 | 87,"","Reserved","","UC_NONE" 94 | 88,"","Reserved","","UC_NONE" 95 | 89,"","Reserved","","UC_NONE" 96 | 90,"","Reserved","","UC_NONE" 97 | 91,"","Reserved","","UC_NONE" 98 | 92,"","Reserved","","UC_NONE" 99 | 93,"","Reserved","","UC_NONE" 100 | 94,"","Reserved","","UC_NONE" 101 | 95,"","Reserved","","UC_NONE" 102 | 96,"","Reserved","","UC_NONE" 103 | 97,"","Reserved","","UC_NONE" 104 | 98,"","Reserved","","UC_NONE" 105 | 99,"","Reserved","","UC_NONE" 106 | 100,"","Reserved","","UC_NONE" 107 | 101,"","Reserved","","UC_NONE" 108 | 102,"","Reserved","","UC_NONE" 109 | 103,"","Reserved","","UC_NONE" 110 | 104,"","Reserved","","UC_NONE" 111 | 105,"","Reserved","","UC_NONE" 112 | 106,"","Reserved","","UC_NONE" 113 | 107,"","Reserved","","UC_NONE" 114 | 108,"","Reserved","","UC_NONE" 115 | 109,"","Reserved","","UC_NONE" 116 | 110,"","Reserved","","UC_NONE" 117 | 111,"","Reserved","","UC_NONE" 118 | 112,"","Reserved","","UC_NONE" 119 | 113,"","Reserved","","UC_NONE" 120 | 114,"","Reserved","","UC_NONE" 121 | 115,"","Reserved","","UC_NONE" 122 | 116,"","Reserved","","UC_NONE" 123 | 117,"","Reserved","","UC_NONE" 124 | 118,"","Reserved","","UC_NONE" 125 | 119,"","Reserved","","UC_NONE" 126 | 120,"","Reserved","","UC_NONE" 127 | 121,"","Reserved","","UC_NONE" 128 | 122,"","Reserved","","UC_NONE" 129 | 123,"","Reserved","","UC_NONE" 130 | 124,"","Reserved","","UC_NONE" 131 | 125,"","Reserved","","UC_NONE" 132 | 126,"","Reserved","","UC_NONE" 133 | 127,"","Reserved","","UC_NONE" 134 | 128,"","Reserved","","UC_NONE" 135 | 129,"","Reserved","","UC_NONE" 136 | 130,"","Reserved","","UC_NONE" 137 | 131,"","Reserved","","UC_NONE" 138 | 132,"","Reserved","","UC_NONE" 139 | 133,"","Reserved","","UC_NONE" 140 | 134,"","Reserved","","UC_NONE" 141 | 135,"","Reserved","","UC_NONE" 142 | 136,"","Reserved","","UC_NONE" 143 | 137,"","Reserved","","UC_NONE" 144 | 138,"","Reserved","","UC_NONE" 145 | 139,"","Reserved","","UC_NONE" 146 | 140,"","Reserved","","UC_NONE" 147 | 141,"","Reserved","","UC_NONE" 148 | 142,"","Reserved","","UC_NONE" 149 | 143,"","Reserved","","UC_NONE" 150 | 144,"","Reserved","","UC_NONE" 151 | 145,"","Reserved","","UC_NONE" 152 | 146,"","Reserved","","UC_NONE" 153 | 147,"","Reserved","","UC_NONE" 154 | 148,"","Reserved","","UC_NONE" 155 | 149,"","Reserved","","UC_NONE" 156 | 150,"","Reserved","","UC_NONE" 157 | 151,"","Reserved","","UC_NONE" 158 | 152,"","Reserved","","UC_NONE" 159 | 153,"","Reserved","","UC_NONE" 160 | 154,"","Reserved","","UC_NONE" 161 | 155,"","Reserved","","UC_NONE" 162 | 156,"","Reserved","","UC_NONE" 163 | 157,"","Reserved","","UC_NONE" 164 | 158,"","Reserved","","UC_NONE" 165 | 159,"","Reserved","","UC_NONE" 166 | 160,"","Reserved","","UC_NONE" 167 | 161,"","Reserved","","UC_NONE" 168 | 162,"","Reserved","","UC_NONE" 169 | 163,"","Reserved","","UC_NONE" 170 | 164,"","Reserved","","UC_NONE" 171 | 165,"","Reserved","","UC_NONE" 172 | 166,"","Reserved","","UC_NONE" 173 | 167,"","Reserved","","UC_NONE" 174 | 168,"","Reserved","","UC_NONE" 175 | 169,"","Reserved","","UC_NONE" 176 | 170,"","Reserved","","UC_NONE" 177 | 171,"","Reserved","","UC_NONE" 178 | 172,"","Reserved","","UC_NONE" 179 | 173,"","Reserved","","UC_NONE" 180 | 174,"","Reserved","","UC_NONE" 181 | 175,"","Reserved","","UC_NONE" 182 | 176,"","Reserved","","UC_NONE" 183 | 177,"","Reserved","","UC_NONE" 184 | 178,"","Reserved","","UC_NONE" 185 | 179,"","Reserved","","UC_NONE" 186 | 180,"","Reserved","","UC_NONE" 187 | 181,"","Reserved","","UC_NONE" 188 | 182,"","Reserved","","UC_NONE" 189 | 183,"","Reserved","","UC_NONE" 190 | 184,"","Reserved","","UC_NONE" 191 | 185,"","Reserved","","UC_NONE" 192 | 186,"","Reserved","","UC_NONE" 193 | 187,"","Reserved","","UC_NONE" 194 | 188,"","Reserved","","UC_NONE" 195 | 189,"","Reserved","","UC_NONE" 196 | 190,"","Reserved","","UC_NONE" 197 | 191,"","Reserved","","UC_NONE" 198 | 192,"","Reserved for local use","","UC_NONE" 199 | 193,"","Reserved for local use","","UC_NONE" 200 | 194,"","Reserved for local use","","UC_NONE" 201 | 195,"","Reserved for local use","","UC_NONE" 202 | 196,"","Reserved for local use","","UC_NONE" 203 | 197,"","Reserved for local use","","UC_NONE" 204 | 198,"","Reserved for local use","","UC_NONE" 205 | 199,"","Reserved for local use","","UC_NONE" 206 | 200,"","Reserved for local use","","UC_NONE" 207 | 201,"","Reserved for local use","","UC_NONE" 208 | 202,"","Reserved for local use","","UC_NONE" 209 | 203,"","Reserved for local use","","UC_NONE" 210 | 204,"","Reserved for local use","","UC_NONE" 211 | 205,"","Reserved for local use","","UC_NONE" 212 | 206,"","Reserved for local use","","UC_NONE" 213 | 207,"","Reserved for local use","","UC_NONE" 214 | 208,"","Reserved for local use","","UC_NONE" 215 | 209,"","Reserved for local use","","UC_NONE" 216 | 210,"","Reserved for local use","","UC_NONE" 217 | 211,"","Reserved for local use","","UC_NONE" 218 | 212,"","Reserved for local use","","UC_NONE" 219 | 213,"","Reserved for local use","","UC_NONE" 220 | 214,"","Reserved for local use","","UC_NONE" 221 | 215,"","Reserved for local use","","UC_NONE" 222 | 216,"","Reserved for local use","","UC_NONE" 223 | 217,"","Reserved for local use","","UC_NONE" 224 | 218,"","Reserved for local use","","UC_NONE" 225 | 219,"","Reserved for local use","","UC_NONE" 226 | 220,"","Reserved for local use","","UC_NONE" 227 | 221,"","Reserved for local use","","UC_NONE" 228 | 222,"","Reserved for local use","","UC_NONE" 229 | 223,"","Reserved for local use","","UC_NONE" 230 | 224,"","Reserved for local use","","UC_NONE" 231 | 225,"","Reserved for local use","","UC_NONE" 232 | 226,"","Reserved for local use","","UC_NONE" 233 | 227,"","Reserved for local use","","UC_NONE" 234 | 228,"","Reserved for local use","","UC_NONE" 235 | 229,"","Reserved for local use","","UC_NONE" 236 | 230,"","Reserved for local use","","UC_NONE" 237 | 231,"","Reserved for local use","","UC_NONE" 238 | 232,"","Reserved for local use","","UC_NONE" 239 | 233,"","Reserved for local use","","UC_NONE" 240 | 234,"","Reserved for local use","","UC_NONE" 241 | 235,"","Reserved for local use","","UC_NONE" 242 | 236,"","Reserved for local use","","UC_NONE" 243 | 237,"","Reserved for local use","","UC_NONE" 244 | 238,"","Reserved for local use","","UC_NONE" 245 | 239,"","Reserved for local use","","UC_NONE" 246 | 240,"","Reserved for local use","","UC_NONE" 247 | 241,"","Reserved for local use","","UC_NONE" 248 | 242,"","Reserved for local use","","UC_NONE" 249 | 243,"","Reserved for local use","","UC_NONE" 250 | 244,"","Reserved for local use","","UC_NONE" 251 | 245,"","Reserved for local use","","UC_NONE" 252 | 246,"","Reserved for local use","","UC_NONE" 253 | 247,"","Reserved for local use","","UC_NONE" 254 | 248,"","Reserved for local use","","UC_NONE" 255 | 249,"","Reserved for local use","","UC_NONE" 256 | 250,"","Reserved for local use","","UC_NONE" 257 | 251,"","Reserved for local use","","UC_NONE" 258 | 252,"","Reserved for local use","","UC_NONE" 259 | 253,"","Reserved for local use","","UC_NONE" 260 | 254,"","Reserved for local use","","UC_NONE" 261 | 255,"","Missing","","UC_NONE" 262 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_2_6.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Urban cover","Proportion","UC_NONE" 7 | 1,"","Road cover","Proportion","UC_NONE" 8 | 2,"","Building cover","Proportion","UC_NONE" 9 | 3,"","Building height","m","UC_NONE" 10 | 4,"","Vertical-to-horizontal area fraction","m2 m-2","UC_NONE" 11 | 5,"","Standard deviation of building height","m","UC_NONE" 12 | 6,"","Reserved","","UC_NONE" 13 | 7,"","Reserved","","UC_NONE" 14 | 8,"","Reserved","","UC_NONE" 15 | 9,"","Reserved","","UC_NONE" 16 | 10,"","Reserved","","UC_NONE" 17 | 11,"","Reserved","","UC_NONE" 18 | 12,"","Reserved","","UC_NONE" 19 | 13,"","Reserved","","UC_NONE" 20 | 14,"","Reserved","","UC_NONE" 21 | 15,"","Reserved","","UC_NONE" 22 | 16,"","Reserved","","UC_NONE" 23 | 17,"","Reserved","","UC_NONE" 24 | 18,"","Reserved","","UC_NONE" 25 | 19,"","Reserved","","UC_NONE" 26 | 20,"","Reserved","","UC_NONE" 27 | 21,"","Reserved","","UC_NONE" 28 | 22,"","Reserved","","UC_NONE" 29 | 23,"","Reserved","","UC_NONE" 30 | 24,"","Reserved","","UC_NONE" 31 | 25,"","Reserved","","UC_NONE" 32 | 26,"","Reserved","","UC_NONE" 33 | 27,"","Reserved","","UC_NONE" 34 | 28,"","Reserved","","UC_NONE" 35 | 29,"","Reserved","","UC_NONE" 36 | 30,"","Reserved","","UC_NONE" 37 | 31,"","Reserved","","UC_NONE" 38 | 32,"","Reserved","","UC_NONE" 39 | 33,"","Reserved","","UC_NONE" 40 | 34,"","Reserved","","UC_NONE" 41 | 35,"","Reserved","","UC_NONE" 42 | 36,"","Reserved","","UC_NONE" 43 | 37,"","Reserved","","UC_NONE" 44 | 38,"","Reserved","","UC_NONE" 45 | 39,"","Reserved","","UC_NONE" 46 | 40,"","Reserved","","UC_NONE" 47 | 41,"","Reserved","","UC_NONE" 48 | 42,"","Reserved","","UC_NONE" 49 | 43,"","Reserved","","UC_NONE" 50 | 44,"","Reserved","","UC_NONE" 51 | 45,"","Reserved","","UC_NONE" 52 | 46,"","Reserved","","UC_NONE" 53 | 47,"","Reserved","","UC_NONE" 54 | 48,"","Reserved","","UC_NONE" 55 | 49,"","Reserved","","UC_NONE" 56 | 50,"","Reserved","","UC_NONE" 57 | 51,"","Reserved","","UC_NONE" 58 | 52,"","Reserved","","UC_NONE" 59 | 53,"","Reserved","","UC_NONE" 60 | 54,"","Reserved","","UC_NONE" 61 | 55,"","Reserved","","UC_NONE" 62 | 56,"","Reserved","","UC_NONE" 63 | 57,"","Reserved","","UC_NONE" 64 | 58,"","Reserved","","UC_NONE" 65 | 59,"","Reserved","","UC_NONE" 66 | 60,"","Reserved","","UC_NONE" 67 | 61,"","Reserved","","UC_NONE" 68 | 62,"","Reserved","","UC_NONE" 69 | 63,"","Reserved","","UC_NONE" 70 | 64,"","Reserved","","UC_NONE" 71 | 65,"","Reserved","","UC_NONE" 72 | 66,"","Reserved","","UC_NONE" 73 | 67,"","Reserved","","UC_NONE" 74 | 68,"","Reserved","","UC_NONE" 75 | 69,"","Reserved","","UC_NONE" 76 | 70,"","Reserved","","UC_NONE" 77 | 71,"","Reserved","","UC_NONE" 78 | 72,"","Reserved","","UC_NONE" 79 | 73,"","Reserved","","UC_NONE" 80 | 74,"","Reserved","","UC_NONE" 81 | 75,"","Reserved","","UC_NONE" 82 | 76,"","Reserved","","UC_NONE" 83 | 77,"","Reserved","","UC_NONE" 84 | 78,"","Reserved","","UC_NONE" 85 | 79,"","Reserved","","UC_NONE" 86 | 80,"","Reserved","","UC_NONE" 87 | 81,"","Reserved","","UC_NONE" 88 | 82,"","Reserved","","UC_NONE" 89 | 83,"","Reserved","","UC_NONE" 90 | 84,"","Reserved","","UC_NONE" 91 | 85,"","Reserved","","UC_NONE" 92 | 86,"","Reserved","","UC_NONE" 93 | 87,"","Reserved","","UC_NONE" 94 | 88,"","Reserved","","UC_NONE" 95 | 89,"","Reserved","","UC_NONE" 96 | 90,"","Reserved","","UC_NONE" 97 | 91,"","Reserved","","UC_NONE" 98 | 92,"","Reserved","","UC_NONE" 99 | 93,"","Reserved","","UC_NONE" 100 | 94,"","Reserved","","UC_NONE" 101 | 95,"","Reserved","","UC_NONE" 102 | 96,"","Reserved","","UC_NONE" 103 | 97,"","Reserved","","UC_NONE" 104 | 98,"","Reserved","","UC_NONE" 105 | 99,"","Reserved","","UC_NONE" 106 | 100,"","Reserved","","UC_NONE" 107 | 101,"","Reserved","","UC_NONE" 108 | 102,"","Reserved","","UC_NONE" 109 | 103,"","Reserved","","UC_NONE" 110 | 104,"","Reserved","","UC_NONE" 111 | 105,"","Reserved","","UC_NONE" 112 | 106,"","Reserved","","UC_NONE" 113 | 107,"","Reserved","","UC_NONE" 114 | 108,"","Reserved","","UC_NONE" 115 | 109,"","Reserved","","UC_NONE" 116 | 110,"","Reserved","","UC_NONE" 117 | 111,"","Reserved","","UC_NONE" 118 | 112,"","Reserved","","UC_NONE" 119 | 113,"","Reserved","","UC_NONE" 120 | 114,"","Reserved","","UC_NONE" 121 | 115,"","Reserved","","UC_NONE" 122 | 116,"","Reserved","","UC_NONE" 123 | 117,"","Reserved","","UC_NONE" 124 | 118,"","Reserved","","UC_NONE" 125 | 119,"","Reserved","","UC_NONE" 126 | 120,"","Reserved","","UC_NONE" 127 | 121,"","Reserved","","UC_NONE" 128 | 122,"","Reserved","","UC_NONE" 129 | 123,"","Reserved","","UC_NONE" 130 | 124,"","Reserved","","UC_NONE" 131 | 125,"","Reserved","","UC_NONE" 132 | 126,"","Reserved","","UC_NONE" 133 | 127,"","Reserved","","UC_NONE" 134 | 128,"","Reserved","","UC_NONE" 135 | 129,"","Reserved","","UC_NONE" 136 | 130,"","Reserved","","UC_NONE" 137 | 131,"","Reserved","","UC_NONE" 138 | 132,"","Reserved","","UC_NONE" 139 | 133,"","Reserved","","UC_NONE" 140 | 134,"","Reserved","","UC_NONE" 141 | 135,"","Reserved","","UC_NONE" 142 | 136,"","Reserved","","UC_NONE" 143 | 137,"","Reserved","","UC_NONE" 144 | 138,"","Reserved","","UC_NONE" 145 | 139,"","Reserved","","UC_NONE" 146 | 140,"","Reserved","","UC_NONE" 147 | 141,"","Reserved","","UC_NONE" 148 | 142,"","Reserved","","UC_NONE" 149 | 143,"","Reserved","","UC_NONE" 150 | 144,"","Reserved","","UC_NONE" 151 | 145,"","Reserved","","UC_NONE" 152 | 146,"","Reserved","","UC_NONE" 153 | 147,"","Reserved","","UC_NONE" 154 | 148,"","Reserved","","UC_NONE" 155 | 149,"","Reserved","","UC_NONE" 156 | 150,"","Reserved","","UC_NONE" 157 | 151,"","Reserved","","UC_NONE" 158 | 152,"","Reserved","","UC_NONE" 159 | 153,"","Reserved","","UC_NONE" 160 | 154,"","Reserved","","UC_NONE" 161 | 155,"","Reserved","","UC_NONE" 162 | 156,"","Reserved","","UC_NONE" 163 | 157,"","Reserved","","UC_NONE" 164 | 158,"","Reserved","","UC_NONE" 165 | 159,"","Reserved","","UC_NONE" 166 | 160,"","Reserved","","UC_NONE" 167 | 161,"","Reserved","","UC_NONE" 168 | 162,"","Reserved","","UC_NONE" 169 | 163,"","Reserved","","UC_NONE" 170 | 164,"","Reserved","","UC_NONE" 171 | 165,"","Reserved","","UC_NONE" 172 | 166,"","Reserved","","UC_NONE" 173 | 167,"","Reserved","","UC_NONE" 174 | 168,"","Reserved","","UC_NONE" 175 | 169,"","Reserved","","UC_NONE" 176 | 170,"","Reserved","","UC_NONE" 177 | 171,"","Reserved","","UC_NONE" 178 | 172,"","Reserved","","UC_NONE" 179 | 173,"","Reserved","","UC_NONE" 180 | 174,"","Reserved","","UC_NONE" 181 | 175,"","Reserved","","UC_NONE" 182 | 176,"","Reserved","","UC_NONE" 183 | 177,"","Reserved","","UC_NONE" 184 | 178,"","Reserved","","UC_NONE" 185 | 179,"","Reserved","","UC_NONE" 186 | 180,"","Reserved","","UC_NONE" 187 | 181,"","Reserved","","UC_NONE" 188 | 182,"","Reserved","","UC_NONE" 189 | 183,"","Reserved","","UC_NONE" 190 | 184,"","Reserved","","UC_NONE" 191 | 185,"","Reserved","","UC_NONE" 192 | 186,"","Reserved","","UC_NONE" 193 | 187,"","Reserved","","UC_NONE" 194 | 188,"","Reserved","","UC_NONE" 195 | 189,"","Reserved","","UC_NONE" 196 | 190,"","Reserved","","UC_NONE" 197 | 191,"","Reserved","","UC_NONE" 198 | 192,"","Reserved for local use","","UC_NONE" 199 | 193,"","Reserved for local use","","UC_NONE" 200 | 194,"","Reserved for local use","","UC_NONE" 201 | 195,"","Reserved for local use","","UC_NONE" 202 | 196,"","Reserved for local use","","UC_NONE" 203 | 197,"","Reserved for local use","","UC_NONE" 204 | 198,"","Reserved for local use","","UC_NONE" 205 | 199,"","Reserved for local use","","UC_NONE" 206 | 200,"","Reserved for local use","","UC_NONE" 207 | 201,"","Reserved for local use","","UC_NONE" 208 | 202,"","Reserved for local use","","UC_NONE" 209 | 203,"","Reserved for local use","","UC_NONE" 210 | 204,"","Reserved for local use","","UC_NONE" 211 | 205,"","Reserved for local use","","UC_NONE" 212 | 206,"","Reserved for local use","","UC_NONE" 213 | 207,"","Reserved for local use","","UC_NONE" 214 | 208,"","Reserved for local use","","UC_NONE" 215 | 209,"","Reserved for local use","","UC_NONE" 216 | 210,"","Reserved for local use","","UC_NONE" 217 | 211,"","Reserved for local use","","UC_NONE" 218 | 212,"","Reserved for local use","","UC_NONE" 219 | 213,"","Reserved for local use","","UC_NONE" 220 | 214,"","Reserved for local use","","UC_NONE" 221 | 215,"","Reserved for local use","","UC_NONE" 222 | 216,"","Reserved for local use","","UC_NONE" 223 | 217,"","Reserved for local use","","UC_NONE" 224 | 218,"","Reserved for local use","","UC_NONE" 225 | 219,"","Reserved for local use","","UC_NONE" 226 | 220,"","Reserved for local use","","UC_NONE" 227 | 221,"","Reserved for local use","","UC_NONE" 228 | 222,"","Reserved for local use","","UC_NONE" 229 | 223,"","Reserved for local use","","UC_NONE" 230 | 224,"","Reserved for local use","","UC_NONE" 231 | 225,"","Reserved for local use","","UC_NONE" 232 | 226,"","Reserved for local use","","UC_NONE" 233 | 227,"","Reserved for local use","","UC_NONE" 234 | 228,"","Reserved for local use","","UC_NONE" 235 | 229,"","Reserved for local use","","UC_NONE" 236 | 230,"","Reserved for local use","","UC_NONE" 237 | 231,"","Reserved for local use","","UC_NONE" 238 | 232,"","Reserved for local use","","UC_NONE" 239 | 233,"","Reserved for local use","","UC_NONE" 240 | 234,"","Reserved for local use","","UC_NONE" 241 | 235,"","Reserved for local use","","UC_NONE" 242 | 236,"","Reserved for local use","","UC_NONE" 243 | 237,"","Reserved for local use","","UC_NONE" 244 | 238,"","Reserved for local use","","UC_NONE" 245 | 239,"","Reserved for local use","","UC_NONE" 246 | 240,"","Reserved for local use","","UC_NONE" 247 | 241,"","Reserved for local use","","UC_NONE" 248 | 242,"","Reserved for local use","","UC_NONE" 249 | 243,"","Reserved for local use","","UC_NONE" 250 | 244,"","Reserved for local use","","UC_NONE" 251 | 245,"","Reserved for local use","","UC_NONE" 252 | 246,"","Reserved for local use","","UC_NONE" 253 | 247,"","Reserved for local use","","UC_NONE" 254 | 248,"","Reserved for local use","","UC_NONE" 255 | 249,"","Reserved for local use","","UC_NONE" 256 | 250,"","Reserved for local use","","UC_NONE" 257 | 251,"","Reserved for local use","","UC_NONE" 258 | 252,"","Reserved for local use","","UC_NONE" 259 | 253,"","Reserved for local use","","UC_NONE" 260 | 254,"","Reserved for local use","","UC_NONE" 261 | 255,"","Missing","","UC_NONE" 262 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_3_2.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Clear sky probability","%","UC_NONE" 7 | 1,"","Cloud top temperature","K","UC_NONE" 8 | 2,"","Cloud top pressure","Pa","UC_NONE" 9 | 3,"","Cloud type","0=No scene identified; 1=Green needle-leafed forest; 2=Green broad-leafed forest; 3=Deciduous needle-leafed forest; 4=Deciduous broad-leafed forest; 5=Deciduous mixed forest; 6=Closed shrub-land; 7=Open shrub-land; 8=Woody savannah; 9=Savannah; 10=Grassland; 11=Permanent wetland; 12=Cropland; 13=Urban; 14=Vegetation/crops; 15=Permanent snow/ice; 16=Barren desert; 17=Water bodies; 18=Tundra; 19=Warm liquid water cloud; 20=Supercooled liquid water cloud; 21=Mixed-phase cloud; 22=Optically thin ice cloud; 23=Optically thick ice cloud; 24=Multilayered cloud; 25-96=Reserved; 97=Snow/ice on land; 98=Snow/ice on water; 99=Sun-glint; 100=General cloud; 101=Low cloud/fog/stratus; 102=Low cloud/stratocumulus; 103=Low cloud/unknown type; 104=Medium cloud/nimbostratus; 105=Medium cloud/altostratus; 106=Medium cloud/unknown type; 107=High cloud/cumulus; 108=High cloud/cirrus; 109=High cloud/unknown; 110=Unknown cloud type; 111=Single layer water cloud; 112=Single layer ice cloud; 113-191=Reserved; 192-254=Reserved for local use; 255=Missing","UC_NONE" 10 | 4,"","Cloud phase","0=No scene identified; 1=Green needle-leafed forest; 2=Green broad-leafed forest; 3=Deciduous needle-leafed forest; 4=Deciduous broad-leafed forest; 5=Deciduous mixed forest; 6=Closed shrub-land; 7=Open shrub-land; 8=Woody savannah; 9=Savannah; 10=Grassland; 11=Permanent wetland; 12=Cropland; 13=Urban; 14=Vegetation/crops; 15=Permanent snow/ice; 16=Barren desert; 17=Water bodies; 18=Tundra; 19=Warm liquid water cloud; 20=Supercooled liquid water cloud; 21=Mixed-phase cloud; 22=Optically thin ice cloud; 23=Optically thick ice cloud; 24=Multilayered cloud; 25-96=Reserved; 97=Snow/ice on land; 98=Snow/ice on water; 99=Sun-glint; 100=General cloud; 101=Low cloud/fog/stratus; 102=Low cloud/stratocumulus; 103=Low cloud/unknown type; 104=Medium cloud/nimbostratus; 105=Medium cloud/altostratus; 106=Medium cloud/unknown type; 107=High cloud/cumulus; 108=High cloud/cirrus; 109=High cloud/unknown; 110=Unknown cloud type; 111=Single layer water cloud; 112=Single layer ice cloud; 113-191=Reserved; 192-254=Reserved for local use; 255=Missing","UC_NONE" 11 | 5,"","Cloud optical depth","Numeric","UC_NONE" 12 | 6,"","Cloud particle effective radius","m","UC_NONE" 13 | 7,"","Cloud liquid water path","kg m-2","UC_NONE" 14 | 8,"","Cloud ice water path","kg m-2","UC_NONE" 15 | 9,"","Cloud albedo","Numeric","UC_NONE" 16 | 10,"","Cloud emissivity","Numeric","UC_NONE" 17 | 11,"","Effective absorption optical depth ratio","Numeric","UC_NONE" 18 | 30,"","Measurement cost","Numeric","UC_NONE" 19 | 31,"","Upper layer cloud optical depth","Numeric","UC_NONE" 20 | 32,"","Upper layer cloud top pressure","Pa","UC_NONE" 21 | 33,"","Upper layer cloud effective radius","m","UC_NONE" 22 | 34,"","Error in upper layer cloud optical depth","Numeric","UC_NONE" 23 | 35,"","Error in upper layer cloud top pressure","Pa","UC_NONE" 24 | 36,"","Error in upper layer cloud effective radius","m","UC_NONE" 25 | 37,"","Lower layer cloud optical depth","Numeric","UC_NONE" 26 | 38,"","Lower layer cloud top pressure","Pa","UC_NONE" 27 | 39,"","Error in lower layer cloud optical depth","Numeric","UC_NONE" 28 | 40,"","Error in lower layer cloud top pressure","Pa","UC_NONE" 29 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_3_3.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Probability of encountering marginal visual flight rule conditions","%","UC_NONE" 7 | 1,"","Probability of encountering low instrument flight rule conditions","%","UC_NONE" 8 | 2,"","Probability of encountering instrument flight rule conditions","%","UC_NONE" 9 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_3_4.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Volcanic ash probability","%","UC_NONE" 7 | 1,"","Volcanic ash cloud top temperature","K","UC_NONE" 8 | 2,"","Volcanic ash cloud top pressure","Pa","UC_NONE" 9 | 3,"","Volcanic ash cloud top height","m","UC_NONE" 10 | 4,"","Volcanic ash cloud emissivity","Numeric","UC_NONE" 11 | 5,"","Volcanic ash effective absorption optical depth ratio","Numeric","UC_NONE" 12 | 6,"","Volcanic ash cloud optical depth","Numeric","UC_NONE" 13 | 7,"","Volcanic ash column density","kg m-2","UC_NONE" 14 | 8,"","Volcanic ash particle effective radius","m","UC_NONE" 15 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_3_5.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Interface sea-surface temperature","K","UC_NONE" 7 | 1,"","Skin sea-surface temperature","K","UC_NONE" 8 | 2,"","Sub-skin sea-surface temperature","K","UC_NONE" 9 | 3,"","Foundation sea-surface temperature","K","UC_NONE" 10 | 4,"","Estimated bias between sea-surface temperature and standard","K","UC_NONE" 11 | 5,"","Estimated standard deviation between sea surface temperature and standard","K","UC_NONE" 12 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_3_6.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Global solar irradiance","W m-2","UC_NONE" 7 | 1,"","Global solar exposure","J m-2","UC_NONE" 8 | 2,"","Direct solar irradiance","W m-2","UC_NONE" 9 | 3,"","Direct solar exposure","J m-2","UC_NONE" 10 | 4,"","Diffuse solar irradiance","W m-2","UC_NONE" 11 | 5,"","Diffuse solar exposure","J m-2","UC_NONE" 12 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_4_0.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Temperature","K","UC_NONE" 7 | 1,"","Electron temperature","K","UC_NONE" 8 | 2,"","Proton temperature","K","UC_NONE" 9 | 3,"","Ion temperature","K","UC_NONE" 10 | 4,"","Parallel temperature","K","UC_NONE" 11 | 5,"","Perpendicular temperature","K","UC_NONE" 12 | 6,"","Reserved","","UC_NONE" 13 | 7,"","Reserved","","UC_NONE" 14 | 8,"","Reserved","","UC_NONE" 15 | 9,"","Reserved","","UC_NONE" 16 | 10,"","Reserved","","UC_NONE" 17 | 11,"","Reserved","","UC_NONE" 18 | 12,"","Reserved","","UC_NONE" 19 | 13,"","Reserved","","UC_NONE" 20 | 14,"","Reserved","","UC_NONE" 21 | 15,"","Reserved","","UC_NONE" 22 | 16,"","Reserved","","UC_NONE" 23 | 17,"","Reserved","","UC_NONE" 24 | 18,"","Reserved","","UC_NONE" 25 | 19,"","Reserved","","UC_NONE" 26 | 20,"","Reserved","","UC_NONE" 27 | 21,"","Reserved","","UC_NONE" 28 | 22,"","Reserved","","UC_NONE" 29 | 23,"","Reserved","","UC_NONE" 30 | 24,"","Reserved","","UC_NONE" 31 | 25,"","Reserved","","UC_NONE" 32 | 26,"","Reserved","","UC_NONE" 33 | 27,"","Reserved","","UC_NONE" 34 | 28,"","Reserved","","UC_NONE" 35 | 29,"","Reserved","","UC_NONE" 36 | 30,"","Reserved","","UC_NONE" 37 | 31,"","Reserved","","UC_NONE" 38 | 32,"","Reserved","","UC_NONE" 39 | 33,"","Reserved","","UC_NONE" 40 | 34,"","Reserved","","UC_NONE" 41 | 35,"","Reserved","","UC_NONE" 42 | 36,"","Reserved","","UC_NONE" 43 | 37,"","Reserved","","UC_NONE" 44 | 38,"","Reserved","","UC_NONE" 45 | 39,"","Reserved","","UC_NONE" 46 | 40,"","Reserved","","UC_NONE" 47 | 41,"","Reserved","","UC_NONE" 48 | 42,"","Reserved","","UC_NONE" 49 | 43,"","Reserved","","UC_NONE" 50 | 44,"","Reserved","","UC_NONE" 51 | 45,"","Reserved","","UC_NONE" 52 | 46,"","Reserved","","UC_NONE" 53 | 47,"","Reserved","","UC_NONE" 54 | 48,"","Reserved","","UC_NONE" 55 | 49,"","Reserved","","UC_NONE" 56 | 50,"","Reserved","","UC_NONE" 57 | 51,"","Reserved","","UC_NONE" 58 | 52,"","Reserved","","UC_NONE" 59 | 53,"","Reserved","","UC_NONE" 60 | 54,"","Reserved","","UC_NONE" 61 | 55,"","Reserved","","UC_NONE" 62 | 56,"","Reserved","","UC_NONE" 63 | 57,"","Reserved","","UC_NONE" 64 | 58,"","Reserved","","UC_NONE" 65 | 59,"","Reserved","","UC_NONE" 66 | 60,"","Reserved","","UC_NONE" 67 | 61,"","Reserved","","UC_NONE" 68 | 62,"","Reserved","","UC_NONE" 69 | 63,"","Reserved","","UC_NONE" 70 | 64,"","Reserved","","UC_NONE" 71 | 65,"","Reserved","","UC_NONE" 72 | 66,"","Reserved","","UC_NONE" 73 | 67,"","Reserved","","UC_NONE" 74 | 68,"","Reserved","","UC_NONE" 75 | 69,"","Reserved","","UC_NONE" 76 | 70,"","Reserved","","UC_NONE" 77 | 71,"","Reserved","","UC_NONE" 78 | 72,"","Reserved","","UC_NONE" 79 | 73,"","Reserved","","UC_NONE" 80 | 74,"","Reserved","","UC_NONE" 81 | 75,"","Reserved","","UC_NONE" 82 | 76,"","Reserved","","UC_NONE" 83 | 77,"","Reserved","","UC_NONE" 84 | 78,"","Reserved","","UC_NONE" 85 | 79,"","Reserved","","UC_NONE" 86 | 80,"","Reserved","","UC_NONE" 87 | 81,"","Reserved","","UC_NONE" 88 | 82,"","Reserved","","UC_NONE" 89 | 83,"","Reserved","","UC_NONE" 90 | 84,"","Reserved","","UC_NONE" 91 | 85,"","Reserved","","UC_NONE" 92 | 86,"","Reserved","","UC_NONE" 93 | 87,"","Reserved","","UC_NONE" 94 | 88,"","Reserved","","UC_NONE" 95 | 89,"","Reserved","","UC_NONE" 96 | 90,"","Reserved","","UC_NONE" 97 | 91,"","Reserved","","UC_NONE" 98 | 92,"","Reserved","","UC_NONE" 99 | 93,"","Reserved","","UC_NONE" 100 | 94,"","Reserved","","UC_NONE" 101 | 95,"","Reserved","","UC_NONE" 102 | 96,"","Reserved","","UC_NONE" 103 | 97,"","Reserved","","UC_NONE" 104 | 98,"","Reserved","","UC_NONE" 105 | 99,"","Reserved","","UC_NONE" 106 | 100,"","Reserved","","UC_NONE" 107 | 101,"","Reserved","","UC_NONE" 108 | 102,"","Reserved","","UC_NONE" 109 | 103,"","Reserved","","UC_NONE" 110 | 104,"","Reserved","","UC_NONE" 111 | 105,"","Reserved","","UC_NONE" 112 | 106,"","Reserved","","UC_NONE" 113 | 107,"","Reserved","","UC_NONE" 114 | 108,"","Reserved","","UC_NONE" 115 | 109,"","Reserved","","UC_NONE" 116 | 110,"","Reserved","","UC_NONE" 117 | 111,"","Reserved","","UC_NONE" 118 | 112,"","Reserved","","UC_NONE" 119 | 113,"","Reserved","","UC_NONE" 120 | 114,"","Reserved","","UC_NONE" 121 | 115,"","Reserved","","UC_NONE" 122 | 116,"","Reserved","","UC_NONE" 123 | 117,"","Reserved","","UC_NONE" 124 | 118,"","Reserved","","UC_NONE" 125 | 119,"","Reserved","","UC_NONE" 126 | 120,"","Reserved","","UC_NONE" 127 | 121,"","Reserved","","UC_NONE" 128 | 122,"","Reserved","","UC_NONE" 129 | 123,"","Reserved","","UC_NONE" 130 | 124,"","Reserved","","UC_NONE" 131 | 125,"","Reserved","","UC_NONE" 132 | 126,"","Reserved","","UC_NONE" 133 | 127,"","Reserved","","UC_NONE" 134 | 128,"","Reserved","","UC_NONE" 135 | 129,"","Reserved","","UC_NONE" 136 | 130,"","Reserved","","UC_NONE" 137 | 131,"","Reserved","","UC_NONE" 138 | 132,"","Reserved","","UC_NONE" 139 | 133,"","Reserved","","UC_NONE" 140 | 134,"","Reserved","","UC_NONE" 141 | 135,"","Reserved","","UC_NONE" 142 | 136,"","Reserved","","UC_NONE" 143 | 137,"","Reserved","","UC_NONE" 144 | 138,"","Reserved","","UC_NONE" 145 | 139,"","Reserved","","UC_NONE" 146 | 140,"","Reserved","","UC_NONE" 147 | 141,"","Reserved","","UC_NONE" 148 | 142,"","Reserved","","UC_NONE" 149 | 143,"","Reserved","","UC_NONE" 150 | 144,"","Reserved","","UC_NONE" 151 | 145,"","Reserved","","UC_NONE" 152 | 146,"","Reserved","","UC_NONE" 153 | 147,"","Reserved","","UC_NONE" 154 | 148,"","Reserved","","UC_NONE" 155 | 149,"","Reserved","","UC_NONE" 156 | 150,"","Reserved","","UC_NONE" 157 | 151,"","Reserved","","UC_NONE" 158 | 152,"","Reserved","","UC_NONE" 159 | 153,"","Reserved","","UC_NONE" 160 | 154,"","Reserved","","UC_NONE" 161 | 155,"","Reserved","","UC_NONE" 162 | 156,"","Reserved","","UC_NONE" 163 | 157,"","Reserved","","UC_NONE" 164 | 158,"","Reserved","","UC_NONE" 165 | 159,"","Reserved","","UC_NONE" 166 | 160,"","Reserved","","UC_NONE" 167 | 161,"","Reserved","","UC_NONE" 168 | 162,"","Reserved","","UC_NONE" 169 | 163,"","Reserved","","UC_NONE" 170 | 164,"","Reserved","","UC_NONE" 171 | 165,"","Reserved","","UC_NONE" 172 | 166,"","Reserved","","UC_NONE" 173 | 167,"","Reserved","","UC_NONE" 174 | 168,"","Reserved","","UC_NONE" 175 | 169,"","Reserved","","UC_NONE" 176 | 170,"","Reserved","","UC_NONE" 177 | 171,"","Reserved","","UC_NONE" 178 | 172,"","Reserved","","UC_NONE" 179 | 173,"","Reserved","","UC_NONE" 180 | 174,"","Reserved","","UC_NONE" 181 | 175,"","Reserved","","UC_NONE" 182 | 176,"","Reserved","","UC_NONE" 183 | 177,"","Reserved","","UC_NONE" 184 | 178,"","Reserved","","UC_NONE" 185 | 179,"","Reserved","","UC_NONE" 186 | 180,"","Reserved","","UC_NONE" 187 | 181,"","Reserved","","UC_NONE" 188 | 182,"","Reserved","","UC_NONE" 189 | 183,"","Reserved","","UC_NONE" 190 | 184,"","Reserved","","UC_NONE" 191 | 185,"","Reserved","","UC_NONE" 192 | 186,"","Reserved","","UC_NONE" 193 | 187,"","Reserved","","UC_NONE" 194 | 188,"","Reserved","","UC_NONE" 195 | 189,"","Reserved","","UC_NONE" 196 | 190,"","Reserved","","UC_NONE" 197 | 191,"","Reserved","","UC_NONE" 198 | 192,"","Reserved for local use","","UC_NONE" 199 | 193,"","Reserved for local use","","UC_NONE" 200 | 194,"","Reserved for local use","","UC_NONE" 201 | 195,"","Reserved for local use","","UC_NONE" 202 | 196,"","Reserved for local use","","UC_NONE" 203 | 197,"","Reserved for local use","","UC_NONE" 204 | 198,"","Reserved for local use","","UC_NONE" 205 | 199,"","Reserved for local use","","UC_NONE" 206 | 200,"","Reserved for local use","","UC_NONE" 207 | 201,"","Reserved for local use","","UC_NONE" 208 | 202,"","Reserved for local use","","UC_NONE" 209 | 203,"","Reserved for local use","","UC_NONE" 210 | 204,"","Reserved for local use","","UC_NONE" 211 | 205,"","Reserved for local use","","UC_NONE" 212 | 206,"","Reserved for local use","","UC_NONE" 213 | 207,"","Reserved for local use","","UC_NONE" 214 | 208,"","Reserved for local use","","UC_NONE" 215 | 209,"","Reserved for local use","","UC_NONE" 216 | 210,"","Reserved for local use","","UC_NONE" 217 | 211,"","Reserved for local use","","UC_NONE" 218 | 212,"","Reserved for local use","","UC_NONE" 219 | 213,"","Reserved for local use","","UC_NONE" 220 | 214,"","Reserved for local use","","UC_NONE" 221 | 215,"","Reserved for local use","","UC_NONE" 222 | 216,"","Reserved for local use","","UC_NONE" 223 | 217,"","Reserved for local use","","UC_NONE" 224 | 218,"","Reserved for local use","","UC_NONE" 225 | 219,"","Reserved for local use","","UC_NONE" 226 | 220,"","Reserved for local use","","UC_NONE" 227 | 221,"","Reserved for local use","","UC_NONE" 228 | 222,"","Reserved for local use","","UC_NONE" 229 | 223,"","Reserved for local use","","UC_NONE" 230 | 224,"","Reserved for local use","","UC_NONE" 231 | 225,"","Reserved for local use","","UC_NONE" 232 | 226,"","Reserved for local use","","UC_NONE" 233 | 227,"","Reserved for local use","","UC_NONE" 234 | 228,"","Reserved for local use","","UC_NONE" 235 | 229,"","Reserved for local use","","UC_NONE" 236 | 230,"","Reserved for local use","","UC_NONE" 237 | 231,"","Reserved for local use","","UC_NONE" 238 | 232,"","Reserved for local use","","UC_NONE" 239 | 233,"","Reserved for local use","","UC_NONE" 240 | 234,"","Reserved for local use","","UC_NONE" 241 | 235,"","Reserved for local use","","UC_NONE" 242 | 236,"","Reserved for local use","","UC_NONE" 243 | 237,"","Reserved for local use","","UC_NONE" 244 | 238,"","Reserved for local use","","UC_NONE" 245 | 239,"","Reserved for local use","","UC_NONE" 246 | 240,"","Reserved for local use","","UC_NONE" 247 | 241,"","Reserved for local use","","UC_NONE" 248 | 242,"","Reserved for local use","","UC_NONE" 249 | 243,"","Reserved for local use","","UC_NONE" 250 | 244,"","Reserved for local use","","UC_NONE" 251 | 245,"","Reserved for local use","","UC_NONE" 252 | 246,"","Reserved for local use","","UC_NONE" 253 | 247,"","Reserved for local use","","UC_NONE" 254 | 248,"","Reserved for local use","","UC_NONE" 255 | 249,"","Reserved for local use","","UC_NONE" 256 | 250,"","Reserved for local use","","UC_NONE" 257 | 251,"","Reserved for local use","","UC_NONE" 258 | 252,"","Reserved for local use","","UC_NONE" 259 | 253,"","Reserved for local use","","UC_NONE" 260 | 254,"","Reserved for local use","","UC_NONE" 261 | 255,"","Missing","","UC_NONE" 262 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_4_5.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Amplitude","dB","UC_NONE" 7 | 1,"","Phase","rad","UC_NONE" 8 | 2,"","Frequency","Hz","UC_NONE" 9 | 3,"","Wavelength","m","UC_NONE" 10 | 4,"","Reserved","","UC_NONE" 11 | 5,"","Reserved","","UC_NONE" 12 | 6,"","Reserved","","UC_NONE" 13 | 7,"","Reserved","","UC_NONE" 14 | 8,"","Reserved","","UC_NONE" 15 | 9,"","Reserved","","UC_NONE" 16 | 10,"","Reserved","","UC_NONE" 17 | 11,"","Reserved","","UC_NONE" 18 | 12,"","Reserved","","UC_NONE" 19 | 13,"","Reserved","","UC_NONE" 20 | 14,"","Reserved","","UC_NONE" 21 | 15,"","Reserved","","UC_NONE" 22 | 16,"","Reserved","","UC_NONE" 23 | 17,"","Reserved","","UC_NONE" 24 | 18,"","Reserved","","UC_NONE" 25 | 19,"","Reserved","","UC_NONE" 26 | 20,"","Reserved","","UC_NONE" 27 | 21,"","Reserved","","UC_NONE" 28 | 22,"","Reserved","","UC_NONE" 29 | 23,"","Reserved","","UC_NONE" 30 | 24,"","Reserved","","UC_NONE" 31 | 25,"","Reserved","","UC_NONE" 32 | 26,"","Reserved","","UC_NONE" 33 | 27,"","Reserved","","UC_NONE" 34 | 28,"","Reserved","","UC_NONE" 35 | 29,"","Reserved","","UC_NONE" 36 | 30,"","Reserved","","UC_NONE" 37 | 31,"","Reserved","","UC_NONE" 38 | 32,"","Reserved","","UC_NONE" 39 | 33,"","Reserved","","UC_NONE" 40 | 34,"","Reserved","","UC_NONE" 41 | 35,"","Reserved","","UC_NONE" 42 | 36,"","Reserved","","UC_NONE" 43 | 37,"","Reserved","","UC_NONE" 44 | 38,"","Reserved","","UC_NONE" 45 | 39,"","Reserved","","UC_NONE" 46 | 40,"","Reserved","","UC_NONE" 47 | 41,"","Reserved","","UC_NONE" 48 | 42,"","Reserved","","UC_NONE" 49 | 43,"","Reserved","","UC_NONE" 50 | 44,"","Reserved","","UC_NONE" 51 | 45,"","Reserved","","UC_NONE" 52 | 46,"","Reserved","","UC_NONE" 53 | 47,"","Reserved","","UC_NONE" 54 | 48,"","Reserved","","UC_NONE" 55 | 49,"","Reserved","","UC_NONE" 56 | 50,"","Reserved","","UC_NONE" 57 | 51,"","Reserved","","UC_NONE" 58 | 52,"","Reserved","","UC_NONE" 59 | 53,"","Reserved","","UC_NONE" 60 | 54,"","Reserved","","UC_NONE" 61 | 55,"","Reserved","","UC_NONE" 62 | 56,"","Reserved","","UC_NONE" 63 | 57,"","Reserved","","UC_NONE" 64 | 58,"","Reserved","","UC_NONE" 65 | 59,"","Reserved","","UC_NONE" 66 | 60,"","Reserved","","UC_NONE" 67 | 61,"","Reserved","","UC_NONE" 68 | 62,"","Reserved","","UC_NONE" 69 | 63,"","Reserved","","UC_NONE" 70 | 64,"","Reserved","","UC_NONE" 71 | 65,"","Reserved","","UC_NONE" 72 | 66,"","Reserved","","UC_NONE" 73 | 67,"","Reserved","","UC_NONE" 74 | 68,"","Reserved","","UC_NONE" 75 | 69,"","Reserved","","UC_NONE" 76 | 70,"","Reserved","","UC_NONE" 77 | 71,"","Reserved","","UC_NONE" 78 | 72,"","Reserved","","UC_NONE" 79 | 73,"","Reserved","","UC_NONE" 80 | 74,"","Reserved","","UC_NONE" 81 | 75,"","Reserved","","UC_NONE" 82 | 76,"","Reserved","","UC_NONE" 83 | 77,"","Reserved","","UC_NONE" 84 | 78,"","Reserved","","UC_NONE" 85 | 79,"","Reserved","","UC_NONE" 86 | 80,"","Reserved","","UC_NONE" 87 | 81,"","Reserved","","UC_NONE" 88 | 82,"","Reserved","","UC_NONE" 89 | 83,"","Reserved","","UC_NONE" 90 | 84,"","Reserved","","UC_NONE" 91 | 85,"","Reserved","","UC_NONE" 92 | 86,"","Reserved","","UC_NONE" 93 | 87,"","Reserved","","UC_NONE" 94 | 88,"","Reserved","","UC_NONE" 95 | 89,"","Reserved","","UC_NONE" 96 | 90,"","Reserved","","UC_NONE" 97 | 91,"","Reserved","","UC_NONE" 98 | 92,"","Reserved","","UC_NONE" 99 | 93,"","Reserved","","UC_NONE" 100 | 94,"","Reserved","","UC_NONE" 101 | 95,"","Reserved","","UC_NONE" 102 | 96,"","Reserved","","UC_NONE" 103 | 97,"","Reserved","","UC_NONE" 104 | 98,"","Reserved","","UC_NONE" 105 | 99,"","Reserved","","UC_NONE" 106 | 100,"","Reserved","","UC_NONE" 107 | 101,"","Reserved","","UC_NONE" 108 | 102,"","Reserved","","UC_NONE" 109 | 103,"","Reserved","","UC_NONE" 110 | 104,"","Reserved","","UC_NONE" 111 | 105,"","Reserved","","UC_NONE" 112 | 106,"","Reserved","","UC_NONE" 113 | 107,"","Reserved","","UC_NONE" 114 | 108,"","Reserved","","UC_NONE" 115 | 109,"","Reserved","","UC_NONE" 116 | 110,"","Reserved","","UC_NONE" 117 | 111,"","Reserved","","UC_NONE" 118 | 112,"","Reserved","","UC_NONE" 119 | 113,"","Reserved","","UC_NONE" 120 | 114,"","Reserved","","UC_NONE" 121 | 115,"","Reserved","","UC_NONE" 122 | 116,"","Reserved","","UC_NONE" 123 | 117,"","Reserved","","UC_NONE" 124 | 118,"","Reserved","","UC_NONE" 125 | 119,"","Reserved","","UC_NONE" 126 | 120,"","Reserved","","UC_NONE" 127 | 121,"","Reserved","","UC_NONE" 128 | 122,"","Reserved","","UC_NONE" 129 | 123,"","Reserved","","UC_NONE" 130 | 124,"","Reserved","","UC_NONE" 131 | 125,"","Reserved","","UC_NONE" 132 | 126,"","Reserved","","UC_NONE" 133 | 127,"","Reserved","","UC_NONE" 134 | 128,"","Reserved","","UC_NONE" 135 | 129,"","Reserved","","UC_NONE" 136 | 130,"","Reserved","","UC_NONE" 137 | 131,"","Reserved","","UC_NONE" 138 | 132,"","Reserved","","UC_NONE" 139 | 133,"","Reserved","","UC_NONE" 140 | 134,"","Reserved","","UC_NONE" 141 | 135,"","Reserved","","UC_NONE" 142 | 136,"","Reserved","","UC_NONE" 143 | 137,"","Reserved","","UC_NONE" 144 | 138,"","Reserved","","UC_NONE" 145 | 139,"","Reserved","","UC_NONE" 146 | 140,"","Reserved","","UC_NONE" 147 | 141,"","Reserved","","UC_NONE" 148 | 142,"","Reserved","","UC_NONE" 149 | 143,"","Reserved","","UC_NONE" 150 | 144,"","Reserved","","UC_NONE" 151 | 145,"","Reserved","","UC_NONE" 152 | 146,"","Reserved","","UC_NONE" 153 | 147,"","Reserved","","UC_NONE" 154 | 148,"","Reserved","","UC_NONE" 155 | 149,"","Reserved","","UC_NONE" 156 | 150,"","Reserved","","UC_NONE" 157 | 151,"","Reserved","","UC_NONE" 158 | 152,"","Reserved","","UC_NONE" 159 | 153,"","Reserved","","UC_NONE" 160 | 154,"","Reserved","","UC_NONE" 161 | 155,"","Reserved","","UC_NONE" 162 | 156,"","Reserved","","UC_NONE" 163 | 157,"","Reserved","","UC_NONE" 164 | 158,"","Reserved","","UC_NONE" 165 | 159,"","Reserved","","UC_NONE" 166 | 160,"","Reserved","","UC_NONE" 167 | 161,"","Reserved","","UC_NONE" 168 | 162,"","Reserved","","UC_NONE" 169 | 163,"","Reserved","","UC_NONE" 170 | 164,"","Reserved","","UC_NONE" 171 | 165,"","Reserved","","UC_NONE" 172 | 166,"","Reserved","","UC_NONE" 173 | 167,"","Reserved","","UC_NONE" 174 | 168,"","Reserved","","UC_NONE" 175 | 169,"","Reserved","","UC_NONE" 176 | 170,"","Reserved","","UC_NONE" 177 | 171,"","Reserved","","UC_NONE" 178 | 172,"","Reserved","","UC_NONE" 179 | 173,"","Reserved","","UC_NONE" 180 | 174,"","Reserved","","UC_NONE" 181 | 175,"","Reserved","","UC_NONE" 182 | 176,"","Reserved","","UC_NONE" 183 | 177,"","Reserved","","UC_NONE" 184 | 178,"","Reserved","","UC_NONE" 185 | 179,"","Reserved","","UC_NONE" 186 | 180,"","Reserved","","UC_NONE" 187 | 181,"","Reserved","","UC_NONE" 188 | 182,"","Reserved","","UC_NONE" 189 | 183,"","Reserved","","UC_NONE" 190 | 184,"","Reserved","","UC_NONE" 191 | 185,"","Reserved","","UC_NONE" 192 | 186,"","Reserved","","UC_NONE" 193 | 187,"","Reserved","","UC_NONE" 194 | 188,"","Reserved","","UC_NONE" 195 | 189,"","Reserved","","UC_NONE" 196 | 190,"","Reserved","","UC_NONE" 197 | 191,"","Reserved","","UC_NONE" 198 | 192,"","Reserved for local use","","UC_NONE" 199 | 193,"","Reserved for local use","","UC_NONE" 200 | 194,"","Reserved for local use","","UC_NONE" 201 | 195,"","Reserved for local use","","UC_NONE" 202 | 196,"","Reserved for local use","","UC_NONE" 203 | 197,"","Reserved for local use","","UC_NONE" 204 | 198,"","Reserved for local use","","UC_NONE" 205 | 199,"","Reserved for local use","","UC_NONE" 206 | 200,"","Reserved for local use","","UC_NONE" 207 | 201,"","Reserved for local use","","UC_NONE" 208 | 202,"","Reserved for local use","","UC_NONE" 209 | 203,"","Reserved for local use","","UC_NONE" 210 | 204,"","Reserved for local use","","UC_NONE" 211 | 205,"","Reserved for local use","","UC_NONE" 212 | 206,"","Reserved for local use","","UC_NONE" 213 | 207,"","Reserved for local use","","UC_NONE" 214 | 208,"","Reserved for local use","","UC_NONE" 215 | 209,"","Reserved for local use","","UC_NONE" 216 | 210,"","Reserved for local use","","UC_NONE" 217 | 211,"","Reserved for local use","","UC_NONE" 218 | 212,"","Reserved for local use","","UC_NONE" 219 | 213,"","Reserved for local use","","UC_NONE" 220 | 214,"","Reserved for local use","","UC_NONE" 221 | 215,"","Reserved for local use","","UC_NONE" 222 | 216,"","Reserved for local use","","UC_NONE" 223 | 217,"","Reserved for local use","","UC_NONE" 224 | 218,"","Reserved for local use","","UC_NONE" 225 | 219,"","Reserved for local use","","UC_NONE" 226 | 220,"","Reserved for local use","","UC_NONE" 227 | 221,"","Reserved for local use","","UC_NONE" 228 | 222,"","Reserved for local use","","UC_NONE" 229 | 223,"","Reserved for local use","","UC_NONE" 230 | 224,"","Reserved for local use","","UC_NONE" 231 | 225,"","Reserved for local use","","UC_NONE" 232 | 226,"","Reserved for local use","","UC_NONE" 233 | 227,"","Reserved for local use","","UC_NONE" 234 | 228,"","Reserved for local use","","UC_NONE" 235 | 229,"","Reserved for local use","","UC_NONE" 236 | 230,"","Reserved for local use","","UC_NONE" 237 | 231,"","Reserved for local use","","UC_NONE" 238 | 232,"","Reserved for local use","","UC_NONE" 239 | 233,"","Reserved for local use","","UC_NONE" 240 | 234,"","Reserved for local use","","UC_NONE" 241 | 235,"","Reserved for local use","","UC_NONE" 242 | 236,"","Reserved for local use","","UC_NONE" 243 | 237,"","Reserved for local use","","UC_NONE" 244 | 238,"","Reserved for local use","","UC_NONE" 245 | 239,"","Reserved for local use","","UC_NONE" 246 | 240,"","Reserved for local use","","UC_NONE" 247 | 241,"","Reserved for local use","","UC_NONE" 248 | 242,"","Reserved for local use","","UC_NONE" 249 | 243,"","Reserved for local use","","UC_NONE" 250 | 244,"","Reserved for local use","","UC_NONE" 251 | 245,"","Reserved for local use","","UC_NONE" 252 | 246,"","Reserved for local use","","UC_NONE" 253 | 247,"","Reserved for local use","","UC_NONE" 254 | 248,"","Reserved for local use","","UC_NONE" 255 | 249,"","Reserved for local use","","UC_NONE" 256 | 250,"","Reserved for local use","","UC_NONE" 257 | 251,"","Reserved for local use","","UC_NONE" 258 | 252,"","Reserved for local use","","UC_NONE" 259 | 253,"","Reserved for local use","","UC_NONE" 260 | 254,"","Reserved for local use","","UC_NONE" 261 | 255,"","Missing","","UC_NONE" 262 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_4_7.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Limb intensity","J m-2 s-1","UC_NONE" 7 | 1,"","Disk intensity","J m-2 s-1","UC_NONE" 8 | 2,"","Disk intensity day","J m-2 s-1","UC_NONE" 9 | 3,"","Disk intensity night","J m-2 s-1","UC_NONE" 10 | 4,"","Reserved","","UC_NONE" 11 | 5,"","Reserved","","UC_NONE" 12 | 6,"","Reserved","","UC_NONE" 13 | 7,"","Reserved","","UC_NONE" 14 | 8,"","Reserved","","UC_NONE" 15 | 9,"","Reserved","","UC_NONE" 16 | 10,"","Reserved","","UC_NONE" 17 | 11,"","Reserved","","UC_NONE" 18 | 12,"","Reserved","","UC_NONE" 19 | 13,"","Reserved","","UC_NONE" 20 | 14,"","Reserved","","UC_NONE" 21 | 15,"","Reserved","","UC_NONE" 22 | 16,"","Reserved","","UC_NONE" 23 | 17,"","Reserved","","UC_NONE" 24 | 18,"","Reserved","","UC_NONE" 25 | 19,"","Reserved","","UC_NONE" 26 | 20,"","Reserved","","UC_NONE" 27 | 21,"","Reserved","","UC_NONE" 28 | 22,"","Reserved","","UC_NONE" 29 | 23,"","Reserved","","UC_NONE" 30 | 24,"","Reserved","","UC_NONE" 31 | 25,"","Reserved","","UC_NONE" 32 | 26,"","Reserved","","UC_NONE" 33 | 27,"","Reserved","","UC_NONE" 34 | 28,"","Reserved","","UC_NONE" 35 | 29,"","Reserved","","UC_NONE" 36 | 30,"","Reserved","","UC_NONE" 37 | 31,"","Reserved","","UC_NONE" 38 | 32,"","Reserved","","UC_NONE" 39 | 33,"","Reserved","","UC_NONE" 40 | 34,"","Reserved","","UC_NONE" 41 | 35,"","Reserved","","UC_NONE" 42 | 36,"","Reserved","","UC_NONE" 43 | 37,"","Reserved","","UC_NONE" 44 | 38,"","Reserved","","UC_NONE" 45 | 39,"","Reserved","","UC_NONE" 46 | 40,"","Reserved","","UC_NONE" 47 | 41,"","Reserved","","UC_NONE" 48 | 42,"","Reserved","","UC_NONE" 49 | 43,"","Reserved","","UC_NONE" 50 | 44,"","Reserved","","UC_NONE" 51 | 45,"","Reserved","","UC_NONE" 52 | 46,"","Reserved","","UC_NONE" 53 | 47,"","Reserved","","UC_NONE" 54 | 48,"","Reserved","","UC_NONE" 55 | 49,"","Reserved","","UC_NONE" 56 | 50,"","Reserved","","UC_NONE" 57 | 51,"","Reserved","","UC_NONE" 58 | 52,"","Reserved","","UC_NONE" 59 | 53,"","Reserved","","UC_NONE" 60 | 54,"","Reserved","","UC_NONE" 61 | 55,"","Reserved","","UC_NONE" 62 | 56,"","Reserved","","UC_NONE" 63 | 57,"","Reserved","","UC_NONE" 64 | 58,"","Reserved","","UC_NONE" 65 | 59,"","Reserved","","UC_NONE" 66 | 60,"","Reserved","","UC_NONE" 67 | 61,"","Reserved","","UC_NONE" 68 | 62,"","Reserved","","UC_NONE" 69 | 63,"","Reserved","","UC_NONE" 70 | 64,"","Reserved","","UC_NONE" 71 | 65,"","Reserved","","UC_NONE" 72 | 66,"","Reserved","","UC_NONE" 73 | 67,"","Reserved","","UC_NONE" 74 | 68,"","Reserved","","UC_NONE" 75 | 69,"","Reserved","","UC_NONE" 76 | 70,"","Reserved","","UC_NONE" 77 | 71,"","Reserved","","UC_NONE" 78 | 72,"","Reserved","","UC_NONE" 79 | 73,"","Reserved","","UC_NONE" 80 | 74,"","Reserved","","UC_NONE" 81 | 75,"","Reserved","","UC_NONE" 82 | 76,"","Reserved","","UC_NONE" 83 | 77,"","Reserved","","UC_NONE" 84 | 78,"","Reserved","","UC_NONE" 85 | 79,"","Reserved","","UC_NONE" 86 | 80,"","Reserved","","UC_NONE" 87 | 81,"","Reserved","","UC_NONE" 88 | 82,"","Reserved","","UC_NONE" 89 | 83,"","Reserved","","UC_NONE" 90 | 84,"","Reserved","","UC_NONE" 91 | 85,"","Reserved","","UC_NONE" 92 | 86,"","Reserved","","UC_NONE" 93 | 87,"","Reserved","","UC_NONE" 94 | 88,"","Reserved","","UC_NONE" 95 | 89,"","Reserved","","UC_NONE" 96 | 90,"","Reserved","","UC_NONE" 97 | 91,"","Reserved","","UC_NONE" 98 | 92,"","Reserved","","UC_NONE" 99 | 93,"","Reserved","","UC_NONE" 100 | 94,"","Reserved","","UC_NONE" 101 | 95,"","Reserved","","UC_NONE" 102 | 96,"","Reserved","","UC_NONE" 103 | 97,"","Reserved","","UC_NONE" 104 | 98,"","Reserved","","UC_NONE" 105 | 99,"","Reserved","","UC_NONE" 106 | 100,"","Reserved","","UC_NONE" 107 | 101,"","Reserved","","UC_NONE" 108 | 102,"","Reserved","","UC_NONE" 109 | 103,"","Reserved","","UC_NONE" 110 | 104,"","Reserved","","UC_NONE" 111 | 105,"","Reserved","","UC_NONE" 112 | 106,"","Reserved","","UC_NONE" 113 | 107,"","Reserved","","UC_NONE" 114 | 108,"","Reserved","","UC_NONE" 115 | 109,"","Reserved","","UC_NONE" 116 | 110,"","Reserved","","UC_NONE" 117 | 111,"","Reserved","","UC_NONE" 118 | 112,"","Reserved","","UC_NONE" 119 | 113,"","Reserved","","UC_NONE" 120 | 114,"","Reserved","","UC_NONE" 121 | 115,"","Reserved","","UC_NONE" 122 | 116,"","Reserved","","UC_NONE" 123 | 117,"","Reserved","","UC_NONE" 124 | 118,"","Reserved","","UC_NONE" 125 | 119,"","Reserved","","UC_NONE" 126 | 120,"","Reserved","","UC_NONE" 127 | 121,"","Reserved","","UC_NONE" 128 | 122,"","Reserved","","UC_NONE" 129 | 123,"","Reserved","","UC_NONE" 130 | 124,"","Reserved","","UC_NONE" 131 | 125,"","Reserved","","UC_NONE" 132 | 126,"","Reserved","","UC_NONE" 133 | 127,"","Reserved","","UC_NONE" 134 | 128,"","Reserved","","UC_NONE" 135 | 129,"","Reserved","","UC_NONE" 136 | 130,"","Reserved","","UC_NONE" 137 | 131,"","Reserved","","UC_NONE" 138 | 132,"","Reserved","","UC_NONE" 139 | 133,"","Reserved","","UC_NONE" 140 | 134,"","Reserved","","UC_NONE" 141 | 135,"","Reserved","","UC_NONE" 142 | 136,"","Reserved","","UC_NONE" 143 | 137,"","Reserved","","UC_NONE" 144 | 138,"","Reserved","","UC_NONE" 145 | 139,"","Reserved","","UC_NONE" 146 | 140,"","Reserved","","UC_NONE" 147 | 141,"","Reserved","","UC_NONE" 148 | 142,"","Reserved","","UC_NONE" 149 | 143,"","Reserved","","UC_NONE" 150 | 144,"","Reserved","","UC_NONE" 151 | 145,"","Reserved","","UC_NONE" 152 | 146,"","Reserved","","UC_NONE" 153 | 147,"","Reserved","","UC_NONE" 154 | 148,"","Reserved","","UC_NONE" 155 | 149,"","Reserved","","UC_NONE" 156 | 150,"","Reserved","","UC_NONE" 157 | 151,"","Reserved","","UC_NONE" 158 | 152,"","Reserved","","UC_NONE" 159 | 153,"","Reserved","","UC_NONE" 160 | 154,"","Reserved","","UC_NONE" 161 | 155,"","Reserved","","UC_NONE" 162 | 156,"","Reserved","","UC_NONE" 163 | 157,"","Reserved","","UC_NONE" 164 | 158,"","Reserved","","UC_NONE" 165 | 159,"","Reserved","","UC_NONE" 166 | 160,"","Reserved","","UC_NONE" 167 | 161,"","Reserved","","UC_NONE" 168 | 162,"","Reserved","","UC_NONE" 169 | 163,"","Reserved","","UC_NONE" 170 | 164,"","Reserved","","UC_NONE" 171 | 165,"","Reserved","","UC_NONE" 172 | 166,"","Reserved","","UC_NONE" 173 | 167,"","Reserved","","UC_NONE" 174 | 168,"","Reserved","","UC_NONE" 175 | 169,"","Reserved","","UC_NONE" 176 | 170,"","Reserved","","UC_NONE" 177 | 171,"","Reserved","","UC_NONE" 178 | 172,"","Reserved","","UC_NONE" 179 | 173,"","Reserved","","UC_NONE" 180 | 174,"","Reserved","","UC_NONE" 181 | 175,"","Reserved","","UC_NONE" 182 | 176,"","Reserved","","UC_NONE" 183 | 177,"","Reserved","","UC_NONE" 184 | 178,"","Reserved","","UC_NONE" 185 | 179,"","Reserved","","UC_NONE" 186 | 180,"","Reserved","","UC_NONE" 187 | 181,"","Reserved","","UC_NONE" 188 | 182,"","Reserved","","UC_NONE" 189 | 183,"","Reserved","","UC_NONE" 190 | 184,"","Reserved","","UC_NONE" 191 | 185,"","Reserved","","UC_NONE" 192 | 186,"","Reserved","","UC_NONE" 193 | 187,"","Reserved","","UC_NONE" 194 | 188,"","Reserved","","UC_NONE" 195 | 189,"","Reserved","","UC_NONE" 196 | 190,"","Reserved","","UC_NONE" 197 | 191,"","Reserved","","UC_NONE" 198 | 192,"","Reserved for local use","","UC_NONE" 199 | 193,"","Reserved for local use","","UC_NONE" 200 | 194,"","Reserved for local use","","UC_NONE" 201 | 195,"","Reserved for local use","","UC_NONE" 202 | 196,"","Reserved for local use","","UC_NONE" 203 | 197,"","Reserved for local use","","UC_NONE" 204 | 198,"","Reserved for local use","","UC_NONE" 205 | 199,"","Reserved for local use","","UC_NONE" 206 | 200,"","Reserved for local use","","UC_NONE" 207 | 201,"","Reserved for local use","","UC_NONE" 208 | 202,"","Reserved for local use","","UC_NONE" 209 | 203,"","Reserved for local use","","UC_NONE" 210 | 204,"","Reserved for local use","","UC_NONE" 211 | 205,"","Reserved for local use","","UC_NONE" 212 | 206,"","Reserved for local use","","UC_NONE" 213 | 207,"","Reserved for local use","","UC_NONE" 214 | 208,"","Reserved for local use","","UC_NONE" 215 | 209,"","Reserved for local use","","UC_NONE" 216 | 210,"","Reserved for local use","","UC_NONE" 217 | 211,"","Reserved for local use","","UC_NONE" 218 | 212,"","Reserved for local use","","UC_NONE" 219 | 213,"","Reserved for local use","","UC_NONE" 220 | 214,"","Reserved for local use","","UC_NONE" 221 | 215,"","Reserved for local use","","UC_NONE" 222 | 216,"","Reserved for local use","","UC_NONE" 223 | 217,"","Reserved for local use","","UC_NONE" 224 | 218,"","Reserved for local use","","UC_NONE" 225 | 219,"","Reserved for local use","","UC_NONE" 226 | 220,"","Reserved for local use","","UC_NONE" 227 | 221,"","Reserved for local use","","UC_NONE" 228 | 222,"","Reserved for local use","","UC_NONE" 229 | 223,"","Reserved for local use","","UC_NONE" 230 | 224,"","Reserved for local use","","UC_NONE" 231 | 225,"","Reserved for local use","","UC_NONE" 232 | 226,"","Reserved for local use","","UC_NONE" 233 | 227,"","Reserved for local use","","UC_NONE" 234 | 228,"","Reserved for local use","","UC_NONE" 235 | 229,"","Reserved for local use","","UC_NONE" 236 | 230,"","Reserved for local use","","UC_NONE" 237 | 231,"","Reserved for local use","","UC_NONE" 238 | 232,"","Reserved for local use","","UC_NONE" 239 | 233,"","Reserved for local use","","UC_NONE" 240 | 234,"","Reserved for local use","","UC_NONE" 241 | 235,"","Reserved for local use","","UC_NONE" 242 | 236,"","Reserved for local use","","UC_NONE" 243 | 237,"","Reserved for local use","","UC_NONE" 244 | 238,"","Reserved for local use","","UC_NONE" 245 | 239,"","Reserved for local use","","UC_NONE" 246 | 240,"","Reserved for local use","","UC_NONE" 247 | 241,"","Reserved for local use","","UC_NONE" 248 | 242,"","Reserved for local use","","UC_NONE" 249 | 243,"","Reserved for local use","","UC_NONE" 250 | 244,"","Reserved for local use","","UC_NONE" 251 | 245,"","Reserved for local use","","UC_NONE" 252 | 246,"","Reserved for local use","","UC_NONE" 253 | 247,"","Reserved for local use","","UC_NONE" 254 | 248,"","Reserved for local use","","UC_NONE" 255 | 249,"","Reserved for local use","","UC_NONE" 256 | 250,"","Reserved for local use","","UC_NONE" 257 | 251,"","Reserved for local use","","UC_NONE" 258 | 252,"","Reserved for local use","","UC_NONE" 259 | 253,"","Reserved for local use","","UC_NONE" 260 | 254,"","Reserved for local use","","UC_NONE" 261 | 255,"","Missing","","UC_NONE" 262 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_4_9.csv: -------------------------------------------------------------------------------- 1 | "subcat","short_name","name","unit","unit_conv" 2 | -4,"######################################################################################################","#","#","#" 3 | -3,"DO NOT MODIFY THIS FILE. It is generated by frmts/grib/degrib/merge_degrib_and_wmo_tables.py","#","#","#" 4 | -2,"from tables at version https://github.com/wmo-im/GRIB2/commit/cf3a2a24695f60f64ac9d5eb26a24b26d2a8a816","#","#","#" 5 | -1,"######################################################################################################","#","#","#" 6 | 0,"","Pedersen conductivity","S m-1","UC_NONE" 7 | 1,"","Hall conductivity","S m-1","UC_NONE" 8 | 2,"","Parallel conductivity","S m-1","UC_NONE" 9 | 3,"","Reserved","","UC_NONE" 10 | 4,"","Reserved","","UC_NONE" 11 | 5,"","Reserved","","UC_NONE" 12 | 6,"","Reserved","","UC_NONE" 13 | 7,"","Reserved","","UC_NONE" 14 | 8,"","Reserved","","UC_NONE" 15 | 9,"","Reserved","","UC_NONE" 16 | 10,"","Reserved","","UC_NONE" 17 | 11,"","Reserved","","UC_NONE" 18 | 12,"","Reserved","","UC_NONE" 19 | 13,"","Reserved","","UC_NONE" 20 | 14,"","Reserved","","UC_NONE" 21 | 15,"","Reserved","","UC_NONE" 22 | 16,"","Reserved","","UC_NONE" 23 | 17,"","Reserved","","UC_NONE" 24 | 18,"","Reserved","","UC_NONE" 25 | 19,"","Reserved","","UC_NONE" 26 | 20,"","Reserved","","UC_NONE" 27 | 21,"","Reserved","","UC_NONE" 28 | 22,"","Reserved","","UC_NONE" 29 | 23,"","Reserved","","UC_NONE" 30 | 24,"","Reserved","","UC_NONE" 31 | 25,"","Reserved","","UC_NONE" 32 | 26,"","Reserved","","UC_NONE" 33 | 27,"","Reserved","","UC_NONE" 34 | 28,"","Reserved","","UC_NONE" 35 | 29,"","Reserved","","UC_NONE" 36 | 30,"","Reserved","","UC_NONE" 37 | 31,"","Reserved","","UC_NONE" 38 | 32,"","Reserved","","UC_NONE" 39 | 33,"","Reserved","","UC_NONE" 40 | 34,"","Reserved","","UC_NONE" 41 | 35,"","Reserved","","UC_NONE" 42 | 36,"","Reserved","","UC_NONE" 43 | 37,"","Reserved","","UC_NONE" 44 | 38,"","Reserved","","UC_NONE" 45 | 39,"","Reserved","","UC_NONE" 46 | 40,"","Reserved","","UC_NONE" 47 | 41,"","Reserved","","UC_NONE" 48 | 42,"","Reserved","","UC_NONE" 49 | 43,"","Reserved","","UC_NONE" 50 | 44,"","Reserved","","UC_NONE" 51 | 45,"","Reserved","","UC_NONE" 52 | 46,"","Reserved","","UC_NONE" 53 | 47,"","Reserved","","UC_NONE" 54 | 48,"","Reserved","","UC_NONE" 55 | 49,"","Reserved","","UC_NONE" 56 | 50,"","Reserved","","UC_NONE" 57 | 51,"","Reserved","","UC_NONE" 58 | 52,"","Reserved","","UC_NONE" 59 | 53,"","Reserved","","UC_NONE" 60 | 54,"","Reserved","","UC_NONE" 61 | 55,"","Reserved","","UC_NONE" 62 | 56,"","Reserved","","UC_NONE" 63 | 57,"","Reserved","","UC_NONE" 64 | 58,"","Reserved","","UC_NONE" 65 | 59,"","Reserved","","UC_NONE" 66 | 60,"","Reserved","","UC_NONE" 67 | 61,"","Reserved","","UC_NONE" 68 | 62,"","Reserved","","UC_NONE" 69 | 63,"","Reserved","","UC_NONE" 70 | 64,"","Reserved","","UC_NONE" 71 | 65,"","Reserved","","UC_NONE" 72 | 66,"","Reserved","","UC_NONE" 73 | 67,"","Reserved","","UC_NONE" 74 | 68,"","Reserved","","UC_NONE" 75 | 69,"","Reserved","","UC_NONE" 76 | 70,"","Reserved","","UC_NONE" 77 | 71,"","Reserved","","UC_NONE" 78 | 72,"","Reserved","","UC_NONE" 79 | 73,"","Reserved","","UC_NONE" 80 | 74,"","Reserved","","UC_NONE" 81 | 75,"","Reserved","","UC_NONE" 82 | 76,"","Reserved","","UC_NONE" 83 | 77,"","Reserved","","UC_NONE" 84 | 78,"","Reserved","","UC_NONE" 85 | 79,"","Reserved","","UC_NONE" 86 | 80,"","Reserved","","UC_NONE" 87 | 81,"","Reserved","","UC_NONE" 88 | 82,"","Reserved","","UC_NONE" 89 | 83,"","Reserved","","UC_NONE" 90 | 84,"","Reserved","","UC_NONE" 91 | 85,"","Reserved","","UC_NONE" 92 | 86,"","Reserved","","UC_NONE" 93 | 87,"","Reserved","","UC_NONE" 94 | 88,"","Reserved","","UC_NONE" 95 | 89,"","Reserved","","UC_NONE" 96 | 90,"","Reserved","","UC_NONE" 97 | 91,"","Reserved","","UC_NONE" 98 | 92,"","Reserved","","UC_NONE" 99 | 93,"","Reserved","","UC_NONE" 100 | 94,"","Reserved","","UC_NONE" 101 | 95,"","Reserved","","UC_NONE" 102 | 96,"","Reserved","","UC_NONE" 103 | 97,"","Reserved","","UC_NONE" 104 | 98,"","Reserved","","UC_NONE" 105 | 99,"","Reserved","","UC_NONE" 106 | 100,"","Reserved","","UC_NONE" 107 | 101,"","Reserved","","UC_NONE" 108 | 102,"","Reserved","","UC_NONE" 109 | 103,"","Reserved","","UC_NONE" 110 | 104,"","Reserved","","UC_NONE" 111 | 105,"","Reserved","","UC_NONE" 112 | 106,"","Reserved","","UC_NONE" 113 | 107,"","Reserved","","UC_NONE" 114 | 108,"","Reserved","","UC_NONE" 115 | 109,"","Reserved","","UC_NONE" 116 | 110,"","Reserved","","UC_NONE" 117 | 111,"","Reserved","","UC_NONE" 118 | 112,"","Reserved","","UC_NONE" 119 | 113,"","Reserved","","UC_NONE" 120 | 114,"","Reserved","","UC_NONE" 121 | 115,"","Reserved","","UC_NONE" 122 | 116,"","Reserved","","UC_NONE" 123 | 117,"","Reserved","","UC_NONE" 124 | 118,"","Reserved","","UC_NONE" 125 | 119,"","Reserved","","UC_NONE" 126 | 120,"","Reserved","","UC_NONE" 127 | 121,"","Reserved","","UC_NONE" 128 | 122,"","Reserved","","UC_NONE" 129 | 123,"","Reserved","","UC_NONE" 130 | 124,"","Reserved","","UC_NONE" 131 | 125,"","Reserved","","UC_NONE" 132 | 126,"","Reserved","","UC_NONE" 133 | 127,"","Reserved","","UC_NONE" 134 | 128,"","Reserved","","UC_NONE" 135 | 129,"","Reserved","","UC_NONE" 136 | 130,"","Reserved","","UC_NONE" 137 | 131,"","Reserved","","UC_NONE" 138 | 132,"","Reserved","","UC_NONE" 139 | 133,"","Reserved","","UC_NONE" 140 | 134,"","Reserved","","UC_NONE" 141 | 135,"","Reserved","","UC_NONE" 142 | 136,"","Reserved","","UC_NONE" 143 | 137,"","Reserved","","UC_NONE" 144 | 138,"","Reserved","","UC_NONE" 145 | 139,"","Reserved","","UC_NONE" 146 | 140,"","Reserved","","UC_NONE" 147 | 141,"","Reserved","","UC_NONE" 148 | 142,"","Reserved","","UC_NONE" 149 | 143,"","Reserved","","UC_NONE" 150 | 144,"","Reserved","","UC_NONE" 151 | 145,"","Reserved","","UC_NONE" 152 | 146,"","Reserved","","UC_NONE" 153 | 147,"","Reserved","","UC_NONE" 154 | 148,"","Reserved","","UC_NONE" 155 | 149,"","Reserved","","UC_NONE" 156 | 150,"","Reserved","","UC_NONE" 157 | 151,"","Reserved","","UC_NONE" 158 | 152,"","Reserved","","UC_NONE" 159 | 153,"","Reserved","","UC_NONE" 160 | 154,"","Reserved","","UC_NONE" 161 | 155,"","Reserved","","UC_NONE" 162 | 156,"","Reserved","","UC_NONE" 163 | 157,"","Reserved","","UC_NONE" 164 | 158,"","Reserved","","UC_NONE" 165 | 159,"","Reserved","","UC_NONE" 166 | 160,"","Reserved","","UC_NONE" 167 | 161,"","Reserved","","UC_NONE" 168 | 162,"","Reserved","","UC_NONE" 169 | 163,"","Reserved","","UC_NONE" 170 | 164,"","Reserved","","UC_NONE" 171 | 165,"","Reserved","","UC_NONE" 172 | 166,"","Reserved","","UC_NONE" 173 | 167,"","Reserved","","UC_NONE" 174 | 168,"","Reserved","","UC_NONE" 175 | 169,"","Reserved","","UC_NONE" 176 | 170,"","Reserved","","UC_NONE" 177 | 171,"","Reserved","","UC_NONE" 178 | 172,"","Reserved","","UC_NONE" 179 | 173,"","Reserved","","UC_NONE" 180 | 174,"","Reserved","","UC_NONE" 181 | 175,"","Reserved","","UC_NONE" 182 | 176,"","Reserved","","UC_NONE" 183 | 177,"","Reserved","","UC_NONE" 184 | 178,"","Reserved","","UC_NONE" 185 | 179,"","Reserved","","UC_NONE" 186 | 180,"","Reserved","","UC_NONE" 187 | 181,"","Reserved","","UC_NONE" 188 | 182,"","Reserved","","UC_NONE" 189 | 183,"","Reserved","","UC_NONE" 190 | 184,"","Reserved","","UC_NONE" 191 | 185,"","Reserved","","UC_NONE" 192 | 186,"","Reserved","","UC_NONE" 193 | 187,"","Reserved","","UC_NONE" 194 | 188,"","Reserved","","UC_NONE" 195 | 189,"","Reserved","","UC_NONE" 196 | 190,"","Reserved","","UC_NONE" 197 | 191,"","Reserved","","UC_NONE" 198 | 192,"","Reserved for local use","","UC_NONE" 199 | 193,"","Reserved for local use","","UC_NONE" 200 | 194,"","Reserved for local use","","UC_NONE" 201 | 195,"","Reserved for local use","","UC_NONE" 202 | 196,"","Reserved for local use","","UC_NONE" 203 | 197,"","Reserved for local use","","UC_NONE" 204 | 198,"","Reserved for local use","","UC_NONE" 205 | 199,"","Reserved for local use","","UC_NONE" 206 | 200,"","Reserved for local use","","UC_NONE" 207 | 201,"","Reserved for local use","","UC_NONE" 208 | 202,"","Reserved for local use","","UC_NONE" 209 | 203,"","Reserved for local use","","UC_NONE" 210 | 204,"","Reserved for local use","","UC_NONE" 211 | 205,"","Reserved for local use","","UC_NONE" 212 | 206,"","Reserved for local use","","UC_NONE" 213 | 207,"","Reserved for local use","","UC_NONE" 214 | 208,"","Reserved for local use","","UC_NONE" 215 | 209,"","Reserved for local use","","UC_NONE" 216 | 210,"","Reserved for local use","","UC_NONE" 217 | 211,"","Reserved for local use","","UC_NONE" 218 | 212,"","Reserved for local use","","UC_NONE" 219 | 213,"","Reserved for local use","","UC_NONE" 220 | 214,"","Reserved for local use","","UC_NONE" 221 | 215,"","Reserved for local use","","UC_NONE" 222 | 216,"","Reserved for local use","","UC_NONE" 223 | 217,"","Reserved for local use","","UC_NONE" 224 | 218,"","Reserved for local use","","UC_NONE" 225 | 219,"","Reserved for local use","","UC_NONE" 226 | 220,"","Reserved for local use","","UC_NONE" 227 | 221,"","Reserved for local use","","UC_NONE" 228 | 222,"","Reserved for local use","","UC_NONE" 229 | 223,"","Reserved for local use","","UC_NONE" 230 | 224,"","Reserved for local use","","UC_NONE" 231 | 225,"","Reserved for local use","","UC_NONE" 232 | 226,"","Reserved for local use","","UC_NONE" 233 | 227,"","Reserved for local use","","UC_NONE" 234 | 228,"","Reserved for local use","","UC_NONE" 235 | 229,"","Reserved for local use","","UC_NONE" 236 | 230,"","Reserved for local use","","UC_NONE" 237 | 231,"","Reserved for local use","","UC_NONE" 238 | 232,"","Reserved for local use","","UC_NONE" 239 | 233,"","Reserved for local use","","UC_NONE" 240 | 234,"","Reserved for local use","","UC_NONE" 241 | 235,"","Reserved for local use","","UC_NONE" 242 | 236,"","Reserved for local use","","UC_NONE" 243 | 237,"","Reserved for local use","","UC_NONE" 244 | 238,"","Reserved for local use","","UC_NONE" 245 | 239,"","Reserved for local use","","UC_NONE" 246 | 240,"","Reserved for local use","","UC_NONE" 247 | 241,"","Reserved for local use","","UC_NONE" 248 | 242,"","Reserved for local use","","UC_NONE" 249 | 243,"","Reserved for local use","","UC_NONE" 250 | 244,"","Reserved for local use","","UC_NONE" 251 | 245,"","Reserved for local use","","UC_NONE" 252 | 246,"","Reserved for local use","","UC_NONE" 253 | 247,"","Reserved for local use","","UC_NONE" 254 | 248,"","Reserved for local use","","UC_NONE" 255 | 249,"","Reserved for local use","","UC_NONE" 256 | 250,"","Reserved for local use","","UC_NONE" 257 | 251,"","Reserved for local use","","UC_NONE" 258 | 252,"","Reserved for local use","","UC_NONE" 259 | 253,"","Reserved for local use","","UC_NONE" 260 | 254,"","Reserved for local use","","UC_NONE" 261 | 255,"","Missing","","UC_NONE" 262 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_local_Canada.csv: -------------------------------------------------------------------------------- 1 | prod,cat,subcat,short_name,name,unit,unit_conv 2 | 0,4,192,"DSWRF_SFC_0","Downward incident solar flux","W/m^2",UC_NONE 3 | 0,4,193,"USWRF_SFC_0","Upward short wave radiative flux","W/m^2",UC_NONE 4 | 0,5,192,"DLWRF_SFC_0","Downward Long Wave Radiative Flux","W/m^2",UC_NONE 5 | 0,5,193,"ULWRF_0","Outgoing Long Wave Radiative Flux","W/m^2",UC_NONE 6 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_local_HPC.csv: -------------------------------------------------------------------------------- 1 | prod,cat,subcat,short_name,name,unit,unit_conv 2 | 0,1,192,"HPC-Wx","HPC Code","-",UC_NONE 3 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_local_NDFD.csv: -------------------------------------------------------------------------------- 1 | prod,cat,subcat,short_name,name,unit,unit_conv 2 | 0,0,193,"ApparentT","Apparent Temperature","K",UC_K2F 3 | 0,0,205,"WBGT","Wet Bulb Globe Temperature","K",UC_K2F 4 | 0,1,192,"Wx","Weather string","-",UC_NONE 5 | 0,1,193,"PPI","Precipitation Potential Index","%",UC_NONE 6 | 0,1,227,"IceAccum","Ice Accumulation","kg/m^2",UC_InchWater 7 | 0,10,8,"PoP12","Prob of 0.01 In. of Precip","%",UC_NONE 8 | 0,13,194,"smokes","Surface level smoke from fires","log10(10^-6g/m^3)",UC_LOG10 9 | 0,13,195,"smokec","Average vertical column smoke from fires","log10(10^-6g/m^3)",UC_LOG10 10 | 0,14,192,"O3MR","Ozone Mixing Ratio","kg/kg",UC_NONE 11 | 0,14,193,"OZCON","Ozone Concentration","PPB",UC_NONE 12 | 0,14,200,"OZMAX1","Ozone Daily Max from 1-hour Average","ppbV",UC_NONE 13 | 0,14,201,"OZMAX8","Ozone Daily Max from 8-hour Average","ppbV",UC_NONE 14 | 0,19,194,"ConvOutlook","Convective Hazard Outlook","0=none; 2=tstm; 4=slight; 6=moderate; 8=high",UC_NONE 15 | 0,19,197,"TornadoProb","Tornado Probability","%",UC_NONE 16 | 0,19,198,"HailProb","Hail Probability","%",UC_NONE 17 | 0,19,199,"WindProb","Damaging Thunderstorm Wind Probability","%",UC_NONE 18 | 0,19,200,"XtrmTornProb","Extreme Tornado Probability","%",UC_NONE 19 | 0,19,201,"XtrmHailProb","Extreme Hail Probability","%",UC_NONE 20 | 0,19,202,"XtrmWindProb","Extreme Thunderstorm Wind Probability","%",UC_NONE 21 | 0,19,215,"TotalSvrProb","Total Probability of Severe Thunderstorms","%",UC_NONE 22 | 0,19,216,"TotalXtrmProb","Total Probability of Extreme Severe Thunderstorms","%",UC_NONE 23 | 0,19,217,"WWA","Watch Warning Advisory","-",UC_NONE 24 | 0,19,235,"TCWind","Tropical Cyclone Wind Threat","0=none; 4=low; 6=moderate; 8=high; 10=extreme",UC_NONE 25 | 0,19,236,"TCSurge","Tropical Cyclone Storm Surge Threat","0=none; 4=low; 6=moderate; 8=high; 10=extreme",UC_NONE 26 | 0,19,238,"TCRain","Tropical Cyclone Flooding Rain Threat","0=none; 4=low; 6=moderate; 8=high; 10=extreme",UC_NONE 27 | 0,19,239,"TCTornado","Tropical Cyclone Tornado Threat","0=none; 4=low; 6=moderate; 8=high; 10=extreme",UC_NONE 28 | 0,19,246,"SNOWLVL","Snow Level","m",UC_M2Feet 29 | 0,19,203,"TotalSvrProb","Total Probability of Severe Thunderstorms","%",UC_NONE 30 | 0,19,204,"TotalXtrmProb","Total Probability of Extreme Severe Thunderstorms","%",UC_NONE 31 | 0,192,192,"FireWx","Critical Fire Weather","%",UC_NONE 32 | 0,192,194,"DryLightning","Dry Lightning","%",UC_NONE 33 | 2,1,192,"CANL","Cold Advisory for Newborn Livestock","0=none; 2=slight; 4=mild; 6=moderate; 8=severe; 10=extreme",UC_NONE 34 | 10,3,192,"Surge","Hurricane Storm Surge","m",UC_M2Feet 35 | 10,3,193,"ETSurge","Extra Tropical Storm Surge","m",UC_M2Feet 36 | 10,3,250,"StormTide","Storm Surge and Tide","m",UC_M2Feet 37 | 10,3,251,"Tide","Tide","m",UC_M2Feet 38 | 0,1,198,"MinRH","Minimum Relative Humidity","%",UC_NONE 39 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_4_2_local_index.csv: -------------------------------------------------------------------------------- 1 | center_code,subcenter_code,filename 2 | 7,5,grib2_table_4_2_local_HPC.csv 3 | 7,,grib2_table_4_2_local_NCEP.csv 4 | 8,0,grib2_table_4_2_local_NDFD.csv 5 | 8,65535,grib2_table_4_2_local_NDFD.csv 6 | 54,,grib2_table_4_2_local_Canada.csv 7 | 161,,grib2_table_4_2_local_MRMS.csv 8 | -------------------------------------------------------------------------------- /crates/grib_tables/csv/grib2_table_versions.csv: -------------------------------------------------------------------------------- 1 | component,version 2 | wmo,v30 3 | degrib,2.25 4 | -------------------------------------------------------------------------------- /crates/grib_tables/src/csv_reader.rs: -------------------------------------------------------------------------------- 1 | pub(crate) mod read_local_index; 2 | pub(crate) mod read_table_4_2; 3 | 4 | use std::path::PathBuf; 5 | 6 | fn csv_path() -> PathBuf { 7 | let manifest_dir = env!("CARGO_MANIFEST_DIR"); 8 | let manifest_dir = PathBuf::from(manifest_dir); 9 | manifest_dir.join("csv") 10 | } 11 | -------------------------------------------------------------------------------- /crates/grib_tables/src/csv_reader/read_local_index.rs: -------------------------------------------------------------------------------- 1 | use super::csv_path; 2 | 3 | use std::collections::HashMap; 4 | use std::num::IntErrorKind; 5 | 6 | use anyhow::Context; 7 | use serde::Deserialize; 8 | 9 | use serde::Deserializer; 10 | 11 | #[derive(Debug, serde::Deserialize)] 12 | pub(crate) struct GdalLocalIndex { 13 | pub(crate) center_code: u16, 14 | 15 | #[serde(deserialize_with = "deserialize_subcenter_code")] 16 | pub(crate) subcenter_code: u8, 17 | 18 | pub(crate) filename: String, 19 | } 20 | 21 | pub(crate) fn deserialize_subcenter_code<'de, D>(deserializer: D) -> Result 22 | where 23 | D: Deserializer<'de>, 24 | { 25 | let s: &str = Deserialize::deserialize(deserializer).unwrap(); 26 | let result: Result = s.parse(); 27 | match result { 28 | Ok(value) => match value { 29 | u16::MAX => Ok(u8::MAX), 30 | v => v 31 | .try_into() 32 | .with_context(|| format!("Failed to convert {value:?} into a u8 subcenter code!")) 33 | .map_err(serde::de::Error::custom), 34 | }, 35 | Err(err) if *err.kind() == IntErrorKind::Empty => Ok(u8::MAX), 36 | Err(err) => Err(serde::de::Error::custom(err)), 37 | } 38 | } 39 | 40 | /// The values of the HashMap are the (center_code, subcenter_code). 41 | pub(crate) fn get_local_index() -> HashMap { 42 | let path = csv_path().join("grib2_table_4_2_local_index.csv"); 43 | let mut reader = csv::Reader::from_path(&path) 44 | .with_context(|| format!("Failed: csv::Reader::from_path({path:?})")) 45 | .unwrap(); 46 | let mut map = HashMap::new(); 47 | for row in reader.deserialize() { 48 | let record: GdalLocalIndex = row 49 | .with_context(|| format!("Failed to deserialize row from {path:?}")) 50 | .unwrap(); 51 | 52 | // Skip duplicate: 53 | if map.contains_key(&record.filename) 54 | && record.filename == "grib2_table_4_2_local_NDFD.csv" 55 | && record.center_code == 8 56 | && record.subcenter_code == u8::MAX 57 | { 58 | continue; 59 | } 60 | 61 | let center_and_subcenter_codes = (record.center_code, record.subcenter_code); 62 | match map.insert(record.filename, center_and_subcenter_codes) { 63 | None => (), 64 | Some(old_value) => panic!( 65 | "{path:?} contains duplicate filenames! Old center_code={}, old subcenter_code={}", 66 | old_value.0, old_value.1 67 | ), 68 | } 69 | } 70 | map 71 | } 72 | 73 | #[cfg(test)] 74 | mod test { 75 | use super::*; 76 | 77 | #[test] 78 | fn test_get_local_index() { 79 | let local_index = get_local_index(); 80 | assert_eq!(local_index.len(), 5); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /crates/grib_tables/src/csv_reader/read_table_4_2.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Context; 2 | 3 | use super::csv_path; 4 | 5 | use std::path::PathBuf; 6 | 7 | use crate::parameter::{Abbrev, Parameter}; 8 | 9 | use crate::parameter::numeric_id::NumericIdBuilder; 10 | 11 | #[derive(Debug, serde::Deserialize, Clone)] 12 | pub(crate) struct GdalTable4_2Record { 13 | /// `prod` is present in the _local_ GDAL CSVs, but not the _master_ CSVs. 14 | #[serde(default)] 15 | pub(crate) prod: Option, 16 | 17 | /// `cat` is present in the _local_ GDAL CSVs, but not the _master_ CSVs. 18 | #[serde(default)] 19 | pub(crate) cat: Option, 20 | 21 | /// This needs to be _signed_ because the first few lines of each 22 | /// GDAL CSV contains comments and have negative `subcat` numbers. 23 | pub(crate) subcat: i16, 24 | 25 | pub(crate) short_name: String, 26 | pub(crate) name: String, 27 | pub(crate) unit: String, 28 | } 29 | 30 | impl From for (NumericIdBuilder, Parameter) { 31 | fn from(record: GdalTable4_2Record) -> Self { 32 | let numeric_id = (&record).into(); 33 | let parameter = record.into(); 34 | (numeric_id, parameter) 35 | } 36 | } 37 | 38 | impl From for Parameter { 39 | fn from(record: GdalTable4_2Record) -> Self { 40 | Self { 41 | abbrev: Abbrev(record.short_name), 42 | name: record.name, 43 | unit: record.unit, 44 | } 45 | } 46 | } 47 | 48 | impl From<&GdalTable4_2Record> for NumericIdBuilder { 49 | fn from(record: &GdalTable4_2Record) -> Self { 50 | NumericIdBuilder::new( 51 | record.prod.unwrap(), 52 | record.cat.unwrap(), 53 | record.subcat.try_into().expect("subcat must be a u8"), 54 | ) 55 | } 56 | } 57 | 58 | pub(crate) fn gdal_table_4_2_iterator( 59 | path: &PathBuf, 60 | ) -> anyhow::Result> { 61 | let reader = csv::Reader::from_path(path) 62 | .with_context(|| format!("Error when calling csv::Reader::from_path({path:?})"))?; 63 | let deser_error_msg = format!("deserialize result into GdalTable4_2Record for path {path:?}",); 64 | let iter = reader 65 | .into_deserialize() 66 | .map(move |row| -> GdalTable4_2Record { row.expect(&deser_error_msg) }) 67 | .filter(|record| { 68 | let lc_name = record.name.to_lowercase(); 69 | record.subcat >= 0 && !lc_name.contains("reserved") && !lc_name.contains("missing") 70 | }); 71 | Ok(iter) 72 | } 73 | 74 | pub(crate) fn gdal_master_table_4_2_iterator( 75 | product_discipline: u8, 76 | parameter_category: u8, 77 | ) -> anyhow::Result> { 78 | let filename = format!("grib2_table_4_2_{product_discipline}_{parameter_category}.csv"); 79 | let path = csv_path().join(filename); 80 | let iter = gdal_table_4_2_iterator(&path)?; 81 | Ok(iter.map(move |mut record| { 82 | record.prod = Some(product_discipline); 83 | record.cat = Some(parameter_category); 84 | record.into() 85 | })) 86 | } 87 | 88 | /// Beware that this function includes "grib2_table_4_2_local_index.csv". 89 | pub(crate) fn list_gdal_table_4_2_csv_files() -> Result { 90 | let path = csv_path().join("grib2_table_4_2_*.csv"); 91 | glob::glob(path.to_str().expect("path to str")) 92 | } 93 | 94 | #[cfg(test)] 95 | mod test { 96 | use super::*; 97 | 98 | #[test] 99 | fn test_read_gdal_table_4_2_0_0() -> anyhow::Result<()> { 100 | let iterator = gdal_master_table_4_2_iterator(0, 0)?; 101 | let vec: Vec<_> = iterator.collect(); 102 | assert_eq!(vec.len(), 33); 103 | 104 | // Check first row of data: 105 | let (numeric_id_builder, parameter) = &vec[0]; 106 | assert_eq!(numeric_id_builder, &NumericIdBuilder::new(0, 0, 0)); 107 | assert_eq!(parameter, &Parameter::new("TMP", "Temperature", "K")); 108 | 109 | // Check middle row of data: 110 | let (numeric_id_builder, parameter) = &vec[16]; 111 | assert_eq!(numeric_id_builder, &NumericIdBuilder::new(0, 0, 16)); 112 | assert_eq!( 113 | parameter, 114 | &Parameter::new("SNOHF", "Snow phase change heat flux", "W/m^2") 115 | ); 116 | 117 | // Check last row of data: 118 | let (numeric_id_builder, parameter) = &vec[32]; 119 | assert_eq!(numeric_id_builder, &NumericIdBuilder::new(0, 0, 32)); 120 | assert_eq!( 121 | parameter, 122 | &Parameter::new("", "Wet-bulb potential temperature", "K") 123 | ); 124 | Ok(()) 125 | } 126 | 127 | #[test] 128 | fn test_read_gdal_table_4_2_0_191() -> anyhow::Result<()> { 129 | let iterator = gdal_master_table_4_2_iterator(0, 191)?; 130 | let vec: Vec<_> = iterator.collect(); 131 | assert_eq!(vec.len(), 4); 132 | 133 | // Check first row of data: 134 | let (numeric_id_builder, parameter) = &vec[0]; 135 | assert_eq!(numeric_id_builder, &NumericIdBuilder::new(0, 191, 0)); 136 | assert_eq!( 137 | parameter, 138 | &Parameter::new( 139 | "TSEC", 140 | "Seconds prior to initial reference time (defined in Section 1)", 141 | "s" 142 | ) 143 | ); 144 | 145 | // Check last row of data: 146 | let (numeric_id_builder, parameter) = &vec[3]; 147 | assert_eq!(numeric_id_builder, &NumericIdBuilder::new(0, 191, 3)); 148 | assert_eq!( 149 | parameter, 150 | &Parameter::new("DSLOBS", "Days Since Last Observation", "d") 151 | ); 152 | Ok(()) 153 | } 154 | 155 | #[test] 156 | fn test_read_gdal_table_4_2_10_0() -> anyhow::Result<()> { 157 | let iterator = gdal_master_table_4_2_iterator(10, 0)?; 158 | let vec: Vec<_> = iterator.collect(); 159 | assert_eq!(vec.len(), 74); 160 | 161 | // Check first row of data: 162 | let (numeric_id_builder, parameter) = &vec[0]; 163 | assert_eq!(numeric_id_builder, &NumericIdBuilder::new(10, 0, 0)); 164 | assert_eq!(parameter, &Parameter::new("WVSP1", "Wave spectra (1)", "-")); 165 | 166 | // Check last row of data: 167 | let (numeric_id_builder, parameter) = &vec[73]; 168 | assert_eq!(numeric_id_builder, &NumericIdBuilder::new(10, 0, 73)); 169 | assert_eq!( 170 | parameter, 171 | &Parameter::new("", "Whitecap fraction", "fraction") 172 | ); 173 | Ok(()) 174 | } 175 | 176 | #[test] 177 | fn test_read_gdal_table_4_2_local_NCEP() -> anyhow::Result<()> { 178 | let path = csv_path().join("grib2_table_4_2_local_NCEP.csv"); 179 | let iterator = gdal_table_4_2_iterator(&path)?; 180 | let vec: Vec<_> = iterator 181 | .map(|record| -> (NumericIdBuilder, Parameter) { record.into() }) 182 | .collect(); 183 | assert_eq!(vec.len(), 391); 184 | 185 | // Check first row of data: 186 | let (numeric_id_builder, parameter) = &vec[0]; 187 | assert_eq!(numeric_id_builder, &NumericIdBuilder::new(0, 0, 192)); 188 | assert_eq!( 189 | parameter, 190 | &Parameter::new("SNOHF", "Snow Phase Change Heat Flux", "W/(m^2)") 191 | ); 192 | 193 | Ok(()) 194 | } 195 | 196 | #[test] 197 | fn test_list_gdal_master_table_4_2_csv_files() -> anyhow::Result<()> { 198 | let filenames: Vec<_> = list_gdal_table_4_2_csv_files()?.collect(); 199 | assert_eq!(filenames.len(), 60); 200 | Ok(()) 201 | } 202 | 203 | #[test] 204 | fn test_gdal_table_4_2_iterator_bad_path() { 205 | let result = gdal_table_4_2_iterator(&PathBuf::from("foo")); 206 | assert!(result.is_err()); 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /crates/grib_tables/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/README.md"))] 2 | 3 | mod csv_reader; 4 | mod parameter; 5 | 6 | pub use parameter::database::ParameterDatabase; 7 | pub use parameter::numeric_id::{NumericId, NumericIdBuilder}; 8 | pub use parameter::{Abbrev, Parameter}; 9 | 10 | pub const MASTER_TABLE_VERSION: u8 = 30; // from grib2_table_versions.csv 11 | -------------------------------------------------------------------------------- /crates/grib_tables/src/parameter.rs: -------------------------------------------------------------------------------- 1 | pub(crate) mod database; 2 | pub(crate) mod numeric_id; 3 | 4 | /// The human-readable description of a GRIB parameter. 5 | #[derive(Clone, Debug, derive_more::Display, PartialEq, Eq)] 6 | #[display("({}, {}, {})", abbrev, name, unit)] 7 | pub struct Parameter { 8 | /// Alternative names: 9 | /// - "short_name" is the column name for "abbrev" in the GDAL CSV files. 10 | pub(crate) abbrev: Abbrev, 11 | 12 | /// Alternative names: 13 | /// - MeaningParameterDescription_en: In the wmo-im/GRIB2 CSV files. 14 | /// - parameter: In the NCEP HTML pages and the WMO PDF. 15 | pub(crate) name: String, 16 | pub(crate) unit: String, // TODO: Maybe use a Unit enum? 17 | } 18 | 19 | impl Parameter { 20 | pub fn new(abbrev: &str, name: &str, unit: &str) -> Self { 21 | Self { 22 | abbrev: Abbrev(abbrev.to_string()), 23 | name: name.to_string(), 24 | unit: unit.to_string(), 25 | } 26 | } 27 | 28 | pub fn abbrev(&self) -> &Abbrev { 29 | &self.abbrev 30 | } 31 | 32 | pub fn name(&self) -> &str { 33 | &self.name 34 | } 35 | 36 | pub fn unit(&self) -> &str { 37 | &self.unit 38 | } 39 | } 40 | 41 | /// The abbreviation (AKA "short_name") for a GRIB parameter. 42 | #[derive(Hash, Eq, PartialEq, Clone, Debug, derive_more::Display, Ord, PartialOrd)] 43 | pub struct Abbrev(pub(crate) String); 44 | 45 | impl From<&str> for Abbrev { 46 | fn from(value: &str) -> Self { 47 | Self(value.to_string()) 48 | } 49 | } 50 | 51 | impl From for Abbrev { 52 | fn from(value: String) -> Self { 53 | Self(value) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /crates/grib_tables/src/parameter/numeric_id.rs: -------------------------------------------------------------------------------- 1 | use core::fmt; 2 | 3 | const N_BITS_PER_BYTE: u64 = 8; 4 | 5 | /// The only public way to create a [`NumericId`]. 6 | #[derive(PartialEq, Debug)] 7 | pub struct NumericIdBuilder { 8 | product_discipline: u8, 9 | parameter_category: u8, 10 | parameter_number: u8, 11 | master_table_version: u8, 12 | originating_center: u16, 13 | subcenter: u8, 14 | local_table_version: u8, 15 | } 16 | 17 | impl NumericIdBuilder { 18 | pub(crate) fn new( 19 | product_discipline: u8, 20 | parameter_category: u8, 21 | parameter_number: u8, 22 | ) -> Self { 23 | Self { 24 | product_discipline, 25 | parameter_category, 26 | parameter_number, 27 | master_table_version: u8::MAX, 28 | originating_center: u16::MAX, 29 | subcenter: u8::MAX, 30 | local_table_version: u8::MAX, 31 | } 32 | } 33 | 34 | pub(crate) fn set_master_table_version(&mut self, master_table_version: u8) -> &Self { 35 | self.master_table_version = master_table_version; 36 | self 37 | } 38 | 39 | pub(crate) fn set_originating_center(&mut self, originating_center: u16) -> &Self { 40 | self.originating_center = originating_center; 41 | self 42 | } 43 | 44 | pub(crate) fn set_subcenter(&mut self, subcenter: u8) -> &Self { 45 | self.subcenter = subcenter; 46 | self 47 | } 48 | 49 | pub(crate) fn set_local_table_version(&mut self, local_table_version: u8) -> &Self { 50 | self.local_table_version = local_table_version; 51 | self 52 | } 53 | 54 | pub(crate) fn build(self) -> NumericId { 55 | NumericId::new( 56 | self.product_discipline, 57 | self.parameter_category, 58 | self.parameter_number, 59 | self.master_table_version, 60 | self.originating_center, 61 | self.subcenter, 62 | self.local_table_version, 63 | ) 64 | } 65 | } 66 | 67 | /// Stores the unique numerical identifier for each GRIB [`Parameter`](crate::Parameter) as a single [`u64`]. 68 | /// 69 | /// Create a `NumericId` using [`NumericIdBuilder`]. 70 | /// 71 | /// The components of the numerical ID are positioned into a single [`u64`] as follows: 72 | /// (The right-most byte is byte 0): 73 | /// 74 | /// | Byte | Description | dtype | GDAL CSV file | 75 | /// |:-----:|:--------------------:|:-----:|:---------------------------:| 76 | /// | 7 | product_discipline | u8 | | 77 | /// | 6 | parameter_category | u8 | | 78 | /// | 5 | parameter_number | u8 | | 79 | /// | 4 | master_table_version | u8 | grib2_table_versions | 80 | /// | 3 & 2 | originating_center | u16 | grib2_center | 81 | /// | 1 | subcenter | u8* | grib2_table_4_2_local_index | 82 | /// | 0 | local_table_version | u8 | | 83 | /// 84 | /// *Note that the [GRIB spec says that the subcenter should be u16](https://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/grib2_sect1.shtml). But [GDAL's `grib2_subcenter.csv`](https://github.com/OSGeo/gdal/blob/master/frmts/grib/data/grib2_subcenter.csv) 85 | /// does not contain any subcenters above 255. 86 | /// And NumericId's u64 doesn't have space for a u16 subcenter! 87 | /// If we later find that we need more bits for `subcenter` then we could consider removing 88 | /// `local_table_version` which isn't available in the GDAL CSVs. 89 | /// 90 | /// [`NumericId`] is a [`u64`] because [`NumericId`] is used as the key in 91 | /// [`ParameterDatabase::numeric_id_to_param`][crate::ParameterDatabase::numeric_id_to_param] 92 | /// which is a ['BTreeMap'][std::collections::BTreeMap], 93 | /// and [`u64`]s are very fast to compare. (And `BTreeMap`s frequently compare keys!) 94 | /// 95 | /// By using a `u64`, we can, for example, get all parameters for a given category using 96 | /// [`BTreeMap::range`][std::collections::BTreeMap::range] 97 | /// from `0x__00_00_00_00_00_00` 98 | /// to `0x__FF_FF_FF_FF_FF_FF` 99 | #[derive(PartialOrd, Ord, Eq, PartialEq, Copy, Clone)] 100 | pub struct NumericId(u64); 101 | 102 | impl NumericId { 103 | const PRODUCT_DISCIPLINE_BYTE: u64 = 7; 104 | const PARAMETER_CATEGORY_BYTE: u64 = 6; 105 | const PARAMETER_NUMBER_BYTE: u64 = 5; 106 | const MASTER_TABLE_VERSION_BYTE: u64 = 4; 107 | const ORIGINATING_CENTER_LEFT_BYTE: u64 = 3; 108 | const ORIGINATING_CENTER_RIGHT_BYTE: u64 = 2; 109 | const SUBCENTER_BYTE: u64 = 1; 110 | const LOCAL_TABLE_VERSION_BYTE: u64 = 0; 111 | 112 | /// Create a new `NumericId`. 113 | /// 114 | /// `originating_center` and `local_table_version` must be `u16::MAX` and `u8::MAX` 115 | /// respectively for parameters which belong to the master table. This is consistent with 116 | /// the GRIB spec, which uses `u16::MAX` and `u8::MAX` to indicate a missing value. 117 | fn new( 118 | product_discipline: u8, 119 | parameter_category: u8, 120 | parameter_number: u8, 121 | master_table_version: u8, 122 | originating_center: u16, 123 | subcenter: u8, 124 | local_table_version: u8, 125 | ) -> Self { 126 | let numeric_id = shift_left_by_n_bytes(product_discipline, Self::PRODUCT_DISCIPLINE_BYTE) 127 | | shift_left_by_n_bytes(parameter_category, Self::PARAMETER_CATEGORY_BYTE) 128 | | shift_left_by_n_bytes(parameter_number, Self::PARAMETER_NUMBER_BYTE) 129 | | shift_left_by_n_bytes(master_table_version, Self::MASTER_TABLE_VERSION_BYTE) 130 | | shift_left_by_n_bytes(originating_center, Self::ORIGINATING_CENTER_RIGHT_BYTE) 131 | | shift_left_by_n_bytes(subcenter, Self::SUBCENTER_BYTE) 132 | | (local_table_version as u64); 133 | Self(numeric_id) 134 | } 135 | 136 | pub fn product_discipline(&self) -> u8 { 137 | self.extract_nth_byte(Self::PRODUCT_DISCIPLINE_BYTE) 138 | } 139 | 140 | pub fn parameter_category(&self) -> u8 { 141 | self.extract_nth_byte(Self::PARAMETER_CATEGORY_BYTE) 142 | } 143 | 144 | pub fn parameter_number(&self) -> u8 { 145 | self.extract_nth_byte(Self::PARAMETER_NUMBER_BYTE) 146 | } 147 | 148 | pub fn master_table_version(&self) -> u8 { 149 | self.extract_nth_byte(Self::MASTER_TABLE_VERSION_BYTE) 150 | } 151 | 152 | pub fn originating_center(&self) -> u16 { 153 | let left = self.extract_nth_byte(Self::ORIGINATING_CENTER_LEFT_BYTE) as u16; 154 | let right = self.extract_nth_byte(Self::ORIGINATING_CENTER_RIGHT_BYTE) as u16; 155 | (left << N_BITS_PER_BYTE) | right 156 | } 157 | 158 | pub fn subcenter(&self) -> u8 { 159 | self.extract_nth_byte(Self::SUBCENTER_BYTE) 160 | } 161 | 162 | pub fn local_table_version(&self) -> u8 { 163 | self.extract_nth_byte(Self::LOCAL_TABLE_VERSION_BYTE) 164 | } 165 | 166 | /// This function counts the bytes from the right to the left. 167 | /// To extract the right-most byte, set `nth_byte` to 0. To extract the left-most byte, set 168 | /// `nth_byte` to 7. 169 | fn extract_nth_byte(&self, nth_byte: u64) -> u8 { 170 | debug_assert!(nth_byte < 8, "nth_byte must be < 8, not {}", nth_byte); 171 | let n_bits_to_shift = N_BITS_PER_BYTE * nth_byte; 172 | let bit_mask = (0xFF as u64) << n_bits_to_shift; 173 | let masked_and_shifted = (self.0 & bit_mask) >> n_bits_to_shift; 174 | debug_assert!(masked_and_shifted <= 0xFF); 175 | masked_and_shifted as u8 176 | } 177 | } 178 | 179 | impl fmt::Debug for NumericId { 180 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 181 | write!( 182 | f, 183 | "NumericId(discipline={}, category={}, parameter_number={}, \ 184 | master_table_version={}, originating_center={}, subcenter={}, \ 185 | local_table_version={}, u64 encoding={})", 186 | self.product_discipline(), 187 | self.parameter_category(), 188 | self.parameter_number(), 189 | self.master_table_version(), 190 | self.originating_center(), 191 | self.subcenter(), 192 | self.local_table_version(), 193 | self.0, 194 | ) 195 | } 196 | } 197 | 198 | fn shift_left_by_n_bytes(value_to_shift: T, n_bytes: u64) -> u64 199 | where 200 | u64: From, 201 | { 202 | debug_assert!(n_bytes < 8, "n_bytes must be < 8, not {}", n_bytes); 203 | let n_bits = N_BITS_PER_BYTE * n_bytes; 204 | u64::from(value_to_shift) << n_bits 205 | } 206 | 207 | #[cfg(test)] 208 | mod test { 209 | use super::*; 210 | 211 | #[test] 212 | fn test_extract_nth_byte_all_zero() { 213 | let numeric_id = NumericId(0x00_00_00_00_00_00_00_00); 214 | for i in 0..8 { 215 | assert_eq!(numeric_id.extract_nth_byte(i), 0); 216 | } 217 | } 218 | 219 | #[test] 220 | fn test_extract_nth_byte_all_ones() { 221 | let numeric_id = NumericId(0xFF_FF_FF_FF_FF_FF_FF_FF); 222 | for i in 0..8 { 223 | assert_eq!(numeric_id.extract_nth_byte(i), 0xFF); 224 | } 225 | } 226 | 227 | #[test] 228 | fn test_extract_nth_ff_byte() { 229 | for n in 0..8 { 230 | let numeric_id = NumericId((0xFF as u64) << (N_BITS_PER_BYTE * n)); 231 | println!("{n} = {:#018x}", numeric_id.0); 232 | for i in 0..8 { 233 | if i == n { 234 | assert_eq!(numeric_id.extract_nth_byte(n), 0xFF); 235 | } else { 236 | assert_eq!(numeric_id.extract_nth_byte(i), 0); 237 | } 238 | } 239 | } 240 | } 241 | 242 | #[test] 243 | fn test_numeric_id() { 244 | let numeric_id = NumericId::new(0, 1, 2, 3, 400, 20, 5); 245 | assert_eq!(numeric_id.product_discipline(), 0); 246 | assert_eq!(numeric_id.parameter_category(), 1); 247 | assert_eq!(numeric_id.parameter_number(), 2); 248 | assert_eq!(numeric_id.master_table_version(), 3); 249 | assert_eq!(numeric_id.originating_center(), 400); 250 | assert_eq!(numeric_id.subcenter(), 20); 251 | assert_eq!(numeric_id.local_table_version(), 5); 252 | } 253 | } 254 | -------------------------------------------------------------------------------- /crates/hypergrib/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hypergrib" 3 | version = "0.0.1" 4 | edition.workspace = true 5 | license.workspace = true 6 | homepage.workspace = true 7 | repository.workspace = true 8 | readme = "README.md" 9 | authors.workspace = true 10 | 11 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 12 | 13 | [dependencies] # In alphabetical order 14 | anyhow.workspace = true 15 | bytes.workspace = true 16 | chrono.workspace = true 17 | clap = { workspace = true, features = ["derive"] } 18 | csv.workspace = true 19 | futures-util.workspace = true 20 | gribberish.workspace = true 21 | indicatif.workspace = true 22 | object_store = { workspace = true, features = ["aws"] } 23 | serde.workspace = true 24 | tokio.workspace = true 25 | url.workspace = true 26 | -------------------------------------------------------------------------------- /crates/hypergrib/src/datasets.rs: -------------------------------------------------------------------------------- 1 | pub mod gefs; 2 | -------------------------------------------------------------------------------- /crates/hypergrib/src/datasets/gefs.rs: -------------------------------------------------------------------------------- 1 | //! NOAA's Global Ensemble Forecast System (GEFS). 2 | //! https://registry.opendata.aws/noaa-gefs 3 | 4 | mod test_utils; 5 | mod version; 6 | pub(crate) use version::Version; 7 | 8 | use chrono::{TimeDelta, Timelike}; 9 | 10 | struct Gefs; 11 | 12 | impl crate::ToIdxPath for Gefs { 13 | fn to_idx_path( 14 | reference_datetime: &chrono::DateTime, 15 | _parameter: &str, 16 | _vertical_level: &str, 17 | forecast_step: &TimeDelta, 18 | ensemble_member: Option<&str>, 19 | ) -> object_store::path::Path { 20 | // TODO: The code below only works for "old" (gefs::Version::V1) GEFS paths. 21 | // Change this function to work with all gefs::Versions. And, for "Version::V3", 22 | // have a `phf::Map` (or maybe just a `HashMap`) which tells us whether 23 | // the parameter belongs to 'atmos', 'chem', 'wave'; and 'pgrb2a' or 'pgrb2b' etc. 24 | let mut parts = Vec::::with_capacity(3); 25 | 26 | // First part of the Path: 27 | parts.push(reference_datetime.format("gefs.%Y%m%d").to_string().into()); 28 | 29 | // Second part of the Path: 30 | let init_hour = format!("{:02}", reference_datetime.hour()); 31 | parts.push(init_hour.as_str().into()); 32 | 33 | // Third part of the Path: 34 | let ensemble_member = ensemble_member.expect("GEFS requires the ensemble member!"); 35 | let forecast_step = if *forecast_step == TimeDelta::zero() { 36 | "anl".to_string() 37 | } else { 38 | format!("f{:03}", forecast_step.num_hours()) 39 | }; 40 | parts.push( 41 | format!( 42 | "{ensemble_member}.t{init_hour}z.pgrb2a{forecast_step}", 43 | ensemble_member = ensemble_member, 44 | init_hour = init_hour, 45 | forecast_step = forecast_step, 46 | ) 47 | .into(), 48 | ); 49 | object_store::path::Path::from_iter(parts) 50 | } 51 | } 52 | 53 | #[cfg(test)] 54 | mod tests { 55 | 56 | use crate::{ymdh_to_datetime, ToIdxPath}; 57 | 58 | use super::*; 59 | 60 | #[test] 61 | fn test_to_idx_path() -> anyhow::Result<()> { 62 | // TODO: Once `Gefs::to_idx_path` knows how to output different paths for different 63 | // `GefsVersion`s, then update this test to use `GEFS_TEST_DATA`. 64 | let p = Gefs::to_idx_path( 65 | &ymdh_to_datetime(2017, 1, 1, 0), 66 | "HGT", 67 | "10 mb", 68 | &TimeDelta::hours(6), 69 | Some("gec00"), 70 | ); 71 | assert_eq!( 72 | p, 73 | object_store::path::Path::from("gefs.20170101/00/gec00.t00z.pgrb2af006") 74 | ); 75 | Ok(()) 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /crates/hypergrib/src/datasets/gefs/test_paths.csv: -------------------------------------------------------------------------------- 1 | path,gefs_version_enum_variant,reference_datetime,ensemble_member,forecast_hour 2 | noaa-gefs-pds/gefs.20170101/00/gec00.t00z.pgrb3aanl.idx,0,20170101T00,gec00,0 3 | noaa-gefs-pds/gefs.20170101/00/gec00.t00z.pgrb2bf330.idx,0,20170101T00,gec00,330 4 | noaa-gefs-pds/gefs.20170101/00/gep20.t00z.pgrb2bf384.idx,0,20170101T00,gep20,384 5 | noaa-gefs-pds/gefs.20180727/00/pgrb2a/gec00.t00z.pgrb2aanl.idx,1,20180727T00,gec00,0 6 | noaa-gefs-pds/gefs.20180727/00/pgrb2b/gec00.t00z.pgrb2aanl.idx,1,20180727T00,gec00,0 7 | noaa-gefs-pds/gefs.20200923/00/atmos/pgrb2ap5/geavg.t00z.pgrb2a.0p50.f000.idx,2,20200923T00,geavg,0 8 | noaa-gefs-pds/gefs.20241011/00/atmos/pgrb2ap5/geavg.t00z.pgrb2a.0p50.f000.idx,3,20241011T00,geavg,0 9 | noaa-gefs-pds/gefs.20241010/00/atmos/pgrb2ap5/geavg.t00z.pgrb2a.0p50.f840.idx,3,20241010T00,geavg,840 10 | noaa-gefs-pds/gefs.20241010/00/atmos/pgrb2ap5/gespr.t00z.pgrb2a.0p50.f840.idx,3,20241010T00,gespr,840 11 | noaa-gefs-pds/gefs.20241010/00/atmos/pgrb2ap5/gec00.t00z.pgrb2a.0p50.f000.idx,3,20241010T00,gec00,0 12 | -------------------------------------------------------------------------------- /crates/hypergrib/src/datasets/gefs/test_utils.rs: -------------------------------------------------------------------------------- 1 | use chrono::NaiveDateTime; 2 | use chrono::{DateTime, TimeDelta, Utc}; 3 | use serde::Deserialize; 4 | 5 | use super::Version; 6 | 7 | #[derive(PartialEq, Debug, serde::Deserialize, Clone)] 8 | pub(super) struct GfsTest { 9 | pub(super) path: String, 10 | #[serde(deserialize_with = "deserialize_gefs_version_enum")] 11 | pub(super) gefs_version_enum_variant: Version, 12 | #[serde(deserialize_with = "deserialize_reference_datetime")] 13 | pub(super) reference_datetime: DateTime, 14 | pub(super) ensemble_member: String, 15 | #[serde(deserialize_with = "deserialize_forecast_hour")] 16 | pub(super) forecast_hour: TimeDelta, 17 | } 18 | 19 | fn deserialize_reference_datetime<'de, D>(deserializer: D) -> Result, D::Error> 20 | where 21 | D: serde::Deserializer<'de>, 22 | { 23 | let s = <&str>::deserialize(deserializer)?; 24 | let s = format!("{s}00"); 25 | match NaiveDateTime::parse_from_str(&s, "%Y%m%dT%H%M") { 26 | Ok(dt) => Ok(dt.and_utc()), 27 | Err(e) => Err(serde::de::Error::custom(format!( 28 | "Invalid init datetime: {e}" 29 | ))), 30 | } 31 | } 32 | 33 | fn deserialize_gefs_version_enum<'de, D>(deserializer: D) -> Result 34 | where 35 | D: serde::Deserializer<'de>, 36 | { 37 | let variant_i = ::deserialize(deserializer)?; 38 | Ok(Version::all_versions()[variant_i].clone()) 39 | } 40 | 41 | fn deserialize_forecast_hour<'de, D>(deserializer: D) -> Result 42 | where 43 | D: serde::Deserializer<'de>, 44 | { 45 | let forecast_hour = ::deserialize(deserializer)?; 46 | Ok(TimeDelta::hours(forecast_hour)) 47 | } 48 | 49 | pub(super) fn load_gefs_test_paths_csv() -> Vec { 50 | // Gets the MANIFEST_DIR of the sub-crate. 51 | let mut d = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); 52 | d.push("src/datasets/gefs/test_paths.csv"); 53 | let mut rdr = csv::Reader::from_path(&d).expect(format!("Failed to open {:?}", &d).as_str()); 54 | let mut records = vec![]; 55 | for result in rdr.deserialize() { 56 | records.push(result.unwrap()); 57 | } 58 | records 59 | } 60 | -------------------------------------------------------------------------------- /crates/hypergrib/src/datasets/gefs/version.rs: -------------------------------------------------------------------------------- 1 | use chrono::{DateTime, Utc}; 2 | 3 | use crate::ymdh_to_datetime; 4 | 5 | /// The structure of the GEFS paths has changed over time. 6 | /// We manually identified the boundaries from the following information sources: 7 | /// - [NOAA GEFS page](https://www.emc.ncep.noaa.gov/emc/pages/numerical_forecast_systems/gefs.php) 8 | /// which includes the model version numbers. 9 | /// - [NCEP Products Inventory](https://www.nco.ncep.noaa.gov/pmb/products/gens/) which describes 10 | /// how the filenames are formatted for the latest version of the model. 11 | /// - Our main source of information was the [GEFS AWS S3 bucket](https://noaa-gefs-pds.s3.amazonaws.com/index.html). 12 | /// Note that all the paths below are "real" paths taken from the S3 bucket. 13 | /// 14 | /// Please beware that these `GefsVersion` numbers are entirely made up by us. They are not the 15 | /// GEFS NWP model versions. Although there should be a simple mapping from our `GefsVersion` 16 | /// numbers to the GEFS model version. 17 | /// 18 | /// TODO: Extract the *actual* GEFS model version numbers from the GRIB files and use those as the 19 | /// enum variant names. 20 | #[derive(Debug, PartialEq, Clone)] 21 | pub(crate) enum Version { 22 | /// GEFS model version 11? 23 | /// 24 | /// Paths of the form `gefs.20170101/00/gec00.t00z.pgrb2aanl.idx` 25 | V0, 26 | 27 | /// GEFS model version 11? 28 | /// 29 | /// Paths of the form `gefs.20180727/00/pgrb2[a|b]/gec00.t00z.pgrb2aanl.idx` 30 | V1, 31 | 32 | /// A union of the paths in V1 and V3 for just two runs! It looks like NOAA ran V1 and V3 33 | /// for two initialisations 2020-09-23T00 and T06. But the folders for these two 34 | /// init datetimes contain fewer files than in the equivalent "proper" V3 folders: e.g.: 35 | /// - gefs.20200923/00/atmos/pgrb2ap5 (V2) = 9,306 entries 36 | /// - gefs.20200924/00/atmos/pgrb2ap5 (V3) = 11,419 entries 37 | /// - gefs.20210101/00/atmos/pgrb2ap5 (V3) = 11,946 entries 38 | /// - gefs.20241010/00/atmos/pgrb2ap5 (V3) = 11,947 entries 39 | /// 40 | /// So it may be safest to ignore the "V3-like" folders in the folders for these 41 | /// two init datetimes and just use the "V1-like" folders for these two init times. 42 | /// i.e. just treat V2 as if it were V1. 43 | V2, 44 | 45 | /// GEFS model version v12? 46 | /// 47 | /// Paths of the forms: 48 | /// ```text 49 | /// This character-----v---v---v is repeated here-----v-v-v 50 | /// These characters----vv--vv--vvv are repeated here---------v-vv-v 51 | /// - gefs.20241008/00/atmos/pgrb2[ap5|bp5|sp25]/geavg.t00z.pgrb2[a|b|s].0p[25|50].f000.idx 52 | /// - gefs.20241008/00/atmos/[bufr|init]/: Ignore! No GRIB data. 53 | /// - gefs.20241008/00/chem/[pgrb2ap25|pgrb2ap5]/gefs.chem.t00z.a2d_0p25.f000.grib2.idx 54 | /// - gefs.20241008/00/wave/` 55 | /// - gridded/gefs.wave.t00z.c00.global.0p25.f000.grib2.idx 56 | /// - station: Ignore! No GRIB data! 57 | /// ``` 58 | V3, 59 | } 60 | 61 | impl Version { 62 | const N_VERSIONS: usize = 4; 63 | const ALL_VERSIONS: [Self; Self::N_VERSIONS] = [Self::V0, Self::V1, Self::V2, Self::V3]; 64 | 65 | /// This is the reference datetime at which this version becomes active. Each version lasts 66 | /// until the next version's start_reference_datetime minus 6 hours. 67 | fn start_reference_datetime(&self) -> DateTime { 68 | match *self { 69 | Self::V0 => ymdh_to_datetime(2017, 1, 1, 0), 70 | Self::V1 => ymdh_to_datetime(2018, 7, 27, 0), 71 | Self::V2 => ymdh_to_datetime(2020, 9, 23, 0), 72 | Self::V3 => ymdh_to_datetime(2020, 9, 23, 12), 73 | } 74 | } 75 | 76 | fn try_from_reference_datetime( 77 | query_datetime: &DateTime, 78 | ) -> Result<&'static Self, BeforeStartOfDatasetError> { 79 | for i in 0..Self::N_VERSIONS - 1 { 80 | let this_gfs_version = &Self::ALL_VERSIONS[i]; 81 | let next_gfs_version = &Self::ALL_VERSIONS[i + 1]; 82 | if *query_datetime >= this_gfs_version.start_reference_datetime() 83 | && *query_datetime < next_gfs_version.start_reference_datetime() 84 | { 85 | return Ok(this_gfs_version); 86 | } 87 | } 88 | let last_gfs_version = &Self::ALL_VERSIONS[Self::N_VERSIONS - 1]; 89 | if *query_datetime >= last_gfs_version.start_reference_datetime() { 90 | Ok(last_gfs_version) 91 | } else { 92 | // The `query_datetime` is before the start of the dataset! 93 | Err(BeforeStartOfDatasetError) 94 | } 95 | } 96 | 97 | pub(crate) const fn all_versions() -> [Self; Self::N_VERSIONS] { 98 | Self::ALL_VERSIONS 99 | } 100 | } 101 | 102 | #[derive(Debug)] 103 | struct BeforeStartOfDatasetError; 104 | 105 | #[cfg(test)] 106 | mod tests { 107 | 108 | use super::*; 109 | use crate::datasets::gefs::test_utils::load_gefs_test_paths_csv; 110 | 111 | #[test] 112 | fn test_try_from_reference_datetime() { 113 | assert!(Version::try_from_reference_datetime(&ymdh_to_datetime(2000, 1, 1, 0)).is_err()); 114 | load_gefs_test_paths_csv() 115 | .iter() 116 | .for_each(|gefs_test_struct| { 117 | assert_eq!( 118 | Version::try_from_reference_datetime(&gefs_test_struct.reference_datetime) 119 | .unwrap(), 120 | &gefs_test_struct.gefs_version_enum_variant, 121 | ) 122 | }); 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /crates/hypergrib/src/lib.rs: -------------------------------------------------------------------------------- 1 | use std::{future, sync::Arc}; 2 | 3 | pub mod datasets; 4 | use chrono::{DateTime, TimeDelta, TimeZone, Utc}; 5 | use futures_util::{Stream, StreamExt}; 6 | use object_store::ObjectMeta; 7 | 8 | // #[derive(PartialEq, Eq, Hash, Clone)] // PartialEq, Eq, and Hash are required for HashMap keys. 9 | // struct Key { 10 | // reference_datetime: DateTime, 11 | // ensemble_member: String, // TODO: Convert to info from GDAL GRIB tables 12 | // forecast_step: TimeDelta, 13 | // parameter: String, // TODO: Convert to info from GDAL GRIB tables 14 | // vertical_level: String, // TODO: Convert to info from GDAL GRIB tables 15 | // } 16 | 17 | /// The location of a GRIB message. 18 | struct MessageLocation { 19 | path: Arc, 20 | byte_offset: u32, 21 | msg_length: u32, 22 | // TODO: Store a reference to coord labels for x and y? 23 | // TODO: Maybe a ref to a struct which holds lots of metadata about this grib message such as: 24 | // - coord labels for x and y 25 | // - NWP model version 26 | // - other metadata? 27 | } 28 | 29 | /// Each `Vec` must be sorted and contains unique values. 30 | // TODO: Consider implementing a `SortedVec` struct which guarantees 31 | // that elements are sorted and unique. 32 | pub struct CoordLabels { 33 | pub reference_datetime: Vec>, 34 | pub ensemble_member: Vec, 35 | pub forecast_step: Vec, 36 | pub parameter: Vec, 37 | pub vertical_level: Vec, 38 | } 39 | 40 | /// Get the coordinate labels. 41 | pub trait GetCoordLabels { 42 | #[allow(async_fn_in_trait)] 43 | async fn get_coord_labels(self) -> anyhow::Result; 44 | } 45 | 46 | trait ToIdxPath { 47 | // TODO: Pass in a struct instead of individual fields? 48 | fn to_idx_path( 49 | reference_datetime: &DateTime, 50 | parameter: &str, 51 | vertical_level: &str, 52 | forecast_step: &TimeDelta, 53 | ensemble_member: Option<&str>, 54 | ) -> object_store::path::Path; 55 | } 56 | 57 | /// Filter a stream of `object_store::Result` to select only the items 58 | /// which have a file extension which matches `extension`. 59 | pub fn filter_by_ext<'a>( 60 | stream: impl Stream> + 'a, 61 | extension: &'static str, 62 | ) -> impl Stream> + 'a { 63 | stream.filter(move |list_result| { 64 | future::ready(list_result.as_ref().is_ok_and(|meta| { 65 | meta.location 66 | .extension() 67 | .is_some_and(|ext| ext == extension) 68 | })) 69 | }) 70 | } 71 | 72 | pub(crate) fn ymdh_to_datetime(year: i32, month: u32, day: u32, hour: u32) -> DateTime { 73 | match Utc.with_ymd_and_hms(year, month, day, hour, 0, 0) { 74 | chrono::offset::LocalResult::Single(dt) => dt, 75 | _ => panic!("Invalid datetime! {year}-{month}-{day}T{hour}"), 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /crates/hypergrib/src/main.rs: -------------------------------------------------------------------------------- 1 | use clap::Parser; 2 | use futures_util::StreamExt; 3 | use futures_util::TryFutureExt; 4 | use std::fs; 5 | use url::Url; 6 | 7 | use hypergrib::filter_by_ext; 8 | 9 | /// Create a manifest from GRIB `.idx` files. 10 | #[derive(Parser, Debug)] 11 | #[command(version, about, long_about = None)] 12 | struct Args { 13 | /// The URL of the GRIB files. For example "s3://noaa-gefs-pds/gefs.20170101/00/" 14 | #[arg(long)] 15 | url: Url, 16 | 17 | /// Set this flag if accessing a bucket that requires authentication. 18 | #[arg(long)] 19 | sign: bool, 20 | } 21 | 22 | #[tokio::main] 23 | pub async fn main() { 24 | let args = Args::parse(); 25 | 26 | println!("{}", args.url); 27 | 28 | // Get options, store, and path: 29 | let mut opts = vec![]; 30 | if !args.sign { 31 | opts.push(("skip_signature", "true")); 32 | } 33 | let (store, path) = object_store::parse_url_opts(&args.url, opts).unwrap(); 34 | 35 | // Get listing of .idx files: 36 | let mut list_stream = filter_by_ext(store.list(Some(&path)), "idx"); 37 | 38 | // Print listing: 39 | let mut i = 0; 40 | while let Some(meta) = list_stream.next().await.transpose().unwrap() { 41 | println!("Name: {}, size: {}", meta.location, meta.size); 42 | 43 | // Write idx file to local filesystem 44 | let bytes = store 45 | .get(&meta.location) 46 | .and_then(|get_result| get_result.bytes()); 47 | fs::write( 48 | meta.location.filename().expect("failed to get filename"), 49 | bytes.await.expect("failed to get bytes"), 50 | ) 51 | .expect("failed to write local file"); 52 | 53 | i += 1; 54 | if i > 10 { 55 | break; 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /crates/hypergrib_idx_parser/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hypergrib_idx_parser" 3 | version = "0.1.0" 4 | edition.workspace = true 5 | license.workspace = true 6 | homepage.workspace = true 7 | repository.workspace = true 8 | readme = "README.md" 9 | authors.workspace = true 10 | 11 | [dependencies] 12 | anyhow.workspace = true 13 | chrono.workspace = true 14 | csv.workspace = true 15 | gribberish.workspace = true 16 | serde.workspace = true 17 | object_store.workspace = true 18 | -------------------------------------------------------------------------------- /crates/hypergrib_idx_parser/README.md: -------------------------------------------------------------------------------- 1 | ## hypergrib_idx_parser 2 | 3 | Parse the body of an `.idx` file. `.idx` files are like a "table of contents" into GRIB messages. 4 | 5 | `hypergrib_idx_parser` takes as input a slice of bytes holding the contents of the `.idx` file, and returns an iterator over the decoded rows in that `.idx` file. Each row is decoded into an `MessageLocation` struct. 6 | 7 | Note that the code for decoding and encoding `.idx` _filenames_ is in the main `hypergrib` crate. 8 | 9 | `hypergrib_idx_parser` will probably eventually be moved into `gribberish`, after https://github.com/mpiannucci/gribberish/issues/63 is implemented. 10 | -------------------------------------------------------------------------------- /crates/hypergrib_idx_parser/src/lib.rs: -------------------------------------------------------------------------------- 1 | #[doc = include_str!("../README.md")] 2 | use anyhow; 3 | use chrono::{DateTime, NaiveDate, TimeDelta, Utc}; 4 | use serde::Deserialize; 5 | 6 | #[derive(PartialEq, Debug, serde::Deserialize)] 7 | struct IdxRecord { 8 | msg_id: u32, 9 | byte_offset: u32, 10 | #[serde(deserialize_with = "deserialize_init_datetime")] 11 | reference_datetime: DateTime, 12 | parameter: String, 13 | vertical_level: String, 14 | // TODO: Define `struct Level{ 15 | // fixed_surface_type: gribberish::templates::product::tables::FixedSurfaceType, 16 | // value: Option 17 | // }` 18 | // e.g. "10 mb" would be `Level{FixedSurfaceType::IsobaricSurface, 10}` 19 | #[serde(deserialize_with = "deserialize_step")] 20 | forecast_step: TimeDelta, 21 | ensemble_member: Option, 22 | } 23 | 24 | // TODO: Return an iterator where each item is a `Result`. 25 | fn parse_idx(b: &[u8]) -> anyhow::Result> { 26 | let mut rdr = csv::ReaderBuilder::new() 27 | .delimiter(b':') 28 | .has_headers(false) 29 | .from_reader(b); 30 | let mut records = vec![]; 31 | for result in rdr.deserialize() { 32 | records.push(result?); 33 | } 34 | Ok(records) 35 | } 36 | 37 | pub fn deserialize_init_datetime<'de, D>(deserializer: D) -> Result, D::Error> 38 | where 39 | D: serde::Deserializer<'de>, 40 | { 41 | let s = <&str>::deserialize(deserializer)?; 42 | // The slightly convoluted approach below is necessary because `NaiveDateTime::parse_str` 43 | // requires the input string to include the hour but `.idx` files don't include hours! 44 | // So we _could_ implement a hack whereby we append "00" to the end of `s` but that requires 45 | // a heap allocation for every row of the `.idx`. The advantage of the approach below 46 | // is that it doesn't require any heap allocations. 47 | let (date, remainder) = NaiveDate::parse_and_remainder(s, "d=%Y%m%d") 48 | .map_err(|e| serde::de::Error::custom(format!("Invalid init date: {e}")))?; 49 | let hour: u32 = remainder.parse().map_err(|e| { 50 | serde::de::Error::custom(format!( 51 | "Hour of the NWP init could not be parsed into a u32: {e}" 52 | )) 53 | })?; 54 | match date.and_hms_opt(hour, 0, 0) { 55 | Some(dt) => Ok(dt.and_utc()), 56 | None => Err(serde::de::Error::custom(format!( 57 | "Invalid init hour: {hour}" 58 | ))), 59 | } 60 | } 61 | 62 | pub fn deserialize_step<'de, D>(deserializer: D) -> Result 63 | where 64 | D: serde::Deserializer<'de>, 65 | { 66 | let s = <&str>::deserialize(deserializer)?; 67 | match s { 68 | "anl" => Ok(TimeDelta::zero()), 69 | _ => Err(serde::de::Error::custom(format!( 70 | "Failed to parse forecast step: {s}" 71 | ))), 72 | } 73 | // TODO: Implement deserialisation for other step strings! See: 74 | // https://github.com/NOAA-EMC/NCEPLIBS-grib_util/blob/develop/src/wgrib/wgrib.c#L2248-L2446 75 | // Even better, use existing strings from gribberish, although this will require 76 | // adding `abbrev` annotations to the relevant gribberish enums, and defining 77 | // a `FromAbbrev` proc macro. The relevant gribberish enums might be 78 | // `GeneratingProcess` and/or `ReferenceDataSignificance`. Also see: 79 | // https://github.com/mpiannucci/gribberish/blob/1e35224773d4c174b4db59875a55438921898e2e/gribberish/src/message_metadata.rs#L96 80 | } 81 | 82 | #[cfg(test)] 83 | mod tests { 84 | use chrono::NaiveDate; 85 | use gribberish::templates::product::parameters::meteorological; 86 | 87 | use super::*; 88 | 89 | #[test] 90 | fn test_parse_idx() -> anyhow::Result<()> { 91 | let idx_text = "\ 92 | 1:0:d=2017010100:HGT:10 mb:anl:ENS=low-res ctl 93 | 2:50487:d=2017010100:TMP:10 mb:anl:ENS=low-res ctl 94 | 3:70653:d=2017010100:RH:10 mb:anl:ENS=low-res ctl 95 | 4:81565:d=2017010100:UGRD:10 mb:anl:ENS=low-res ctl 96 | "; 97 | let records = parse_idx(idx_text.as_bytes())?; 98 | assert_eq!(records.len(), 4); 99 | assert_eq!( 100 | records[0], 101 | IdxRecord { 102 | msg_id: 1, 103 | byte_offset: 0, 104 | reference_datetime: NaiveDate::from_ymd_opt(2017, 1, 1) 105 | .unwrap() 106 | .and_hms_opt(0, 0, 0) 107 | .unwrap() 108 | .and_utc(), 109 | parameter: String::from("HGT"), 110 | vertical_level: String::from("10 mb"), 111 | forecast_step: TimeDelta::zero(), 112 | ensemble_member: Some(String::from("ENS=low-res ctl")), 113 | } 114 | ); 115 | Ok(()) 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /crates/hypergrib_indexer/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hypergrib_indexer" 3 | version = "0.0.1" 4 | edition.workspace = true 5 | license.workspace = true 6 | homepage.workspace = true 7 | repository.workspace = true 8 | readme.workspace = true 9 | authors.workspace = true 10 | categories.workspace = true 11 | keywords.workspace = true 12 | 13 | [dependencies] 14 | anyhow.workspace = true 15 | clap.workspace = true 16 | chrono = { workspace = true, features = ["serde"] } 17 | futures-util.workspace = true 18 | hypergrib.workspace = true 19 | object_store.workspace = true 20 | serde.workspace = true 21 | serde_yaml.workspace = true 22 | tokio.workspace = true 23 | url.workspace = true 24 | list_with_depth.workspace = true 25 | reqwest.workspace = true # Enable `hickory-dns`. See workspace's Cargo.toml for details. 26 | -------------------------------------------------------------------------------- /crates/hypergrib_indexer/README.md: -------------------------------------------------------------------------------- 1 | ## `hypergrib_indexer` 2 | 3 | Create `hypergrib` metadata from a source dataset. 4 | 5 | Run `cargo run -- --help` in the `hypergrib_indexer` directory for more info. 6 | -------------------------------------------------------------------------------- /crates/hypergrib_indexer/datasets/gefs/index.yaml: -------------------------------------------------------------------------------- 1 | name: GEFS 2 | description: The Global Ensemble Forecast System (GEFS) has been operational at NCEP since December 1992. 3 | documentation_urls: 4 | - https://registry.opendata.aws/noaa-gefs/ 5 | - https://www.nco.ncep.noaa.gov/pmb/products/gens/ 6 | - https://www.emc.ncep.noaa.gov/emc/pages/numerical_forecast_systems/gefs.php 7 | datasets: 8 | # There should be a 1:1 mapping between versions and xarray.Dataset, 9 | # albeit with a few NaNs (e.g. if a param isn't available at a particular step). 10 | - dataset_id: v12_atmos_0.5_degree 11 | nwp_model_version: 12 12 | 13 | data_files: 14 | file_type: grib2 15 | extension: .grib 16 | bucket_url: s3://noaa-gefs-pds/ 17 | index_files: 18 | file_type: idx 19 | extension: .idx 20 | bucket_url: s3://noaa-gefs-pds/ 21 | 22 | # `reference_datetime`, `ensemble_member`, `forecast_step`, and `parameter_set` 23 | # are keywords which are understood by hypergrib. 24 | formatting_template: > 25 | gefs.{reference_datetime:%Y%m%d}/ 26 | {daily_cycle:02}/ 27 | atmos/ 28 | pgrb2{parameter_set}p5/ 29 | ge{ensemble_member}. 30 | t{daily_cycle:02}z. 31 | pgrb2{parameter_set}. 32 | 0p50. 33 | f{forecast_step:03} 34 | 35 | reference_datetimes: 36 | start: 2020-09-23T12:00:00Z # inclusive. 37 | # `end` is inclusive. If `end` is missing, this means "ongoing". 38 | number_of_daily_cycles: 4 39 | 40 | ensemble_members: 41 | # `control`, `perturbed`, `ens_mean` and `ens_spread` are all keywords (understood by hypergrib). 42 | control: c00 43 | perturbed: 44 | formatting_template: p{:02} 45 | start: 1 # inclusive 46 | end: 30 # inclusive 47 | ens_mean: avg 48 | ens_spread: spr 49 | 50 | analysis_step: 0 # Earlier versions of GEFS use a string: "anl" 51 | 52 | # `forecast_steps` is a list of multiple ranges because NWPs often reduce the temporal frequency 53 | # for forecast horizons further into the future, and because some daily initialisation cycles 54 | # have different forecast horizons. 55 | forecast_steps: 56 | - daily_cycles: [ 0, 6, 12, 18 ] # The daily cycles for which these forecast steps are relevant for. 57 | start_hour: 3 # inclusive 58 | end_hour: 240 # inclusive 59 | step_duration_in_hours: 3 60 | - daily_cycles: [ 0, 6, 12, 18 ] 61 | start_hour: 246 62 | end_hour: 384 # 384 hours is 16 days. 63 | step_duration_in_hours: 6 64 | - daily_cycles: [ 0 ] # Daily cycle 0 extends out to 35 days. 65 | start_hour: 390 66 | end_hour: 840 # 840 hours is 35 days. 67 | step_duration_in_hours: 6 68 | 69 | # vertical_levels are listed in a "best effort" order of altitude, from lowest to highest: 70 | vertical_levels: [ 0-0.1 m below ground, mean sea level, surface, 71 | 2 m above ground, 10 m above ground, 180-0 mb above ground, 72 | 1000 mb, 925 mb, 850 mb, 700 mb, 500 mb, 400 mb, 300 mb, 73 | 250 mb, 200 mb, 100 mb, 50 mb, 10 mb, entire atmosphere, top of atmosphere ] 74 | 75 | parameter_sets: 76 | # This needs more work... and probably needs to be determined algorithmically. 77 | # But let's do some visualisation. See issue #5. 78 | a: # Parameter set 'a' contains the most commonly used parameters in GEFS. 79 | # Each key is a parameter abbreviation. If the key maps to an empty value then that 80 | # means that the param is present in every combination of vertical level, forecast step, 81 | # daily cycle, and ensemble member. A non-empty value tells us where to find the param. 82 | # Keys can be single param abbreviations, or a comma-separated list because params are 83 | # often organised in groups, such as TMP,RH. 84 | TMP,RH: 85 | # This says that TMP & RH are present in all forecast steps, daily cycles, and ensemble members. 86 | # But TMP and RH are only present in these specified vertical levels: 87 | - vertical_levels: 88 | verb: include_only 89 | items: [ 2 m above ground, 90 | 1000 mb, 925 mb, 850 mb, 700 mb, 500 mb, 91 | 250 mb, 200 mb, 100 mb, 50 mb, 10 mb ] 92 | DSWRF: 93 | # "DSWRF is found in all forecast steps except step 0. It is only found at the surface." 94 | - forecast_steps: 95 | verb: exclude 96 | items: [ 0 ] 97 | vertical_levels: 98 | verb: include_only 99 | items: [ surface ] 100 | UGRD,VGRD: 101 | - vertical_levels: 102 | verb: include_only 103 | items: [ 104 | 10 m above ground, 105 | 1000 mb, 925 mb, 850 mb, 700 mb, 500 mb, 400 mb, 300 mb, 106 | 250 mb, 200 mb, 100 mb, 50 mb, 10 mb ] 107 | HGT: 108 | # In the analysis step, HGT is available at surface, and a bunch of pressure levels. 109 | # In all other steps, HGT is not available at surface! 110 | - forecast_steps: 111 | verb: include_only 112 | items: [ 0 ] 113 | vertical_levels: 114 | verb: include_only 115 | items: [ 116 | surface, 117 | 1000 mb, 925 mb, 850 mb, 700 mb, 500 mb, 300 mb, 118 | 250 mb, 200 mb, 100 mb, 50 mb, 10 mb ] 119 | - forecast_steps: 120 | verb: exclude 121 | items: [ 0 ] 122 | vertical_levels: 123 | verb: include_only 124 | items: [ 125 | 1000 mb, 925 mb, 850 mb, 700 mb, 500 mb, 300 mb, 126 | 250 mb, 200 mb, 100 mb, 50 mb, 10 mb ] 127 | 128 | -------------------------------------------------------------------------------- /crates/hypergrib_indexer/src/coord_labels_builder.rs: -------------------------------------------------------------------------------- 1 | use std::{collections::BTreeSet, sync::Arc}; 2 | 3 | use chrono::{DateTime, TimeDelta, Utc}; 4 | use hypergrib::CoordLabels; 5 | use object_store::{limit::LimitStore, ObjectStore}; 6 | use url::Url; 7 | 8 | /// Set the maximum number of concurrent operations. 9 | /// Set to `None` for no limit. But beware that, when no limit is set, 10 | /// you may have to increase the number of open file descriptors that your operating 11 | /// system allows. (Note that file descriptors are used for network connections, as 12 | /// well as for files!). On Linux, run `ulimit -n 10000` to set the limit to 10,000. 13 | const CONCURRENCY_LIMIT: Option = Some(1000); 14 | 15 | pub(crate) struct CoordLabelsBuilder { 16 | grib_store: Arc, 17 | grib_base_path: object_store::path::Path, 18 | idx_store: Arc, 19 | idx_base_path: object_store::path::Path, 20 | reference_datetime: BTreeSet>, 21 | ensemble_member: BTreeSet, 22 | forecast_step: BTreeSet, 23 | parameter: BTreeSet, 24 | vertical_level: BTreeSet, 25 | } 26 | 27 | impl CoordLabelsBuilder { 28 | pub(crate) fn new( 29 | grib_store: Arc, 30 | grib_base_path: object_store::path::Path, 31 | idx_store: Arc, 32 | idx_base_path: object_store::path::Path, 33 | ) -> Self { 34 | Self { 35 | grib_store, 36 | grib_base_path, 37 | idx_store, 38 | idx_base_path, 39 | reference_datetime: BTreeSet::new(), 40 | ensemble_member: BTreeSet::new(), 41 | forecast_step: BTreeSet::new(), 42 | parameter: BTreeSet::new(), 43 | vertical_level: BTreeSet::new(), 44 | } 45 | } 46 | 47 | pub(crate) fn new_from_url(url: &str, skip_signature: bool) -> anyhow::Result { 48 | let mut opts = vec![]; 49 | if skip_signature { 50 | opts.push(("skip_signature", "true")); 51 | } 52 | let bucket_url = Url::try_from(url)?; 53 | let (store, base_path) = object_store::parse_url_opts(&bucket_url, opts)?; 54 | let store: Arc = if let Some(concurrency_limit) = CONCURRENCY_LIMIT { 55 | Arc::new(LimitStore::new(store, concurrency_limit)) 56 | } else { 57 | Arc::from(store) 58 | }; 59 | Ok(CoordLabelsBuilder::new( 60 | store.clone(), 61 | base_path.clone(), 62 | store, 63 | base_path, 64 | )) 65 | } 66 | 67 | pub(crate) fn build(self) -> CoordLabels { 68 | CoordLabels { 69 | reference_datetime: to_sorted_vec(self.reference_datetime), 70 | ensemble_member: to_sorted_vec(self.ensemble_member), 71 | forecast_step: to_sorted_vec(self.forecast_step), 72 | parameter: to_sorted_vec(self.parameter), 73 | vertical_level: to_sorted_vec(self.vertical_level), 74 | } 75 | } 76 | 77 | pub(crate) fn grib_store(&self) -> &Arc { 78 | &self.grib_store 79 | } 80 | 81 | pub(crate) fn grib_base_path(&self) -> &object_store::path::Path { 82 | &self.grib_base_path 83 | } 84 | 85 | pub(crate) fn idx_store(&self) -> &Arc { 86 | &self.idx_store 87 | } 88 | 89 | pub(crate) fn idx_base_path(&self) -> &object_store::path::Path { 90 | &self.idx_base_path 91 | } 92 | 93 | pub(crate) fn insert_reference_datetime(&mut self, datetime: DateTime) -> bool { 94 | self.reference_datetime.insert(datetime) 95 | } 96 | 97 | pub(crate) fn reference_datetime(&self) -> &BTreeSet> { 98 | &self.reference_datetime 99 | } 100 | 101 | pub(crate) fn describe_reference_datetimes(&self) -> String { 102 | let dts = &self.reference_datetime; 103 | format!( 104 | "{} reference datetimes found. First: {:?}. Last: {:?}", 105 | dts.len(), 106 | dts.first(), 107 | dts.last() 108 | ) 109 | } 110 | } 111 | 112 | fn to_sorted_vec(set: S) -> Vec 113 | where 114 | T: Ord, 115 | S: IntoIterator, 116 | Vec: FromIterator<::Item>, 117 | { 118 | let mut v: Vec = set.into_iter().collect(); 119 | v.sort(); 120 | v 121 | } 122 | -------------------------------------------------------------------------------- /crates/hypergrib_indexer/src/datasets.rs: -------------------------------------------------------------------------------- 1 | pub mod gefs; 2 | pub use gefs::Gefs; 3 | -------------------------------------------------------------------------------- /crates/hypergrib_indexer/src/datasets/gefs.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Context; 2 | use chrono::{DateTime, NaiveDate, Utc}; 3 | use hypergrib::{CoordLabels, GetCoordLabels}; 4 | 5 | use crate::coord_labels_builder::CoordLabelsBuilder; 6 | use list_with_depth::list_with_depth; 7 | 8 | const BUCKET_URL: &str = "s3://noaa-gefs-pds"; 9 | const SKIP_SIGNATURE: bool = true; 10 | 11 | pub struct Gefs { 12 | coord_labels_builder: CoordLabelsBuilder, 13 | } 14 | 15 | impl Gefs { 16 | pub fn new() -> anyhow::Result { 17 | let coord_labels_builder = CoordLabelsBuilder::new_from_url(BUCKET_URL, SKIP_SIGNATURE)?; 18 | Ok(Self { 19 | coord_labels_builder, 20 | }) 21 | } 22 | 23 | /// The reference datetimes are extracted from the first two parts of the path, for example: 24 | /// `gefs.20241204/00/`. 25 | async fn get_reference_datetimes(&mut self) -> anyhow::Result<()> { 26 | let store = self.coord_labels_builder.idx_store().clone(); 27 | let prefix = self.coord_labels_builder.idx_base_path(); 28 | let list = list_with_depth(store, Some(prefix), 1).await?; 29 | for prefix in list.common_prefixes.iter() { 30 | let datetime = path_to_reference_datetime(prefix)?; 31 | let datetime_is_unique = self 32 | .coord_labels_builder 33 | .insert_reference_datetime(datetime); 34 | assert!( 35 | datetime_is_unique, 36 | "Duplicate reference datetime! {datetime}" 37 | ); 38 | } 39 | Ok(()) 40 | } 41 | } 42 | 43 | impl GetCoordLabels for Gefs { 44 | async fn get_coord_labels(mut self) -> anyhow::Result { 45 | self.get_reference_datetimes().await?; 46 | println!( 47 | "{}", 48 | self.coord_labels_builder.describe_reference_datetimes() 49 | ); 50 | 51 | // TODO: Get list of ensemble members and steps from GEFS .idx filenames. 52 | // See issue #23. And use the code snippet in issue #23! 53 | // TODO: Get a list of parameters and vertical levels by reading the 54 | // bodies of a minimal set of .idx files. See issue #24. 55 | // TODO: Get the horizontal spatial coordinates. See issue #25. 56 | Ok(self.coord_labels_builder.build()) 57 | } 58 | } 59 | 60 | /// Convert the first two parts of a path to a reference datetime. 61 | /// For example, `gefs.20191122/18` becomes 2019-11-22T18:00. 62 | fn path_to_reference_datetime(path: &object_store::path::Path) -> anyhow::Result> { 63 | let parts: Vec<_> = path.parts().take(2).collect(); 64 | let error_context = |s| format!("{s} when parsing path: '{path}'"); 65 | let date = NaiveDate::parse_from_str(parts[0].as_ref(), "gefs.%Y%m%d").with_context(|| { 66 | error_context("Failed to convert date component of NWP reference datetime") 67 | })?; 68 | let hour: u32 = parts[1] 69 | .as_ref() 70 | .parse() 71 | .with_context(|| error_context("Hour of the NWP init could not be parsed into a u32"))?; 72 | match date.and_hms_opt(hour, 0, 0) { 73 | Some(dt) => Ok(dt.and_utc()), 74 | None => Err(anyhow::format_err!(error_context( 75 | "Invalid NWP reference hour" 76 | ))), 77 | } 78 | } 79 | 80 | #[cfg(test)] 81 | mod tests { 82 | 83 | use super::*; 84 | 85 | #[test] 86 | fn test_path_to_reference_datetime() -> anyhow::Result<()> { 87 | let path = object_store::path::Path::from("gefs.20191122/18"); 88 | let result = path_to_reference_datetime(&path)?; 89 | assert_eq!( 90 | result, 91 | DateTime::parse_from_rfc3339("2019-11-22T18:00:00Z")? 92 | ); 93 | Ok(()) 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /crates/hypergrib_indexer/src/ingest_yaml.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | 3 | use chrono::{DateTime, FixedOffset, Utc}; 4 | use serde::Deserialize; 5 | use url::Url; 6 | 7 | #[derive(Debug, Deserialize)] 8 | struct NWP { 9 | name: String, 10 | description: String, 11 | #[serde(deserialize_with = "deserialize_urls")] 12 | documentation_urls: Vec, 13 | datasets: Vec, 14 | } 15 | 16 | #[derive(Debug, Deserialize)] 17 | struct Dataset { 18 | dataset_id: String, 19 | nwp_model_version: f32, 20 | data_files: FileInfo, 21 | index_files: FileInfo, 22 | formatting_template: String, 23 | reference_datetimes: ReferenceDatetimes, 24 | ensemble_members: EnsembleMembers, 25 | analysis_step: String, 26 | forecast_steps: Vec, 27 | vertical_levels: Vec, 28 | 29 | /// The key of the outer HashMap is the param set name (e.g. 'a' or 'b' in GEFS). 30 | /// The key of the inner HashMap is the NWP param abbreviation (e.g. 'TMP' or 'RH'). 31 | parameter_sets: HashMap>>, 32 | } 33 | 34 | #[derive(Debug, Deserialize)] 35 | struct FileInfo { 36 | file_type: FileType, 37 | extension: String, 38 | #[serde(deserialize_with = "deserialize_url")] 39 | bucket_url: Url, 40 | } 41 | 42 | #[derive(Debug, Deserialize, PartialEq)] 43 | #[serde(rename_all = "lowercase")] 44 | enum FileType { 45 | Grib2, 46 | Idx, 47 | } 48 | 49 | #[derive(Debug, Deserialize)] 50 | struct ReferenceDatetimes { 51 | start: DateTime, 52 | end: Option>, 53 | number_of_daily_cycles: u8, 54 | } 55 | 56 | #[derive(Debug, Deserialize)] 57 | struct EnsembleMembers { 58 | control: Option, 59 | perturbed: Option, 60 | ens_mean: Option, 61 | ens_spread: Option, 62 | } 63 | 64 | #[derive(Debug, Deserialize)] 65 | struct PerturbedEnsembleMembers { 66 | formatting_template: String, 67 | start: u32, 68 | end: u32, 69 | } 70 | 71 | #[derive(Debug, Deserialize)] 72 | struct ForecastStepRange { 73 | daily_cycles: Vec, 74 | start_hour: u32, 75 | end_hour: u32, 76 | step_duration_in_hours: u32, 77 | } 78 | 79 | #[derive(Debug, Deserialize)] 80 | struct ParameterFilter { 81 | vertical_levels: Option, 82 | forecast_steps: Option, 83 | } 84 | 85 | #[derive(Debug, Deserialize, PartialEq)] 86 | #[serde(tag = "verb", content = "items", rename_all = "snake_case")] 87 | enum VerticalLevels { 88 | IncludeOnly(Vec), 89 | Exclude(Vec), 90 | } 91 | 92 | #[derive(Debug, Deserialize, PartialEq)] 93 | #[serde(tag = "verb", content = "items", rename_all = "snake_case")] 94 | enum ForecastSteps { 95 | IncludeOnly(Vec), 96 | Exclude(Vec), 97 | } 98 | 99 | // Custom deserialization function for a single URL 100 | fn deserialize_url<'de, D>(deserializer: D) -> Result 101 | where 102 | D: serde::Deserializer<'de>, 103 | { 104 | let s: String = serde::Deserialize::deserialize(deserializer)?; 105 | Url::parse(&s).map_err(serde::de::Error::custom) 106 | } 107 | 108 | // Custom deserialization function for a vector of URLs 109 | fn deserialize_urls<'de, D>(deserializer: D) -> Result, D::Error> 110 | where 111 | D: serde::Deserializer<'de>, 112 | { 113 | let strings: Vec = Vec::deserialize(deserializer)?; 114 | strings 115 | .iter() 116 | .map(|s| Url::parse(s).map_err(serde::de::Error::custom)) 117 | .collect() 118 | } 119 | 120 | #[cfg(test)] 121 | mod tests { 122 | use super::*; 123 | use chrono::{TimeZone, Utc}; 124 | use serde_yaml; 125 | use std::fs::File; 126 | use std::io::Read; 127 | use std::path::PathBuf; 128 | 129 | #[test] 130 | fn test_load_yaml() { 131 | // Construct the path relative to the Cargo.toml 132 | let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); 133 | path.push("datasets/gefs/index.yaml"); 134 | 135 | // Open the file 136 | let mut file = File::open(&path).expect("Unable to open file"); 137 | let mut contents = String::new(); 138 | file.read_to_string(&mut contents) 139 | .expect("Unable to read file"); 140 | 141 | // Deserialize the YAML contents into the NWP struct 142 | let nwp: NWP = serde_yaml::from_str(&contents).expect("Unable to parse YAML"); 143 | 144 | // Add assertions here to verify the contents of the `nwp` struct 145 | // For example: 146 | assert_eq!(nwp.name, "GEFS"); 147 | assert_eq!(nwp.datasets.len(), 1); 148 | let dataset = &nwp.datasets[0]; 149 | assert_eq!(dataset.dataset_id, "v12_atmos_0.5_degree"); 150 | assert_eq!(dataset.data_files.file_type, FileType::Grib2); 151 | assert_eq!(dataset.data_files.extension, ".grib"); 152 | assert_eq!( 153 | dataset.data_files.bucket_url, 154 | Url::parse("s3://noaa-gefs-pds/").unwrap() 155 | ); 156 | assert_eq!( 157 | dataset.reference_datetimes.start, 158 | Utc.with_ymd_and_hms(2020, 9, 23, 12, 0, 0).unwrap() 159 | ); 160 | assert_eq!(dataset.reference_datetimes.end, None); 161 | assert_eq!(dataset.reference_datetimes.number_of_daily_cycles, 4); 162 | assert_eq!(dataset.forecast_steps.len(), 3); 163 | let param_set_a = dataset 164 | .parameter_sets 165 | .get("a") 166 | .expect("Failed to find parameter_set 'a'"); 167 | assert_eq!( 168 | param_set_a["DSWRF"][0].vertical_levels, 169 | Some(VerticalLevels::IncludeOnly(vec!["surface".to_string()])) 170 | ); 171 | assert!(param_set_a["TMP,RH"][0].forecast_steps.is_none()); 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /crates/hypergrib_indexer/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub(crate) mod coord_labels_builder; 2 | pub mod datasets; 3 | pub(crate) mod ingest_yaml; 4 | -------------------------------------------------------------------------------- /crates/hypergrib_indexer/src/main.rs: -------------------------------------------------------------------------------- 1 | use clap::{Parser, ValueEnum}; 2 | use hypergrib::GetCoordLabels; 3 | use hypergrib_indexer::datasets::gefs::Gefs; 4 | 5 | /// Create a manifest from GRIB `.idx` files. 6 | #[derive(Parser, Debug)] 7 | #[command(version, about, long_about = None)] 8 | struct Args { 9 | #[arg(value_enum)] 10 | dataset: DatasetName, 11 | } 12 | 13 | #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, ValueEnum)] 14 | enum DatasetName { 15 | /// The Global Ensemble Forecast System (GEFS) is a weather model created 16 | /// by the US National Centers for Environmental Prediction (NCEP) that 17 | /// generates 21 separate forecasts (ensemble members). See: 18 | /// https://www.ncei.noaa.gov/products/weather-climate-models/global-ensemble-forecast 19 | Gefs, 20 | } 21 | 22 | #[tokio::main] 23 | pub async fn main() -> anyhow::Result<()> { 24 | let args = Args::parse(); 25 | 26 | println!("Loading dataset {:?}", args.dataset); 27 | 28 | let dataset = match args.dataset { 29 | DatasetName::Gefs => Gefs::new()?, 30 | }; 31 | 32 | let coord_labels = dataset.get_coord_labels().await.expect("get_coord_labels"); 33 | // TODO: Write the coord labels to a metadata file. See: 34 | // https://github.com/JackKelly/hypergrib/discussions/17 35 | 36 | Ok(()) 37 | } 38 | -------------------------------------------------------------------------------- /design.md: -------------------------------------------------------------------------------- 1 | ## Step 1: Create metadata describing each NWP dataset 2 | 3 | There will be four parts to the metadata: 4 | 1. Hand-written metadata: NWP name, bucket, ensemble members, forecast steps. 5 | 2. Algorithmically generated by the [`explore_nwps`](https://github.com/JackKelly/explore_nwps) Python package: NWP variables, vertical levels, horizontal coordinates 6 | 3. [Data contract](https://github.com/JackKelly/hypergrib/issues/32). 7 | 4. Reference datetimes (AKA init datetimes). These can be grabbed at "inference time" within a few seconds. Or even faster if we "burn in" the NWP ref datetimes, and only grab the most recent. 8 | 9 | ## Step 2: Load the metadata and load data 10 | 11 | Open dataset: 12 | 13 | ```python 14 | da = xr.open_dataset(URL, engine="hypergrib") 15 | ``` 16 | 17 | `hypergrib` loads the metadata and passes to xarray the full list of coordinates and dimension names, e.g.: 18 | 19 | ```python 20 | dims = ["init_time", "variable", "vertical_level", "timestep", "ensemble_member"] 21 | coords = { 22 | "init_time": ["2024-01-01", "2024-01-02"], 23 | # etc. 24 | } 25 | ``` 26 | 27 | User request: 28 | 29 | ```python 30 | da.sel( 31 | init_time="2024-01-01", 32 | nwp_variable=["temperature", "wind_speed"], 33 | vertical_level="2meters", 34 | # all forecast time steps 35 | # all ensemble members 36 | ) 37 | ``` 38 | 39 | xarray converts these coordinate labels to integer indexes: 40 | 41 | ```python 42 | da.isel( 43 | init_time=0, 44 | nwp_variable=[0, 1], 45 | vertical_level=0, 46 | # all forecast time steps 47 | # all ensemble members 48 | ) 49 | ``` 50 | 51 | The integer indexes get passed to the `hypergrib` backend for xarray. (In the future, `hypergrib` may implement a [custom xarray index](https://docs.xarray.dev/en/stable/internals/how-to-create-custom-index.html), so we can avoid the redundant conversion to integer indexes and back to coordinate labels). 52 | 53 | ### Planned `hypergrib` MVP features: 54 | 55 | - [ ] Load the metadata (which was produced by step 1). 56 | - [ ] Convert integer indicies back to coordinate labels by looking up the appropriate labels in `hypergrib`'s coords arrays. 57 | - [ ] Find the unique tuples of init date, init hour, ensemble member, and step. 58 | - [ ] Algorithmically generate the location of all the `.idx` files we need. For example, the GEFS location strings look like this: ` 59 | noaa-gefs-pds/gefs.//pgrb2b/gep.tz.pgrb2af` 60 | - [ ] In parallel, submit GET requests for all these `.idx` files. 61 | - [ ] As soon as an `.idx` file arrives, decode it, and look up byte ranges of the GRIB files we need, and immediately submit GET requests for those byte ranges of the GRIB file. (This step is probably so fast that we perhaps don't need to multi-thread this... for the MVP, let's use a single thread for decoding `.idx` files and if that's too slow then we can add more threads). Maybe stop decoding rows in the `.idx` file once we've found all the metadata we need. 62 | - [ ] If an `.idx` file doesn't exist then: 63 | - Allow the user to determine what happens if `hypergrib` _tries_ but fails to read an `.idx` file. Three options: 64 | - Silent: Don't complain about the missing `.idx`. Just load the GRIB, scan it, and keep in mem (because we'll soon extract binary data from it). 65 | - Warn: Log a warning about the missing `.idx`. And load the GRIB, scan it, and keep in mem. 66 | - Fail: Complain loudly about the missing `.idx`! Don't load the GRIB. 67 | - (Maybe, in a future version, we could offer the option to generate and cache `.idx` files locally) 68 | - [ ] If no GRIB exists then log another warning and insert the MISSING DATA indicator into the array (which will probably be NaN for floating point data). 69 | - [ ] As soon as GRIB data arrives, decode it, and place it into the final array. Decoding GRIB data should be multi-threaded. 70 | - [ ] Benchmark! See recent discussion on "[Large Scale Geospatial Benchmarks](https://discourse.pangeo.io/t/large-scale-geospatial-benchmarks/4498/2)" on the Pangeo forum. 71 | 72 | ### Features beyond the MVP 73 | 74 | #### Allow the user to specify whether to load `.idx` files 75 | Allow the user to set a threshold for when to load `.idx` files. 76 | 77 | If the user requests more than THRESHOLD% of the GRIB messages in any GRIB file then skip the `.idx` and just load the GRIB. Otherwise, attempt to load the `.idx`. (The motivation being that, if the user wants to read most of the GRIB file, then loading the `.idx` first will add unnecessary latency). 78 | 79 | Set the threshold to 100% to always try to load the `.idx` file before the GRIB. 80 | 81 | Set the threshold to 0% to never load the `.idx`, and always load the GRIB file first. 82 | 83 | #### Define an extended idx format 84 | See https://github.com/JackKelly/hypergrib/discussions/17 85 | 86 | #### Schedule the network IO to balance several different objectives: 87 | - Keep a few hundred network request in-flight at any given moment (user configurable). (Why? Because the [AnyBlob paper](https://www.vldb.org/pvldb/vol16/p2769-durner.pdf) suggests that is what's required to achieve max throughput). 88 | - Consolidate nearby byterange requests (user configurable) to minimise overhead, and reduce the total number of IO operations. 89 | 90 | #### Slice _into_ each GRIB message 91 | For example, some GRIBs are compressed in JPEG2000, and JPEG2000 allows _parts_ of the image to be decompressed. (But would we still have to _download_ the entire GRIB message, and the only benefit would be a small reduction in decompression time?) 92 | 93 | And maybe we could decompress each GRIB file and save the state of the decompressor every, say, 4 kB. Then, at query time, if we want a single pixel then we'd have to stream at most 4 kB of data from disk. Although that has its own issues.). 94 | 95 | But, to get a real speed up, we'd want to only _read_ a subset of each GRIB message. And GRIB data is probably stored as a sequence of horizontal scan lines. So, for example, if you wanted to read a single consecutive byte range for just the United Kingdom from a global NWP then the best you can do might be to read all the horizontal scan lines that include the UK. So you'd end up with a short but very wide slice that includes. But that's still a significant speedup, so might be worth pursuing. 96 | 97 | #### Get hypergrib working for as many NWPs as possible 98 | See [Issue #30](https://github.com/JackKelly/hypergrib/issues/30). 99 | 100 | #### Implement existing protocols 101 | See [Issue #19](https://github.com/JackKelly/hypergrib/issues/19). 102 | 103 | #### Distribute `hypergrib`'s workload across multiple machines 104 | So, for example, users can get acceptable IO performance even if they ask for "churro-shaped" data arrays. 105 | 106 | ## If it's too slow to get `.idx` files: 107 | 108 | - For small GRIB files, just read the entirety of each GRIB file? 109 | - Store `.idx` files locally? 110 | - Convert `.idx` files to a more concise and cloud-friendly file format, which is published in a cloud bucket? 111 | - Put all the `.idx` data into a cloud-side database? 112 | - Put all the `.idx` data into a local database? DuckDB? 113 | - We probably want to avoid using a manifest file, or putting metadata for every GRIB message into a database, because we want to scale to datasets with _trillions_ of GRIB messages. See https://github.com/JackKelly/hypergrib/discussions/14 114 | 115 | # A file structure for describing NWP datasets 116 | 117 | Hand written YAML per dataset: 118 | 119 | `datasets/gefs/index.yaml`: See https://github.com/JackKelly/explore_nwps/blob/main/metadata/gefs/index.yaml 120 | 121 | 122 | Output by Python scripts: 123 | 124 | `datasets/gefs/parameters.yaml`: 125 | ```yaml 126 | - desc: Temperature 127 | abbr: TMP 128 | unit: K 129 | max: 373 130 | min: 173 131 | data_type: