diff --git a/core/src/ModelArray.cpp b/core/src/ModelArray.cpp index ac2b8eb47..c480df0b9 100644 --- a/core/src/ModelArray.cpp +++ b/core/src/ModelArray.cpp @@ -191,12 +191,24 @@ void ModelArray::setData(const DataType& from) { m_data = from; } // setData(fro void ModelArray::setData(const ModelArray& from) { setData(from.m_data.data()); } -void ModelArray::setDimensions(Type type, const MultiDim& newDims) +#ifdef USE_MPI +void ModelArray::setDimensions(Type type, const MultiDim& globalDims, const MultiDim& localDims) { std::vector& dimSpecs = typeDimensions.at(type); for (size_t i = 0; i < dimSpecs.size(); ++i) { - definedDimensions.at(dimSpecs[i]).localLength = newDims[i]; + definedDimensions.at(dimSpecs[i]).globalLength = globalDims[i]; + definedDimensions.at(dimSpecs[i]).localLength = localDims[i]; } +#else +void ModelArray::setDimensions(Type type, const MultiDim& globalDims) +{ + std::vector& dimSpecs = typeDimensions.at(type); + for (size_t i = 0; i < dimSpecs.size(); ++i) { + // for serial code (non-MPI) global and local dims are the same. + definedDimensions.at(dimSpecs[i]).globalLength = globalDims[i]; + definedDimensions.at(dimSpecs[i]).localLength = globalDims[i]; + } +#endif validateMaps(); } diff --git a/core/src/ParaGridIO.cpp b/core/src/ParaGridIO.cpp index a0383daf9..4db13f7be 100644 --- a/core/src/ParaGridIO.cpp +++ b/core/src/ParaGridIO.cpp @@ -318,7 +318,7 @@ void ParaGridIO::dumpModelState(const ModelState& state, const std::string& file for (auto entry : ModelArray::definedDimensions) { ModelArray::Dimension dim = entry.first; size_t dimSz = (dimCompMap.count(dim)) ? ModelArray::nComponents(dimCompMap.at(dim)) - : dimSz = entry.second.localLength; + : dimSz = entry.second.globalLength; ncFromMAMap[dim] = ncFile.addDim(entry.second.name, dimSz); // TODO Do I need to add data, even if it is just integers 0...n-1? } diff --git a/core/src/RectGridIO.cpp b/core/src/RectGridIO.cpp index 28bdaa47d..9eeeb7475 100644 --- a/core/src/RectGridIO.cpp +++ b/core/src/RectGridIO.cpp @@ -35,18 +35,16 @@ void dimensionSetter( const netCDF::NcFile& ncFile, const std::string& fieldName, ModelArray::Type type) { size_t nDims = ncFile.getVar(fieldName).getDimCount(); - ModelArray::MultiDim dims; - dims.resize(nDims); - for (size_t d = 0; d < nDims; ++d) { - dims[d] = ncFile.getVar(fieldName).getDim(d).getSize(); - } - // The dimensions in the netCDF are in the reverse order compared to ModelArray - std::reverse(dims.begin(), dims.end()); - // Replace X, Y dimensions with local extends + ModelArray::MultiDim globalDims; + ModelArray::MultiDim localDims; + globalDims.resize(nDims); + localDims.resize(nDims); auto& metadata = ModelMetadata::getInstance(); - dims[0] = metadata.getLocalExtentX(); - dims[1] = metadata.getLocalExtentY(); - ModelArray::setDimensions(type, dims); + globalDims[0] = metadata.getGlobalExtentX(); + globalDims[1] = metadata.getGlobalExtentY(); + localDims[0] = metadata.getLocalExtentX(); + localDims[1] = metadata.getLocalExtentY(); + ModelArray::setDimensions(type, globalDims, localDims); } #else void dimensionSetter( @@ -77,10 +75,6 @@ ModelState RectGridIO::getModelState(const std::string& filePath) // Get the sizes of the three types of field // HField from hice dimensionSetter(ncFile, hiceName, ModelArray::Type::H); - // UField from hice - dimensionSetter(ncFile, hiceName, ModelArray::Type::U); - // VField from hice - dimensionSetter(ncFile, hiceName, ModelArray::Type::V); #ifdef USE_MPI // Set the origins and extensions for reading 2D data based diff --git a/core/src/include/ModelArray.hpp b/core/src/include/ModelArray.hpp index 5e6d41b50..b54fb0b9a 100644 --- a/core/src/include/ModelArray.hpp +++ b/core/src/include/ModelArray.hpp @@ -330,7 +330,12 @@ class ModelArray { * @param type The type of array the dimensions are to be specified for. * @param dim The per-dimension size to be set. */ +#ifdef USE_MPI + static void setDimensions(Type, const MultiDim&, const MultiDim&); +#else static void setDimensions(Type, const MultiDim&); +#endif + /*! * @brief Sets the number and size of the dimensions of this type of ModelArray. * @@ -340,9 +345,17 @@ class ModelArray { * * @param dim The per-dimension size to be set. */ - void setDimensions(const MultiDim& dims) +#ifdef USE_MPI + void setDimensions(const MultiDim& globalDims, const MultiDim& localDims) +#else + void setDimensions(const MultiDim& globalDims) +#endif { - setDimensions(type, dims); +#ifdef USE_MPI + setDimensions(type, globalDims, localDims); +#else + setDimensions(type, globalDims); +#endif resize(); } diff --git a/core/src/modules/DynamicsModule/BBMDynamics.cpp b/core/src/modules/DynamicsModule/BBMDynamics.cpp index 9ab998793..8aa5ebefd 100644 --- a/core/src/modules/DynamicsModule/BBMDynamics.cpp +++ b/core/src/modules/DynamicsModule/BBMDynamics.cpp @@ -4,6 +4,8 @@ */ #include "include/BBMDynamics.hpp" +#include "include/ModelArray.hpp" +#include "include/ModelMetadata.hpp" #include "include/constants.hpp" #include "include/gridNames.hpp" @@ -112,17 +114,27 @@ void BBMDynamics::setData(const ModelState::DataMap& ms) if (uice.getType() == ModelArray::Type::CG && uice.dimensions()[0] != cgDims[0]) { // CG degree of the read data const unsigned int fileCGdegree = (ModelArray::dimensions(ModelArray::Type::CG)[0] - 1) - / ModelArray::dimensions(ModelArray::Type::H)[0]; - const unsigned int modelCGdegree = (cgDims[0] - 1) - / ModelArray::dimensions(ModelArray::Type::H)[0]; + / ModelArray::dimensions(ModelArray::Type::H)[0]; + const unsigned int modelCGdegree + = (cgDims[0] - 1) / ModelArray::dimensions(ModelArray::Type::H)[0]; throw std::runtime_error( - "Differing CG degrees between input data and model are not supported. File CG degree = " - + std::to_string(fileCGdegree) + ", model CG degree = " - + std::to_string(modelCGdegree) + "."); + "Differing CG degrees between input data and model are not supported. File CG degree = " + + std::to_string(fileCGdegree) + ", model CG degree = " + std::to_string(modelCGdegree) + + "."); } // Set the dimensions of CG arrays +#ifdef USE_MPI + auto& metadata = ModelMetadata::getInstance(); + ModelArray::MultiDim globalDims, localDims; + globalDims[0] = metadata.getGlobalExtentX(); + globalDims[1] = metadata.getGlobalExtentY(); + localDims[0] = metadata.getLocalExtentX(); + localDims[1] = metadata.getLocalExtentY(); + ModelArray::setDimensions(ModelArray::Type::CG, globalDims, localDims); +#else ModelArray::setDimensions(ModelArray::Type::CG, cgDims); +#endif // Set the data in the kernel arrays. // Required data @@ -194,10 +206,11 @@ void BBMDynamics::advectField( ModelState BBMDynamics::getStatePrognostic() const { return { { - { uName, kernel.getCGData(uName) }, - { vName, kernel.getCGData(vName) }, - { damageName, damage }, - }, { getConfiguration() } }; + { uName, kernel.getCGData(uName) }, + { vName, kernel.getCGData(vName) }, + { damageName, damage }, + }, + { getConfiguration() } }; } BBMDynamics::HelpMap& BBMDynamics::getHelpText(HelpMap& map, bool getAll) diff --git a/core/src/modules/DynamicsModule/MEVPDynamics.cpp b/core/src/modules/DynamicsModule/MEVPDynamics.cpp index 53677611b..4e3afb2bd 100644 --- a/core/src/modules/DynamicsModule/MEVPDynamics.cpp +++ b/core/src/modules/DynamicsModule/MEVPDynamics.cpp @@ -5,6 +5,8 @@ */ #include "include/MEVPDynamics.hpp" +#include "include/ModelArray.hpp" +#include "include/ModelMetadata.hpp" #include "include/constants.hpp" #include "include/gridNames.hpp" @@ -98,17 +100,27 @@ void MEVPDynamics::setData(const ModelState::DataMap& ms) if (uice.getType() == ModelArray::Type::CG && uice.dimensions()[0] != cgDims[0]) { // CG degree of the read data const unsigned int fileCGdegree = (ModelArray::dimensions(ModelArray::Type::CG)[0] - 1) - / ModelArray::dimensions(ModelArray::Type::H)[0]; - const unsigned int modelCGdegree = (cgDims[0] - 1) - / ModelArray::dimensions(ModelArray::Type::H)[0]; + / ModelArray::dimensions(ModelArray::Type::H)[0]; + const unsigned int modelCGdegree + = (cgDims[0] - 1) / ModelArray::dimensions(ModelArray::Type::H)[0]; throw std::runtime_error( - "Differing CG degrees between input data and model are not supported. File CG degree = " - + std::to_string(fileCGdegree) + ", model CG degree = " - + std::to_string(modelCGdegree) + "."); + "Differing CG degrees between input data and model are not supported. File CG degree = " + + std::to_string(fileCGdegree) + ", model CG degree = " + std::to_string(modelCGdegree) + + "."); } // Set the dimensions of CG arrays +#ifdef USE_MPI + auto& metadata = ModelMetadata::getInstance(); + ModelArray::MultiDim globalDims, localDims; + globalDims[0] = metadata.getGlobalExtentX(); + globalDims[1] = metadata.getGlobalExtentY(); + localDims[0] = metadata.getLocalExtentX(); + localDims[1] = metadata.getLocalExtentY(); + ModelArray::setDimensions(ModelArray::Type::CG, globalDims, localDims); +#else ModelArray::setDimensions(ModelArray::Type::CG, cgDims); +#endif // Set the data in the kernel arrays. for (const auto& fieldName : namedFields) { @@ -155,9 +167,10 @@ void MEVPDynamics::advectField( ModelState MEVPDynamics::getStatePrognostic() const { return { { - { uName, kernel.getCGData(uName) }, - { vName, kernel.getCGData(vName) }, - }, { getConfiguration() } }; + { uName, kernel.getCGData(uName) }, + { vName, kernel.getCGData(vName) }, + }, + { getConfiguration() } }; } MEVPDynamics::HelpMap& MEVPDynamics::getHelpText(HelpMap& map, bool getAll) diff --git a/core/test/RectGrid_test.cpp b/core/test/RectGrid_test.cpp index 377a353fe..29e6c6ebc 100644 --- a/core/test/RectGrid_test.cpp +++ b/core/test/RectGrid_test.cpp @@ -146,7 +146,11 @@ TEST_CASE("Write and read a ModelState-based RectGrid restart file") // Reset dimensions so it is possible to check if they // are read correctly from refeence file +#ifdef USE_MPI + ModelArray::setDimensions(ModelArray::Type::H, { 1, 1 }, { 1, 1 }); +#else ModelArray::setDimensions(ModelArray::Type::H, { 1, 1 }); +#endif REQUIRE(ModelArray::dimensions(ModelArray::Type::H)[0] == 1); RectangularGrid gridIn; size_t targetX = 1;