Identify GCONINJE UDA Items

This commit adds UDA items for the GCONINJE keyword.  This is in
preparation of tracking UDA status in this context.  While here,
also add unit tests for the expected values of UDQ::keyword() and
UDQ::udaCode().
This commit is contained in:
Bård Skaflestad 2021-05-25 22:23:41 +02:00
parent cefc083135
commit 665a82b9cd
3 changed files with 146 additions and 59 deletions

View File

@ -17,10 +17,12 @@
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef UDQ_ENUMS_HPP
#define UDQ_ENUMS_HPP
#include <string>
#include <vector>
namespace Opm {
/*
@ -69,8 +71,6 @@ enum class UDQVarType {
GROUP_VAR = 9
};
enum class UDQTokenType{
error = 0,
number = 1,
@ -139,7 +139,6 @@ enum class UDQUpdate {
NEXT
};
enum class UDAControl {
WCONPROD_ORAT,
WCONPROD_GRAT,
@ -157,10 +156,14 @@ enum class UDAControl {
GCONPROD_OIL_TARGET,
GCONPROD_WATER_TARGET,
GCONPROD_GAS_TARGET,
GCONPROD_LIQUID_TARGET
GCONPROD_LIQUID_TARGET,
//
GCONINJE_SURFACE_MAX_RATE,
GCONINJE_RESV_MAX_RATE,
GCONINJE_TARGET_REINJ_FRACTION,
GCONINJE_TARGET_VOID_FRACTION,
};
enum class UDAKeyword {
WCONPROD,
WCONINJE,
@ -168,8 +171,6 @@ enum class UDAKeyword {
GCONPROD
};
namespace UDQ {
UDQVarType targetType(const std::string& keyword, const std::vector<std::string>& selector);
@ -191,7 +192,7 @@ namespace UDQ {
int uadCode(UDAControl control);
constexpr double restart_default = -0.3E+21;
}
}
} // UDQ
} // Opm
#endif
#endif // UDQ_ENUMS_HPP

View File

@ -17,18 +17,17 @@
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#include <string>
#include <unordered_map>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp>
#include <map>
#include <set>
#include <stdexcept>
#include <string>
#include <unordered_map>
#include <vector>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp>
namespace Opm { namespace UDQ {
namespace Opm {
namespace UDQ {
namespace {
const std::set<UDQTokenType> cmp_func = {UDQTokenType::binary_cmp_eq,
@ -364,54 +363,81 @@ std::string typeName(UDQVarType var_type) {
}
}
namespace {
template <typename Value>
Value lookup_control_map_value(const std::map<UDAControl, Value>& map, const UDAControl control)
{
auto pos = map.find(control);
if (pos == map.end()) {
throw std::logic_error {
"Unrecognized enum type (" +
std::to_string(static_cast<int>(control)) +
"- internal error"
};
}
UDAKeyword keyword(UDAControl control) {
const std::map<UDAControl, UDAKeyword> c2k = {{UDAControl::WCONPROD_ORAT, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_GRAT, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_WRAT, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_LRAT, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_RESV, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_BHP, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_THP, UDAKeyword::WCONPROD},
{UDAControl::WCONINJE_RATE, UDAKeyword::WCONINJE},
{UDAControl::WCONINJE_RESV, UDAKeyword::WCONINJE},
{UDAControl::WCONINJE_BHP, UDAKeyword::WCONINJE},
{UDAControl::WCONINJE_THP, UDAKeyword::WCONINJE},
{UDAControl::GCONPROD_OIL_TARGET, UDAKeyword::GCONPROD},
{UDAControl::GCONPROD_WATER_TARGET, UDAKeyword::GCONPROD},
{UDAControl::GCONPROD_GAS_TARGET, UDAKeyword::GCONPROD},
{UDAControl::GCONPROD_LIQUID_TARGET, UDAKeyword::GCONPROD}};
return pos->second;
}
} // Anonymous
auto it = c2k.find(control);
if (it != c2k.end())
return it->second;
UDAKeyword keyword(UDAControl control)
{
static const auto c2k = std::map<UDAControl, UDAKeyword> {
{UDAControl::WCONPROD_ORAT, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_GRAT, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_WRAT, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_LRAT, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_RESV, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_BHP, UDAKeyword::WCONPROD},
{UDAControl::WCONPROD_THP, UDAKeyword::WCONPROD},
{UDAControl::WCONINJE_RATE, UDAKeyword::WCONINJE},
{UDAControl::WCONINJE_RESV, UDAKeyword::WCONINJE},
{UDAControl::WCONINJE_BHP, UDAKeyword::WCONINJE},
{UDAControl::WCONINJE_THP, UDAKeyword::WCONINJE},
{UDAControl::GCONPROD_OIL_TARGET, UDAKeyword::GCONPROD},
{UDAControl::GCONPROD_WATER_TARGET, UDAKeyword::GCONPROD},
{UDAControl::GCONPROD_GAS_TARGET, UDAKeyword::GCONPROD},
{UDAControl::GCONPROD_LIQUID_TARGET, UDAKeyword::GCONPROD},
{UDAControl::GCONINJE_SURFACE_MAX_RATE, UDAKeyword::GCONINJE},
{UDAControl::GCONINJE_RESV_MAX_RATE, UDAKeyword::GCONINJE},
{UDAControl::GCONINJE_TARGET_REINJ_FRACTION, UDAKeyword::GCONINJE},
{UDAControl::GCONINJE_TARGET_VOID_FRACTION, UDAKeyword::GCONINJE},
};
throw std::logic_error("Unrecognized enum type - internal error");
return lookup_control_map_value(c2k, control);
}
int uadCode(UDAControl control)
{
static const auto c2uad = std::map<UDAControl, int> {
{UDAControl::WCONPROD_ORAT, 300004},
{UDAControl::WCONPROD_GRAT, 500004},
{UDAControl::WCONPROD_WRAT, 400004},
{UDAControl::WCONPROD_LRAT, 600004},
{UDAControl::WCONPROD_RESV, 999999},
{UDAControl::WCONPROD_BHP, 999999},
{UDAControl::WCONPROD_THP, 999999},
int uadCode(UDAControl control) {
const std::map<UDAControl, int> c2uad = {{UDAControl::WCONPROD_ORAT, 300004},
{UDAControl::WCONPROD_GRAT, 500004},
{UDAControl::WCONPROD_WRAT, 400004},
{UDAControl::WCONPROD_LRAT, 600004},
{UDAControl::WCONPROD_RESV, 999999},
{UDAControl::WCONPROD_BHP, 999999},
{UDAControl::WCONPROD_THP, 999999},
{UDAControl::WCONINJE_RATE, 400003},
{UDAControl::WCONINJE_RESV, 500003},
{UDAControl::WCONINJE_BHP, 999999},
{UDAControl::WCONINJE_THP, 999999},
{UDAControl::GCONPROD_OIL_TARGET, 200019},
{UDAControl::GCONPROD_WATER_TARGET, 300019},
{UDAControl::GCONPROD_GAS_TARGET, 400019},
{UDAControl::GCONPROD_LIQUID_TARGET, 500019}};
// --------------------------------------------------------------
{UDAControl::WCONINJE_RATE, 400003},
{UDAControl::WCONINJE_RESV, 500003},
{UDAControl::WCONINJE_BHP, 999999},
{UDAControl::WCONINJE_THP, 999999},
auto it = c2uad.find(control);
if (it != c2uad.end())
return it->second;
// --------------------------------------------------------------
{UDAControl::GCONPROD_OIL_TARGET, 200019},
{UDAControl::GCONPROD_WATER_TARGET, 300019},
{UDAControl::GCONPROD_GAS_TARGET, 400019},
{UDAControl::GCONPROD_LIQUID_TARGET, 500019},
throw std::logic_error("Unrecognized enum type - internal error");
}
}
// --------------------------------------------------------------
{UDAControl::GCONINJE_SURFACE_MAX_RATE, 300017}, // Surface injection rate
{UDAControl::GCONINJE_RESV_MAX_RATE, 400017}, // Reservoir volume injection rate
{UDAControl::GCONINJE_TARGET_REINJ_FRACTION, 500017}, // Reinjection fraction
{UDAControl::GCONINJE_TARGET_VOID_FRACTION, 600017}, // Voidage replacement fraction
};
return lookup_control_map_value(c2uad, control);
}
}} // Opm::UDQ

View File

@ -14,8 +14,11 @@ Copyright 2018 Statoil ASA.
*/
#define BOOST_TEST_MODULE UDQTests
#include <boost/test/unit_test.hpp>
#include <limits>
#include <stdexcept>
#include <opm/common/utility/OpmInputError.hpp>
#include <opm/parser/eclipse/Utility/Typetools.hpp>
@ -1512,6 +1515,63 @@ BOOST_AUTO_TEST_CASE(UDQ_USAGE) {
}
BOOST_AUTO_TEST_CASE(UDQControl_Keyword)
{
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::WCONPROD_ORAT) == UDAKeyword::WCONPROD, "WCONPROD_ORAT control keyword must be WCONPROD");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::WCONPROD_GRAT) == UDAKeyword::WCONPROD, "WCONPROD_GRAT control keyword must be WCONPROD");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::WCONPROD_WRAT) == UDAKeyword::WCONPROD, "WCONPROD_WRAT control keyword must be WCONPROD");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::WCONPROD_LRAT) == UDAKeyword::WCONPROD, "WCONPROD_LRAT control keyword must be WCONPROD");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::WCONPROD_RESV) == UDAKeyword::WCONPROD, "WCONPROD_RESV control keyword must be WCONPROD");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::WCONPROD_BHP) == UDAKeyword::WCONPROD, "WCONPROD_BHP control keyword must be WCONPROD");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::WCONPROD_THP) == UDAKeyword::WCONPROD, "WCONPROD_THP control keyword must be WCONPROD");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::WCONINJE_RATE) == UDAKeyword::WCONINJE, "WCONINJE_RATE control keyword must be WCONINJE");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::WCONINJE_RESV) == UDAKeyword::WCONINJE, "WCONINJE_RESV control keyword must be WCONINJE");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::WCONINJE_BHP) == UDAKeyword::WCONINJE, "WCONINJE_BHP control keyword must be WCONINJE");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::WCONINJE_THP) == UDAKeyword::WCONINJE, "WCONINJE_THP control keyword must be WCONINJE");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::GCONPROD_OIL_TARGET) == UDAKeyword::GCONPROD, "GCONPROD_OIL_TARGET control keyword must be GCONPROD");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::GCONPROD_WATER_TARGET) == UDAKeyword::GCONPROD, "GCONPROD_WATER_TARGET control keyword must be GCONPROD");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::GCONPROD_GAS_TARGET) == UDAKeyword::GCONPROD, "GCONPROD_GAS_TARGET control keyword must be GCONPROD");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::GCONPROD_LIQUID_TARGET) == UDAKeyword::GCONPROD, "GCONPROD_LIQUID_TARGET control keyword must be GCONPROD");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::GCONINJE_SURFACE_MAX_RATE) == UDAKeyword::GCONINJE, "GCONINJE_SURFACE_MAX_RATE control keyword must be GCONINJE");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::GCONINJE_RESV_MAX_RATE) == UDAKeyword::GCONINJE, "GCONINJE_RESV_MAX_RATE control keyword must be GCONINJE");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::GCONINJE_TARGET_REINJ_FRACTION) == UDAKeyword::GCONINJE, "GCONINJE_TARGET_REINJ_FRACTION control keyword must be GCONINJE");
BOOST_CHECK_MESSAGE(UDQ::keyword(UDAControl::GCONINJE_TARGET_VOID_FRACTION) == UDAKeyword::GCONINJE, "GCONINJE_TARGET_VOID_FRACTION control keyword must be GCONINJE");
BOOST_CHECK_THROW(UDQ::keyword(static_cast<UDAControl>(1729)),
std::logic_error);
}
BOOST_AUTO_TEST_CASE(UDAControl_IUAD_0)
{
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::WCONPROD_ORAT), 300004);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::WCONPROD_GRAT), 500004);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::WCONPROD_WRAT), 400004);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::WCONPROD_LRAT), 600004);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::WCONPROD_RESV), 999999);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::WCONPROD_BHP), 999999);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::WCONPROD_THP), 999999);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::WCONINJE_RATE), 400003);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::WCONINJE_RESV), 500003);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::WCONINJE_BHP), 999999);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::WCONINJE_THP), 999999);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::GCONPROD_OIL_TARGET), 200019);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::GCONPROD_WATER_TARGET), 300019);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::GCONPROD_GAS_TARGET), 400019);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::GCONPROD_LIQUID_TARGET), 500019);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::GCONINJE_SURFACE_MAX_RATE), 300017);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::GCONINJE_RESV_MAX_RATE), 400017);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::GCONINJE_TARGET_REINJ_FRACTION), 500017);
BOOST_CHECK_EQUAL(UDQ::uadCode(UDAControl::GCONINJE_TARGET_VOID_FRACTION), 600017);
BOOST_CHECK_THROW(UDQ::uadCode(static_cast<UDAControl>(1729)),
std::logic_error);
}
BOOST_AUTO_TEST_CASE(IntegrationTest) {
#include "data/integration_tests/udq.data"