From c3312ee83774e72fa74f3b09baece9c54c7306e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Domokos=20S=C3=A1rm=C3=A1ny?= Date: Tue, 16 Jul 2024 15:17:07 +0100 Subject: [PATCH 1/4] Set type of generating process for control forecast --- src/multio/action/encode/GribEncoder.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/multio/action/encode/GribEncoder.cc b/src/multio/action/encode/GribEncoder.cc index b7a0b1be1..6874fbbe5 100644 --- a/src/multio/action/encode/GribEncoder.cc +++ b/src/multio/action/encode/GribEncoder.cc @@ -65,8 +65,8 @@ const std::map type_of_statistical_processing{ const std::map category_to_levtype{ {"ocean-grid-coordinate", "oceanSurface"}, {"ocean-2d", "oceanSurface"}, {"ocean-3d", "oceanModelLevel"}}; -const std::map type_of_generating_process{ - {"an", 0}, {"4v", 0}, {"fc", 2}, {"pf", 4}, {"tpa", 12}}; +const std::map type_of_generating_process{{"an", 0}, {"4v", 0}, {"fc", 2}, + {"cf", 4}, {"pf", 4}, {"tpa", 12}}; const std::unordered_set types_with_time_reference_offset{"fc", "fcmean", "cf", "pf", "4v"}; From 737adfeab6f3a5a9b8c77296ccb56b1b56ef22ab Mon Sep 17 00:00:00 2001 From: Razvan Aguridan Date: Mon, 15 Jul 2024 07:17:39 +0000 Subject: [PATCH 2/4] Set model, resolution and generation for EERIE --- src/multio/action/encode/GribEncoder.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/multio/action/encode/GribEncoder.cc b/src/multio/action/encode/GribEncoder.cc index 6874fbbe5..df88969fc 100644 --- a/src/multio/action/encode/GribEncoder.cc +++ b/src/multio/action/encode/GribEncoder.cc @@ -408,6 +408,9 @@ QueriedMarsKeys setMarsKeys(GribEncoder& g, const eckit::Configuration& md) { withFirstOf(valueSetter(g, "activity"), LookUpString(md, "activity")); withFirstOf(valueSetter(g, "experiment"), LookUpString(md, "experiment")); withFirstOf(valueSetter(g, "realization"), LookUpString(md, "realization")); + withFirstOf(valueSetter(g, "generation"), LookUpString(md, "generation")); + withFirstOf(valueSetter(g, "model"), LookUpString(md, "model")); + withFirstOf(valueSetter(g, "resolution"), LookUpString(md, "resolution")); if (paramId && ((*paramId == "260199") || (*paramId == "260360") || (*paramId == "262024"))) { withFirstOf(valueSetter(g, "typeOfFirstFixedSurface"), From 37b60dde41a739d5ce61da34c9d75758445eb7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Domokos=20S=C3=A1rm=C3=A1ny?= Date: Wed, 17 Jul 2024 16:54:33 +0100 Subject: [PATCH 3/4] MUL-131: Set additional keys for ensemble ocean output --- src/multio/action/encode/GribEncoder.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/multio/action/encode/GribEncoder.cc b/src/multio/action/encode/GribEncoder.cc index df88969fc..2840fbccd 100644 --- a/src/multio/action/encode/GribEncoder.cc +++ b/src/multio/action/encode/GribEncoder.cc @@ -450,6 +450,14 @@ QueriedMarsKeys setMarsKeys(GribEncoder& g, const eckit::Configuration& md) { withFirstOf(valueSetter(g, "lengthOf4DvarWindow"), LookUpLong(md, "lengthOf4DvarWindow"), LookUpLong(md, "anlength")); + // Metadata for ensemble forecast + withFirstOf(valueSetter(g, "oceanAtmosphereCoupling"), LookUpLong(md, "oceanAtmosphereCoupling")); + withFirstOf(valueSetter(g, "legBaseDate"), LookUpLong(md, "legBaseDate")); + withFirstOf(valueSetter(g, "legBaseTime"), LookUpLong(md, "legBaseTime")); + withFirstOf(valueSetter(g, "legNumber"), LookUpLong(md, "legNumber")); + withFirstOf(valueSetter(g, "referenceDate"), LookUpLong(md, "referenceDate")); + withFirstOf(valueSetter(g, "climateDateFrom"), LookUpLong(md, "climateDateFrom")); + withFirstOf(valueSetter(g, "climateDateTo"), LookUpLong(md, "climateDateTo")); withFirstOf(valueSetter(g, "componentIndex"), LookUpLong(md, "componentIndex")); withFirstOf(valueSetter(g, "numberOfComponents"), LookUpLong(md, "numberOfComponents")); From 51816f294834791a8e17998c91b879911d651408 Mon Sep 17 00:00:00 2001 From: Razvan Aguridan Date: Tue, 16 Jul 2024 14:46:53 +0000 Subject: [PATCH 4/4] MUL-132: Populate the (e)ORCA UID cache without reading the grids --- src/multio/action/encode/GridDownloader.cc | 27 ++++++++++++++++++---- src/multio/action/encode/GridDownloader.h | 2 ++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/multio/action/encode/GridDownloader.cc b/src/multio/action/encode/GridDownloader.cc index cfed5dcd6..e92d31b01 100644 --- a/src/multio/action/encode/GridDownloader.cc +++ b/src/multio/action/encode/GridDownloader.cc @@ -12,6 +12,7 @@ #include "GribEncoder.h" +#include "atlas/grid/SpecRegistry.h" #include "atlas/grid/Grid.h" #include "atlas/grid/Iterator.h" #include "atlas/library.h" @@ -79,6 +80,10 @@ AtlasInstance& AtlasInstance::instance() { GridDownloader::GridDownloader(const config::ComponentConfiguration& compConf) : encoder_(createEncoder(compConf)), templateMetadata_(), gridCoordinatesCache_(), gridUIDCache_() { + ScopedAtlasInstance scopedAtlasInstance; + + populateUIDCache(compConf); + if (encoder_ != nullptr) { initTemplateMetadata(); @@ -109,6 +114,23 @@ std::optional GridDownloader::getGridCoords(const GridDownloade return GridCoordinates{encodedLat, encodedLon}; } +void GridDownloader::populateUIDCache(const config::ComponentConfiguration& compConf) { + if (compConf.parsedConfig().has("unstructured-grid-type")) { + atlas::mpi::Scope mpi_scope("self"); + + const auto baseGridName = compConf.parsedConfig().getString("unstructured-grid-type"); + for (auto const& unstructuredGridSubtype : {"T", "U", "V", "W", "F"}) { + const auto completeGridName = baseGridName + "_" + unstructuredGridSubtype; + + const auto gridSpec = atlas::grid::SpecRegistry::get(completeGridName); + const auto gridUID = gridSpec.getString("uid"); + + gridUIDCache_.emplace(std::piecewise_construct, std::tuple(std::string(unstructuredGridSubtype) + " grid"), + std::tuple(gridUID)); + } + } +} + void GridDownloader::initTemplateMetadata() { templateMetadata_.set("step", 0); templateMetadata_.set("typeOfLevel", "oceanSurface"); @@ -133,8 +155,6 @@ multio::message::Metadata GridDownloader::createMetadataFromCoordsData(size_t gr } void GridDownloader::downloadOrcaGridCoordinates(const config::ComponentConfiguration& compConf) { - ScopedAtlasInstance scopedAtlasInstance; - const auto baseGridName = compConf.parsedConfig().getString("unstructured-grid-type"); for (auto const& unstructuredGridSubtype : {"T", "U", "V", "W", "F"}) { const auto completeGridName = baseGridName + "_" + unstructuredGridSubtype; @@ -147,9 +167,6 @@ void GridDownloader::downloadOrcaGridCoordinates(const config::ComponentConfigur const auto gridUID = grid.uid(); - gridUIDCache_.emplace(std::piecewise_construct, std::tuple(std::string(unstructuredGridSubtype) + " grid"), - std::tuple(gridUID)); - if (encoder_ != nullptr) { const auto gridSize = grid.size(); diff --git a/src/multio/action/encode/GridDownloader.h b/src/multio/action/encode/GridDownloader.h index b7c8f46b9..89a5c56b2 100644 --- a/src/multio/action/encode/GridDownloader.h +++ b/src/multio/action/encode/GridDownloader.h @@ -76,6 +76,8 @@ class GridDownloader : eckit::NonCopyable { using GridCoordinateCache = std::unordered_map; using GridUIDCache = std::unordered_map; + void populateUIDCache(const config::ComponentConfiguration& compConf); + void initTemplateMetadata(); multio::message::Metadata createMetadataFromCoordsData(size_t gridSize, const std::string& unstructuredGridSubtype, const std::string& gridUID, int paramId);