2016-04-20 02:55:17 -05:00
|
|
|
/*
|
|
|
|
Copyright 2016 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 <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
#if HAVE_DYNAMIC_BOOST_TEST
|
|
|
|
#define BOOST_TEST_DYN_LINK
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define BOOST_TEST_MODULE Wells
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
|
|
|
|
|
|
|
#include <stdexcept>
|
|
|
|
|
|
|
|
#include <ert/ecl/ecl_sum.h>
|
2016-06-24 12:39:17 -05:00
|
|
|
#include <ert/util/util.h>
|
|
|
|
#include <ert/util/TestArea.hpp>
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-10-03 07:52:39 -05:00
|
|
|
#include <opm/output/data/Wells.hpp>
|
|
|
|
#include <opm/output/data/Cells.hpp>
|
2016-04-20 02:55:17 -05:00
|
|
|
#include <opm/output/eclipse/Summary.hpp>
|
|
|
|
|
|
|
|
#include <opm/parser/eclipse/Deck/Deck.hpp>
|
2016-08-23 07:09:44 -05:00
|
|
|
#include <opm/parser/eclipse/Units/UnitSystem.hpp>
|
|
|
|
#include <opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp>
|
2016-04-20 02:55:17 -05:00
|
|
|
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
|
|
|
|
#include <opm/parser/eclipse/EclipseState/SummaryConfig/SummaryConfig.hpp>
|
|
|
|
#include <opm/parser/eclipse/Parser/ParseContext.hpp>
|
|
|
|
#include <opm/parser/eclipse/Parser/Parser.hpp>
|
|
|
|
|
|
|
|
using namespace Opm;
|
|
|
|
using rt = data::Rates::opt;
|
|
|
|
|
|
|
|
const char* path = "summary_deck.DATA";
|
|
|
|
|
|
|
|
/* conversion factor for whenever 'day' is the unit of measure, whereas we
|
|
|
|
* expect input in SI units (seconds)
|
|
|
|
*/
|
|
|
|
static const int day = 24 * 60 * 60;
|
|
|
|
|
2016-08-23 07:09:44 -05:00
|
|
|
|
|
|
|
static data::Solution make_solution( const EclipseGrid& grid ) {
|
|
|
|
int numCells = grid.getCartesianSize();
|
2016-10-06 09:31:41 -05:00
|
|
|
data::Solution sol = {
|
|
|
|
{"TEMP" , { UnitSystem::measure::temperature, std::vector<double>( numCells ), data::TargetType::RESTART_SOLUTION} },
|
|
|
|
{"SWAT" , { UnitSystem::measure::identity, std::vector<double>( numCells ), data::TargetType::RESTART_SOLUTION} },
|
|
|
|
{"SGAS" , { UnitSystem::measure::identity, std::vector<double>( numCells ), data::TargetType::RESTART_SOLUTION} }};
|
2016-08-23 07:09:44 -05:00
|
|
|
|
|
|
|
|
2016-10-06 01:16:33 -05:00
|
|
|
sol.data("TEMP").assign( numCells, 7.0 );
|
|
|
|
sol.data("SWAT").assign( numCells, 8.0 );
|
|
|
|
sol.data("SGAS").assign( numCells, 9.0 );
|
2016-08-23 07:09:44 -05:00
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
std::vector<double> pres(numCells);
|
|
|
|
for (size_t k=0; k < grid.getNZ(); k++) {
|
|
|
|
for (size_t j=0; j < grid.getNY(); j++) {
|
|
|
|
for (size_t i=0; i < grid.getNX(); i++) {
|
|
|
|
size_t g = grid.getNX()*grid.getNY()*k + j * grid.getNX() + i;
|
|
|
|
pres[g] = 1.0*(k + 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-10-06 01:16:33 -05:00
|
|
|
sol.insert( "PRESSURE" , UnitSystem::measure::pressure , pres, data::TargetType::RESTART_SOLUTION);
|
2016-08-23 07:09:44 -05:00
|
|
|
}
|
|
|
|
return sol;
|
|
|
|
}
|
|
|
|
|
2016-04-20 02:55:17 -05:00
|
|
|
static data::Wells result_wells() {
|
|
|
|
/* populate with the following pattern:
|
|
|
|
*
|
|
|
|
* Wells are named W_1, W_2 etc, i.e. wells are 1 indexed.
|
|
|
|
*
|
|
|
|
* rates on a well are populated with 10 * wellidx . type (where type is
|
|
|
|
* 0-1-2 from owg)
|
|
|
|
*
|
|
|
|
* bhp is wellidx.1
|
|
|
|
* bhp is wellidx.2
|
|
|
|
*
|
|
|
|
* completions are 100*wellidx . type
|
|
|
|
*/
|
|
|
|
|
|
|
|
// conversion factor Pascal (simulator output) <-> barsa
|
|
|
|
const double ps = 100000;
|
|
|
|
|
|
|
|
data::Rates rates1;
|
2016-05-23 01:49:55 -05:00
|
|
|
rates1.set( rt::wat, -10.0 / day );
|
|
|
|
rates1.set( rt::oil, -10.1 / day );
|
|
|
|
rates1.set( rt::gas, -10.2 / day );
|
2016-09-23 08:57:10 -05:00
|
|
|
rates1.set( rt::solvent, -10.3 / day );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
|
|
|
data::Rates rates2;
|
2016-05-23 01:49:55 -05:00
|
|
|
rates2.set( rt::wat, -20.0 / day );
|
|
|
|
rates2.set( rt::oil, -20.1 / day );
|
|
|
|
rates2.set( rt::gas, -20.2 / day );
|
2016-09-23 08:57:10 -05:00
|
|
|
rates2.set( rt::solvent, -20.3 / day );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
|
|
|
data::Rates rates3;
|
|
|
|
rates3.set( rt::wat, 30.0 / day );
|
|
|
|
rates3.set( rt::oil, 30.1 / day );
|
|
|
|
rates3.set( rt::gas, 30.2 / day );
|
2016-09-23 08:57:10 -05:00
|
|
|
rates3.set( rt::solvent, 30.3 / day );
|
|
|
|
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-07-15 08:20:56 -05:00
|
|
|
/* completion rates */
|
|
|
|
data::Rates crates1;
|
|
|
|
crates1.set( rt::wat, -100.0 / day );
|
|
|
|
crates1.set( rt::oil, -100.1 / day );
|
|
|
|
crates1.set( rt::gas, -100.2 / day );
|
2016-09-23 08:57:10 -05:00
|
|
|
crates1.set( rt::solvent, -100.3 / day );
|
2016-07-15 08:20:56 -05:00
|
|
|
|
|
|
|
data::Rates crates2;
|
|
|
|
crates2.set( rt::wat, -200.0 / day );
|
|
|
|
crates2.set( rt::oil, -200.1 / day );
|
|
|
|
crates2.set( rt::gas, -200.2 / day );
|
2016-09-23 08:57:10 -05:00
|
|
|
crates2.set( rt::solvent, -200.3 / day );
|
2016-07-15 08:20:56 -05:00
|
|
|
|
|
|
|
data::Rates crates3;
|
|
|
|
crates3.set( rt::wat, 300.0 / day );
|
|
|
|
crates3.set( rt::oil, 300.1 / day );
|
|
|
|
crates3.set( rt::gas, 300.2 / day );
|
2016-09-23 08:57:10 -05:00
|
|
|
crates3.set( rt::solvent, 300.3 / day );
|
2016-07-15 08:20:56 -05:00
|
|
|
|
2016-10-25 05:37:12 -05:00
|
|
|
data::Completion comp1 { 1, crates1, 1.9, 123.4 };
|
|
|
|
data::Completion comp2 { 1, crates2, 1.10, 123.4 };
|
|
|
|
data::Completion comp3 { 3, crates3, 1.11, 123.4 };
|
2016-07-15 08:20:56 -05:00
|
|
|
|
2016-10-24 09:52:26 -05:00
|
|
|
data::Well well1 { rates1, 0.1 * ps, 0.2 * ps, 0.3 * ps, 1, { comp1 } };
|
|
|
|
data::Well well2 { rates2, 1.1 * ps, 1.2 * ps, 1.3 * ps, 2, { comp2 } };
|
|
|
|
data::Well well3 { rates3, 2.1 * ps, 2.2 * ps, 2.3 * ps, 3, { comp3 } };
|
2016-04-20 02:55:17 -05:00
|
|
|
|
|
|
|
return { { "W_1", well1 }, { "W_2", well2 }, { "W_3", well3 } };
|
|
|
|
}
|
|
|
|
|
|
|
|
ERT::ert_unique_ptr< ecl_sum_type, ecl_sum_free > readsum( const std::string& base ) {
|
|
|
|
return ERT::ert_unique_ptr< ecl_sum_type, ecl_sum_free >(
|
|
|
|
ecl_sum_fread_alloc_case( base.c_str(), ":" )
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
struct setup {
|
2016-10-13 07:15:58 -05:00
|
|
|
Deck deck;
|
2016-04-20 02:55:17 -05:00
|
|
|
EclipseState es;
|
|
|
|
SummaryConfig config;
|
2016-08-23 07:09:44 -05:00
|
|
|
const EclipseGrid& grid;
|
2016-04-20 02:55:17 -05:00
|
|
|
data::Wells wells;
|
|
|
|
std::string name;
|
2016-06-24 12:39:17 -05:00
|
|
|
ERT::TestArea ta;
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-08-23 07:09:44 -05:00
|
|
|
/*-----------------------------------------------------------------*/
|
|
|
|
|
|
|
|
data::Solution solution;
|
|
|
|
std::unordered_map<int , std::vector<size_t>> cells;
|
|
|
|
|
2016-06-29 12:39:10 -05:00
|
|
|
setup( const std::string& fname , const ParseContext& parseContext = ParseContext( )) :
|
|
|
|
deck( Parser().parseFile( path, parseContext ) ),
|
2016-10-13 07:15:58 -05:00
|
|
|
es( deck, ParseContext() ),
|
|
|
|
config( deck, es, parseContext ),
|
|
|
|
grid( es.getInputGrid() ),
|
2016-04-20 02:55:17 -05:00
|
|
|
wells( result_wells() ),
|
2016-06-24 12:39:17 -05:00
|
|
|
name( fname ),
|
2016-10-13 07:15:58 -05:00
|
|
|
ta( ERT::TestArea("test_summary") ),
|
|
|
|
solution( make_solution( es.getInputGrid() ) )
|
2016-08-23 07:09:44 -05:00
|
|
|
{
|
|
|
|
const auto& properties = es.get3DProperties();
|
|
|
|
const auto& fipnum = properties.getIntGridProperty("FIPNUM");
|
|
|
|
const auto& region_values = properties.getRegions( "FIPNUM" );
|
|
|
|
|
|
|
|
for (auto region_id : region_values)
|
2016-09-07 11:08:05 -05:00
|
|
|
cells.emplace( region_id , fipnum.cellsEqual( region_id , grid ));
|
2016-08-23 07:09:44 -05:00
|
|
|
}
|
2016-04-26 05:22:22 -05:00
|
|
|
|
2016-04-20 02:55:17 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Tests works by reading the Deck, write the summary output, then immediately
|
|
|
|
* read it again (with ERT), and compare the read values with the input.
|
|
|
|
*/
|
2016-05-23 02:33:09 -05:00
|
|
|
BOOST_AUTO_TEST_CASE(well_keywords) {
|
|
|
|
setup cfg( "test_Summary_well" );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-06-24 12:39:46 -05:00
|
|
|
// Force to run in a directory, to make sure the basename with
|
|
|
|
// leading path works.
|
|
|
|
util_make_path( "PATH" );
|
|
|
|
cfg.name = "PATH/CASE";
|
|
|
|
|
2016-04-20 02:55:17 -05:00
|
|
|
out::Summary writer( cfg.es, cfg.config, cfg.name );
|
2016-09-07 11:08:05 -05:00
|
|
|
writer.add_timestep( 0, 0 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 1, 1 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 2, 2 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
2016-04-20 02:55:17 -05:00
|
|
|
writer.write();
|
|
|
|
|
|
|
|
auto res = readsum( cfg.name );
|
|
|
|
const auto* resp = res.get();
|
2016-05-23 02:33:09 -05:00
|
|
|
|
|
|
|
/* Production rates */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.0, ecl_sum_get_well_var( resp, 1, "W_1", "WWPR" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 20.0, ecl_sum_get_well_var( resp, 1, "W_2", "WWPR" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.1, ecl_sum_get_well_var( resp, 1, "W_1", "WOPR" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 20.1, ecl_sum_get_well_var( resp, 1, "W_2", "WOPR" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.2, ecl_sum_get_well_var( resp, 1, "W_1", "WGPR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 20.2, ecl_sum_get_well_var( resp, 1, "W_2", "WGPR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.0 + 10.1, ecl_sum_get_well_var( resp, 1, "W_1", "WLPR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 20.0 + 20.1, ecl_sum_get_well_var( resp, 1, "W_2", "WLPR" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.3, ecl_sum_get_well_var( resp, 1, "W_1", "WNPR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 20.3, ecl_sum_get_well_var( resp, 1, "W_2", "WNPR" ), 1e-5 );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Production totals */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.0, ecl_sum_get_well_var( resp, 1, "W_1", "WWPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 20.0, ecl_sum_get_well_var( resp, 1, "W_2", "WWPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.1, ecl_sum_get_well_var( resp, 1, "W_1", "WOPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 20.1, ecl_sum_get_well_var( resp, 1, "W_2", "WOPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.2, ecl_sum_get_well_var( resp, 1, "W_1", "WGPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 20.2, ecl_sum_get_well_var( resp, 1, "W_2", "WGPT" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.3, ecl_sum_get_well_var( resp, 1, "W_1", "WNPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 20.3, ecl_sum_get_well_var( resp, 1, "W_2", "WNPT" ), 1e-5 );
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( (10.0 + 10.1), ecl_sum_get_well_var( resp, 1, "W_1", "WLPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( (20.0 + 20.1), ecl_sum_get_well_var( resp, 1, "W_2", "WLPT" ), 1e-5 );
|
|
|
|
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 10.0, ecl_sum_get_well_var( resp, 2, "W_1", "WWPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 20.0, ecl_sum_get_well_var( resp, 2, "W_2", "WWPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 10.1, ecl_sum_get_well_var( resp, 2, "W_1", "WOPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 20.1, ecl_sum_get_well_var( resp, 2, "W_2", "WOPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 10.2, ecl_sum_get_well_var( resp, 2, "W_1", "WGPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 20.2, ecl_sum_get_well_var( resp, 2, "W_2", "WGPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( ( 20.0 + 20.1 ), ecl_sum_get_well_var( resp, 2, "W_2", "WLPR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * (20.0 + 20.1), ecl_sum_get_well_var( resp, 2, "W_2", "WLPT" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * 10.3, ecl_sum_get_well_var( resp, 2, "W_1", "WNPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 20.3, ecl_sum_get_well_var( resp, 2, "W_2", "WNPT" ), 1e-5 );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Production rates (history) */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10, ecl_sum_get_well_var( resp, 1, "W_1", "WWPRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 20, ecl_sum_get_well_var( resp, 1, "W_2", "WWPRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.1, ecl_sum_get_well_var( resp, 1, "W_1", "WOPRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 20.1, ecl_sum_get_well_var( resp, 1, "W_2", "WOPRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.2, ecl_sum_get_well_var( resp, 1, "W_1", "WGPRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 20.2, ecl_sum_get_well_var( resp, 1, "W_2", "WGPRH" ), 1e-5 );
|
2016-05-23 02:14:13 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Production totals (history) */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * 10.0, ecl_sum_get_well_var( resp, 2, "W_1", "WWPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 20.0, ecl_sum_get_well_var( resp, 2, "W_2", "WWPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 10.1, ecl_sum_get_well_var( resp, 2, "W_1", "WOPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 20.1, ecl_sum_get_well_var( resp, 2, "W_2", "WOPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 10.2, ecl_sum_get_well_var( resp, 2, "W_1", "WGPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 20.2, ecl_sum_get_well_var( resp, 2, "W_2", "WGPTH" ), 1e-5 );
|
2016-05-23 02:14:13 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Injection rates */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 30.0, ecl_sum_get_well_var( resp, 1, "W_3", "WWIR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 30.2, ecl_sum_get_well_var( resp, 1, "W_3", "WGIR" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 30.3, ecl_sum_get_well_var( resp, 1, "W_3", "WNIR" ), 1e-5 );
|
2016-05-23 02:14:13 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Injection totals */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 30.0, ecl_sum_get_well_var( resp, 1, "W_3", "WWIT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 30.2, ecl_sum_get_well_var( resp, 1, "W_3", "WGIT" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 30.3, ecl_sum_get_well_var( resp, 1, "W_3", "WNIT" ), 1e-5 );
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * 30.0, ecl_sum_get_well_var( resp, 2, "W_3", "WWIT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 30.2, ecl_sum_get_well_var( resp, 2, "W_3", "WGIT" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * 30.3, ecl_sum_get_well_var( resp, 2, "W_3", "WNIT" ), 1e-5 );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Injection rates (history) */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 30.0, ecl_sum_get_well_var( resp, 1, "W_3", "WWIRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 0, ecl_sum_get_well_var( resp, 1, "W_3", "WGIRH" ), 1e-5 );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Injection totals (history) */
|
2016-06-15 03:45:07 -05:00
|
|
|
BOOST_CHECK_CLOSE( 30.0, ecl_sum_get_well_var( resp, 1, "W_3", "WWITH" ), 1e-5 );
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 0, ecl_sum_get_well_var( resp, 1, "W_3", "WGITH" ), 1e-5 );
|
2016-06-15 03:45:07 -05:00
|
|
|
BOOST_CHECK_CLOSE( 60.0, ecl_sum_get_well_var( resp, 2, "W_3", "WWITH" ), 1e-5 );
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 0, ecl_sum_get_well_var( resp, 2, "W_3", "WGITH" ), 1e-5 );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* WWCT - water cut */
|
|
|
|
const double wwcut1 = 10.0 / ( 10.0 + 10.1 );
|
|
|
|
const double wwcut2 = 20.0 / ( 20.0 + 20.1 );
|
2016-07-18 05:02:29 -05:00
|
|
|
const double wwcut3 = 0;
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( wwcut1, ecl_sum_get_well_var( resp, 1, "W_1", "WWCT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( wwcut2, ecl_sum_get_well_var( resp, 1, "W_2", "WWCT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( wwcut3, ecl_sum_get_well_var( resp, 1, "W_3", "WWCT" ), 1e-5 );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* gas-oil ratio */
|
2016-04-20 02:55:17 -05:00
|
|
|
const double wgor1 = 10.2 / 10.1;
|
|
|
|
const double wgor2 = 20.2 / 20.1;
|
2016-07-18 05:02:29 -05:00
|
|
|
const double wgor3 = 0;
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( wgor1, ecl_sum_get_well_var( resp, 1, "W_1", "WGOR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( wgor2, ecl_sum_get_well_var( resp, 1, "W_2", "WGOR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( wgor3, ecl_sum_get_well_var( resp, 1, "W_3", "WGOR" ), 1e-5 );
|
2016-04-28 02:44:57 -05:00
|
|
|
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( wgor1, ecl_sum_get_well_var( resp, 1, "W_1", "WGORH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( wgor2, ecl_sum_get_well_var( resp, 1, "W_2", "WGORH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 0, ecl_sum_get_well_var( resp, 1, "W_3", "WGORH" ), 1e-5 );
|
2016-04-28 02:44:57 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* WGLR - gas-liquid rate */
|
|
|
|
const double wglr1 = 10.2 / ( 10.0 + 10.1 );
|
|
|
|
const double wglr2 = 20.2 / ( 20.0 + 20.1 );
|
2016-07-18 05:02:29 -05:00
|
|
|
const double wglr3 = 0;
|
2016-04-28 02:46:01 -05:00
|
|
|
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( wglr1, ecl_sum_get_well_var( resp, 1, "W_1", "WGLR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( wglr2, ecl_sum_get_well_var( resp, 1, "W_2", "WGLR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( wglr3, ecl_sum_get_well_var( resp, 1, "W_3", "WGLR" ), 1e-5 );
|
2016-04-28 02:46:01 -05:00
|
|
|
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( wglr1, ecl_sum_get_well_var( resp, 1, "W_1", "WGLRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( wglr2, ecl_sum_get_well_var( resp, 1, "W_2", "WGLRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 0, ecl_sum_get_well_var( resp, 1, "W_3", "WGLRH" ), 1e-5 );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* BHP */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 0.1, ecl_sum_get_well_var( resp, 1, "W_1", "WBHP" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 1.1, ecl_sum_get_well_var( resp, 1, "W_2", "WBHP" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2.1, ecl_sum_get_well_var( resp, 1, "W_3", "WBHP" ), 1e-5 );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* THP */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 0.2, ecl_sum_get_well_var( resp, 1, "W_1", "WTHP" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 1.2, ecl_sum_get_well_var( resp, 1, "W_2", "WTHP" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2.2, ecl_sum_get_well_var( resp, 1, "W_3", "WTHP" ), 1e-5 );
|
2016-04-20 02:55:17 -05:00
|
|
|
}
|
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
BOOST_AUTO_TEST_CASE(group_keywords) {
|
|
|
|
setup cfg( "test_Summary_group" );
|
2016-04-28 08:42:20 -05:00
|
|
|
|
|
|
|
out::Summary writer( cfg.es, cfg.config, cfg.name );
|
2016-09-07 11:08:05 -05:00
|
|
|
writer.add_timestep( 0, 0 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 1, 1 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 2, 2 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
2016-04-28 08:42:20 -05:00
|
|
|
writer.write();
|
|
|
|
|
|
|
|
auto res = readsum( cfg.name );
|
|
|
|
const auto* resp = res.get();
|
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Production rates */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.0 + 20.0, ecl_sum_get_group_var( resp, 1, "G_1", "GWPR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.1 + 20.1, ecl_sum_get_group_var( resp, 1, "G_1", "GOPR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.2 + 20.2, ecl_sum_get_group_var( resp, 1, "G_1", "GGPR" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.3 + 20.3, ecl_sum_get_group_var( resp, 1, "G_1", "GNPR" ), 1e-5 );
|
2016-04-26 05:26:38 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Production totals */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.0 + 20.0, ecl_sum_get_group_var( resp, 1, "G_1", "GWPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.1 + 20.1, ecl_sum_get_group_var( resp, 1, "G_1", "GOPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.2 + 20.2, ecl_sum_get_group_var( resp, 1, "G_1", "GGPT" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.3 + 20.3, ecl_sum_get_group_var( resp, 1, "G_1", "GNPT" ), 1e-5 );
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.0 + 20.0), ecl_sum_get_group_var( resp, 2, "G_1", "GWPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.1 + 20.1), ecl_sum_get_group_var( resp, 2, "G_1", "GOPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.2 + 20.2), ecl_sum_get_group_var( resp, 2, "G_1", "GGPT" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.3 + 20.3), ecl_sum_get_group_var( resp, 2, "G_1", "GNPT" ), 1e-5 );
|
2016-04-28 09:20:03 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Production rates (history) */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.0 + 20.0, ecl_sum_get_group_var( resp, 1, "G_1", "GWPRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.1 + 20.1, ecl_sum_get_group_var( resp, 1, "G_1", "GOPRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.2 + 20.2, ecl_sum_get_group_var( resp, 1, "G_1", "GGPRH" ), 1e-5 );
|
2016-04-28 09:20:03 -05:00
|
|
|
BOOST_CHECK_CLOSE( 10.0 + 10.1 + 20.0 + 20.1,
|
2016-06-06 09:24:00 -05:00
|
|
|
ecl_sum_get_group_var( resp, 1, "G_1", "GLPRH" ), 1e-5 );
|
2016-04-28 09:20:03 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Production totals (history) */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( (10.0 + 20.0), ecl_sum_get_group_var( resp, 1, "G_1", "GWPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 0, ecl_sum_get_group_var( resp, 1, "G_2", "GWPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( (10.1 + 20.1), ecl_sum_get_group_var( resp, 1, "G_1", "GOPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 0, ecl_sum_get_group_var( resp, 1, "G_2", "GOPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( (10.2 + 20.2), ecl_sum_get_group_var( resp, 1, "G_1", "GGPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 0, ecl_sum_get_group_var( resp, 1, "G_2", "GGPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( (10.0 + 20.0 + 10.1 + 20.1),
|
|
|
|
ecl_sum_get_group_var( resp, 1, "G_1", "GLPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 0, ecl_sum_get_group_var( resp, 1, "G_2", "GLPTH" ), 1e-5 );
|
2016-04-28 09:20:03 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Injection rates */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 30.0, ecl_sum_get_group_var( resp, 1, "G_2", "GWIR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 30.2, ecl_sum_get_group_var( resp, 1, "G_2", "GGIR" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 30.3, ecl_sum_get_group_var( resp, 1, "G_2", "GNIR" ), 1e-5 );
|
2016-05-23 02:14:13 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Injection totals */
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 30.0, ecl_sum_get_group_var( resp, 1, "G_2", "GWIT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 30.2, ecl_sum_get_group_var( resp, 1, "G_2", "GGIT" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 30.3, ecl_sum_get_group_var( resp, 1, "G_2", "GNIT" ), 1e-5 );
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * 30.0, ecl_sum_get_group_var( resp, 2, "G_2", "GWIT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 30.2, ecl_sum_get_group_var( resp, 2, "G_2", "GGIT" ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * 30.3, ecl_sum_get_group_var( resp, 2, "G_2", "GNIT" ), 1e-5 );
|
2016-04-26 05:26:38 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* Injection totals (history) */
|
2016-06-15 03:45:07 -05:00
|
|
|
BOOST_CHECK_CLOSE( 30.0, ecl_sum_get_group_var( resp, 1, "G_2", "GWITH" ), 1e-5 );
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 0, ecl_sum_get_group_var( resp, 1, "G_2", "GGITH" ), 1e-5 );
|
2016-06-15 03:45:07 -05:00
|
|
|
BOOST_CHECK_CLOSE( 60.0, ecl_sum_get_group_var( resp, 2, "G_2", "GWITH" ), 1e-5 );
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( 0, ecl_sum_get_group_var( resp, 2, "G_2", "GGITH" ), 1e-5 );
|
2016-04-26 05:26:38 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* gwct - water cut */
|
|
|
|
const double gwcut1 = (10.0 + 20.0) / ( 10.0 + 10.1 + 20.0 + 20.1 );
|
2016-07-18 05:02:29 -05:00
|
|
|
const double gwcut2 = 0;
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( gwcut1, ecl_sum_get_group_var( resp, 1, "G_1", "GWCT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( gwcut2, ecl_sum_get_group_var( resp, 1, "G_2", "GWCT" ), 1e-5 );
|
2016-04-26 05:26:38 -05:00
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
/* ggor - gas-oil ratio */
|
2016-04-26 05:26:38 -05:00
|
|
|
const double ggor1 = (10.2 + 20.2) / (10.1 + 20.1);
|
2016-07-18 05:02:29 -05:00
|
|
|
const double ggor2 = 0;
|
2016-06-06 09:24:00 -05:00
|
|
|
BOOST_CHECK_CLOSE( ggor1, ecl_sum_get_group_var( resp, 1, "G_1", "GGOR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( ggor2, ecl_sum_get_group_var( resp, 1, "G_2", "GGOR" ), 1e-5 );
|
2016-04-20 02:55:17 -05:00
|
|
|
}
|
|
|
|
|
2016-07-15 08:20:56 -05:00
|
|
|
BOOST_AUTO_TEST_CASE(completion_kewords) {
|
|
|
|
setup cfg( "test_Summary_completion" );
|
|
|
|
|
|
|
|
out::Summary writer( cfg.es, cfg.config, cfg.name );
|
2016-09-07 11:08:05 -05:00
|
|
|
writer.add_timestep( 0, 0 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 1, 1 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 2, 2 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
2016-07-15 08:20:56 -05:00
|
|
|
writer.write();
|
|
|
|
|
|
|
|
auto res = readsum( cfg.name );
|
|
|
|
const auto* resp = res.get();
|
|
|
|
|
|
|
|
/* Production rates */
|
|
|
|
BOOST_CHECK_CLOSE( 100.0, ecl_sum_get_well_completion_var( resp, 1, "W_1", "CWPR", 1 ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 100.1, ecl_sum_get_well_completion_var( resp, 1, "W_1", "COPR", 1 ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 100.2, ecl_sum_get_well_completion_var( resp, 1, "W_1", "CGPR", 1 ), 1e-5 );
|
|
|
|
|
|
|
|
/* Production totals */
|
|
|
|
BOOST_CHECK_CLOSE( 100.0, ecl_sum_get_well_completion_var( resp, 1, "W_1", "CWPT", 1 ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 100.1, ecl_sum_get_well_completion_var( resp, 1, "W_1", "COPT", 1 ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 100.2, ecl_sum_get_well_completion_var( resp, 1, "W_1", "CGPT", 1 ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 100.3, ecl_sum_get_well_completion_var( resp, 1, "W_1", "CNPT", 1 ), 1e-5 );
|
2016-07-15 08:20:56 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * 100.0, ecl_sum_get_well_completion_var( resp, 2, "W_1", "CWPT", 1 ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 100.1, ecl_sum_get_well_completion_var( resp, 2, "W_1", "COPT", 1 ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 100.2, ecl_sum_get_well_completion_var( resp, 2, "W_1", "CGPT", 1 ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * 100.3, ecl_sum_get_well_completion_var( resp, 2, "W_1", "CNPT", 1 ), 1e-5 );
|
2016-07-15 08:20:56 -05:00
|
|
|
|
|
|
|
/* Injection rates */
|
|
|
|
BOOST_CHECK_CLOSE( 300.0, ecl_sum_get_well_completion_var( resp, 1, "W_3", "CWIR", 3 ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 300.2, ecl_sum_get_well_completion_var( resp, 1, "W_3", "CGIR", 3 ), 1e-5 );
|
|
|
|
|
|
|
|
/* Injection totals */
|
|
|
|
BOOST_CHECK_CLOSE( 300.0, ecl_sum_get_well_completion_var( resp, 1, "W_3", "CWIT", 3 ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 300.2, ecl_sum_get_well_completion_var( resp, 1, "W_3", "CGIT", 3 ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 300.3, ecl_sum_get_well_completion_var( resp, 1, "W_3", "CNIT", 3 ), 1e-5 );
|
2016-07-15 08:20:56 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * 300.0, ecl_sum_get_well_completion_var( resp, 2, "W_3", "CWIT", 3 ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 300.2, ecl_sum_get_well_completion_var( resp, 2, "W_3", "CGIT", 3 ), 1e-5 );
|
2016-09-23 08:57:10 -05:00
|
|
|
BOOST_CHECK_CLOSE( 2 * 300.3, ecl_sum_get_well_completion_var( resp, 2, "W_3", "CNIT", 3 ), 1e-5 );
|
|
|
|
|
|
|
|
/* Solvent flow rate + or - Note OPM uses negative values for producers, while CNFR outputs positive
|
|
|
|
values for producers*/
|
|
|
|
BOOST_CHECK_CLOSE( -300.3, ecl_sum_get_well_completion_var( resp, 1, "W_3", "CNFR", 3 ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 200.3, ecl_sum_get_well_completion_var( resp, 1, "W_2", "CNFR", 1 ), 1e-5 );
|
2016-07-15 08:20:56 -05:00
|
|
|
|
|
|
|
/* CGPT's wildcarding means W_2's completions should also be available */
|
|
|
|
BOOST_CHECK_CLOSE( 200.2, ecl_sum_get_well_completion_var( resp, 1, "W_2", "CGPT", 1 ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 200.2, ecl_sum_get_well_completion_var( resp, 2, "W_2", "CGPT", 1 ), 1e-5 );
|
|
|
|
}
|
|
|
|
|
2016-07-18 05:57:06 -05:00
|
|
|
BOOST_AUTO_TEST_CASE(field_keywords) {
|
|
|
|
setup cfg( "test_Summary_field" );
|
|
|
|
|
|
|
|
out::Summary writer( cfg.es, cfg.config, cfg.name );
|
2016-09-07 11:08:05 -05:00
|
|
|
writer.add_timestep( 0, 0 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 1, 1 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 2, 2 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
2016-07-18 05:57:06 -05:00
|
|
|
writer.write();
|
|
|
|
|
|
|
|
auto res = readsum( cfg.name );
|
|
|
|
const auto* resp = res.get();
|
|
|
|
|
|
|
|
/* Production rates */
|
|
|
|
BOOST_CHECK_CLOSE( 10.0 + 20.0, ecl_sum_get_field_var( resp, 1, "FWPR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.1 + 20.1, ecl_sum_get_field_var( resp, 1, "FOPR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.2 + 20.2, ecl_sum_get_field_var( resp, 1, "FGPR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.0 + 20.0 + 10.1 + 20.1,
|
|
|
|
ecl_sum_get_field_var( resp, 1, "FLPR" ), 1e-5 );
|
|
|
|
|
|
|
|
/* Production totals */
|
|
|
|
BOOST_CHECK_CLOSE( 10.0 + 20.0, ecl_sum_get_field_var( resp, 1, "FWPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.1 + 20.1, ecl_sum_get_field_var( resp, 1, "FOPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.2 + 20.2, ecl_sum_get_field_var( resp, 1, "FGPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.0 + 20.0 + 10.1 + 20.1,
|
|
|
|
ecl_sum_get_field_var( resp, 1, "FLPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.0 + 20.0), ecl_sum_get_field_var( resp, 2, "FWPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.1 + 20.1), ecl_sum_get_field_var( resp, 2, "FOPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.2 + 20.2), ecl_sum_get_field_var( resp, 2, "FGPT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.0 + 20.0 + 10.1 + 20.1),
|
|
|
|
ecl_sum_get_field_var( resp, 2, "FLPT" ), 1e-5 );
|
|
|
|
|
|
|
|
/* Production rates (history) */
|
|
|
|
BOOST_CHECK_CLOSE( 10.0 + 20.0, ecl_sum_get_field_var( resp, 1, "FWPRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.1 + 20.1, ecl_sum_get_field_var( resp, 1, "FOPRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.2 + 20.2, ecl_sum_get_field_var( resp, 1, "FGPRH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 10.0 + 10.1 + 20.0 + 20.1,
|
|
|
|
ecl_sum_get_field_var( resp, 1, "FLPRH" ), 1e-5 );
|
|
|
|
|
|
|
|
/* Production totals (history) */
|
|
|
|
BOOST_CHECK_CLOSE( (10.0 + 20.0), ecl_sum_get_field_var( resp, 1, "FWPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( (10.1 + 20.1), ecl_sum_get_field_var( resp, 1, "FOPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( (10.2 + 20.2), ecl_sum_get_field_var( resp, 1, "FGPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( (10.0 + 20.0 + 10.1 + 20.1),
|
|
|
|
ecl_sum_get_field_var( resp, 1, "FLPTH" ), 1e-5 );
|
|
|
|
|
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.0 + 20.0), ecl_sum_get_field_var( resp, 2, "FWPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.1 + 20.1), ecl_sum_get_field_var( resp, 2, "FOPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.2 + 20.2), ecl_sum_get_field_var( resp, 2, "FGPTH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * (10.0 + 20.0 + 10.1 + 20.1),
|
|
|
|
ecl_sum_get_field_var( resp, 2, "FLPTH" ), 1e-5 );
|
|
|
|
|
|
|
|
/* Injection rates */
|
|
|
|
BOOST_CHECK_CLOSE( 30.0, ecl_sum_get_field_var( resp, 1, "FWIR" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 30.2, ecl_sum_get_field_var( resp, 1, "FGIR" ), 1e-5 );
|
|
|
|
|
|
|
|
/* Injection totals */
|
|
|
|
BOOST_CHECK_CLOSE( 30.0, ecl_sum_get_field_var( resp, 1, "FWIT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 30.2, ecl_sum_get_field_var( resp, 1, "FGIT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 30.0, ecl_sum_get_field_var( resp, 2, "FWIT" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 2 * 30.2, ecl_sum_get_field_var( resp, 2, "FGIT" ), 1e-5 );
|
|
|
|
|
|
|
|
/* Injection totals (history) */
|
|
|
|
BOOST_CHECK_CLOSE( 30.0, ecl_sum_get_field_var( resp, 1, "FWITH" ), 1e-5 );
|
|
|
|
BOOST_CHECK_CLOSE( 60.0, ecl_sum_get_field_var( resp, 2, "FWITH" ), 1e-5 );
|
|
|
|
|
2016-07-19 07:38:40 -05:00
|
|
|
/* fwct - water cut */
|
2016-07-18 05:57:06 -05:00
|
|
|
const double wcut = (10.0 + 20.0) / ( 10.0 + 10.1 + 20.0 + 20.1 );
|
|
|
|
BOOST_CHECK_CLOSE( wcut, ecl_sum_get_field_var( resp, 1, "FWCT" ), 1e-5 );
|
2016-07-19 07:38:40 -05:00
|
|
|
BOOST_CHECK_CLOSE( wcut, ecl_sum_get_field_var( resp, 1, "FWCTH" ), 1e-5 );
|
2016-07-18 05:57:06 -05:00
|
|
|
|
|
|
|
/* ggor - gas-oil ratio */
|
|
|
|
const double ggor = (10.2 + 20.2) / (10.1 + 20.1);
|
|
|
|
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 );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-05-23 02:33:09 -05:00
|
|
|
BOOST_AUTO_TEST_CASE(report_steps_time) {
|
|
|
|
setup cfg( "test_Summary_report_steps_time" );
|
2016-04-20 02:55:17 -05:00
|
|
|
|
|
|
|
out::Summary writer( cfg.es, cfg.config, cfg.name );
|
2016-09-07 11:08:05 -05:00
|
|
|
writer.add_timestep( 1, 2 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 1, 5 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 2, 10 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
2016-04-20 02:55:17 -05:00
|
|
|
writer.write();
|
|
|
|
|
|
|
|
auto res = readsum( cfg.name );
|
|
|
|
const auto* resp = res.get();
|
|
|
|
|
|
|
|
BOOST_CHECK( ecl_sum_has_report_step( resp, 1 ) );
|
|
|
|
BOOST_CHECK( ecl_sum_has_report_step( resp, 2 ) );
|
|
|
|
BOOST_CHECK( !ecl_sum_has_report_step( resp, 3 ) );
|
|
|
|
|
2016-05-11 02:52:21 -05:00
|
|
|
BOOST_CHECK_EQUAL( ecl_sum_iget_sim_days( resp, 0 ), 2 );
|
|
|
|
BOOST_CHECK_EQUAL( ecl_sum_iget_sim_days( resp, 1 ), 5 );
|
|
|
|
BOOST_CHECK_EQUAL( ecl_sum_iget_sim_days( resp, 2 ), 10 );
|
|
|
|
BOOST_CHECK_EQUAL( ecl_sum_get_sim_length( resp ), 10 );
|
2016-04-20 02:55:17 -05:00
|
|
|
}
|
2016-06-15 03:45:07 -05:00
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(skip_unknown_var) {
|
|
|
|
setup cfg( "test_Summary_skip_unknown_var" );
|
|
|
|
|
|
|
|
out::Summary writer( cfg.es, cfg.config, cfg.name );
|
2016-09-07 11:08:05 -05:00
|
|
|
writer.add_timestep( 1, 2 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 1, 5 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
|
|
|
writer.add_timestep( 2, 10 * day, cfg.grid, cfg.es, cfg.cells, cfg.wells , cfg.solution);
|
2016-06-15 03:45:07 -05:00
|
|
|
writer.write();
|
|
|
|
|
|
|
|
auto res = readsum( cfg.name );
|
|
|
|
const auto* resp = res.get();
|
|
|
|
|
|
|
|
/* verify that some non-supported keywords aren't written to the file */
|
|
|
|
BOOST_CHECK( !ecl_sum_has_well_var( resp, "W_1", "WPI" ) );
|
|
|
|
BOOST_CHECK( !ecl_sum_has_field_var( resp, "FVIR" ) );
|
|
|
|
}
|
2016-08-23 07:09:44 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(region_vars) {
|
|
|
|
setup cfg( "region_vars" );
|
|
|
|
|
|
|
|
{
|
|
|
|
out::Summary writer( cfg.es, cfg.config, cfg.name );
|
2016-09-07 11:08:05 -05:00
|
|
|
writer.add_timestep( 1, 2 * day, cfg.grid , cfg.es, cfg.cells, cfg.wells, cfg.solution);
|
|
|
|
writer.add_timestep( 1, 5 * day, cfg.grid , cfg.es, cfg.cells, cfg.wells, cfg.solution);
|
|
|
|
writer.add_timestep( 2, 10 * day, cfg.grid , cfg.es, cfg.cells, cfg.wells, cfg.solution);
|
2016-08-23 07:09:44 -05:00
|
|
|
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"));
|
2016-10-13 07:15:58 -05:00
|
|
|
UnitSystem units( UnitSystem::UnitType::UNIT_TYPE_METRIC );
|
2016-08-23 07:09:44 -05:00
|
|
|
|
|
|
|
for (size_t r=1; r <= 10; r++) {
|
|
|
|
std::string key = "RPR:" + std::to_string( r );
|
|
|
|
BOOST_CHECK_CLOSE( r * 1.0 , units.to_si( UnitSystem::measure::pressure , ecl_sum_get_general_var( resp, 1, key.c_str())) , 1e-5);
|
|
|
|
}
|
|
|
|
}
|