/* 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 . */ #ifndef OPM_TABLE_MANAGER_HPP #define OPM_TABLE_MANAGER_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Opm { class TableManager { public: TableManager( const Deck& deck ); const TableContainer& getTables( const std::string& tableName ) const; const TableContainer& operator[](const std::string& tableName) const; bool hasTables( const std::string& tableName ) const; std::shared_ptr getTabdims() const; const TableContainer& getSwofTables() const; const TableContainer& getSgwfnTables() const; const TableContainer& getSof2Tables() const; const TableContainer& getSof3Tables() const; const TableContainer& getSgofTables() const; const TableContainer& getSlgofTables() const; const TableContainer& getSwfnTables() const; const TableContainer& getSgfnTables() const; const TableContainer& getSsfnTables() const; const TableContainer& getRsvdTables() const; const TableContainer& getRvvdTables() const; const TableContainer& getEnkrvdTables() const; const TableContainer& getEnptvdTables() const; const TableContainer& getImkrvdTables() const; const TableContainer& getImptvdTables() const; const TableContainer& getPvdgTables() const; const TableContainer& getPvdoTables() const; const TableContainer& getPvdsTables() const; const TableContainer& getWatvisctTables() const; const TableContainer& getOilvisctTables() const; const TableContainer& getGasvisctTables() const; const TableContainer& getRtempvdTables() const; const TableContainer& getRocktabTables() const; const TableContainer& getPlyadsTables() const; const TableContainer& getPlyviscTables() const; const TableContainer& getPlydhflfTables() const; const TableContainer& getPlymaxTables() const; const TableContainer& getPlyrockTables() const; const TableContainer& getPlyshlogTables() const; const TableContainer& getSorwmisTables() const; const TableContainer& getSgcwmisTables() const; const TableContainer& getMiscTables() const; const std::vector& getPvtgTables() const; const std::vector& getPvtoTables() const; const std::map& getVFPProdTables() const; const std::map& getVFPInjTables() const; private: TableContainer& forceGetTables( const std::string& tableName , size_t numTables); void complainAboutAmbiguousKeyword(const Deck& deck, const std::string& keywordName) const; void addTables( const std::string& tableName , size_t numTables); void initSimpleTables(const Deck& deck); void initRTempTables(const Deck& deck); void initDims(const Deck& deck); void initRocktabTables(const Deck& deck); void initGasvisctTables(const Deck& deck); void initVFPProdTables(const Deck& deck, std::map& tableMap); void initVFPInjTables(const Deck& deck, std::map& tableMap); void initPlymaxTables(const Deck& deck); void initPlyrockTables(const Deck& deck); void initPlyshlogTables(const Deck& deck); template void initSimpleTableContainer(const Deck& deck, const std::string& keywordName, const std::string& tableName, size_t numTables) { if (!deck.hasKeyword(keywordName)) return; // the table is not featured by the deck... auto& container = forceGetTables(tableName , numTables); if (deck.numKeywords(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 table = std::make_shared(); table->init(dataItem); container.addTable( tableIdx , table ); } } } template void initSimpleTableContainer(const Deck& deck, const std::string& keywordName, size_t numTables) { initSimpleTableContainer(deck , keywordName , keywordName , numTables); } template void initSimpleTable(const Deck& deck, const std::string& keywordName, std::vector& tableVector) { if (!deck.hasKeyword(keywordName)) return; // the table is not featured by the deck... if (deck.numKeywords(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) { // for simple tables, an empty record indicates that the previous table // should be copied... if (tableIdx == 0) { std::string msg = "The first table for keyword "+keywordName+" must be explicitly defined! Ignoring keyword"; OpmLog::addMessage(Log::MessageType::Warning , Log::fileMessage( tableKeyword->getFileName(), tableKeyword->getLineNumber(), msg)); return; } tableVector.push_back(tableVector.back()); continue; } tableVector.push_back(TableType()); tableVector[tableIdx].init(dataItem); } } template void initFullTables(const Deck& deck, const std::string& keywordName, std::vector& tableVector) { if (!deck.hasKeyword(keywordName)) return; // the table is not featured by the deck... if (deck.numKeywords(keywordName) > 1) { complainAboutAmbiguousKeyword(deck, keywordName); return; } const auto& tableKeyword = deck.getKeyword(keywordName); int numTables = TableType::numTables(tableKeyword); for (int tableIdx = 0; tableIdx < numTables; ++tableIdx) { tableVector.push_back(TableType()); tableVector[tableIdx].init(tableKeyword, tableIdx); } } std::map m_simpleTables; std::map m_vfpprodTables; std::map m_vfpinjTables; std::vector m_pvtgTables; std::vector m_pvtoTables; std::shared_ptr m_regdims; std::shared_ptr m_tabdims; std::shared_ptr m_eqldims; }; } #endif