Add UDQ container class
This commit is contained in:
@@ -109,6 +109,7 @@ if(ENABLE_ECL_INPUT)
|
||||
src/opm/parser/eclipse/EclipseState/Tables/VFPInjTable.cpp
|
||||
src/opm/parser/eclipse/EclipseState/Tables/VFPProdTable.cpp
|
||||
src/opm/parser/eclipse/EclipseState/UDQConfig.cpp
|
||||
src/opm/parser/eclipse/EclipseState/Schedule/UDQ.cpp
|
||||
src/opm/parser/eclipse/EclipseState/Schedule/UDQExpression.cpp
|
||||
src/opm/parser/eclipse/Parser/ParseContext.cpp
|
||||
src/opm/parser/eclipse/Parser/Parser.cpp
|
||||
@@ -447,6 +448,7 @@ if(ENABLE_ECL_INPUT)
|
||||
opm/parser/eclipse/EclipseState/IOConfig/IOConfig.hpp
|
||||
opm/parser/eclipse/EclipseState/checkDeck.hpp
|
||||
opm/parser/eclipse/EclipseState/Runspec.hpp
|
||||
opm/parser/eclipse/EclipseState/Schedule/UDQ.hpp
|
||||
opm/parser/eclipse/EclipseState/UDQConfig.hpp
|
||||
opm/parser/eclipse/EclipseState/Schedule/UDQExpression.hpp
|
||||
opm/parser/eclipse/Deck/DeckItem.hpp
|
||||
|
||||
41
opm/parser/eclipse/EclipseState/Schedule/UDQ.hpp
Normal file
41
opm/parser/eclipse/EclipseState/Schedule/UDQ.hpp
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
Copyright 2018 Statoil ASA.
|
||||
|
||||
This file is part of the Open Porous Media project (OPM).
|
||||
|
||||
OPM is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OPM is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OPM. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef UDQState_HPP_
|
||||
#define UDQState_HPP_
|
||||
|
||||
#include <opm/parser/eclipse/EclipseState/UDQConfig.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQExpression.hpp>
|
||||
|
||||
|
||||
namespace Opm {
|
||||
|
||||
class UDQ{
|
||||
public:
|
||||
UDQ(const UDQConfig& config, const Deck& deck);
|
||||
const std::vector<UDQExpression>& expressions() const noexcept;
|
||||
private:
|
||||
std::vector<UDQExpression> m_expressions;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
38
src/opm/parser/eclipse/EclipseState/Schedule/UDQ.cpp
Normal file
38
src/opm/parser/eclipse/EclipseState/Schedule/UDQ.cpp
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
Copyright 2018 Statoil ASA.
|
||||
|
||||
This file is part of the Open Porous Media project (OPM).
|
||||
|
||||
OPM is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OPM is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OPM. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <opm/parser/eclipse/Deck/Deck.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/UDQConfig.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ.hpp>
|
||||
|
||||
namespace Opm {
|
||||
|
||||
UDQ::UDQ(const UDQConfig& config, const Deck& deck) {
|
||||
if (deck.hasKeyword("UDQ")) {
|
||||
const auto& kw = deck.getKeyword("UDQ");
|
||||
for (const auto& record : kw)
|
||||
this->m_expressions.emplace_back( record );
|
||||
}
|
||||
}
|
||||
|
||||
const std::vector<UDQExpression>& UDQ::expressions() const noexcept {
|
||||
return this->m_expressions;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <opm/parser/eclipse/Deck/Deck.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Runspec.hpp>
|
||||
#include <opm/parser/eclipse/Parser/Parser.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQExpression.hpp>
|
||||
|
||||
using namespace Opm;
|
||||
@@ -48,6 +49,36 @@ UDQPARAM
|
||||
BOOST_CHECK(udq_config.reseedRNG());
|
||||
BOOST_CHECK_EQUAL(0.25, udq_config.cmpEpsilon());
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(UDQ_KEWYORDS) {
|
||||
const std::string input = R"(
|
||||
RUNSPEC
|
||||
|
||||
UDQDIMS
|
||||
10* 'Y'/
|
||||
|
||||
UDQPARAM
|
||||
3* 0.25 /
|
||||
|
||||
SCHEDULE
|
||||
|
||||
UDQ
|
||||
ASSIGN WUBHP 0.0 /
|
||||
UNITS WUBHP 'BARSA' /
|
||||
DEFINE FUOPR AVEG(WOPR) + 1/
|
||||
/
|
||||
)";
|
||||
|
||||
Parser parser;
|
||||
ParseContext parseContext;
|
||||
|
||||
auto deck = parser.parseString(input, parseContext);
|
||||
auto udq_config = UDQConfig(deck);
|
||||
auto udq = UDQ(udq_config, deck);
|
||||
BOOST_CHECK_EQUAL(3, udq.expressions().size());
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(UDQ_KEYWORD) {
|
||||
// Invalid action
|
||||
BOOST_REQUIRE_THROW( UDQExpression("INVALID_ACTION", "WUBHP" , {"DATA1" ,"1"}), std::invalid_argument);
|
||||
@@ -57,3 +88,40 @@ BOOST_AUTO_TEST_CASE(UDQ_KEYWORD) {
|
||||
|
||||
BOOST_CHECK_NO_THROW(UDQExpression("ASSIGN" ,"WUBHP", {"1"}));
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(UDQ_DATA) {
|
||||
const std::string input = R"(
|
||||
RUNSPEC
|
||||
|
||||
UDQDIMS
|
||||
10* 'Y'/
|
||||
|
||||
UDQPARAM
|
||||
3* 0.25 /
|
||||
|
||||
SCHEDULE
|
||||
|
||||
UDQ
|
||||
ASSIGN CUMW1 P12 10 12 1 (4.0 + 6*(4 - 2)) /
|
||||
DEFINE WUMW1 WBHP 'P*1*' UMAX WBHP 'P*4*' /
|
||||
/
|
||||
|
||||
|
||||
)";
|
||||
Parser parser;
|
||||
ParseContext parseContext;
|
||||
|
||||
auto deck = parser.parseString(input, parseContext);
|
||||
auto udq_config = UDQConfig(deck);
|
||||
auto udq = UDQ(udq_config, deck);
|
||||
const auto& records = udq.expressions();
|
||||
const auto& rec0 = records[0];
|
||||
const auto& rec1 = records[1];
|
||||
const std::vector<std::string> exp0 = {"P12", "10", "12", "1", "(", "4.0", "+", "6", "*", "(", "4", "-", "2", ")", ")"};
|
||||
const std::vector<std::string> exp1 = {"WBHP", "P*1*", "UMAX", "WBHP" , "P*4*"};
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(rec0.tokens().begin(), rec0.tokens().end(), exp0.begin(), exp0.end());
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(rec1.tokens().begin(), rec1.tokens().end(), exp1.begin(), exp1.end());
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user