Files
opm-common/opm/parser/eclipse/EclipseState/Tables/TableManager.cpp
Jørgen Kvalsvik 21aaceaed9 Runspec object; move phases from TableManager
There has never really been a natural home for initial properties that
aren't InitConfig, meaning information such as phases in the deck and
other runspec information hasn't had a natural home.

This patch introduces the Runspec object on EclipseState for phase
information and other similar properties that are interesting and static
for when setting up parameters etc. for simulation, that aren't all that
interesting once simulation starts.

An additional benefit is a leaner implementation for the phase enum and
some stricter semantics via enum classes.
2016-11-01 16:41:19 +01:00

707 lines
28 KiB
C++

/*
Copyright 2015 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/Parser/ParserKeywords/E.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/M.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/V.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/T.hpp>
#include <opm/parser/eclipse/Deck/Deck.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/TableManager.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/E.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/M.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/P.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/T.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/V.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/ScheduleEnums.hpp> // Phase::PhaseEnum
#include <opm/parser/eclipse/EclipseState/Tables/EnkrvdTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/EnptvdTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/GasvisctTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/ImkrvdTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/ImptvdTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/MiscTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/MsfnTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/OilvisctTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/PlyadsTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/PlydhflfTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/PlymaxTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/PlyrockTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/PlyshlogTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/PlyviscTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/PmiscTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/TlpmixpaTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/PvdgTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/PvdoTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/PvdsTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/RocktabTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/RsvdTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/RtempvdTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/RvvdTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/SgcwmisTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/SgfnTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/SgofTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/SgwfnTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/SlgofTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/Sof2Table.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/Sof3Table.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/SorwmisTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/SsfnTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/SwfnTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/SwofTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/TableContainer.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/WatvisctTable.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/Tabdims.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/Eqldims.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/Regdims.hpp>
namespace Opm {
TableManager::TableManager( const Deck& deck )
:
hasImptvd (deck.hasKeyword("IMPTVD")),
hasEnptvd (deck.hasKeyword("ENPTVD")),
hasEqlnum (deck.hasKeyword("EQLNUM"))
{
initDims( deck );
initSimpleTables( deck );
initFullTables(deck, "PVTG", m_pvtgTables);
initFullTables(deck, "PVTO", m_pvtoTables);
initVFPProdTables(deck, m_vfpprodTables);
initVFPInjTables(deck, m_vfpinjTables);
}
void TableManager::initDims(const Deck& deck) {
using namespace Opm::ParserKeywords;
if (deck.hasKeyword<TABDIMS>()) {
const auto& keyword = deck.getKeyword<TABDIMS>();
const auto& record = keyword.getRecord(0);
int ntsfun = record.getItem<TABDIMS::NTSFUN>().get< int >(0);
int ntpvt = record.getItem<TABDIMS::NTPVT>().get< int >(0);
int nssfun = record.getItem<TABDIMS::NSSFUN>().get< int >(0);
int nppvt = record.getItem<TABDIMS::NPPVT>().get< int >(0);
int ntfip = record.getItem<TABDIMS::NTFIP>().get< int >(0);
int nrpvt = record.getItem<TABDIMS::NRPVT>().get< int >(0);
m_tabdims = std::make_shared<Tabdims>(ntsfun , ntpvt , nssfun , nppvt , ntfip , nrpvt);
} else
m_tabdims = std::make_shared<Tabdims>();
if (deck.hasKeyword<EQLDIMS>()) {
const auto& keyword = deck.getKeyword<EQLDIMS>();
const auto& record = keyword.getRecord(0);
int ntsequl = record.getItem<EQLDIMS::NTEQUL>().get< int >(0);
int nodes_p = record.getItem<EQLDIMS::DEPTH_NODES_P>().get< int >(0);
int nodes_tab = record.getItem<EQLDIMS::DEPTH_NODES_TAB>().get< int >(0);
int nttrvd = record.getItem<EQLDIMS::NTTRVD>().get< int >(0);
int ntsrvd = record.getItem<EQLDIMS::NSTRVD>().get< int >(0);
m_eqldims = std::make_shared<Eqldims>(ntsequl , nodes_p , nodes_tab , nttrvd , ntsrvd );
} else
m_eqldims = std::make_shared<Eqldims>();
if (deck.hasKeyword<REGDIMS>()) {
const auto& keyword = deck.getKeyword<REGDIMS>();
const auto& record = keyword.getRecord(0);
int ntfip = record.getItem<REGDIMS::NTFIP>().get< int >(0);
int nmfipr = record.getItem<REGDIMS::NMFIPR>().get< int >(0);
int nrfreg = record.getItem<REGDIMS::NRFREG>().get< int >(0);
int ntfreg = record.getItem<REGDIMS::NTFREG>().get< int >(0);
int nplmix = record.getItem<REGDIMS::NPLMIX>().get< int >(0);
m_regdims = std::make_shared<Regdims>( ntfip , nmfipr , nrfreg , ntfreg , nplmix );
} else
m_regdims = std::make_shared<Regdims>();
}
void TableManager::addTables( const std::string& tableName , size_t numTables) {
m_simpleTables.emplace(std::make_pair(tableName , TableContainer( numTables )));
}
bool TableManager::hasTables( const std::string& tableName ) const {
auto pair = m_simpleTables.find( tableName );
if (pair == m_simpleTables.end())
return false;
else {
const auto& tables = pair->second;
return !tables.empty();
}
}
const TableContainer& TableManager::getTables( const std::string& tableName ) const {
auto pair = m_simpleTables.find( tableName );
if (pair == m_simpleTables.end())
throw std::invalid_argument("No such table collection: " + tableName);
else
return pair->second;
}
TableContainer& TableManager::forceGetTables( const std::string& tableName , size_t numTables ) {
auto pair = m_simpleTables.find( tableName );
if (pair == m_simpleTables.end()) {
addTables( tableName , numTables );
pair = m_simpleTables.find( tableName );
}
return pair->second;
}
const TableContainer& TableManager::operator[](const std::string& tableName) const {
return getTables(tableName);
}
void TableManager::initSimpleTables(const Deck& deck) {
addTables( "SWOF" , m_tabdims->getNumSatTables() );
addTables( "SGWFN", m_tabdims->getNumSatTables() );
addTables( "SGOF", m_tabdims->getNumSatTables() );
addTables( "SLGOF", m_tabdims->getNumSatTables() );
addTables( "SOF2", m_tabdims->getNumSatTables() );
addTables( "SOF3", m_tabdims->getNumSatTables() );
addTables( "SWFN", m_tabdims->getNumSatTables() );
addTables( "SGFN", m_tabdims->getNumSatTables() );
addTables( "SSFN", m_tabdims->getNumSatTables() );
addTables( "MSFN", m_tabdims->getNumSatTables() );
addTables( "PLYADS", m_tabdims->getNumSatTables() );
addTables( "PLYROCK", m_tabdims->getNumSatTables());
addTables( "PLYVISC", m_tabdims->getNumPVTTables());
addTables( "PLYDHFLF", m_tabdims->getNumPVTTables());
addTables( "PVDG", m_tabdims->getNumPVTTables());
addTables( "PVDO", m_tabdims->getNumPVTTables());
addTables( "PVDS", m_tabdims->getNumPVTTables());
addTables( "OILVISCT", m_tabdims->getNumPVTTables());
addTables( "WATVISCT", m_tabdims->getNumPVTTables());
addTables( "GASVISCT", m_tabdims->getNumPVTTables());
addTables( "PLYMAX", m_regdims->getNPLMIX());
addTables( "RSVD", m_eqldims->getNumEquilRegions());
addTables( "RVVD", m_eqldims->getNumEquilRegions());
{
size_t numMiscibleTables = ParserKeywords::MISCIBLE::NTMISC::defaultValue;
if (deck.hasKeyword<ParserKeywords::MISCIBLE>()) {
const auto& keyword = deck.getKeyword<ParserKeywords::MISCIBLE>();
const auto& record = keyword.getRecord(0);
numMiscibleTables = static_cast<size_t>(record.getItem<ParserKeywords::MISCIBLE::NTMISC>().get< int >(0));
}
addTables( "SORWMIS", numMiscibleTables);
addTables( "SGCWMIS", numMiscibleTables);
addTables( "MISC", numMiscibleTables);
addTables( "PMISC", numMiscibleTables);
addTables( "TLPMIXPA", numMiscibleTables);
}
{
size_t numEndScaleTables = ParserKeywords::ENDSCALE::NUM_TABLES::defaultValue;
if (deck.hasKeyword<ParserKeywords::ENDSCALE>()) {
const auto& keyword = deck.getKeyword<ParserKeywords::ENDSCALE>();
const auto& record = keyword.getRecord(0);
numEndScaleTables = static_cast<size_t>(record.getItem<ParserKeywords::ENDSCALE::NUM_TABLES>().get< int >(0));
}
addTables( "ENKRVD", numEndScaleTables);
addTables( "ENPTVD", numEndScaleTables);
addTables( "IMKRVD", numEndScaleTables);
addTables( "IMPTVD", numEndScaleTables);
}
{
size_t numRocktabTables = ParserKeywords::ROCKCOMP::NTROCC::defaultValue;
if (deck.hasKeyword<ParserKeywords::ROCKCOMP>()) {
const auto& keyword = deck.getKeyword<ParserKeywords::ROCKCOMP>();
const auto& record = keyword.getRecord(0);
numRocktabTables = static_cast<size_t>(record.getItem<ParserKeywords::ROCKCOMP::NTROCC>().get< int >(0));
}
addTables( "ROCKTAB", numRocktabTables);
}
initSimpleTableContainer<SwofTable>(deck, "SWOF" , m_tabdims->getNumSatTables());
initSimpleTableContainer<SgwfnTable>(deck, "SGWFN", m_tabdims->getNumSatTables());
initSimpleTableContainer<SgofTable>(deck, "SGOF" , m_tabdims->getNumSatTables());
initSimpleTableContainer<SlgofTable>(deck, "SLGOF" , m_tabdims->getNumSatTables());
initSimpleTableContainer<Sof2Table>(deck, "SOF2" , m_tabdims->getNumSatTables());
initSimpleTableContainer<Sof3Table>(deck, "SOF3" , m_tabdims->getNumSatTables());
initSimpleTableContainer<SwfnTable>(deck, "SWFN" , m_tabdims->getNumSatTables());
initSimpleTableContainer<SgfnTable>(deck, "SGFN" , m_tabdims->getNumSatTables());
initSimpleTableContainer<SsfnTable>(deck, "SSFN" , m_tabdims->getNumSatTables());
initSimpleTableContainer<MsfnTable>(deck, "MSFN" , m_tabdims->getNumSatTables());
initSimpleTableContainer<RsvdTable>(deck, "RSVD" , m_eqldims->getNumEquilRegions());
initSimpleTableContainer<RvvdTable>(deck, "RVVD" , m_eqldims->getNumEquilRegions());
{
size_t numEndScaleTables = ParserKeywords::ENDSCALE::NUM_TABLES::defaultValue;
if (deck.hasKeyword<ParserKeywords::ENDSCALE>()) {
const auto& keyword = deck.getKeyword<ParserKeywords::ENDSCALE>();
const auto& record = keyword.getRecord(0);
numEndScaleTables = static_cast<size_t>(record.getItem<ParserKeywords::ENDSCALE::NUM_TABLES>().get< int >(0));
}
initSimpleTableContainer<EnkrvdTable>( deck , "ENKRVD", numEndScaleTables);
initSimpleTableContainer<EnptvdTable>( deck , "ENPTVD", numEndScaleTables);
initSimpleTableContainer<ImkrvdTable>( deck , "IMKRVD", numEndScaleTables);
initSimpleTableContainer<ImptvdTable>( deck , "IMPTVD", numEndScaleTables);
}
{
size_t numMiscibleTables = ParserKeywords::MISCIBLE::NTMISC::defaultValue;
if (deck.hasKeyword<ParserKeywords::MISCIBLE>()) {
const auto& keyword = deck.getKeyword<ParserKeywords::MISCIBLE>();
const auto& record = keyword.getRecord(0);
numMiscibleTables = static_cast<size_t>(record.getItem<ParserKeywords::MISCIBLE::NTMISC>().get< int >(0));
}
initSimpleTableContainer<SorwmisTable>(deck, "SORWMIS", numMiscibleTables);
initSimpleTableContainer<SgcwmisTable>(deck, "SGCWMIS", numMiscibleTables);
initSimpleTableContainer<MiscTable>(deck, "MISC", numMiscibleTables);
initSimpleTableContainer<PmiscTable>(deck, "PMISC", numMiscibleTables);
initSimpleTableContainer<TlpmixpaTable>(deck, "TLPMIXPA", numMiscibleTables);
}
initSimpleTableContainer<PvdgTable>(deck, "PVDG", m_tabdims->getNumPVTTables());
initSimpleTableContainer<PvdoTable>(deck, "PVDO", m_tabdims->getNumPVTTables());
initSimpleTableContainer<PvdsTable>(deck, "PVDS", m_tabdims->getNumPVTTables());
initSimpleTableContainer<OilvisctTable>(deck, "OILVISCT", m_tabdims->getNumPVTTables());
initSimpleTableContainer<WatvisctTable>(deck, "WATVISCT", m_tabdims->getNumPVTTables());
initSimpleTableContainer<PlyadsTable>(deck, "PLYADS", m_tabdims->getNumSatTables());
initSimpleTableContainer<PlyviscTable>(deck, "PLYVISC", m_tabdims->getNumPVTTables());
initSimpleTableContainer<PlydhflfTable>(deck, "PLYDHFLF", m_tabdims->getNumPVTTables());
initPlyrockTables(deck);
initPlymaxTables(deck);
initGasvisctTables(deck);
initRTempTables(deck);
initRocktabTables(deck);
initPlyshlogTables(deck);
}
void TableManager::initRTempTables(const Deck& deck) {
// the temperature vs depth table. the problem here is that
// the TEMPVD (E300) and RTEMPVD (E300 + E100) keywords are
// synonymous, but we want to provide only a single cannonical
// API here, so we jump through some small hoops...
if (deck.hasKeyword("TEMPVD") && deck.hasKeyword("RTEMPVD"))
throw std::invalid_argument("The TEMPVD and RTEMPVD tables are mutually exclusive!");
else if (deck.hasKeyword("TEMPVD"))
initSimpleTableContainer<RtempvdTable>(deck, "TEMPVD", "RTEMPVD", m_eqldims->getNumEquilRegions());
else if (deck.hasKeyword("RTEMPVD"))
initSimpleTableContainer<RtempvdTable>(deck, "RTEMPVD", "RTEMPVD" , m_eqldims->getNumEquilRegions());
}
void TableManager::initGasvisctTables(const Deck& deck) {
const std::string keywordName = "GASVISCT";
size_t numTables = m_tabdims->getNumPVTTables();
if (!deck.hasKeyword(keywordName))
return; // the table is not featured by the deck...
auto& container = forceGetTables(keywordName , numTables);
if (deck.count(keywordName) > 1) {
complainAboutAmbiguousKeyword(deck, keywordName);
return;
}
const auto& tableKeyword = deck.getKeyword(keywordName);
for (size_t tableIdx = 0; tableIdx < tableKeyword.size(); ++tableIdx) {
const auto& tableRecord = tableKeyword.getRecord( tableIdx );
const auto& dataItem = tableRecord.getItem( 0 );
if (dataItem.size() > 0) {
std::shared_ptr<GasvisctTable> table = std::make_shared<GasvisctTable>( deck , dataItem );
container.addTable( tableIdx , table );
}
}
}
void TableManager::initPlyshlogTables(const Deck& deck) {
const std::string keywordName = "PLYSHLOG";
if (!deck.hasKeyword(keywordName)) {
return;
}
if (!deck.count(keywordName)) {
complainAboutAmbiguousKeyword(deck, keywordName);
return;
}
size_t numTables = m_tabdims->getNumPVTTables();
auto& container = forceGetTables(keywordName , numTables);
const auto& tableKeyword = deck.getKeyword(keywordName);
if (tableKeyword.size() > 2) {
std::string msg = "The Parser does currently NOT support the alternating record schema used in PLYSHLOG";
throw std::invalid_argument( msg );
}
for (size_t tableIdx = 0; tableIdx < tableKeyword.size(); tableIdx += 2) {
const auto& indexRecord = tableKeyword.getRecord( tableIdx );
const auto& dataRecord = tableKeyword.getRecord( tableIdx + 1);
const auto& dataItem = dataRecord.getItem( 0 );
if (dataItem.size() > 0) {
std::shared_ptr<PlyshlogTable> table = std::make_shared<PlyshlogTable>(indexRecord , dataRecord);
container.addTable( tableIdx , table );
}
}
}
void TableManager::initPlyrockTables(const Deck& deck) {
size_t numTables = m_tabdims->getNumSatTables();
const std::string keywordName = "PLYROCK";
if (!deck.hasKeyword(keywordName)) {
return;
}
if (!deck.count(keywordName)) {
complainAboutAmbiguousKeyword(deck, keywordName);
return;
}
const auto& keyword = deck.getKeyword<ParserKeywords::PLYROCK>();
auto& container = forceGetTables(keywordName , numTables);
for (size_t tableIdx = 0; tableIdx < keyword.size(); ++tableIdx) {
const auto& tableRecord = keyword.getRecord( tableIdx );
std::shared_ptr<PlyrockTable> table = std::make_shared<PlyrockTable>(tableRecord);
container.addTable( tableIdx , table );
}
}
void TableManager::initPlymaxTables(const Deck& deck) {
size_t numTables = m_regdims->getNPLMIX();
const std::string keywordName = "PLYMAX";
if (!deck.hasKeyword(keywordName)) {
return;
}
if (!deck.count(keywordName)) {
complainAboutAmbiguousKeyword(deck, keywordName);
return;
}
const auto& keyword = deck.getKeyword<ParserKeywords::PLYMAX>();
auto& container = forceGetTables(keywordName , numTables);
for (size_t tableIdx = 0; tableIdx < keyword.size(); ++tableIdx) {
const auto& tableRecord = keyword.getRecord( tableIdx );
std::shared_ptr<PlymaxTable> table = std::make_shared<PlymaxTable>( tableRecord );
container.addTable( tableIdx , table );
}
}
void TableManager::initRocktabTables(const Deck& deck) {
if (!deck.hasKeyword("ROCKTAB"))
return; // ROCKTAB is not featured by the deck...
if (deck.count("ROCKTAB") > 1) {
complainAboutAmbiguousKeyword(deck, "ROCKTAB");
return;
}
const auto& rockcompKeyword = deck.getKeyword<ParserKeywords::ROCKCOMP>();
const auto& record = rockcompKeyword.getRecord( 0 );
size_t numTables = record.getItem<ParserKeywords::ROCKCOMP::NTROCC>().get< int >(0);
auto& container = forceGetTables("ROCKTAB" , numTables);
const auto rocktabKeyword = deck.getKeyword("ROCKTAB");
bool isDirectional = deck.hasKeyword<ParserKeywords::RKTRMDIR>();
bool useStressOption = false;
if (deck.hasKeyword<ParserKeywords::ROCKOPTS>()) {
const auto rockoptsKeyword = deck.getKeyword<ParserKeywords::ROCKOPTS>();
const auto& rockoptsRecord = rockoptsKeyword.getRecord(0);
const auto& item = rockoptsRecord.getItem<ParserKeywords::ROCKOPTS::METHOD>();
useStressOption = (item.getTrimmedString(0) == "STRESS");
}
for (size_t tableIdx = 0; tableIdx < rocktabKeyword.size(); ++tableIdx) {
const auto& tableRecord = rocktabKeyword.getRecord( tableIdx );
const auto& dataItem = tableRecord.getItem( 0 );
if (dataItem.size() > 0) {
std::shared_ptr<RocktabTable> table = std::make_shared<RocktabTable>( dataItem , isDirectional, useStressOption );
container.addTable( tableIdx , table );
}
}
}
void TableManager::initVFPProdTables(const Deck& deck,
std::map<int, VFPProdTable>& tableMap) {
if (!deck.hasKeyword(ParserKeywords::VFPPROD::keywordName)) {
return;
}
int num_tables = deck.count(ParserKeywords::VFPPROD::keywordName);
const auto& keywords = deck.getKeywordList<ParserKeywords::VFPPROD>();
const auto& unit_system = deck.getActiveUnitSystem();
for (int i=0; i<num_tables; ++i) {
const auto& keyword = *keywords[i];
VFPProdTable table;
table.init(keyword, unit_system);
m_messages.appendMessages(table.getMessageContainer());
//Check that the table in question has a unique ID
int table_id = table.getTableNum();
if (tableMap.find(table_id) == tableMap.end()) {
tableMap.insert(std::make_pair(table_id, std::move(table)));
}
else {
throw std::invalid_argument("Duplicate table numbers for VFPPROD found");
}
}
}
void TableManager::initVFPInjTables(const Deck& deck,
std::map<int, VFPInjTable>& tableMap) {
if (!deck.hasKeyword(ParserKeywords::VFPINJ::keywordName)) {
return;
}
int num_tables = deck.count(ParserKeywords::VFPINJ::keywordName);
const auto& keywords = deck.getKeywordList<ParserKeywords::VFPINJ>();
const auto& unit_system = deck.getActiveUnitSystem();
for (int i=0; i<num_tables; ++i) {
const auto& keyword = *keywords[i];
VFPInjTable table;
table.init(keyword, unit_system);
//Check that the table in question has a unique ID
int table_id = table.getTableNum();
if (tableMap.find(table_id) == tableMap.end()) {
tableMap.insert(std::make_pair(table_id, std::move(table)));
}
else {
throw std::invalid_argument("Duplicate table numbers for VFPINJ found");
}
}
}
std::shared_ptr<const Tabdims> TableManager::getTabdims() const {
return m_tabdims;
}
/*
const std::vector<SwofTable>& TableManager::getSwofTables() const {
return m_swofTables;
}
*/
const TableContainer& TableManager::getSwofTables() const {
return getTables("SWOF");
}
const TableContainer& TableManager::getSgwfnTables() const {
return getTables("SGWFN");
}
const TableContainer& TableManager::getSlgofTables() const {
return getTables("SLGOF");
}
const TableContainer& TableManager::getSgofTables() const {
return getTables("SGOF");
}
const TableContainer& TableManager::getSof2Tables() const {
return getTables("SOF2");
}
const TableContainer& TableManager::getSof3Tables() const {
return getTables("SOF3");
}
const TableContainer& TableManager::getSwfnTables() const {
return getTables("SWFN");
}
const TableContainer& TableManager::getSgfnTables() const {
return getTables("SGFN");
}
const TableContainer& TableManager::getSsfnTables() const {
return getTables("SSFN");
}
const TableContainer& TableManager::getRsvdTables() const {
return getTables("RSVD");
}
const TableContainer& TableManager::getRvvdTables() const {
return getTables("RVVD");
}
const TableContainer& TableManager::getEnkrvdTables() const {
return getTables("ENKRVD");
}
const TableContainer& TableManager::getEnptvdTables() const {
return getTables("ENPTVD");
}
const TableContainer& TableManager::getImkrvdTables() const {
return getTables("IMKRVD");
}
const TableContainer& TableManager::getImptvdTables() const {
return getTables("IMPTVD");
}
const TableContainer& TableManager::getPvdgTables() const {
return getTables("PVDG");
}
const TableContainer& TableManager::getPvdoTables() const {
return getTables("PVDO");
}
const TableContainer& TableManager::getPvdsTables() const {
return getTables("PVDS");
}
const TableContainer& TableManager::getOilvisctTables() const {
return getTables("OILVISCT");
}
const TableContainer& TableManager::getWatvisctTables() const {
return getTables("WATVISCT");
}
const TableContainer& TableManager::getGasvisctTables() const {
return getTables("GASVISCT");
}
const TableContainer& TableManager::getRtempvdTables() const {
return getTables("RTEMPVD");
}
const TableContainer& TableManager::getRocktabTables() const {
return getTables("ROCKTAB");
}
const TableContainer& TableManager::getPlyadsTables() const {
return getTables("PLYADS");
}
const TableContainer& TableManager::getPlyviscTables() const {
return getTables("PLYVISC");
}
const TableContainer& TableManager::getPlydhflfTables() const {
return getTables("PLYDHFL");
}
const TableContainer& TableManager::getPlymaxTables() const {
return getTables("PLYMAX");
}
const TableContainer& TableManager::getPlyrockTables() const {
return getTables("PLYROCK");
}
const TableContainer& TableManager::getPlyshlogTables() const {
return getTables("PLYSHLOG");
}
const std::vector<PvtgTable>& TableManager::getPvtgTables() const {
return m_pvtgTables;
}
const std::vector<PvtoTable>& TableManager::getPvtoTables() const {
return m_pvtoTables;
}
const TableContainer& TableManager::getMsfnTables() const {
return getTables("MSFN");
}
const TableContainer& TableManager::getPmiscTables() const {
return getTables("PMISC");
}
const TableContainer& TableManager::getMiscTables() const {
return getTables("MISC");
}
const TableContainer& TableManager::getSgcwmisTables() const {
return getTables("SGCWMIS");
}
const TableContainer& TableManager::getSorwmisTables() const {
return getTables("SORWMIS");
}
const TableContainer& TableManager::getTlpmixpaTables() const {
return getTables("TLPMIXPA");
}
const std::map<int, VFPProdTable>& TableManager::getVFPProdTables() const {
return m_vfpprodTables;
}
const std::map<int, VFPInjTable>& TableManager::getVFPInjTables() const {
return m_vfpinjTables;
}
bool TableManager::useImptvd() const {
return hasImptvd;
}
bool TableManager::useEnptvd() const {
return hasEnptvd;
}
bool TableManager::useEqlnum() const {
return hasEqlnum;
}
const MessageContainer& TableManager::getMessageContainer() const {
return m_messages;
}
MessageContainer& TableManager::getMessageContainer() {
return m_messages;
}
void TableManager::complainAboutAmbiguousKeyword(const Deck& deck, const std::string& keywordName) {
m_messages.error("The " + keywordName + " keyword must be unique in the deck. Ignoring all!");
const auto& keywords = deck.getKeywordList(keywordName);
for (size_t i = 0; i < keywords.size(); ++i) {
std::string msg = "Ambiguous keyword "+keywordName+" defined here";
m_messages.error(keywords[i]->getFileName(), msg, keywords[i]->getLineNumber());
}
}
}