diff --git a/src/metkit/mars2grib/backend/concepts/level/levelEncoding.h b/src/metkit/mars2grib/backend/concepts/level/levelEncoding.h index 3d004351..b06b4427 100644 --- a/src/metkit/mars2grib/backend/concepts/level/levelEncoding.h +++ b/src/metkit/mars2grib/backend/concepts/level/levelEncoding.h @@ -107,7 +107,7 @@ constexpr bool needLevel() { Variant == LevelType::Hybrid || Variant == LevelType::IsobaricInHpa || Variant == LevelType::IsobaricInPa || Variant == LevelType::Isothermal || Variant == LevelType::PotentialVorticity || Variant == LevelType::Theta || - Variant == LevelType::OceanModel) { + Variant == LevelType::OceanModel || Variant == LevelType::FlightLevel) { return true; } else { diff --git a/src/metkit/mars2grib/backend/concepts/level/levelEnum.h b/src/metkit/mars2grib/backend/concepts/level/levelEnum.h index c88dc368..a0e54403 100644 --- a/src/metkit/mars2grib/backend/concepts/level/levelEnum.h +++ b/src/metkit/mars2grib/backend/concepts/level/levelEnum.h @@ -129,6 +129,7 @@ enum class LevelType : std::size_t { HeightAboveSeaAt2M, HeightAboveGroundAt10M, HeightAboveGroundAt2M, + FlightLevel, Default }; @@ -145,20 +146,19 @@ enum class LevelType : std::size_t { /// The order of this list must match the intended iteration order /// for registry construction and diagnostics. /// -using LevelList = - ValueList; +using LevelList = ValueList< + LevelType::Surface, LevelType::EntireAtmosphere, LevelType::EntireLake, LevelType::CloudBase, LevelType::Tropopause, + LevelType::NominalTop, LevelType::MostUnstableParcel, LevelType::MixedLayerParcel, LevelType::Isothermal, + LevelType::IsobaricInPa, LevelType::IsobaricInHpa, LevelType::LowCloudLayer, LevelType::MediumCloudLayer, + LevelType::HighCloudLayer, LevelType::MeanSea, LevelType::HeightAboveSea, LevelType::HeightAboveGround, + LevelType::Hybrid, LevelType::Theta, LevelType::PotentialVorticity, LevelType::SnowLayer, LevelType::SoilLayer, + LevelType::SeaIceLayer, LevelType::OceanSurface, LevelType::DepthBelowSeaLayer, LevelType::OceanSurfaceToBottom, + LevelType::LakeBottom, LevelType::MixingLayer, LevelType::OceanModel, LevelType::OceanModelLayer, + LevelType::MixedLayerDepthByDensity, LevelType::MixedLayerDepthByTemperature, LevelType::SnowLayerOverIceOnWater, + LevelType::IceTopOnWater, LevelType::IceLayerOnWater, LevelType::EntireMeltPond, + LevelType::WaterSurfaceToIsothermalOceanLayer, LevelType::AbstractSingleLevel, LevelType::AbstractMultipleLevel, + LevelType::HeightAboveSeaAt10M, LevelType::HeightAboveSeaAt2M, LevelType::HeightAboveGroundAt10M, + LevelType::HeightAboveGroundAt2M, LevelType::FlightLevel, LevelType::Default>; /// @@ -231,6 +231,7 @@ DEF(LevelType::HeightAboveSeaAt10M, "heightAboveSeaAt10m"); DEF(LevelType::HeightAboveSeaAt2M, "heightAboveSeaAt2m"); DEF(LevelType::HeightAboveGroundAt10M, "heightAboveGroundAt10m"); DEF(LevelType::HeightAboveGroundAt2M, "heightAboveGroundAt2m"); +DEF(LevelType::FlightLevel, "flightLevel"); DEF(LevelType::Default, "default"); #undef DEF diff --git a/src/metkit/mars2grib/backend/concepts/level/levelMatcher.h b/src/metkit/mars2grib/backend/concepts/level/levelMatcher.h index 3d23158c..83b563c4 100644 --- a/src/metkit/mars2grib/backend/concepts/level/levelMatcher.h +++ b/src/metkit/mars2grib/backend/concepts/level/levelMatcher.h @@ -189,6 +189,18 @@ inline std::size_t matchPL(const long param, const long level) { "No mapping exists for param \"" + std::to_string(param) + "\" on levtype PL", Here()); } +inline std::size_t matchFL(const long param) { + using metkit::mars2grib::util::param_matcher::matchAny; + using metkit::mars2grib::util::param_matcher::range; + + if (matchAny(param, 260290)) { + return static_cast(LevelType::FlightLevel); + } + + throw utils::exceptions::Mars2GribMatcherException( + "No mapping exists for param \"" + std::to_string(param) + "\" on levtype FL", Here()); +} + inline std::size_t matchPT(const long param) { using metkit::mars2grib::util::param_matcher::matchAny; using metkit::mars2grib::util::param_matcher::range; @@ -332,6 +344,9 @@ std::size_t levelMatcher(const MarsDict_t& mars, const OptDict_t& opt) { const auto level = get_or_throw(mars, "levelist"); return impl::matchPL(param, level); } + if (levtype == "fl") { + return impl::matchFL(param); + } if (levtype == "pt") { return impl::matchPT(param); } diff --git a/src/metkit/mars2grib/backend/deductions/significanceOfReferenceTime.h b/src/metkit/mars2grib/backend/deductions/significanceOfReferenceTime.h index ecbf50c2..8ef181e7 100644 --- a/src/metkit/mars2grib/backend/deductions/significanceOfReferenceTime.h +++ b/src/metkit/mars2grib/backend/deductions/significanceOfReferenceTime.h @@ -118,10 +118,10 @@ tables::SignificanceOfReferenceTime resolve_SignificanceOfReferenceTime_or_throw constexpr std::array analysisTypes = { {"an", "ia", "oi", "3v", "3g", "4g", "ea", "pa", "tpa", "ga", "gai", "ai", "af", "ab", "oai", "ga", "gai"}}; - constexpr std::array forecastTypes = { - {"fc", "cf", "pf", "cm", "fp", "em", "ep", "es", "fa", "efi", "efic", - "bf", "cd", "wem", "wes", "cr", "ses", "taem", "taes", "sg", "sf", "if", - "fcmean", "fcmax", "fcmin", "fcstdev", "ssd", "tf", "bf", "cd", "hcmean", "s3", "si"}}; + constexpr std::array forecastTypes = { + {"fc", "cf", "pf", "cm", "fp", "em", "ep", "es", "fa", "efi", "efic", "bf", + "cd", "wem", "wes", "cr", "ses", "taem", "taes", "sg", "sf", "if", "fcmean", "fcmax", + "fcmin", "fcstdev", "ssd", "tf", "bf", "cd", "hcmean", "s3", "si", "gbf", "gwt"}}; constexpr std::array startOfDataAssimilationTypes = {{"4i", "4v", "me", "eme"}};