diff --git a/opm/output/eclipse/EclipseIO.hpp b/opm/output/eclipse/EclipseIO.hpp index 1d9bdb5bb..92138c2a4 100644 --- a/opm/output/eclipse/EclipseIO.hpp +++ b/opm/output/eclipse/EclipseIO.hpp @@ -176,7 +176,7 @@ public: data::Solution, data::Wells, std::map misc_summary_values, - std::map> region_summary_values = {}, + std::map> region_summary_values, std::map> extra_restart = {}, bool write_double = false); diff --git a/opm/output/eclipse/Summary.hpp b/opm/output/eclipse/Summary.hpp index 953d319b8..676a92702 100644 --- a/opm/output/eclipse/Summary.hpp +++ b/opm/output/eclipse/Summary.hpp @@ -59,7 +59,6 @@ class Summary { const std::map& misc_values, const std::map>& region_values = {}); - void set_initial( const data::Solution& ); void write(); ~Summary(); @@ -73,8 +72,6 @@ class Summary { std::unique_ptr< keyword_handlers > handlers; const ecl_sum_tstep_type* prev_tstep = nullptr; double prev_time_elapsed = 0; - double initial_oip = 0.0; - const std::vector porv; }; } diff --git a/src/opm/output/eclipse/EclipseIO.cpp b/src/opm/output/eclipse/EclipseIO.cpp index 3dd7ed017..d78cef66b 100644 --- a/src/opm/output/eclipse/EclipseIO.cpp +++ b/src/opm/output/eclipse/EclipseIO.cpp @@ -401,13 +401,6 @@ void EclipseIO::writeInitial( data::Solution simProps, std::mapimpl->writeEGRIDFile( nnc ); } - this->impl->summary.set_initial( simProps ); -} - - -void EclipseIO::overwriteInitialOIP( const data::Solution& simProps ) -{ - this->impl->summary.set_initial( simProps ); } // implementation of the writeTimeStep method @@ -419,7 +412,7 @@ void EclipseIO::writeTimeStep(int report_step, std::map misc_summary_values, std::map> region_summary_values, std::map> extra_restart, - bool write_double) + bool write_double) { if( !this->impl->output_enabled ) diff --git a/src/opm/output/eclipse/Summary.cpp b/src/opm/output/eclipse/Summary.cpp index e9a4910d6..3c51c5770 100644 --- a/src/opm/output/eclipse/Summary.cpp +++ b/src/opm/output/eclipse/Summary.cpp @@ -161,8 +161,6 @@ struct fn_args { const data::Solution& state; const out::RegionCache& regionCache; const EclipseGrid& grid; - double initial_oip; - const std::vector& pv; }; /* Since there are several enums in opm scattered about more-or-less @@ -401,172 +399,6 @@ quantity region_rate( const fn_args& args ) { return { -sum, rate_unit< phase >() }; } -quantity region_sum( const fn_args& args , const std::string& keyword , UnitSystem::measure unit) { - const auto& cells = args.regionCache.cells( args.num ); - if (cells.empty()) - return { 0.0 , unit }; - - double sum = 0; - - if( args.state.count( keyword ) == 0 ) - return { 0.0, unit }; - - const std::vector& sim_value = args.state.data( keyword ); - if (sim_value.size() != args.grid.getNumActive()) { - std::stringstream str; - str << "Wrongly sized data array passed to output for keyword " - << keyword << ", size=" << sim_value.size() << ", expected=" << args.grid.getNumActive() << "."; - throw std::runtime_error(str.str()); - } - - - for (auto cell_index : cells) - sum += sim_value[cell_index]; - - return { sum , unit }; -} - -quantity fpr( const fn_args& args ) { - if( !args.state.has( "PRESSURE" ) ) - return { 0.0, measure::pressure }; - - const auto& p = args.state.data( "PRESSURE" ); - const auto& pv = args.pv; - const bool hasSwat = args.state.has( "SWAT" ); - const auto& swat = hasSwat? args.state.data( "SWAT" ): std::vector(p.size(),0.0); - double fpr = 0.0; - double sum_hcpv = 0.0; - for (size_t cell_index = 0; cell_index < p.size(); ++cell_index) { - double hcs= 1.0; - hcs -= swat[cell_index]; - double hcpv = pv[cell_index]*hcs; - fpr += hcpv * p[cell_index]; - sum_hcpv += hcpv; - } - return { fpr / sum_hcpv, measure::pressure }; -} - -quantity fprp( const fn_args& args ) { - if( !args.state.has( "PRESSURE" ) ) - return { 0.0, measure::pressure }; - - const auto& p = args.state.data( "PRESSURE" ); - const auto& pv = args.pv; - double fprp = 0.0; - double sum_pv = 0.0; - for (size_t cell_index = 0; cell_index < p.size(); ++cell_index) { - fprp += pv[cell_index] * p[cell_index]; - sum_pv += pv[cell_index]; - } - return { fprp / sum_pv, measure::pressure }; -} - -quantity rpr(const fn_args& args) { - - const auto& cells = args.regionCache.cells( args.num ); - if (cells.empty()) - return { 0.0 , measure::pressure }; - - if( !args.state.has( "PRESSURE" ) ) - return { 0.0, measure::pressure }; - - const auto& p = args.state.data( "PRESSURE" ); - const auto& pv = args.pv; - const bool hasSwat = args.state.has( "SWAT" ); - - const auto& swat = hasSwat? args.state.data( "SWAT" ): std::vector(cells.size(),0.0); - double rpr = 0.0; - double sum_hcpv = 0.0; - for (auto cell_index : cells) { - double hcs= 1.0; - hcs -= swat[cell_index]; - double hcpv = pv[cell_index]*hcs; - rpr += hcpv * p[cell_index]; - sum_hcpv += hcpv; - } - return { rpr / sum_hcpv, measure::pressure }; -} - -quantity roip(const fn_args& args) { - return region_sum( args , "OIP", measure::volume ); -} - -quantity rgip(const fn_args& args) { - return region_sum( args , "GIP", measure::volume ); -} - -quantity rwip(const fn_args& args) { - return region_sum( args , "WIP", measure::volume ); -} - -quantity roipl(const fn_args& args) { - return region_sum( args , "OIPL", measure::volume ); -} - -quantity roipg(const fn_args& args) { - return region_sum( args , "OIPG", measure::volume ); -} - -quantity rgipl(const fn_args& args) { - return region_sum( args , "GIPL", measure::volume ); -} - -quantity rgipg(const fn_args& args) { - return region_sum( args , "GIPG", measure::volume ); -} - -quantity fgip( const fn_args& args ) { - quantity zero { 0.0, measure::volume }; - if( !args.state.has( "GIP" ) ) - return zero; - - const auto& cells = args.state.at( "GIP" ).data; - return { std::accumulate( cells.begin(), cells.end(), 0.0 ), - measure::volume }; -} - -quantity fgipg( const fn_args& args ) { - quantity zero { 0.0, measure::volume }; - if( !args.state.has( "GIPG" ) ) - return zero; - - const auto& cells = args.state.at( "GIPG" ).data; - return { std::accumulate( cells.begin(), cells.end(), 0.0 ), - measure::volume }; -} - -quantity foip( const fn_args& args ) { - if( !args.state.has( "OIP" ) ) - return { 0.0, measure::volume }; - - const auto& cells = args.state.at( "OIP" ).data; - return { std::accumulate( cells.begin(), cells.end(), 0.0 ), - measure::volume }; -} - -quantity foipl( const fn_args& args ) { - if( !args.state.has( "OIPL" ) ) - return { 0.0, measure::volume }; - - const auto& cells = args.state.at( "OIPL" ).data; - return { std::accumulate( cells.begin(), cells.end(), 0.0 ), - measure::volume }; -} - -quantity fwip( const fn_args& args ) { - if( !args.state.has( "WIP" ) ) - return { 0.0, measure::volume }; - - const auto& cells = args.state.at( "WIP" ).data; - return { std::accumulate( cells.begin(), cells.end(), 0.0 ), - measure::volume }; -} - -quantity foe( const fn_args& args ) { - const quantity val = { foip( args ).value, measure::identity }; - return (args.initial_oip - val) / args.initial_oip; -} - quantity bpr( const fn_args& args) { if (!args.state.has("PRESSURE")) return { 0.0 , measure::pressure }; @@ -849,13 +681,6 @@ static const std::unordered_map< std::string, ofun > funs = { { "FVIT", mul( sum( sum( rate< rt::reservoir_water, injector>, rate< rt::reservoir_oil, injector >), rate< rt::reservoir_gas, injector>), duration)}, - { "FOIP", foip }, - { "FOIPL", foipl }, - { "FGIP", fgip }, - { "FGIPG", fgipg }, - { "FWIP", fwip }, - { "FOE", foe }, - { "FWPRH", production_history< Phase::WATER > }, { "FOPRH", production_history< Phase::OIL > }, { "FGPRH", production_history< Phase::GAS > }, @@ -890,19 +715,9 @@ static const std::unordered_map< std::string, ofun > funs = { production_history< Phase::OIL > ) ) }, { "FMWIN", flowing< injector > }, { "FMWPR", flowing< producer > }, - // { "FPR", fpr }, - { "FPRP", fprp }, { "FVPRT", res_vol_production_target }, /* Region properties */ -// { "RPR" , rpr}, -// { "ROIP" , roip}, -// { "ROIPL" , roipl}, -// { "ROIPG" , roipg}, -// { "RGIP" , rgip}, -// { "RGIPL" , rgipl}, -// { "RGIPG" , rgipg}, -// { "RWIP" , rwip}, { "ROIR" , region_rate< rt::oil, injector > }, { "RGIR" , region_rate< rt::gas, injector > }, { "RWIR" , region_rate< rt::wat, injector > }, @@ -1024,8 +839,7 @@ Summary::Summary( const EclipseState& st, const char* basename ) : grid( grid_arg ), regionCache( st.get3DProperties( ) , grid_arg, schedule ), - handlers( new keyword_handlers() ), - porv( st.get3DProperties().getDoubleGridProperty("PORV").compressedCopy(grid_arg)) + handlers( new keyword_handlers() ) { const auto& init_config = st.getInitConfig(); @@ -1056,35 +870,40 @@ Summary::Summary( const EclipseState& st, for( const auto& node : sum ) { const auto* keyword = node.keyword(); - const auto misc_pair = misc_units.find( keyword ); - const auto funs_pair = funs.find( keyword ); - const auto region_pair = region_units.find( keyword ); + const auto misc_pair = misc_units.find( keyword ); + const auto funs_pair = funs.find( keyword ); + const auto region_pair = region_units.find( keyword ); - /* - All summary values of the type ECL_SMSPEC_MISC_VAR must be - passed explicitly in the misc_values map when calling - add_timestep. - */ - if (misc_pair != misc_units.end()) { + /* + All summary values of the type ECL_SMSPEC_MISC_VAR + and ECL_SMSPEC_FIELD_VAR must be passed explicitly + in the misc_values map when calling + add_timestep. + */ + if (misc_pair != misc_units.end()) { - auto* nodeptr = ecl_sum_add_var( this->ecl_sum.get(), - keyword, - node.wgname(), - node.num(), + if ((node.type() != ECL_SMSPEC_FIELD_VAR) && (node.type() != ECL_SMSPEC_MISC_VAR)) { + continue; + } + + auto* nodeptr = ecl_sum_add_var( this->ecl_sum.get(), + keyword, + node.wgname(), + node.num(), st.getUnits().name( misc_pair->second ), - 0 ); + 0 ); - this->handlers->misc_nodes.emplace( keyword, nodeptr ); + this->handlers->misc_nodes.emplace( keyword, nodeptr ); } else if (region_pair != region_units.end()) { - auto* nodeptr = ecl_sum_add_var( this->ecl_sum.get(), - keyword, - node.wgname(), - node.num(), - st.getUnits().name( region_pair->second ), - 0 ); + auto* nodeptr = ecl_sum_add_var( this->ecl_sum.get(), + keyword, + node.wgname(), + node.num(), + st.getUnits().name( region_pair->second ), + 0 ); - this->handlers->region_nodes.emplace( keyword, nodeptr ); + this->handlers->region_nodes.emplace( keyword, nodeptr ); } else if (funs_pair != funs.end()) { @@ -1105,22 +924,20 @@ Summary::Summary( const EclipseState& st, {}, // Well results - data::Wells {}, // Solution::State {}, // Region <-> cell mappings. - this->grid, - this->initial_oip, - {} }; + this->grid}; const auto val = handle( no_args ); - auto* nodeptr = ecl_sum_add_var( this->ecl_sum.get(), - keyword, - node.wgname(), - node.num(), - st.getUnits().name( val.unit ), - 0 ); + auto* nodeptr = ecl_sum_add_var( this->ecl_sum.get(), + keyword, + node.wgname(), + node.num(), + st.getUnits().name( val.unit ), + 0 ); - this->handlers->handlers.emplace_back( nodeptr, handle ); + this->handlers->handlers.emplace_back( nodeptr, handle ); } else { - unsupported_keywords.insert(keyword); + unsupported_keywords.insert(keyword); } } for ( const auto& keyword : unsupported_keywords ) { @@ -1153,9 +970,7 @@ void Summary::add_timestep( int report_step, wells, state, this->regionCache, - this->grid, - this->initial_oip, - this->porv}); + this->grid}); const auto unit_applied_val = es.getUnits().from_si( val.unit, val.value ); const auto res = smspec_node_is_total( f.first ) && prev_tstep @@ -1194,13 +1009,6 @@ void Summary::add_timestep( int report_step, this->prev_time_elapsed = secs_elapsed; } -void Summary::set_initial( const data::Solution& sol ) { - if( !sol.has( "OIP" ) ) return; - - const auto& cells = sol.at( "OIP" ).data; - this->initial_oip = std::accumulate( cells.begin(), cells.end(), 0.0 ); -} - void Summary::write() { ecl_sum_fwrite( this->ecl_sum.get() ); } diff --git a/tests/test_EclipseIO.cpp b/tests/test_EclipseIO.cpp index afb0c65ee..e80cb6216 100644 --- a/tests/test_EclipseIO.cpp +++ b/tests/test_EclipseIO.cpp @@ -342,6 +342,7 @@ BOOST_AUTO_TEST_CASE(EclipseIOIntegration) { first_step - start_time, sol, wells, + {}, {}); diff --git a/tests/test_RFT.cpp b/tests/test_RFT.cpp index 4042c770d..970f4de6b 100755 --- a/tests/test_RFT.cpp +++ b/tests/test_RFT.cpp @@ -145,6 +145,7 @@ BOOST_AUTO_TEST_CASE(test_RFT) { step_time - start_time, createBlackoilState( 2, numCells ), wells, + {}, {}); } @@ -221,6 +222,7 @@ BOOST_AUTO_TEST_CASE(test_RFT2) { step_time - start_time, createBlackoilState( 2, numCells ), wells, + {}, {}); } verifyRFTFile2("TESTRFT.RFT"); diff --git a/tests/test_Summary.cpp b/tests/test_Summary.cpp index b931ee2bf..7f8e28e7b 100644 --- a/tests/test_Summary.cpp +++ b/tests/test_Summary.cpp @@ -805,55 +805,11 @@ BOOST_AUTO_TEST_CASE(field_keywords) { BOOST_CHECK_CLOSE( ggor, ecl_sum_get_field_var( resp, 1, "FGOR" ), 1e-5 ); BOOST_CHECK_CLOSE( ggor, ecl_sum_get_field_var( resp, 1, "FGORH" ), 1e-5 ); - const double foip = 11.0 * 1000 - 2*10; // Cell (1,2,10) is inactive. - const double foipl = 10.0 * 1000 - (2*10 - 1); // Cell (1,2,10) is inactive. - const double fgip = 11.55 * 1000 - 2.1*10; // Cell (1,2,10) is inactive. - const double fgipg = 12.55 * 1000 - (2.1*10 + 1); // Cell (1,2,10) is inactive. - const double fwip = 12.1 * 1000 - 2.2*10; // Cell (1,2,10) is inactive. - BOOST_CHECK_CLOSE( foip, ecl_sum_get_field_var( resp, 1, "FOIP" ), 1e-5 ); - BOOST_CHECK_CLOSE( foipl, ecl_sum_get_field_var( resp, 1, "FOIPL" ), 1e-5 ); - BOOST_CHECK_CLOSE( fgip, ecl_sum_get_field_var( resp, 1, "FGIP" ), 1e-5 ); - BOOST_CHECK_CLOSE( fgipg, ecl_sum_get_field_var( resp, 1, "FGIPG" ), 1e-5 ); - BOOST_CHECK_CLOSE( fwip, ecl_sum_get_field_var( resp, 1, "FWIP" ), 1e-5 ); - BOOST_CHECK_EQUAL( 1, ecl_sum_get_field_var( resp, 1, "FMWIN" ) ); BOOST_CHECK_EQUAL( 2, ecl_sum_get_field_var( resp, 1, "FMWPR" ) ); - UnitSystem units( UnitSystem::UnitType::UNIT_TYPE_METRIC ); - const double fpr_si = (5.5 * 1000 - 10) / 999; - const double fpr = units.from_si( UnitSystem::measure::pressure, fpr_si ); - BOOST_CHECK_CLOSE( fpr, ecl_sum_get_field_var( resp, 1, "FPR" ), 1e-5 ); // - - /* in this test, the initial OIP wasn't set */ - BOOST_CHECK_EQUAL( 0.0, ecl_sum_get_field_var( resp, 1, "FOE" ) ); - BOOST_CHECK_EQUAL( 0.0, ecl_sum_get_field_var( resp, 2, "FOE" ) ); } -BOOST_AUTO_TEST_CASE(foe_test) { - setup cfg( "foe" ); - - std::vector< double > oip( cfg.grid.getNumActive(), 12.0 ); - data::Solution sol; - sol.insert( "OIP", UnitSystem::measure::volume, oip, data::TargetType::RESTART_AUXILIARY ); - - out::Summary writer( cfg.es, cfg.config, cfg.grid, cfg.schedule, cfg.name ); - writer.set_initial( sol ); - writer.add_timestep( 1, 2 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer.add_timestep( 1, 5 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer.add_timestep( 2, 10 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer.write(); - - auto res = readsum( cfg.name ); - const auto* resp = res.get(); - - const double oip0 = 12 * cfg.grid.getNumActive(); - const double oip1 = 11.0 * 1000 - 2*10; - const double foe = (oip0 - oip1) / oip0; - BOOST_CHECK_CLOSE( foe, ecl_sum_get_field_var( resp, 1, "FOE" ), 1e-5 ); - BOOST_CHECK_CLOSE( foe, ecl_sum_get_field_var( resp, 2, "FOE" ), 1e-5 ); -} - - BOOST_AUTO_TEST_CASE(report_steps_time) { setup cfg( "test_Summary_report_steps_time" ); @@ -894,54 +850,6 @@ BOOST_AUTO_TEST_CASE(skip_unknown_var) { } - -BOOST_AUTO_TEST_CASE(region_vars) { - setup cfg( "region_vars" ); - - { - out::Summary writer( cfg.es, cfg.config, cfg.grid, cfg.schedule, cfg.name ); - writer.add_timestep( 1, 2 * day, cfg.es, cfg.schedule, cfg.wells, cfg.solution, {}); - writer.add_timestep( 1, 5 * day, cfg.es, cfg.schedule, cfg.wells, cfg.solution, {}); - writer.add_timestep( 2, 10 * day, cfg.es, cfg.schedule, cfg.wells, cfg.solution, {}); - writer.write(); - } - - auto res = readsum( cfg.name ); - const auto* resp = res.get(); - - BOOST_CHECK( ecl_sum_has_general_var( resp , "RPR:1")); - BOOST_CHECK( ecl_sum_has_general_var( resp , "RPR:10")); - BOOST_CHECK( !ecl_sum_has_general_var( resp , "RPR:11")); - UnitSystem units( UnitSystem::UnitType::UNIT_TYPE_METRIC ); - - for (size_t r=1; r <= 10; r++) { - std::string rpr_key = "RPR:" + std::to_string( r ); - std::string roip_key = "ROIP:" + std::to_string( r ); - std::string rwip_key = "RWIP:" + std::to_string( r ); - std::string rgip_key = "RGIP:" + std::to_string( r ); - std::string roipl_key = "ROIPL:" + std::to_string( r ); - std::string roipg_key = "ROIPG:" + std::to_string( r ); - std::string rgipl_key = "RGIPL:" + std::to_string( r ); - std::string rgipg_key = "RGIPG:" + std::to_string( r ); - double area = cfg.grid.getNX() * cfg.grid.getNY(); - - BOOST_CHECK_CLOSE( r * 1.0 , units.to_si( UnitSystem::measure::pressure , ecl_sum_get_general_var( resp, 1, rpr_key.c_str())) , 1e-5); - - // There is one inactive cell in the bottom layer. - if (r == 10) - area -= 1; - - BOOST_CHECK_CLOSE( area * 2*r * 1.0 , units.to_si( UnitSystem::measure::volume , ecl_sum_get_general_var( resp, 1, roip_key.c_str())) , 1e-5); - BOOST_CHECK_CLOSE( area * (2*r - 1) * 1.0 , units.to_si( UnitSystem::measure::volume , ecl_sum_get_general_var( resp, 1, roipl_key.c_str())) , 1e-5); - BOOST_CHECK_CLOSE( area * (2*r + 1 ) * 1.0 , units.to_si( UnitSystem::measure::volume , ecl_sum_get_general_var( resp, 1, roipg_key.c_str())) , 1e-5); - BOOST_CHECK_CLOSE( area * 2.1*r * 1.0 , units.to_si( UnitSystem::measure::volume , ecl_sum_get_general_var( resp, 1, rgip_key.c_str())) , 1e-5); - BOOST_CHECK_CLOSE( area * (2.1*r - 1) * 1.0, units.to_si( UnitSystem::measure::volume , ecl_sum_get_general_var( resp, 1, rgipl_key.c_str())) , 1e-5); - BOOST_CHECK_CLOSE( area * (2.1*r + 1) * 1.0, units.to_si( UnitSystem::measure::volume , ecl_sum_get_general_var( resp, 1, rgipg_key.c_str())) , 1e-5); - BOOST_CHECK_CLOSE( area * 2.2*r * 1.0 , units.to_si( UnitSystem::measure::volume , ecl_sum_get_general_var( resp, 1, rwip_key.c_str())) , 1e-5); - } -} - - BOOST_AUTO_TEST_CASE(region_production) { setup cfg( "region_production" ); @@ -1066,130 +974,6 @@ BOOST_AUTO_TEST_CASE( require3D ) } -BOOST_AUTO_TEST_CASE(fpr) { - setup cfg( "test_fpr", "summary_deck_non_constant_porosity.DATA"); - - out::Summary writer( cfg.es, cfg.config, cfg.grid, cfg.schedule, cfg.name ); - writer.add_timestep( 0, 0 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer.add_timestep( 1, 1 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer.add_timestep( 2, 2 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer.write(); - - auto res = readsum( cfg.name ); - const auto* resp = res.get(); - - UnitSystem units( UnitSystem::UnitType::UNIT_TYPE_METRIC ); - // fpr = sum_ (p * hcpv ) / hcpv, hcpv = pv * (1 - sw) - const double fpr_si = ( (3 * 0.1 + 8 * 0.2) * 500 * (1 - 8.0) ) / ( (500*0.1 + 500*0.2) * (1 - 8.0)); - const double fpr = units.from_si( UnitSystem::measure::pressure, fpr_si ); - BOOST_CHECK_CLOSE( fpr, ecl_sum_get_field_var( resp, 1, "FPR" ), 1e-5 ); // - - // change sw and pressure and test again. - size_t g = 0; - for (size_t k=0; k < cfg.grid.getNZ(); k++) { - for (size_t j=0; j < cfg.grid.getNY(); j++) { - for (size_t i=0; i < cfg.grid.getNX(); i++) { - if (cfg.grid.cellActive(i,j,k)) { - cfg.solution.data("SWAT")[g] = 0.1*(k); - cfg.solution.data("PRESSURE")[g] = units.to_si( UnitSystem::measure::pressure, 1 ); - g++; - } - } - } - } - - out::Summary writer2( cfg.es, cfg.config, cfg.grid, cfg.schedule, cfg.name ); - writer2.add_timestep( 0, 0 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer2.add_timestep( 1, 1 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer2.add_timestep( 2, 2 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer2.write(); - - auto res2 = readsum( cfg.name ); - const auto* resp2 = res2.get(); - - // fpr = sum_ (p * hcpv ) / hcpv, hcpv = pv * (1 - sw) - const double fpr2_si = ( (0.8 * 0.1 + 0.3 * 0.2) * 500 * 1 ) / ( (0.8 * 0.1 + 0.3 * 0.2) * 500); - BOOST_CHECK_CLOSE( fpr2_si, ecl_sum_get_field_var( resp2, 1, "FPR" ), 1e-5 ); // -} - -BOOST_AUTO_TEST_CASE(fprp) { - setup cfg( "test_fprp", "summary_deck_non_constant_porosity.DATA"); - - out::Summary writer( cfg.es, cfg.config, cfg.grid, cfg.schedule, cfg.name ); - writer.add_timestep( 0, 0 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer.add_timestep( 1, 1 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer.add_timestep( 2, 2 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer.write(); - - auto res = readsum( cfg.name ); - const auto* resp = res.get(); - - UnitSystem units( UnitSystem::UnitType::UNIT_TYPE_METRIC ); - // fprp = sum_ (p * pv ) / pv - const double fprp_si = ( (3 * 0.1 + 8 * 0.2) * 500 ) / ( (500*0.1 + 500*0.2)); - const double fprp = units.from_si( UnitSystem::measure::pressure, fprp_si ); - BOOST_CHECK_CLOSE( fprp, ecl_sum_get_field_var( resp, 1, "FPRP" ), 1e-5 ); - - // Change pressure and check again - for (size_t g = 0; g < cfg.grid.getNumActive(); g++){ - cfg.solution.data("PRESSURE")[g] = units.to_si( UnitSystem::measure::pressure, 1 ); - } - - out::Summary writer2( cfg.es, cfg.config, cfg.grid, cfg.schedule, cfg.name ); - writer2.add_timestep( 0, 0 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer2.add_timestep( 1, 1 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer2.add_timestep( 2, 2 * day, cfg.es, cfg.schedule, cfg.wells , cfg.solution, {}); - writer2.write(); - - auto res2 = readsum( cfg.name ); - const auto* resp2 = res2.get(); - - // fprp = sum_ (p * pv ) / pv - const double fprp2_si = ( (0.8 * 0.1 + 0.3 * 0.2) * 500) / ( (0.8 * 0.1 + 0.3 * 0.2) * 500); - BOOST_CHECK_CLOSE( fprp2_si, ecl_sum_get_field_var( resp2, 1, "FPRP" ), 1e-5 ); -} - -BOOST_AUTO_TEST_CASE(rpr) { - setup cfg( "test_rpr", "summary_deck_non_constant_porosity.DATA"); - - { - out::Summary writer( cfg.es, cfg.config, cfg.grid, cfg.schedule, cfg.name ); - writer.add_timestep( 1, 2 * day, cfg.es, cfg.schedule, cfg.wells, cfg.solution, {}); - writer.add_timestep( 1, 5 * day, cfg.es, cfg.schedule, cfg.wells, cfg.solution, {}); - writer.add_timestep( 2, 10 * day, cfg.es, cfg.schedule, cfg.wells, cfg.solution, {}); - writer.write(); - } - - auto res = readsum( cfg.name ); - const auto* resp = res.get(); - - BOOST_CHECK( ecl_sum_has_general_var( resp , "RPR:1")); - BOOST_CHECK( ecl_sum_has_general_var( resp , "RPR:3")); - BOOST_CHECK( !ecl_sum_has_general_var( resp , "RPR:4")); - UnitSystem units( UnitSystem::UnitType::UNIT_TYPE_METRIC ); - - // rpr = sum_ (p * hcpv ) / hcpv, hcpv = pv * (1 - sw) - // region 1; layer 1:4 - { - const double rpr_si = ( 2.5 * 0.1 * 400 * (1 - 8.0) ) / ( (400*0.1) * (1 - 8.0)); - std::string rpr_key = "RPR:1"; - BOOST_CHECK_CLOSE( rpr_si , units.to_si( UnitSystem::measure::pressure , ecl_sum_get_general_var( resp, 1, rpr_key.c_str())) , 1e-5); - } - // region 2; layer 5:6 - { - const double rpr_si = ( (5 * 0.1 + 6 * 0.2) * 100 * (1 - 8.0) ) / ( (0.1 + 0.2) * 100 * (1 - 8.0)); - std::string rpr_key = "RPR:2"; - BOOST_CHECK_CLOSE( rpr_si , units.to_si( UnitSystem::measure::pressure , ecl_sum_get_general_var( resp, 1, rpr_key.c_str())) , 1e-5); - } - // region 3; layer 7:10 - { - const double rpr_si = ( 8.5 * 0.2 * 400 * (1 - 8.0) ) / ( (400*0.2) * (1 - 8.0)); - std::string rpr_key = "RPR:3"; - BOOST_CHECK_CLOSE( rpr_si , units.to_si( UnitSystem::measure::pressure , ecl_sum_get_general_var( resp, 1, rpr_key.c_str())) , 1e-5); - } - -} - BOOST_AUTO_TEST_CASE(MISC) { setup cfg( "test_MISC"); diff --git a/tests/test_writenumwells.cpp b/tests/test_writenumwells.cpp index f45cf3791..607481d7a 100644 --- a/tests/test_writenumwells.cpp +++ b/tests/test_writenumwells.cpp @@ -161,6 +161,7 @@ BOOST_AUTO_TEST_CASE(EclipseWriteRestartWellInfo) { timestep, solution, wells , + {}, {} ); }