Merge pull request #1422 from akva2/noecl_flush_prestate

More serialization preparation
This commit is contained in:
Joakim Hove 2020-01-22 06:30:57 +01:00 committed by GitHub
commit 51daf43cef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 259 additions and 21 deletions

View File

@ -35,7 +35,11 @@ namespace Opm {
class EclipseConfig
{
public:
EclipseConfig() = default;
EclipseConfig(const Deck& deck, const ParseContext& parseContext, ErrorGuard& errors);
EclipseConfig(const IOConfig& ioConfig,
const InitConfig& initConfig,
const RestartConfig& restartConfig);
const InitConfig& init() const;
const IOConfig& io() const;
@ -44,9 +48,11 @@ namespace Opm {
const InitConfig& getInitConfig() const;
const RestartConfig& getRestartConfig() const;
bool operator==(const EclipseConfig& data) const;
private:
IOConfig m_ioConfig;
const InitConfig m_initConfig;
InitConfig m_initConfig;
RestartConfig m_restartConfig;
};
}

View File

@ -32,7 +32,11 @@ namespace Opm {
class Fault {
public:
Fault() = default;
explicit Fault(const std::string& faultName);
Fault(const std::string& name,
double transMult,
const std::vector<FaultFace>& faceList);
const std::string& getName() const;
void setTransMult(double transMult);
@ -40,13 +44,14 @@ public:
void addFace( FaultFace );
std::vector< FaultFace >::const_iterator begin() const;
std::vector< FaultFace >::const_iterator end() const;
const std::vector<FaultFace>& getFaceList() const;
bool operator==( const Fault& rhs ) const;
bool operator!=( const Fault& rhs ) const;
private:
std::string m_name;
double m_transMult;
double m_transMult = 0.0;
std::vector< FaultFace > m_faceList;
};
}

View File

@ -36,6 +36,7 @@ class FaultCollection {
public:
FaultCollection();
FaultCollection(const GRIDSection& gridSection, const GridDims& grid);
FaultCollection(const OrderedMap<std::string, Fault>& faults);
size_t size() const;
bool hasFault(const std::string& faultName) const;
@ -48,6 +49,10 @@ public:
void addFault(const std::string& faultName);
void setTransMult(const std::string& faultName , double transMult);
const OrderedMap<std::string, Fault>& getFaults() const;
bool operator==(const FaultCollection& data) const;
private:
void addFaultFaces(const GridDims& grid,
const DeckRecord& faultRecord,

View File

@ -29,22 +29,25 @@ namespace Opm {
class FaultFace {
public:
FaultFace() = default;
FaultFace(size_t nx , size_t ny , size_t nz,
size_t I1 , size_t I2,
size_t J1 , size_t J2,
size_t K1 , size_t K2,
FaceDir::DirEnum faceDir);
FaultFace(const std::vector<size_t>& indices, FaceDir::DirEnum faceDir);
std::vector<size_t>::const_iterator begin() const;
std::vector<size_t>::const_iterator end() const;
FaceDir::DirEnum getDir() const;
const std::vector<size_t>& getIndices() const;
bool operator==( const FaultFace& rhs ) const;
bool operator!=( const FaultFace& rhs ) const;
private:
static void checkCoord(size_t dim , size_t l1 , size_t l2);
FaceDir::DirEnum m_faceDir;
FaceDir::DirEnum m_faceDir = FaceDir::XPlus;
std::vector<size_t> m_indexList;
};

View File

@ -57,6 +57,15 @@ namespace Opm {
int directions;
MULTREGT::NNCBehaviourEnum nnc_behaviour;
std::string region_name;
bool operator==(const MULTREGTRecord& data) const {
return src_value == data.src_value &&
target_value == data.target_value &&
trans_mult == data.trans_mult &&
directions == data.directions &&
nnc_behaviour == data.nnc_behaviour &&
region_name == data.region_name;
}
};
typedef std::map< std::pair<int , int> , const MULTREGTRecord * > MULTREGTSearchMap;
@ -67,16 +76,37 @@ namespace Opm {
class MULTREGTScanner {
public:
using ExternalSearchMap = std::map<std::string, std::map<std::pair<int,int>, int>>;
MULTREGTScanner() = default;
MULTREGTScanner(const MULTREGTScanner& data);
MULTREGTScanner(const GridDims& grid,
const FieldPropsManager& fp_arg,
const FieldPropsManager* fp_arg,
const std::vector< const DeckKeyword* >& keywords);
MULTREGTScanner(const std::array<size_t,3>& size,
const std::vector<MULTREGTRecord>& records,
const ExternalSearchMap& searchMap,
const std::map<std::string, std::vector<int>>& region,
const std::string& defaultRegion);
double getRegionMultiplier(size_t globalCellIdx1, size_t globalCellIdx2, FaceDir::DirEnum faceDir) const;
std::array<size_t,3> getSize() const;
const std::vector<MULTREGTRecord>& getRecords() const;
ExternalSearchMap getSearchMap() const;
const std::map<std::string, std::vector<int>>& 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;
const FieldPropsManager& fp;
std::size_t nx = 0,ny = 0, nz = 0;
const FieldPropsManager* fp = nullptr;
std::vector< MULTREGTRecord > m_records;
std::map<std::string , MULTREGTSearchMap> m_searchMap;
std::map<std::string, std::vector<int>> regions;

View File

@ -47,7 +47,13 @@ namespace Opm {
class TransMult {
public:
TransMult() = default;
TransMult(const GridDims& dims, const Deck& deck, const FieldPropsManager& fp);
TransMult(const std::array<size_t,3>& size,
const std::map<FaceDir::DirEnum, std::vector<double>>& trans,
const std::map<FaceDir::DirEnum, std::string>& names,
const MULTREGTScanner& scanner);
double getMultiplier(size_t globalIndex, FaceDir::DirEnum faceDir) const;
double getMultiplier(size_t i , size_t j , size_t k, FaceDir::DirEnum faceDir) const;
double getRegionMultiplier( size_t globalCellIndex1, size_t globalCellIndex2, FaceDir::DirEnum faceDir) const;
@ -55,6 +61,13 @@ namespace Opm {
void applyMULTFLT(const FaultCollection& faults);
void applyMULTFLT(const Fault& fault);
std::array<size_t,3> getSize() const;
const std::map<FaceDir::DirEnum, std::vector<double>>& getTrans() const;
const std::map<FaceDir::DirEnum, std::string>& getNames() const;
const MULTREGTScanner& getScanner() const;
bool operator==(const TransMult& data) const;
private:
size_t getGlobalIndex(size_t i , size_t j , size_t k) const;
void assertIJK(size_t i , size_t j , size_t k) const;
@ -62,7 +75,7 @@ namespace Opm {
bool hasDirectionProperty(FaceDir::DirEnum faceDir) const;
std::vector<double>& getDirectionProperty(FaceDir::DirEnum faceDir);
size_t m_nx , m_ny , m_nz;
size_t m_nx = 0, m_ny = 0, m_nz = 0;
std::map<FaceDir::DirEnum , std::vector<double> > m_trans;
std::map<FaceDir::DirEnum , std::string> m_names;
MULTREGTScanner m_multregtScanner;

View File

@ -36,6 +36,16 @@ namespace Opm {
}
EclipseConfig::EclipseConfig(const IOConfig& ioConfig,
const InitConfig& initConfig,
const RestartConfig& restartConfig) :
m_ioConfig(ioConfig),
m_initConfig(initConfig),
m_restartConfig(restartConfig)
{
}
const InitConfig& EclipseConfig::init() const {
return m_initConfig;
}
@ -62,4 +72,10 @@ namespace Opm {
return init();
}
bool EclipseConfig::operator==(const EclipseConfig& data) const {
return this->init() == data.init() &&
this->io() == data.io() &&
this->restart() == data.restart();
}
}

View File

@ -27,6 +27,15 @@ namespace Opm {
{
}
Fault::Fault(const std::string& name,
double transMult,
const std::vector<FaultFace>& faceList) :
m_name(name),
m_transMult(transMult),
m_faceList(faceList)
{
}
const std::string& Fault::getName() const {
return m_name;
@ -67,6 +76,10 @@ namespace Opm {
return !( *this == rhs );
}
const std::vector<FaultFace>& Fault::getFaceList() const {
return m_faceList;
}
}

View File

@ -56,6 +56,11 @@ namespace Opm {
}
}
FaultCollection::FaultCollection(const OrderedMap<std::string, Fault>& faults) :
m_faults(faults)
{
}
void FaultCollection::addFaultFaces(const GridDims& grid,
const DeckRecord& faultRecord,
@ -113,4 +118,12 @@ namespace Opm {
Fault& fault = getFault( faultName );
fault.setTransMult( transMult );
}
const OrderedMap<std::string, Fault>& FaultCollection::getFaults() const {
return m_faults;
}
bool FaultCollection::operator==(const FaultCollection& data) const {
return this->getFaults() == data.getFaults();
}
}

View File

@ -55,6 +55,12 @@ namespace Opm {
}
}
FaultFace::FaultFace(const std::vector<size_t>& indices, FaceDir::DirEnum faceDir)
: m_faceDir(faceDir)
, m_indexList(indices)
{
}
void FaultFace::checkCoord(size_t dim , size_t l1 , size_t l2) {
if (l1 > l2)
@ -89,4 +95,8 @@ namespace Opm {
bool FaultFace::operator!=( const FaultFace& rhs ) const {
return !( *this == rhs );
}
const std::vector<size_t>& FaultFace::getIndices() const {
return m_indexList;
}
}

View File

@ -106,21 +106,21 @@ std::vector<int> unique(const std::vector<int> data) {
interface with the wanted region values.
*/
MULTREGTScanner::MULTREGTScanner(const GridDims& grid,
const FieldPropsManager& fp_arg,
const FieldPropsManager* fp_arg,
const std::vector< const DeckKeyword* >& keywords) :
nx(grid.getNX()),
ny(grid.getNY()),
nz(grid.getNZ()),
fp(fp_arg) {
this->default_region = this->fp.default_region();
this->default_region = this->fp->default_region();
for (size_t idx = 0; idx < keywords.size(); idx++)
this->addKeyword(*keywords[idx] , this->default_region);
MULTREGTSearchMap searchPairs;
for (std::vector<MULTREGTRecord>::const_iterator record = m_records.begin(); record != m_records.end(); ++record) {
const std::string& region_name = record->region_name;
if (this->fp.has<int>( region_name)) {
if (this->fp->has<int>( region_name)) {
int srcRegion = record->src_value;
int targetRegion = record->target_value;
@ -140,7 +140,7 @@ std::vector<int> unique(const std::vector<int> data) {
+ " which is not in the deck");
if (this->regions.count(region_name) == 0)
this->regions[region_name] = this->fp.get_global<int>(region_name);
this->regions[region_name] = this->fp->get_global<int>(region_name);
}
for (auto iter = searchPairs.begin(); iter != searchPairs.end(); ++iter) {
@ -155,6 +155,27 @@ std::vector<int> unique(const std::vector<int> data) {
}
MULTREGTScanner::MULTREGTScanner(const std::array<size_t,3>& size,
const std::vector<MULTREGTRecord>& records,
const ExternalSearchMap& searchMap,
const std::map<std::string, std::vector<int>>& 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");
@ -195,12 +216,12 @@ std::vector<int> unique(const std::vector<int> data) {
region_name = MULTREGT::RegionNameFromDeckValue( regionItem.get<std::string>(0) );
if (srcItem.defaultApplied(0) || srcItem.get<int>(0) < 0)
src_regions = unique(this->fp.get<int>(region_name));
src_regions = unique(this->fp->get<int>(region_name));
else
src_regions.push_back(srcItem.get<int>(0));
if (targetItem.defaultApplied(0) || targetItem.get<int>(0) < 0)
target_regions = unique(fp.get<int>(region_name));
target_regions = unique(fp->get<int>(region_name));
else
target_regions.push_back(targetItem.get<int>(0));
@ -275,4 +296,69 @@ std::vector<int> unique(const std::vector<int> data) {
}
return 1;
}
std::array<size_t,3> MULTREGTScanner::getSize() const {
return {nx, ny, nz};
}
const std::vector<MULTREGTRecord>& MULTREGTScanner::getRecords() const {
return m_records;
}
const std::map<std::string, std::vector<int>>& 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<std::pair<int,int>, 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<std::pair<int,int>, 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;
}
}

View File

@ -43,7 +43,7 @@ namespace Opm {
{ FaceDir::XMinus, "MULTX-" },
{ FaceDir::YMinus, "MULTY-" },
{ FaceDir::ZMinus, "MULTZ-" }}),
m_multregtScanner( dims, fp, deck.getKeywordList( "MULTREGT" ))
m_multregtScanner( dims, &fp, deck.getKeywordList( "MULTREGT" ))
{
EDITSection edit_section(deck);
if (edit_section.hasKeyword("MULTREGT")) {
@ -56,6 +56,20 @@ R"(This deck has the MULTREGT keyword located in the EDIT section. Note that:
}
}
TransMult::TransMult(const std::array<size_t,3>& size,
const std::map<FaceDir::DirEnum, std::vector<double>>& trans,
const std::map<FaceDir::DirEnum, std::string>& names,
const MULTREGTScanner& scanner) :
m_nx(size[0]),
m_ny(size[1]),
m_nz(size[2]),
m_trans(trans),
m_names(names),
m_multregtScanner(scanner)
{
}
void TransMult::assertIJK(size_t i , size_t j , size_t k) const {
if ((i >= m_nx) || (j >= m_ny) || (k >= m_nz))
throw std::invalid_argument("Invalid ijk");
@ -136,4 +150,28 @@ R"(This deck has the MULTREGT keyword located in the EDIT section. Note that:
this->applyMULTFLT(fault);
}
}
std::array<size_t,3> TransMult::getSize() const {
return {m_nx, m_ny, m_nz};
}
const std::map<FaceDir::DirEnum, std::vector<double>>& TransMult::getTrans() const {
return m_trans;
}
const std::map<FaceDir::DirEnum, std::string>& TransMult::getNames() const {
return m_names;
}
const MULTREGTScanner& TransMult::getScanner() const {
return m_multregtScanner;
}
bool TransMult::operator==(const TransMult& data) const {
return this->getSize() == data.getSize() &&
this->getTrans() == data.getTrans() &&
this->getNames() == data.getNames() &&
this->getScanner() == data.getScanner();
}
}

View File

@ -113,19 +113,19 @@ BOOST_AUTO_TEST_CASE(InvalidInput) {
std::vector<const Opm::DeckKeyword*> keywords0;
const auto& multregtKeyword0 = deck.getKeyword( "MULTREGT", 0 );
keywords0.push_back( &multregtKeyword0 );
BOOST_CHECK_THROW( Opm::MULTREGTScanner scanner( grid, fp, keywords0 ); , std::invalid_argument );
BOOST_CHECK_THROW( Opm::MULTREGTScanner scanner( grid, &fp, keywords0 ); , std::invalid_argument );
// Not supported region
std::vector<const Opm::DeckKeyword*> keywords1;
const auto& multregtKeyword1 = deck.getKeyword( "MULTREGT", 1 );
keywords1.push_back( &multregtKeyword1 );
BOOST_CHECK_THROW( Opm::MULTREGTScanner scanner( grid, fp, keywords1 ); , std::invalid_argument );
BOOST_CHECK_THROW( Opm::MULTREGTScanner scanner( grid, &fp, keywords1 ); , std::invalid_argument );
// The keyword is ok; but it refers to a region which is not in the deck.
std::vector<const Opm::DeckKeyword*> keywords2;
const auto& multregtKeyword2 = deck.getKeyword( "MULTREGT", 2 );
keywords2.push_back( &multregtKeyword2 );
BOOST_CHECK_THROW( Opm::MULTREGTScanner scanner( grid, fp, keywords2 ); , std::logic_error );
BOOST_CHECK_THROW( Opm::MULTREGTScanner scanner( grid, &fp, keywords2 ); , std::logic_error );
}
@ -180,13 +180,13 @@ BOOST_AUTO_TEST_CASE(NotSupported) {
std::vector<const Opm::DeckKeyword*> keywords0;
const auto& multregtKeyword0 = deck.getKeyword( "MULTREGT", 0 );
keywords0.push_back( &multregtKeyword0 );
BOOST_CHECK_THROW( Opm::MULTREGTScanner scanner( grid, fp, keywords0 ); , std::invalid_argument );
BOOST_CHECK_THROW( Opm::MULTREGTScanner scanner( grid, &fp, keywords0 ); , std::invalid_argument );
// srcValue == targetValue - not supported
std::vector<const Opm::DeckKeyword*> keywords1;
const Opm::DeckKeyword& multregtKeyword1 = deck.getKeyword( "MULTREGT", 1 );
keywords1.push_back( &multregtKeyword1 );
BOOST_CHECK_THROW( Opm::MULTREGTScanner scanner( grid, fp, keywords1 ); , std::invalid_argument );
BOOST_CHECK_THROW( Opm::MULTREGTScanner scanner( grid, &fp, keywords1 ); , std::invalid_argument );
}
static Opm::Deck createDefaultedRegions() {
@ -240,7 +240,7 @@ BOOST_AUTO_TEST_CASE(DefaultedRegions) {
std::vector<const Opm::DeckKeyword*> keywords0;
const auto& multregtKeyword0 = deck.getKeyword( "MULTREGT", 0 );
keywords0.push_back( &multregtKeyword0 );
Opm::MULTREGTScanner scanner0(grid, fp, keywords0);
Opm::MULTREGTScanner scanner0(grid, &fp, keywords0);
BOOST_CHECK_EQUAL( scanner0.getRegionMultiplier(grid.getGlobalIndex(0,0,1), grid.getGlobalIndex(1,0,1), Opm::FaceDir::XPlus ), 1.25);
BOOST_CHECK_EQUAL( scanner0.getRegionMultiplier(grid.getGlobalIndex(1,0,0), grid.getGlobalIndex(2,0,0), Opm::FaceDir::XPlus ), 1.0);
BOOST_CHECK_EQUAL( scanner0.getRegionMultiplier(grid.getGlobalIndex(2,0,1), grid.getGlobalIndex(2,0,0), Opm::FaceDir::ZMinus ), 0.0);
@ -248,7 +248,7 @@ BOOST_AUTO_TEST_CASE(DefaultedRegions) {
std::vector<const Opm::DeckKeyword*> keywords1;
const Opm::DeckKeyword& multregtKeyword1 = deck.getKeyword( "MULTREGT", 1 );
keywords1.push_back( &multregtKeyword1 );
Opm::MULTREGTScanner scanner1(grid, fp, keywords1 );
Opm::MULTREGTScanner scanner1(grid, &fp, keywords1 );
BOOST_CHECK_EQUAL( scanner1.getRegionMultiplier(grid.getGlobalIndex(2,0,0), grid.getGlobalIndex(1,0,0), Opm::FaceDir::XMinus ), 0.75);
BOOST_CHECK_EQUAL( scanner1.getRegionMultiplier(grid.getGlobalIndex(2,0,0), grid.getGlobalIndex(2,0,1), Opm::FaceDir::ZPlus), 0.75);
}