diff --git a/opm/parser/eclipse/EclipseState/Grid/MULTREGTScanner.hpp b/opm/parser/eclipse/EclipseState/Grid/MULTREGTScanner.hpp index 3c7565440..420c1e6b5 100644 --- a/opm/parser/eclipse/EclipseState/Grid/MULTREGTScanner.hpp +++ b/opm/parser/eclipse/EclipseState/Grid/MULTREGTScanner.hpp @@ -76,15 +76,36 @@ namespace Opm { class MULTREGTScanner { public: + using ExternalSearchMap = std::map, int>>; + + MULTREGTScanner() = default; + MULTREGTScanner(const MULTREGTScanner& data); MULTREGTScanner(const GridDims& grid, const FieldPropsManager* fp_arg, const std::vector< const DeckKeyword* >& keywords); + MULTREGTScanner(const std::array& size, + const std::vector& records, + const ExternalSearchMap& searchMap, + const std::map>& region, + const std::string& defaultRegion); + double getRegionMultiplier(size_t globalCellIdx1, size_t globalCellIdx2, FaceDir::DirEnum faceDir) const; + std::array getSize() const; + const std::vector& getRecords() const; + ExternalSearchMap getSearchMap() const; + const std::map>& getRegions() const; + const std::string& getDefaultRegion() const; + + bool operator==(const MULTREGTScanner& data) const; + MULTREGTScanner& operator=(const MULTREGTScanner& data); + private: + void constructSearchMap(const ExternalSearchMap& searchMap); + void addKeyword( const DeckKeyword& deckKeyword, const std::string& defaultRegion); void assertKeywordSupported(const DeckKeyword& deckKeyword); - std::size_t nx,ny,nz; + std::size_t nx = 0,ny = 0, nz = 0; const FieldPropsManager* fp = nullptr; std::vector< MULTREGTRecord > m_records; std::map m_searchMap; diff --git a/src/opm/parser/eclipse/EclipseState/Grid/MULTREGTScanner.cpp b/src/opm/parser/eclipse/EclipseState/Grid/MULTREGTScanner.cpp index 4ffee4dc0..3c79b2942 100644 --- a/src/opm/parser/eclipse/EclipseState/Grid/MULTREGTScanner.cpp +++ b/src/opm/parser/eclipse/EclipseState/Grid/MULTREGTScanner.cpp @@ -155,6 +155,27 @@ std::vector unique(const std::vector data) { } + MULTREGTScanner::MULTREGTScanner(const std::array& size, + const std::vector& records, + const ExternalSearchMap& searchMap, + const std::map>& region, + const std::string& defaultRegion) : + nx(size[0]), + ny(size[1]), + nz(size[2]), + m_records(records), + regions(region), + default_region(defaultRegion) + { + constructSearchMap(searchMap); + } + + + MULTREGTScanner::MULTREGTScanner(const MULTREGTScanner& data) { + *this = data; + } + + void MULTREGTScanner::assertKeywordSupported( const DeckKeyword& deckKeyword) { for (const auto& deckRecord : deckKeyword) { const auto& srcItem = deckRecord.getItem("SRC_REGION"); @@ -275,4 +296,69 @@ std::vector unique(const std::vector data) { } return 1; } + + std::array MULTREGTScanner::getSize() const { + return {nx, ny, nz}; + } + + const std::vector& MULTREGTScanner::getRecords() const { + return m_records; + } + + const std::map>& MULTREGTScanner::getRegions() const { + return regions; + } + + const std::string& MULTREGTScanner::getDefaultRegion() const { + return default_region; + } + + MULTREGTScanner::ExternalSearchMap MULTREGTScanner::getSearchMap() const { + ExternalSearchMap result; + for (const auto& it : m_searchMap) { + std::map, int> res; + for (const auto& it2 : it.second) { + auto ffunc = [&](const Opm::MULTREGTRecord& a) + { + return &a == it2.second; + }; + auto rIt = std::find_if(m_records.begin(), m_records.end(), ffunc); + res[it2.first] = std::distance(m_records.begin(), rIt); + } + result[it.first] = res; + } + return result; + } + + void MULTREGTScanner::constructSearchMap(const ExternalSearchMap& searchMap) { + for (const auto& it : searchMap) { + std::map, const Opm::MULTREGTRecord*> res; + for (const auto& it2 : it.second) { + res[it2.first] = &m_records[it2.second]; + } + m_searchMap.insert({it.first, res}); + } + } + + bool MULTREGTScanner::operator==(const MULTREGTScanner& data) const { + return this->getSize() == data.getSize() && + this->getRecords() == data.getRecords() && + this->getRegions() == data.getRegions() && + this->getSearchMap() == data.getSearchMap() && + this->getDefaultRegion() == data.getDefaultRegion(); + } + + MULTREGTScanner& MULTREGTScanner::operator=(const MULTREGTScanner& data) { + nx = data.nx; + ny = data.ny; + nz = data.nz; + fp = data.fp; + m_records = data.m_records; + regions = data.regions; + default_region = data.default_region; + m_searchMap.clear(); + constructSearchMap(data.getSearchMap()); + + return *this; + } }