From 6175139b50554aa021391a3f3dbff9356eb8cc37 Mon Sep 17 00:00:00 2001 From: mo-jonasganderton Date: Thu, 6 Mar 2025 16:35:30 +0000 Subject: [PATCH 1/6] Enable use for regional grids --- src/monio/Monio.cc | 20 +++++++++++++++++--- src/monio/Monio.h | 2 +- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/monio/Monio.cc b/src/monio/Monio.cc index 6929a7b..890747b 100644 --- a/src/monio/Monio.cc +++ b/src/monio/Monio.cc @@ -11,6 +11,7 @@ #include #include +#include "atlas/functionspace/StructuredColumns.h" #include "atlas/parallel/mpi/mpi.h" #include "oops/util/Duration.h" #include "oops/util/Logger.h" @@ -60,9 +61,22 @@ void monio::Monio::readState(atlas::FieldSet& localFieldSet, atlas::Field globalField = utilsatlas::getGlobalField(localField); if (mpiCommunicator_.rank() == mpiRankOwner_) { auto& functionSpace = globalField.functionspace(); - auto& grid = atlas::functionspace::NodeColumns(functionSpace).mesh().grid(); + + auto nc = atlas::functionspace::NodeColumns(functionSpace); + auto sc = atlas::functionspace::StructuredColumns(functionSpace); + + atlas::Grid grid; + if (nc) { + grid = nc.mesh().grid(); + } else if (sc) { + grid = sc.grid(); + } else { + utils::throwException("Monio::readState()> FunctionSpace not an accepted type. " + "Accepted types: NodeColumns, StructuredColumns"); + } + // Initialise file - int variableConvention = initialiseFile(grid.name(), filePath, true); + int variableConvention = initialiseFile(grid, filePath, true); // getFileData returns a copy of FileData (with required LFRic mesh data), so read data // is discarded when FileData goes out-of-scope for reading subsequent fields. FileData fileData = getFileData(grid.name()); @@ -390,7 +404,7 @@ monio::FileData monio::Monio::getFileData(const std::string& gridName) { return FileData(); // This function is called by all PEs. A return is essential. } -void monio::Monio::createLfricAtlasMap(FileData& fileData, const atlas::CubedSphereGrid& grid) { +void monio::Monio::createLfricAtlasMap(FileData& fileData, const atlas::Grid& grid) { oops::Log::trace() << "Monio::createLfricAtlasMap()" << std::endl; if (mpiCommunicator_.rank() == mpiRankOwner_) { if (fileData.getLfricAtlasMap().size() == 0) { diff --git a/src/monio/Monio.h b/src/monio/Monio.h index 3faef13..6ecb7c8 100644 --- a/src/monio/Monio.h +++ b/src/monio/Monio.h @@ -89,7 +89,7 @@ class Monio { FileData getFileData(const std::string& gridName); /// \brief Creates and stores a map between Atlas and LFRic horizontal ordering. - void createLfricAtlasMap(FileData& fileData, const atlas::CubedSphereGrid& grid); + void createLfricAtlasMap(FileData& fileData, const atlas::Grid& grid); /// \brief Creates and stores date-times from a state file. void createDateTimes(FileData& fileData, From 3d0158d99fea65ad8299953f7c780b36f67f4893 Mon Sep 17 00:00:00 2001 From: mo-jonasganderton Date: Thu, 6 Mar 2025 17:08:15 +0000 Subject: [PATCH 2/6] Move changes to util method --- src/monio/Monio.cc | 19 ++++--------------- src/monio/UtilsAtlas.cc | 13 +++++++++++++ src/monio/UtilsAtlas.h | 2 ++ 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/monio/Monio.cc b/src/monio/Monio.cc index 890747b..43636ed 100644 --- a/src/monio/Monio.cc +++ b/src/monio/Monio.cc @@ -62,18 +62,7 @@ void monio::Monio::readState(atlas::FieldSet& localFieldSet, if (mpiCommunicator_.rank() == mpiRankOwner_) { auto& functionSpace = globalField.functionspace(); - auto nc = atlas::functionspace::NodeColumns(functionSpace); - auto sc = atlas::functionspace::StructuredColumns(functionSpace); - - atlas::Grid grid; - if (nc) { - grid = nc.mesh().grid(); - } else if (sc) { - grid = sc.grid(); - } else { - utils::throwException("Monio::readState()> FunctionSpace not an accepted type. " - "Accepted types: NodeColumns, StructuredColumns"); - } + auto grid = utilsatlas::getGridFromFunctionSpace(functionSpace); // Initialise file int variableConvention = initialiseFile(grid, filePath, true); @@ -134,7 +123,7 @@ void monio::Monio::readIncrements(atlas::FieldSet& localFieldSet, atlas::Field globalField = utilsatlas::getGlobalField(localField); if (mpiCommunicator_.rank() == mpiRankOwner_) { auto& functionSpace = globalField.functionspace(); - auto& grid = atlas::functionspace::NodeColumns(functionSpace).mesh().grid(); + auto grid = utilsatlas::getGridFromFunctionSpace(functionSpace); // Initialise file int variableConvention = initialiseFile(grid.name(), filePath); @@ -186,7 +175,7 @@ void monio::Monio::writeIncrements(const atlas::FieldSet& localFieldSet, if (filePath.length() != 0) { try { auto& functionSpace = localFieldSet[0].functionspace(); - auto& grid = atlas::functionspace::NodeColumns(functionSpace).mesh().grid(); + auto grid = utilsatlas::getGridFromFunctionSpace(functionSpace); FileData fileData = getFileData(grid.name()); cleanFileData(fileData); // Remove metadata required for reading, but not for writing. if (isLfricConvention == false) { @@ -249,7 +238,7 @@ void monio::Monio::writeState(const atlas::FieldSet& localFieldSet, if (filePath.length() != 0) { try { auto& functionSpace = localFieldSet[0].functionspace(); - auto& grid = atlas::functionspace::NodeColumns(functionSpace).mesh().grid(); + auto grid = utilsatlas::getGridFromFunctionSpace(functionSpace); FileData fileData = getFileData(grid.name()); cleanFileData(fileData); // Remove metadata required for reading, but not for writing. if (isLfricConvention == false) { diff --git a/src/monio/UtilsAtlas.cc b/src/monio/UtilsAtlas.cc index cbe0395..2a784de 100644 --- a/src/monio/UtilsAtlas.cc +++ b/src/monio/UtilsAtlas.cc @@ -165,6 +165,19 @@ atlas::FieldSet getGlobalFieldSet(const atlas::FieldSet& fieldSet) { } } +atlas::Grid getGridFromFunctionSpace(const atlas::FunctionSpace& functionSpace) { + auto nc = atlas::functionspace::NodeColumns(functionSpace); + auto sc = atlas::functionspace::StructuredColumns(functionSpace); + if (nc) { + return nc.mesh().grid(); + } else if (sc) { + return sc.grid(); + } else { + utils::throwException("Monio::readState()> FunctionSpace not an accepted type. " + "Accepted types: NodeColumns, StructuredColumns"); + } +} + atlas::idx_t getHorizontalSize(const atlas::Field& field) { atlas::Field ghostField = field.functionspace().ghost(); atlas::idx_t size = 0; diff --git a/src/monio/UtilsAtlas.h b/src/monio/UtilsAtlas.h index 128b0a1..fcd3866 100644 --- a/src/monio/UtilsAtlas.h +++ b/src/monio/UtilsAtlas.h @@ -43,6 +43,8 @@ namespace utilsatlas { atlas::Field getGlobalField(const atlas::Field& field); + atlas::Grid getGridFromFunctionSpace(const atlas::FunctionSpace& functionSpace); + atlas::idx_t getHorizontalSize(const atlas::Field& field); // Just 2D size. Any field. atlas::idx_t getGlobalDataSize(const atlas::Field& field); // Full 3D size of global field. From 80a424ddbe4597fcc207a39ffd01ac9939032508 Mon Sep 17 00:00:00 2001 From: mo-jonasganderton Date: Thu, 6 Mar 2025 17:13:21 +0000 Subject: [PATCH 3/6] Remove blank line --- src/monio/Monio.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/monio/Monio.cc b/src/monio/Monio.cc index 43636ed..f0d72d3 100644 --- a/src/monio/Monio.cc +++ b/src/monio/Monio.cc @@ -61,7 +61,6 @@ void monio::Monio::readState(atlas::FieldSet& localFieldSet, atlas::Field globalField = utilsatlas::getGlobalField(localField); if (mpiCommunicator_.rank() == mpiRankOwner_) { auto& functionSpace = globalField.functionspace(); - auto grid = utilsatlas::getGridFromFunctionSpace(functionSpace); // Initialise file From 76f2f7739fe8e18af281a83968760fca593a3547 Mon Sep 17 00:00:00 2001 From: mo-jonasganderton Date: Thu, 6 Mar 2025 17:15:33 +0000 Subject: [PATCH 4/6] Remove blank line --- src/monio/Monio.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/monio/Monio.cc b/src/monio/Monio.cc index f0d72d3..c559cc8 100644 --- a/src/monio/Monio.cc +++ b/src/monio/Monio.cc @@ -62,7 +62,6 @@ void monio::Monio::readState(atlas::FieldSet& localFieldSet, if (mpiCommunicator_.rank() == mpiRankOwner_) { auto& functionSpace = globalField.functionspace(); auto grid = utilsatlas::getGridFromFunctionSpace(functionSpace); - // Initialise file int variableConvention = initialiseFile(grid, filePath, true); // getFileData returns a copy of FileData (with required LFRic mesh data), so read data From 5402fedf48d3b1d19a35af9bcec92bb8687266ce Mon Sep 17 00:00:00 2001 From: mo-jonasganderton Date: Thu, 6 Mar 2025 17:17:47 +0000 Subject: [PATCH 5/6] Pass grid rather than name --- src/monio/Monio.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monio/Monio.cc b/src/monio/Monio.cc index c559cc8..ad11adf 100644 --- a/src/monio/Monio.cc +++ b/src/monio/Monio.cc @@ -124,7 +124,7 @@ void monio::Monio::readIncrements(atlas::FieldSet& localFieldSet, auto grid = utilsatlas::getGridFromFunctionSpace(functionSpace); // Initialise file - int variableConvention = initialiseFile(grid.name(), filePath); + int variableConvention = initialiseFile(grid, filePath); // getFileData returns a copy of FileData (with required LFRic mesh data), so read data // is discarded when FileData goes out-of-scope for reading subsequent fields. FileData fileData = getFileData(grid.name()); From fb6ff57dcfde86c7bd94e98e2e24b62f796929d3 Mon Sep 17 00:00:00 2001 From: Jonas Ganderton Date: Mon, 24 Mar 2025 14:56:35 +0000 Subject: [PATCH 6/6] Remove unnecessary include Co-authored-by: Josh Colclough <109143205+mo-joshuacolclough@users.noreply.github.com> --- src/monio/Monio.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/monio/Monio.cc b/src/monio/Monio.cc index ad11adf..8d3729a 100644 --- a/src/monio/Monio.cc +++ b/src/monio/Monio.cc @@ -11,7 +11,6 @@ #include #include -#include "atlas/functionspace/StructuredColumns.h" #include "atlas/parallel/mpi/mpi.h" #include "oops/util/Duration.h" #include "oops/util/Logger.h"