From b230a734d03100f67d8896f840ffe9eff95cd4d6 Mon Sep 17 00:00:00 2001 From: Tim Spain Date: Mon, 23 Jun 2025 19:42:48 +0200 Subject: [PATCH 01/11] Handle different ModelArray types in CGDynamicsKernel::ma2cg. --- dynamics/src/include/CGDynamicsKernel.hpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/dynamics/src/include/CGDynamicsKernel.hpp b/dynamics/src/include/CGDynamicsKernel.hpp index 61de16217..2a739876e 100644 --- a/dynamics/src/include/CGDynamicsKernel.hpp +++ b/dynamics/src/include/CGDynamicsKernel.hpp @@ -95,10 +95,19 @@ class CGDynamicsKernel : public DynamicsKernel { CGVector& ma2cg(const ModelArray& maData, CGVector& cgData) { - DGVector dgtmp(*smesh); - dgtmp.zero(); - DGModelArray::ma2dg(maData, dgtmp); - Nextsim::Interpolations::DG2CG(*smesh, cgData, dgtmp); + if (maData.getType() == ModelArray::Type::H) { + DGVector dgtmp(*smesh); + dgtmp.zero(); + DGModelArray::ma2dg(maData, dgtmp); + Nextsim::Interpolations::DG2CG(*smesh, cgData, dgtmp); + } else if (maData.getType() == ModelArray::Type::DG){ + dgtmp = DGVectorHolder(maData.data()); + Nextsim::Interpolations::DG2CG(*smesh, cgData, dgtmp); + } else if (maData.getType() == ModelArray::Type::CG) { + cgData = maData.data(); + } else { + throw std::runtime_error("CGDynamicsKernel::ma2cg: unhandled ModelArray type ", ModelArray::typeNames.at(maData.getType())); + } return cgData; } }; From 3a88d27b19e28352eac7b3e4b80b8eb75d481840 Mon Sep 17 00:00:00 2001 From: Tim Spain Date: Mon, 23 Jun 2025 22:03:28 +0200 Subject: [PATCH 02/11] Add the getCGData function. --- dynamics/src/CGDynamicsKernel.cpp | 13 +++++++++++++ dynamics/src/include/CGDynamicsKernel.hpp | 9 +++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/dynamics/src/CGDynamicsKernel.cpp b/dynamics/src/CGDynamicsKernel.cpp index b9fe73fde..6d8b314cf 100644 --- a/dynamics/src/CGDynamicsKernel.cpp +++ b/dynamics/src/CGDynamicsKernel.cpp @@ -109,6 +109,19 @@ ModelArray CGDynamicsKernel::getDG0Data(const std::string& name) co } } +template +ModelArray CGDynamicsKernel::getCGData(const std::string& name) const +{ + CGField madata(ModelArray::Type::CG); + madata.resize(); + if (name == uName) { + madata = u; + } else if (name == vName) { + madata = v; + } + return madata; +} + template void CGDynamicsKernel::prepareAdvection() { dgtransport->prepareAdvection(u, v); diff --git a/dynamics/src/include/CGDynamicsKernel.hpp b/dynamics/src/include/CGDynamicsKernel.hpp index 2a739876e..875beb83e 100644 --- a/dynamics/src/include/CGDynamicsKernel.hpp +++ b/dynamics/src/include/CGDynamicsKernel.hpp @@ -43,6 +43,7 @@ class CGDynamicsKernel : public DynamicsKernel { void setData(const std::string& name, const ModelArray& data) override; ModelArray getDG0Data(const std::string& name) const override; + ModelArray getCGData(const std::string& name) const; void computeGradientOfSeaSurfaceHeight(const DGVector<1>& seaSurfaceHeight); void prepareIteration(const DataMap& data) override; void projectVelocityToStrain() override; @@ -101,12 +102,12 @@ class CGDynamicsKernel : public DynamicsKernel { DGModelArray::ma2dg(maData, dgtmp); Nextsim::Interpolations::DG2CG(*smesh, cgData, dgtmp); } else if (maData.getType() == ModelArray::Type::DG){ - dgtmp = DGVectorHolder(maData.data()); - Nextsim::Interpolations::DG2CG(*smesh, cgData, dgtmp); + const DGVector& asdgv = reinterpret_cast&>(maData.data()); + Nextsim::Interpolations::DG2CG(*smesh, cgData, asdgv); } else if (maData.getType() == ModelArray::Type::CG) { - cgData = maData.data(); + cgData = maData.data().matrix(); } else { - throw std::runtime_error("CGDynamicsKernel::ma2cg: unhandled ModelArray type ", ModelArray::typeNames.at(maData.getType())); + throw std::runtime_error(std::string("CGDynamicsKernel::ma2cg: unhandled ModelArray type ") + ModelArray::typeNames.at(maData.getType())); } return cgData; } From d3092450652540b23b0b8f54c96b95e801575721 Mon Sep 17 00:00:00 2001 From: Tim Spain Date: Mon, 23 Jun 2025 22:04:19 +0200 Subject: [PATCH 03/11] Use getCGData to retrieve full CG ice velocity components. --- .../modules/DynamicsModule/BBMDynamics.cpp | 9 ++++++ .../modules/DynamicsModule/MEVPDynamics.cpp | 8 +++++ .../DynamicsModule/include/BBMDynamics.hpp | 2 ++ .../include/FreeDriftDynamics.hpp | 8 +++++ .../DynamicsModule/include/MEVPDynamics.hpp | 2 ++ core/src/modules/include/IDynamics.hpp | 32 +++++++++---------- 6 files changed, 44 insertions(+), 17 deletions(-) diff --git a/core/src/modules/DynamicsModule/BBMDynamics.cpp b/core/src/modules/DynamicsModule/BBMDynamics.cpp index bffeb7f4a..563b82fed 100644 --- a/core/src/modules/DynamicsModule/BBMDynamics.cpp +++ b/core/src/modules/DynamicsModule/BBMDynamics.cpp @@ -170,6 +170,15 @@ void BBMDynamics::advectField( kernel.advectField(timestep, field, lowerLimit, upperLimit); } +ModelState BBMDynamics::getStatePrognostic() const +{ + return { { + { uName, kernel.getCGData(uName) }, + { vName, kernel.getCGData(vName) }, + { damageName, damage }, + }, { getConfiguration() } }; +} + BBMDynamics::HelpMap& BBMDynamics::getHelpText(HelpMap& map, bool getAll) { map["BBMDynamics"] = { diff --git a/core/src/modules/DynamicsModule/MEVPDynamics.cpp b/core/src/modules/DynamicsModule/MEVPDynamics.cpp index 0d1455b00..763cc1489 100644 --- a/core/src/modules/DynamicsModule/MEVPDynamics.cpp +++ b/core/src/modules/DynamicsModule/MEVPDynamics.cpp @@ -131,6 +131,14 @@ void MEVPDynamics::advectField( kernel.advectField(timestep, field, lowerLimit, upperLimit); } +ModelState MEVPDynamics::getStatePrognostic() const +{ + return { { + { uName, kernel.getCGData(uName) }, + { vName, kernel.getCGData(vName) }, + }, { getConfiguration() } }; +} + MEVPDynamics::HelpMap& MEVPDynamics::getHelpText(HelpMap& map, bool getAll) { map["MEVPDynamics"] = { diff --git a/core/src/modules/DynamicsModule/include/BBMDynamics.hpp b/core/src/modules/DynamicsModule/include/BBMDynamics.hpp index a72705ea4..b840ca4d7 100644 --- a/core/src/modules/DynamicsModule/include/BBMDynamics.hpp +++ b/core/src/modules/DynamicsModule/include/BBMDynamics.hpp @@ -33,6 +33,8 @@ class BBMDynamics : public IDynamics, public Configured { void configure() override; ConfigMap getConfiguration() const override; + ModelState getStatePrognostic() const override; + enum { C_KEY, NU_KEY, diff --git a/core/src/modules/DynamicsModule/include/FreeDriftDynamics.hpp b/core/src/modules/DynamicsModule/include/FreeDriftDynamics.hpp index c1de4848a..023b227ed 100644 --- a/core/src/modules/DynamicsModule/include/FreeDriftDynamics.hpp +++ b/core/src/modules/DynamicsModule/include/FreeDriftDynamics.hpp @@ -83,6 +83,14 @@ class FreeDriftDynamics : public IDynamics { void prepareAdvection() override { kernel.prepareAdvection(); } + ModelState getStatePrognostic() const override + { + return { { + { uName, kernel.getCGData(uName) }, + { vName, kernel.getCGData(vName) }, + }, { getConfiguration() } }; + } + private: FreeDriftDynamicsKernel kernel; DynamicsParameters params; diff --git a/core/src/modules/DynamicsModule/include/MEVPDynamics.hpp b/core/src/modules/DynamicsModule/include/MEVPDynamics.hpp index fb77d0638..b1e9b51fb 100644 --- a/core/src/modules/DynamicsModule/include/MEVPDynamics.hpp +++ b/core/src/modules/DynamicsModule/include/MEVPDynamics.hpp @@ -40,6 +40,8 @@ class MEVPDynamics : public IDynamics, public Configured { void configure() override; ConfigMap getConfiguration() const override; + ModelState getStatePrognostic() const override; + enum { PSTAR_KEY, DELTA_KEY, diff --git a/core/src/modules/include/IDynamics.hpp b/core/src/modules/include/IDynamics.hpp index 2be8c7ffd..ecdc43c0e 100644 --- a/core/src/modules/include/IDynamics.hpp +++ b/core/src/modules/include/IDynamics.hpp @@ -49,29 +49,27 @@ class IDynamics : public ModelComponent { } virtual ~IDynamics() = default; - ModelState getStatePrognostic() const override - { - ModelState state = { { - { uName, uice }, - { vName, vice }, - }, - getConfiguration() }; - - if (m_usesDamage) { - ModelState::DataMap damageState = { { damageName, damage } }; - state.merge(damageState); - } - - return state; - } +// ModelState getStatePrognostic() const override +// { +// ModelState state = { { +// { uName, uice }, +// { vName, vice }, +// }, +// getConfiguration() }; +// +// if (m_usesDamage) { +// ModelState::DataMap damageState = { { damageName, damage } }; +// state.merge(damageState); +// } +// +// return state; +// } ModelState getStateDiagnostic() const override { ModelState state = { { { uIOStressName, taux }, { vIOStressName, tauy }, - { uName, uice }, - { vName, vice }, { shearName, shear }, { divergenceName, divergence }, { sigmaIName, sigmaI }, From 8ad8702f7faf7e2a42c9ed5542041c14dd3fecea Mon Sep 17 00:00:00 2001 From: Tim Spain Date: Mon, 23 Jun 2025 22:06:32 +0200 Subject: [PATCH 04/11] Remove commented out code. --- core/src/modules/include/IDynamics.hpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/core/src/modules/include/IDynamics.hpp b/core/src/modules/include/IDynamics.hpp index ecdc43c0e..baa4e9ce9 100644 --- a/core/src/modules/include/IDynamics.hpp +++ b/core/src/modules/include/IDynamics.hpp @@ -49,22 +49,6 @@ class IDynamics : public ModelComponent { } virtual ~IDynamics() = default; -// ModelState getStatePrognostic() const override -// { -// ModelState state = { { -// { uName, uice }, -// { vName, vice }, -// }, -// getConfiguration() }; -// -// if (m_usesDamage) { -// ModelState::DataMap damageState = { { damageName, damage } }; -// state.merge(damageState); -// } -// -// return state; -// } - ModelState getStateDiagnostic() const override { ModelState state = { { From 21049d043b961cef1e3e70bfc51c13c62e997950 Mon Sep 17 00:00:00 2001 From: Tim Spain Date: Mon, 23 Jun 2025 22:40:23 +0200 Subject: [PATCH 05/11] clang formatting --- dynamics/src/include/CGDynamicsKernel.hpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/dynamics/src/include/CGDynamicsKernel.hpp b/dynamics/src/include/CGDynamicsKernel.hpp index 875beb83e..1a08306bd 100644 --- a/dynamics/src/include/CGDynamicsKernel.hpp +++ b/dynamics/src/include/CGDynamicsKernel.hpp @@ -101,13 +101,16 @@ class CGDynamicsKernel : public DynamicsKernel { dgtmp.zero(); DGModelArray::ma2dg(maData, dgtmp); Nextsim::Interpolations::DG2CG(*smesh, cgData, dgtmp); - } else if (maData.getType() == ModelArray::Type::DG){ - const DGVector& asdgv = reinterpret_cast&>(maData.data()); + } else if (maData.getType() == ModelArray::Type::DG) { + const DGVector& asdgv + = reinterpret_cast&>(maData.data()); Nextsim::Interpolations::DG2CG(*smesh, cgData, asdgv); } else if (maData.getType() == ModelArray::Type::CG) { cgData = maData.data().matrix(); } else { - throw std::runtime_error(std::string("CGDynamicsKernel::ma2cg: unhandled ModelArray type ") + ModelArray::typeNames.at(maData.getType())); + throw std::runtime_error( + std::string("CGDynamicsKernel::ma2cg: unhandled ModelArray type ") + + ModelArray::typeNames.at(maData.getType())); } return cgData; } From 4262ce6234433a22602c97743775a185c4f56882 Mon Sep 17 00:00:00 2001 From: Tim Spain Date: Mon, 28 Jul 2025 12:25:37 +0200 Subject: [PATCH 06/11] Interpolate from DG0 to CG, if necessary. --- dynamics/src/include/CGModelArray.hpp | 20 +++++++++++++++++--- dynamics/test/CMakeLists.txt | 1 + 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/dynamics/src/include/CGModelArray.hpp b/dynamics/src/include/CGModelArray.hpp index 710113d5f..4d87c3344 100644 --- a/dynamics/src/include/CGModelArray.hpp +++ b/dynamics/src/include/CGModelArray.hpp @@ -16,9 +16,23 @@ class CGModelArray { public: template static CGVector& ma2cg(const ModelArray& ma, CGVector& cg) { - cg = ma.data().matrix(); - //! Interpolation of DG0 to CGVector - // Nextsim::Interpolations::DG2CG(smesh, cg, ma); + if (ma.getType() != ModelArray::Type::CG) { + /* + * Create a ParametricMesh with the correct x and y dimensions, the + * only members used by the Interpolations functions. Constructed + * with Cartesian coordinates, but the coordinate system is not used. + */ + ParametricMesh smesh(Nextsim::CARTESIAN); // The coordinate system is unimportant here + smesh.nx = ma.dimensions()[0]; + smesh.ny = ma.dimensions()[1]; + // Assume the data is compatible with a DG0 array + DGVector<1> asDG(smesh); + asDG = ma.data().matrix(); + Interpolations::DG2CG(smesh, cg, asDG); + } else { + // CG to CG. Assume the CG degrees are equal + cg = ma.data().matrix(); + } return cg; } diff --git a/dynamics/test/CMakeLists.txt b/dynamics/test/CMakeLists.txt index 7a3584fc2..b4eb1ee55 100644 --- a/dynamics/test/CMakeLists.txt +++ b/dynamics/test/CMakeLists.txt @@ -39,6 +39,7 @@ if(NOT ENABLE_MPI) "${CoreDir}/ModelArray.cpp" "${CoreDir}/ModelArraySlice.cpp" "${CoreDir}/${ModelArrayStructure}/ModelArrayDetails.cpp" + "${SRC_DIR}/Interpolations.cpp" ) target_include_directories( testCGModelArray From 97a2a894fe618974b685d3ed4cc68184f0490367 Mon Sep 17 00:00:00 2001 From: Tim Spain Date: Mon, 28 Jul 2025 12:27:06 +0200 Subject: [PATCH 07/11] Read CG ice velocity data. Set the CG dimensions from the dynamics. --- .../modules/DynamicsModule/BBMDynamics.cpp | 21 +++++++++++++++++++ .../modules/DynamicsModule/MEVPDynamics.cpp | 21 +++++++++++++++++++ dynamics/src/CGDynamicsKernel.cpp | 6 ++++++ dynamics/src/include/CGDynamicsKernel.hpp | 2 ++ 4 files changed, 50 insertions(+) diff --git a/core/src/modules/DynamicsModule/BBMDynamics.cpp b/core/src/modules/DynamicsModule/BBMDynamics.cpp index 563b82fed..9ab998793 100644 --- a/core/src/modules/DynamicsModule/BBMDynamics.cpp +++ b/core/src/modules/DynamicsModule/BBMDynamics.cpp @@ -103,6 +103,27 @@ void BBMDynamics::setData(const ModelState::DataMap& ms) uice = ms.at(uName); vice = ms.at(vName); + // Handle CG data field sizes + const ModelArray::MultiDim cgDims = kernel.getCGDimensions(); + /* If the u is Type::CG and the dimensions read from the restart file do + * not match those of the CG dynamics kernel, throw an exception. + * TODO: Support interpolation between different CG number of Gauss points. + */ + 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]; + + 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) + "."); + } + // Set the dimensions of CG arrays + ModelArray::setDimensions(ModelArray::Type::CG, cgDims); + // Set the data in the kernel arrays. // Required data for (const auto& fieldName : namedFields) { diff --git a/core/src/modules/DynamicsModule/MEVPDynamics.cpp b/core/src/modules/DynamicsModule/MEVPDynamics.cpp index 763cc1489..53677611b 100644 --- a/core/src/modules/DynamicsModule/MEVPDynamics.cpp +++ b/core/src/modules/DynamicsModule/MEVPDynamics.cpp @@ -89,6 +89,27 @@ void MEVPDynamics::setData(const ModelState::DataMap& ms) uice = ms.at(uName); vice = ms.at(vName); + // Handle CG data field sizes + const ModelArray::MultiDim cgDims = kernel.getCGDimensions(); + /* If the u is Type::CG and the dimensions read from the restart file do + * not match those of the CG dynamics kernel, throw an exception. + * TODO: Support interpolation between different CG number of Gauss points. + */ + 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]; + + 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) + "."); + } + // Set the dimensions of CG arrays + ModelArray::setDimensions(ModelArray::Type::CG, cgDims); + // Set the data in the kernel arrays. for (const auto& fieldName : namedFields) { kernel.setData(fieldName, ms.at(fieldName)); diff --git a/dynamics/src/CGDynamicsKernel.cpp b/dynamics/src/CGDynamicsKernel.cpp index 6d8b314cf..59af796e8 100644 --- a/dynamics/src/CGDynamicsKernel.cpp +++ b/dynamics/src/CGDynamicsKernel.cpp @@ -122,6 +122,12 @@ ModelArray CGDynamicsKernel::getCGData(const std::string& name) con return madata; } +template +const ModelArray::MultiDim CGDynamicsKernel::getCGDimensions() const +{ + return {CGdegree * smesh->nx +1, CGdegree * smesh->ny + 1}; +} + template void CGDynamicsKernel::prepareAdvection() { dgtransport->prepareAdvection(u, v); diff --git a/dynamics/src/include/CGDynamicsKernel.hpp b/dynamics/src/include/CGDynamicsKernel.hpp index 1a08306bd..b6b71a6ab 100644 --- a/dynamics/src/include/CGDynamicsKernel.hpp +++ b/dynamics/src/include/CGDynamicsKernel.hpp @@ -44,6 +44,8 @@ class CGDynamicsKernel : public DynamicsKernel { void setData(const std::string& name, const ModelArray& data) override; ModelArray getDG0Data(const std::string& name) const override; ModelArray getCGData(const std::string& name) const; + + const ModelArray::MultiDim getCGDimensions() const; void computeGradientOfSeaSurfaceHeight(const DGVector<1>& seaSurfaceHeight); void prepareIteration(const DataMap& data) override; void projectVelocityToStrain() override; From 90eb8de51dc265e1b8708bef91d84cb41407c88c Mon Sep 17 00:00:00 2001 From: Tim Spain Date: Mon, 28 Jul 2025 13:34:30 +0200 Subject: [PATCH 08/11] Use the correct length ofr dimensions (to get CG dimensions to work). --- core/src/ParaGridIO.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/ParaGridIO.cpp b/core/src/ParaGridIO.cpp index 1f08cf475..9c04c3f60 100644 --- a/core/src/ParaGridIO.cpp +++ b/core/src/ParaGridIO.cpp @@ -264,7 +264,7 @@ void ParaGridIO::dumpModelState( for (auto entry : ModelArray::definedDimensions) { ModelArray::Dimension dim = entry.first; size_t dimSz = (dimCompMap.count(dim)) ? ModelArray::nComponents(dimCompMap.at(dim)) - : dimSz = entry.second.globalLength; + : dimSz = entry.second.localLength; ncFromMAMap[dim] = ncFile.addDim(entry.second.name, dimSz); // TODO Do I need to add data, even if it is just integers 0...n-1? } From c168d80e2d5919ea22496c814a822c85f59eef1f Mon Sep 17 00:00:00 2001 From: Tim Spain Date: Mon, 28 Jul 2025 13:43:03 +0200 Subject: [PATCH 09/11] Correct dimension names for CG fields. --- core/src/ParaGridIO.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/ParaGridIO.cpp b/core/src/ParaGridIO.cpp index 9c04c3f60..55b64c456 100644 --- a/core/src/ParaGridIO.cpp +++ b/core/src/ParaGridIO.cpp @@ -35,7 +35,7 @@ ParaGridIO::ParaGridIO(ParametricGrid& grid) { "ydimxdimdg_comp", ModelArray::Type::DG }, { "yxdgstress_comp", ModelArray::Type::DGSTRESS }, { "ydimxdimdgstress_comp", ModelArray::Type::DGSTRESS }, - { "ycgxcg", ModelArray::Type::CG }, + { "y_cgx_cg", ModelArray::Type::CG }, { "yvertexxvertexncoords", ModelArray::Type::VERTEX }, // clang-format on }) From 0cd2868a3fbc8941893665ad37555e832e2e1390 Mon Sep 17 00:00:00 2001 From: Tim Spain Date: Mon, 28 Jul 2025 13:55:30 +0200 Subject: [PATCH 10/11] clang formatting --- dynamics/src/CGDynamicsKernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynamics/src/CGDynamicsKernel.cpp b/dynamics/src/CGDynamicsKernel.cpp index 59af796e8..3a5471069 100644 --- a/dynamics/src/CGDynamicsKernel.cpp +++ b/dynamics/src/CGDynamicsKernel.cpp @@ -125,7 +125,7 @@ ModelArray CGDynamicsKernel::getCGData(const std::string& name) con template const ModelArray::MultiDim CGDynamicsKernel::getCGDimensions() const { - return {CGdegree * smesh->nx +1, CGdegree * smesh->ny + 1}; + return { CGdegree * smesh->nx + 1, CGdegree * smesh->ny + 1 }; } template void CGDynamicsKernel::prepareAdvection() From 6d846b8600ad92b7f071ca30acdce066b9c9406c Mon Sep 17 00:00:00 2001 From: Tim Spain Date: Mon, 28 Jul 2025 14:43:15 +0200 Subject: [PATCH 11/11] Remove the U ModelArray type. --- core/src/ModelComponent.cpp | 3 --- core/src/RectGridIO.cpp | 14 ++------------ .../ModelArrayDetails.cpp | 18 ++---------------- .../include/ModelArrayDetails.hpp | 4 ---- .../include/ModelArrayTypedefs.hpp | 2 -- .../include/ModelArrayTypedefs.hpp | 2 -- dynamics/src/CGDynamicsKernel.cpp | 8 ++++---- .../modules/include/IAtmosphereBoundary.hpp | 8 ++++---- physics/src/modules/include/IOceanBoundary.hpp | 4 ++-- physics/test/BenchmarkBoundaries_test.cpp | 4 ---- 10 files changed, 14 insertions(+), 53 deletions(-) diff --git a/core/src/ModelComponent.cpp b/core/src/ModelComponent.cpp index f74081f19..f1a779916 100644 --- a/core/src/ModelComponent.cpp +++ b/core/src/ModelComponent.cpp @@ -64,12 +64,9 @@ ModelArray ModelComponent::mask(const ModelArray& data) break; } case (ModelArray::Type::H): - case (ModelArray::Type::U): - case (ModelArray::Type::V): { return data * oceanMask() + MissingData::value() * (1 - oceanMask()); break; } - } } const ModelArray& ModelComponent::oceanMask() { return oceanMaskSingleton(); } diff --git a/core/src/RectGridIO.cpp b/core/src/RectGridIO.cpp index 61e143c5f..d09ae91fe 100644 --- a/core/src/RectGridIO.cpp +++ b/core/src/RectGridIO.cpp @@ -76,21 +76,11 @@ ModelState RectGridIO::getModelState(const std::string& filePath) #endif #ifdef USE_MPI - // Get the sizes of the four types of field - // HField from hice + // Get the sizes of the HField from hice dimensionSetter(ncFile, hiceName, ModelArray::Type::H, metadata); - // UField from hice - dimensionSetter(ncFile, hiceName, ModelArray::Type::U, metadata); - // VField from hice - dimensionSetter(ncFile, hiceName, ModelArray::Type::V, metadata); #else - // Get the sizes of the four types of field - // HField from hice + // Get the sizes of the 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); #endif #ifdef USE_MPI diff --git a/core/src/discontinuousgalerkin/ModelArrayDetails.cpp b/core/src/discontinuousgalerkin/ModelArrayDetails.cpp index d3fbf9121..6457e0987 100644 --- a/core/src/discontinuousgalerkin/ModelArrayDetails.cpp +++ b/core/src/discontinuousgalerkin/ModelArrayDetails.cpp @@ -51,16 +51,6 @@ ModelArray::TypeDimensions ModelArray::typeDimensions = { ModelArray::Dimension::XVERTEX, ModelArray::Dimension::YVERTEX, } }, - { ModelArray::Type::U, - { - ModelArray::Dimension::X, - ModelArray::Dimension::Y, - } }, - { ModelArray::Type::V, - { - ModelArray::Dimension::X, - ModelArray::Dimension::Y, - } }, { ModelArray::Type::DG, { ModelArray::Dimension::X, @@ -81,8 +71,6 @@ ModelArray::TypeDimensions ModelArray::typeDimensions = { const std::map ModelArray::typeNames = { { ModelArray::Type::H, "HField" }, { ModelArray::Type::VERTEX, "VertexField" }, - { ModelArray::Type::U, "UField" }, - { ModelArray::Type::V, "VField" }, { ModelArray::Type::DG, "DGField" }, { ModelArray::Type::DGSTRESS, "DGStressField" }, { ModelArray::Type::CG, "CGField" }, @@ -99,8 +87,8 @@ bool ModelArray::hasDoF(const Type type) } ModelArray::SizeMap::SizeMap() - : m_sizes({ { Type::H, 0 }, { Type::VERTEX, 1 }, { Type::U, 0 }, { Type::V, 0 }, - { Type::DG, 0 }, { Type::DGSTRESS, 0 }, { Type::CG, 1 } }) + : m_sizes( { { Type::H, 0 }, { Type::VERTEX, 1 }, { Type::DG, 0 }, { Type::DGSTRESS, 0 }, { + Type::CG, 1 } }) { } @@ -108,8 +96,6 @@ ModelArray::DimensionMap::DimensionMap() : m_dimensions({ { Type::H, { 0, 0 } }, { Type::VERTEX, { 1, 1 } }, - { Type::U, { 0, 0 } }, - { Type::V, { 0, 0 } }, { Type::DG, { 0, 0 } }, { Type::DGSTRESS, { 0, 0 } }, { Type::CG, { 1, 1 } }, diff --git a/core/src/discontinuousgalerkin/include/ModelArrayDetails.hpp b/core/src/discontinuousgalerkin/include/ModelArrayDetails.hpp index 5b8be1abe..9c923b45c 100644 --- a/core/src/discontinuousgalerkin/include/ModelArrayDetails.hpp +++ b/core/src/discontinuousgalerkin/include/ModelArrayDetails.hpp @@ -16,8 +16,6 @@ enum class Dimension { X, Y, XVERTEX, YVERTEX, XCG, YCG, DG, DGSTRESS, NCOORDS, enum class Type { H, VERTEX, - U, - V, DG, DGSTRESS, CG, @@ -27,8 +25,6 @@ static const Type AdvectionType = Type::DG; static ModelArray HField() { return ModelArray(Type::H); } static ModelArray VertexField() { return ModelArray(Type::VERTEX); } -static ModelArray UField() { return ModelArray(Type::U); } -static ModelArray VField() { return ModelArray(Type::V); } static ModelArray DGField() { return ModelArray(Type::DG); } static ModelArray DGSField() { return ModelArray(Type::DGSTRESS); } static ModelArray CGField() { return ModelArray(Type::CG); } diff --git a/core/src/discontinuousgalerkin/include/ModelArrayTypedefs.hpp b/core/src/discontinuousgalerkin/include/ModelArrayTypedefs.hpp index f083f3cda..038e25ac8 100644 --- a/core/src/discontinuousgalerkin/include/ModelArrayTypedefs.hpp +++ b/core/src/discontinuousgalerkin/include/ModelArrayTypedefs.hpp @@ -9,8 +9,6 @@ typedef ModelArray HField; typedef ModelArray VertexField; -typedef ModelArray UField; -typedef ModelArray VField; typedef ModelArray DGField; typedef ModelArray DGSField; typedef ModelArray CGField; diff --git a/core/src/finitevolume/include/ModelArrayTypedefs.hpp b/core/src/finitevolume/include/ModelArrayTypedefs.hpp index 9d30a346a..605bbb2c9 100644 --- a/core/src/finitevolume/include/ModelArrayTypedefs.hpp +++ b/core/src/finitevolume/include/ModelArrayTypedefs.hpp @@ -8,6 +8,4 @@ // ModelArrayDetails.cpp typedef ModelArray HField; -typedef ModelArray UField; -typedef ModelArray VField; typedef ModelArray VertexField; diff --git a/dynamics/src/CGDynamicsKernel.cpp b/dynamics/src/CGDynamicsKernel.cpp index 3a5471069..fe350a99f 100644 --- a/dynamics/src/CGDynamicsKernel.cpp +++ b/dynamics/src/CGDynamicsKernel.cpp @@ -85,22 +85,22 @@ template ModelArray CGDynamicsKernel::getDG0Data(const std::string& name) const { if (name == uName) { - ModelArray data(ModelArray::Type::U); + ModelArray data(ModelArray::Type::H); DGVector utmp(*smesh); Nextsim::Interpolations::CG2DG(*smesh, utmp, u); return DGModelArray::dg2ma(utmp, data); } else if (name == vName) { - ModelArray data(ModelArray::Type::V); + ModelArray data(ModelArray::Type::H); DGVector vtmp(*smesh); Nextsim::Interpolations::CG2DG(*smesh, vtmp, v); return DGModelArray::dg2ma(vtmp, data); } else if (name == uIOStressName) { - ModelArray data(ModelArray::Type::U); + ModelArray data(ModelArray::Type::H); DGVector utmp(*smesh); Nextsim::Interpolations::CG2DG(*smesh, utmp, uIceOceanStress); return DGModelArray::dg2ma(utmp, data); } else if (name == vIOStressName) { - ModelArray data(ModelArray::Type::V); + ModelArray data(ModelArray::Type::H); DGVector vtmp(*smesh); Nextsim::Interpolations::CG2DG(*smesh, vtmp, vIceOceanStress); return DGModelArray::dg2ma(vtmp, data); diff --git a/physics/src/modules/include/IAtmosphereBoundary.hpp b/physics/src/modules/include/IAtmosphereBoundary.hpp index de6e8c912..7a7f2ffaf 100644 --- a/physics/src/modules/include/IAtmosphereBoundary.hpp +++ b/physics/src/modules/include/IAtmosphereBoundary.hpp @@ -23,8 +23,8 @@ class IAtmosphereBoundary : public ModelComponent { , snow(ModelArray::Type::H) , rain(ModelArray::Type::H) , evap(ModelArray::Type::H) - , uwind(ModelArray::Type::U) - , vwind(ModelArray::Type::V) + , uwind(ModelArray::Type::H) + , vwind(ModelArray::Type::H) , penSW(ModelArray::Type::H) , tauXOW(ModelArray::Type::H) , tauYOW(ModelArray::Type::H) @@ -79,8 +79,8 @@ class IAtmosphereBoundary : public ModelComponent { HField snow; HField rain; HField evap; - UField uwind; - VField vwind; + HField uwind; + HField vwind; HField penSW; HField tauXOW; // x(east)-ward open ocean stress, Pa HField tauYOW; // y(north)-ward open ocean stress, Pa diff --git a/physics/src/modules/include/IOceanBoundary.hpp b/physics/src/modules/include/IOceanBoundary.hpp index 98d4d9a2c..e1b153410 100644 --- a/physics/src/modules/include/IOceanBoundary.hpp +++ b/physics/src/modules/include/IOceanBoundary.hpp @@ -165,8 +165,8 @@ class IOceanBoundary : public ModelComponent { HField mld; // Mixed layer or slab ocean depth m HField tf; // Freezing point of the mixed layer, ˚C HField cpml; // Heat capacity of the mixed layer, J K⁻¹ m² - UField u; // x(east)-ward ocean current, m s⁻¹ - VField v; // y(north)-ward ocean current, m s⁻¹ + HField u; // x(east)-ward ocean current, m s⁻¹ + HField v; // y(north)-ward ocean current, m s⁻¹ HField ssh; // sea surface height, m HField qNoSun; // Net surface ocean heat flux, except short wave, W m⁻² HField qswNet; // Net surface ocean shortwave flux, W m⁻² diff --git a/physics/test/BenchmarkBoundaries_test.cpp b/physics/test/BenchmarkBoundaries_test.cpp index a1145e622..14d6fc964 100644 --- a/physics/test/BenchmarkBoundaries_test.cpp +++ b/physics/test/BenchmarkBoundaries_test.cpp @@ -20,8 +20,6 @@ TEST_CASE("OceanTest") const size_t nx = 256; const size_t ny = 256; ModelArray::setDimensions(ModelArray::Type::H, { nx, ny }); - ModelArray::setDimensions(ModelArray::Type::U, { nx, ny }); - ModelArray::setDimensions(ModelArray::Type::V, { nx, ny }); BenchmarkOcean benchOcean; benchOcean.setData(ModelState::DataMap()); @@ -48,8 +46,6 @@ TEST_CASE("AtmosphereTest") const size_t nx = 256; const size_t ny = 256; ModelArray::setDimensions(ModelArray::Type::H, { nx, ny }); - ModelArray::setDimensions(ModelArray::Type::U, { nx, ny }); - ModelArray::setDimensions(ModelArray::Type::V, { nx, ny }); BenchmarkAtmosphere benchAtm; benchAtm.setData(ModelState::DataMap());