SummaryConfig does not require EclipseState

Rewrite construction to accept EclipseState components instead of the
full state. Enables having SummaryConfig as a member in EclipseState.
This commit is contained in:
Jørgen Kvalsvik
2016-04-29 13:13:23 +02:00
parent 28ae15cf0f
commit ee8710d3cb
2 changed files with 49 additions and 32 deletions

View File

@@ -23,6 +23,7 @@
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
#include <opm/parser/eclipse/Deck/Section.hpp>
#include <opm/parser/eclipse/EclipseState/Eclipse3DProperties.hpp>
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
#include <opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Completion.hpp>
@@ -38,6 +39,7 @@
#include <algorithm>
#include <array>
#include <functional>
namespace Opm {
@@ -52,30 +54,29 @@ namespace Opm {
static inline std::vector< ERT::smspec_node > keywordWG(
ecl_smspec_var_type var_type,
const DeckKeyword& keyword,
const EclipseState& es ) {
const Schedule& schedule ) {
const auto mknode = [&keyword,var_type]( const std::string& name ) {
return ERT::smspec_node( var_type, name, keyword.name() );
};
const auto find = []( ecl_smspec_var_type v, const EclipseState& est ) {
const auto find = []( ecl_smspec_var_type v, const Schedule& sc ) {
if( v == ECL_SMSPEC_WELL_VAR )
return fun::map( wellName, est.getSchedule()->getWells() );
return fun::map( wellName, sc.getWells() );
else
return fun::map( groupName, est.getSchedule()->getGroups() );
return fun::map( groupName, sc.getGroups() );
};
const auto& item = keyword.getDataRecord().getDataItem();
const auto wgnames = item.size() > 0 && item.hasValue( 0 )
? item.getData< std::string >()
: find( var_type, es );
: find( var_type, schedule );
return fun::map( mknode, wgnames );
}
static inline std::vector< ERT::smspec_node > keywordF(
const DeckKeyword& keyword,
const EclipseState& /* es */ ) {
const DeckKeyword& keyword ) {
std::vector< ERT::smspec_node > res;
res.push_back( ERT::smspec_node( keyword.name() ) );
@@ -106,11 +107,9 @@ namespace Opm {
static inline std::vector< ERT::smspec_node > keywordB(
const DeckKeyword& keyword,
const EclipseState& es ) {
std::array< int, 3 > dims ) {
auto dims = dimensions( *es.getInputGrid() );
const auto mkrecord = [&dims,&keyword]( const DeckRecord& record ) {
const auto mkrecord = [dims,&keyword]( const DeckRecord& record ) {
auto ijk = getijk( record );
return ERT::smspec_node( keyword.name(), dims.data(), ijk.data() );
};
@@ -120,36 +119,34 @@ namespace Opm {
static inline std::vector< ERT::smspec_node > keywordR(
const DeckKeyword& keyword,
const EclipseState& es ) {
const Eclipse3DProperties& props,
std::array< int, 3 > dims ) {
auto dims = dimensions( *es.getInputGrid() );
const auto mknode = [&dims,&keyword]( int region ) {
const auto mknode = [dims,&keyword]( int region ) {
return ERT::smspec_node( keyword.name(), dims.data(), region );
};
const auto& item = keyword.getDataRecord().getDataItem();
const auto regions = item.size() > 0 && item.hasValue( 0 )
? item.getData< int >()
: es.getRegions( "FIPNUM" );
: props.getRegions( "FIPNUM" );
return fun::map( mknode, regions );
}
static inline std::vector< ERT::smspec_node > keywordC(
const DeckKeyword& keyword,
const EclipseState& es ) {
const Schedule& schedule,
std::array< int, 3 > dims ) {
std::vector< ERT::smspec_node > nodes;
const auto& keywordstring = keyword.name();
const auto& schedule = es.getSchedule();
const auto last_timestep = schedule->getTimeMap()->last();
auto dims = dimensions( *es.getInputGrid() );
const auto last_timestep = schedule.getTimeMap()->last();
for( const auto& record : keyword ) {
if( record.getItem( 0 ).defaultApplied( 0 ) ) {
for( const auto& well : schedule->getWells() ) {
for( const auto& well : schedule.getWells() ) {
const auto& name = wellName( well );
@@ -178,7 +175,7 @@ namespace Opm {
}
else {
/* well specified, block coordinates defaulted */
for( const auto& completion : *schedule->getWell( name ).getCompletions( last_timestep ) ) {
for( const auto& completion : *schedule.getWell( name ).getCompletions( last_timestep ) ) {
auto ijk = getijk( *completion );
nodes.emplace_back( keywordstring, name, dims.data(), ijk.data() );
}
@@ -189,27 +186,40 @@ namespace Opm {
return nodes;
}
std::vector< ERT::smspec_node > handleKW( const DeckKeyword& keyword, const EclipseState& es ) {
std::vector< ERT::smspec_node > handleKW( const DeckKeyword& keyword,
const Schedule& schedule,
const Eclipse3DProperties& props,
std::array< int, 3 > n_xyz ) {
const auto var_type = ecl_smspec_identify_var_type( keyword.name().c_str() );
switch( var_type ) {
case ECL_SMSPEC_WELL_VAR: /* intentional fall-through */
case ECL_SMSPEC_GROUP_VAR: return keywordWG( var_type, keyword, es );
case ECL_SMSPEC_FIELD_VAR: return keywordF( keyword, es );
case ECL_SMSPEC_BLOCK_VAR: return keywordB( keyword, es );
case ECL_SMSPEC_REGION_VAR: return keywordR( keyword, es );
case ECL_SMSPEC_COMPLETION_VAR: return keywordC( keyword, es );
case ECL_SMSPEC_GROUP_VAR: return keywordWG( var_type, keyword, schedule );
case ECL_SMSPEC_FIELD_VAR: return keywordF( keyword );
case ECL_SMSPEC_BLOCK_VAR: return keywordB( keyword, n_xyz );
case ECL_SMSPEC_REGION_VAR: return keywordR( keyword, props, n_xyz );
case ECL_SMSPEC_COMPLETION_VAR: return keywordC( keyword, schedule, n_xyz );
default: return {};
}
}
SummaryConfig::SummaryConfig( const Deck& deck, const EclipseState& es ) {
SummaryConfig::SummaryConfig( const Deck& deck, const EclipseState& es )
: SummaryConfig( deck,
*es.getSchedule(),
es.get3DProperties(),
dimensions( *es.getInputGrid() ) )
{}
SummaryConfig::SummaryConfig( const Deck& deck,
const Schedule& schedule,
const Eclipse3DProperties& props,
std::array< int, 3 > n_xyz ) {
SUMMARYSection section( deck );
const auto handler = [&es]( const DeckKeyword& kw ) {
return handleKW( kw, es );
};
using namespace std::placeholders;
const auto handler = std::bind( handleKW, _1, schedule, props, n_xyz );
this->keywords = fun::concat( fun::map( handler, section ) );
}

View File

@@ -20,6 +20,7 @@
#ifndef OPM_SUMMARY_CONFIG_HPP
#define OPM_SUMMARY_CONFIG_HPP
#include <array>
#include <vector>
#include <ert/ecl/Smspec.hpp>
@@ -27,14 +28,20 @@
namespace Opm {
class Deck;
class Eclipse3DProperties;
class EclipseState;
class ParserKeyword;
class Schedule;
class SummaryConfig {
public:
typedef std::vector< ERT::smspec_node >::const_iterator const_iterator;
SummaryConfig( const Deck&, const EclipseState& );
SummaryConfig( const Deck&, const Schedule&,
const Eclipse3DProperties&, std::array< int, 3 > );
SummaryConfig( const Deck&, const Schedule&,
const Eclipse3DProperties&, int, int, int );
const_iterator begin() const;
const_iterator end() const;