Partially Internalise AQUDIMS in Runspec

This commit internalises the items NANAQU (5) and NCAMAX (6) of the
AQUDIMS keyword into a new structure

    AquiferDimensions

hooked up to the 'Runspec' class.  This is in preparation of adding
restart output for analytic aquifers (Carter-Tracy and Fetkovich).
This commit is contained in:
Bård Skaflestad
2021-03-09 20:40:32 +01:00
parent e3b54278a0
commit 796318409d
3 changed files with 149 additions and 0 deletions

View File

@@ -218,6 +218,36 @@ private:
int nMaxNoBranchesConToNode;
};
class AquiferDimensions {
public:
AquiferDimensions();
explicit AquiferDimensions(const Deck& deck);
static AquiferDimensions serializeObject();
int maxAnalyticAquifers() const
{
return this->maxNumAnalyticAquifers;
}
int maxAnalyticAquiferConnections() const
{
return this->maxNumAnalyticAquiferConn;
}
template <class Serializer>
void serializeOp(Serializer& serializer)
{
serializer(this->maxNumAnalyticAquifers);
serializer(this->maxNumAnalyticAquiferConn);
}
private:
int maxNumAnalyticAquifers;
int maxNumAnalyticAquiferConn;
};
bool operator==(const AquiferDimensions& lhs, const AquiferDimensions& rhs);
class EclHysterConfig
{
@@ -339,6 +369,7 @@ public:
const Welldims& wellDimensions() const noexcept;
const WellSegmentDims& wellSegmentDimensions() const noexcept;
const NetworkDims& networkDimensions() const noexcept;
const AquiferDimensions& aquiferDimensions() const noexcept;
int eclPhaseMask( ) const noexcept;
const EclHysterConfig& hysterPar() const noexcept;
const Actdims& actdims() const noexcept;
@@ -357,6 +388,7 @@ public:
welldims.serializeOp(serializer);
wsegdims.serializeOp(serializer);
netwrkdims.serializeOp(serializer);
aquiferdims.serializeOp(serializer);
udq_params.serializeOp(serializer);
hystpar.serializeOp(serializer);
m_actdims.serializeOp(serializer);
@@ -372,6 +404,7 @@ private:
Welldims welldims;
WellSegmentDims wsegdims;
NetworkDims netwrkdims;
AquiferDimensions aquiferdims;
UDQParams udq_params;
EclHysterConfig hystpar;
Actdims m_actdims;

View File

@@ -21,6 +21,7 @@
#include <opm/parser/eclipse/Deck/Deck.hpp>
#include <opm/parser/eclipse/Deck/DeckSection.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/A.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/B.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/C.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/F.hpp>
@@ -275,6 +276,41 @@ bool NetworkDims::operator==(const NetworkDims& data) const
this->maxNoBranchesConToNode() == data.maxNoBranchesConToNode();
}
AquiferDimensions::AquiferDimensions()
: maxNumAnalyticAquifers { ParserKeywords::AQUDIMS::NANAQU::defaultValue }
, maxNumAnalyticAquiferConn{ ParserKeywords::AQUDIMS::NCAMAX::defaultValue }
{}
AquiferDimensions::AquiferDimensions(const Deck& deck)
: AquiferDimensions{}
{
using AD = ParserKeywords::AQUDIMS;
if (deck.hasKeyword<AD>()) {
const auto& keyword = deck.getKeyword<AD>(0);
const auto& ad = keyword.getRecord(0);
this->maxNumAnalyticAquifers = ad.getItem<AD::NANAQU>().get<int>(0);
this->maxNumAnalyticAquiferConn = ad.getItem<AD::NCAMAX>().get<int>(0);
}
}
AquiferDimensions AquiferDimensions::serializeObject()
{
auto dim = AquiferDimensions{};
dim.maxNumAnalyticAquifers = 3;
dim.maxNumAnalyticAquiferConn = 10;
return dim;
}
bool operator==(const AquiferDimensions& lhs, const AquiferDimensions& rhs)
{
return (lhs.maxAnalyticAquifers() == rhs.maxAnalyticAquifers())
&& (lhs.maxAnalyticAquiferConnections() == rhs.maxAnalyticAquiferConnections());
}
EclHysterConfig::EclHysterConfig(const Opm::Deck& deck)
{
@@ -456,6 +492,7 @@ Runspec Runspec::serializeObject()
result.endscale = EndpointScaling::serializeObject();
result.welldims = Welldims::serializeObject();
result.wsegdims = WellSegmentDims::serializeObject();
result.aquiferdims = AquiferDimensions::serializeObject();
result.udq_params = UDQParams::serializeObject();
result.hystpar = EclHysterConfig::serializeObject();
result.m_actdims = Actdims::serializeObject();
@@ -497,6 +534,11 @@ const NetworkDims& Runspec::networkDimensions() const noexcept
return this->netwrkdims;
}
const AquiferDimensions& Runspec::aquiferDimensions() const noexcept
{
return this->aquiferdims;
}
const EclHysterConfig& Runspec::hysterPar() const noexcept
{
return this->hystpar;
@@ -542,6 +584,7 @@ bool Runspec::operator==(const Runspec& data) const {
this->endpointScaling() == data.endpointScaling() &&
this->wellDimensions() == data.wellDimensions() &&
this->wellSegmentDimensions() == data.wellSegmentDimensions() &&
(this->aquiferDimensions() == data.aquiferDimensions()) &&
this->hysterPar() == data.hysterPar() &&
this->actdims() == data.actdims() &&
this->saturationFunctionControls() == data.saturationFunctionControls() &&

View File

@@ -527,6 +527,79 @@ WSEGDIMS
BOOST_CHECK_EQUAL(wsd.maxLateralBranchesPerWell(), 33); // WSEGDIMS(3)
}
BOOST_AUTO_TEST_CASE(AQUDIMS_FullSpec)
{
const auto input = std::string {
R"(
RUNSPEC
AQUDIMS
-- 1 2 3 4 5 6 7 8
3 4 5 6 7 8 9 10 /
)" };
const auto ad = AquiferDimensions {
Parser{}.parseString(input)
};
BOOST_CHECK_EQUAL(ad.maxAnalyticAquifers(), 7); // AQUDIMS(5)
BOOST_CHECK_EQUAL(ad.maxAnalyticAquiferConnections(), 8); // AQUDIMS(6)
}
BOOST_AUTO_TEST_CASE(AQUDIMS_AllDefaulted)
{
const auto input = std::string {
R"(
RUNSPEC
AQUDIMS
/
)" };
const auto ad = AquiferDimensions {
Parser{}.parseString(input)
};
BOOST_CHECK_EQUAL(ad.maxAnalyticAquifers(), 1); // AQUDIMS(5): Default = 1
BOOST_CHECK_EQUAL(ad.maxAnalyticAquiferConnections(), 1); // AQUDIMS(6): Default = 1
}
BOOST_AUTO_TEST_CASE(AQUDIMS_MaxAnalyticAquifers)
{
const auto input = std::string {
R"(
RUNSPEC
AQUDIMS
-- 1 2 3 4 5
4* 1729 /
)" };
const auto ad = AquiferDimensions {
Parser{}.parseString(input)
};
BOOST_CHECK_EQUAL(ad.maxAnalyticAquifers(), 1729); // AQUDIMS(5)
}
BOOST_AUTO_TEST_CASE(AQUDIMS_MaxAnalyticAquiferConnections)
{
const auto input = std::string {
R"(
RUNSPEC
AQUDIMS
-- 1 2 3 4 5 6
5* 42 /
)" };
const auto ad = AquiferDimensions {
Parser{}.parseString(input)
};
BOOST_CHECK_EQUAL(ad.maxAnalyticAquiferConnections(), 42); // AQUDIMS(6)
}
BOOST_AUTO_TEST_CASE( SWATINIT ) {
const std::string input = R"(
SWATINIT