2018-10-09 08:20:55 -05:00
|
|
|
/*
|
|
|
|
Copyright 2018 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/>.
|
|
|
|
*/
|
|
|
|
|
2019-02-20 07:21:42 -06:00
|
|
|
#define BOOST_TEST_MODULE Aggregate_MSW_Data
|
2018-10-09 08:20:55 -05:00
|
|
|
#include <opm/output/eclipse/AggregateMSWData.hpp>
|
2021-02-26 07:56:00 -06:00
|
|
|
#include <opm/output/eclipse/WriteRestartHelpers.hpp>
|
2018-10-09 08:20:55 -05:00
|
|
|
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
|
|
|
|
#include <opm/output/eclipse/AggregateWellData.hpp>
|
2020-03-26 09:31:21 -05:00
|
|
|
#include <opm/parser/eclipse/Python/Python.hpp>
|
2018-10-09 08:20:55 -05:00
|
|
|
|
|
|
|
#include <opm/output/eclipse/VectorItems/intehead.hpp>
|
|
|
|
#include <opm/output/eclipse/VectorItems/well.hpp>
|
2021-02-26 07:56:00 -06:00
|
|
|
#include <opm/output/eclipse/VectorItems/msw.hpp>
|
2018-10-09 08:20:55 -05:00
|
|
|
|
|
|
|
#include <opm/output/data/Wells.hpp>
|
|
|
|
|
2020-01-15 04:41:28 -06:00
|
|
|
#include <opm/io/eclipse/rst/segment.hpp>
|
2018-10-09 08:20:55 -05:00
|
|
|
#include <opm/parser/eclipse/Deck/Deck.hpp>
|
|
|
|
#include <opm/parser/eclipse/Parser/Parser.hpp>
|
|
|
|
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
|
|
|
|
#include <opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp>
|
2018-11-16 06:53:28 -06:00
|
|
|
#include <opm/parser/eclipse/EclipseState/Schedule/SummaryState.hpp>
|
2021-02-28 10:04:35 -06:00
|
|
|
#include <opm/common/utility/TimeService.hpp>
|
2018-10-09 08:20:55 -05:00
|
|
|
|
|
|
|
#include <exception>
|
|
|
|
#include <stdexcept>
|
|
|
|
#include <utility>
|
|
|
|
#include <vector>
|
2018-10-26 09:14:31 -05:00
|
|
|
#include <iostream>
|
|
|
|
#include <cstddef>
|
2018-10-09 08:20:55 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
namespace {
|
2018-10-09 08:20:55 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
namespace VI = ::Opm::RestartIO::Helpers::VectorItems;
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
Opm::Deck first_sim(std::string fname) {
|
|
|
|
return Opm::Parser {} .parseFile(fname);
|
|
|
|
}
|
2018-10-09 08:20:55 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
Opm::SummaryState sim_state()
|
2018-10-09 08:20:55 -05:00
|
|
|
{
|
2021-02-26 07:56:00 -06:00
|
|
|
auto state = Opm::SummaryState{Opm::TimeService::now()};
|
|
|
|
|
|
|
|
state.update("SPR:PROD:1", 235.);
|
|
|
|
state.update("SPR:PROD:2", 237.);
|
|
|
|
state.update("SPR:PROD:3", 239.);
|
|
|
|
state.update("SPR:PROD:4", 243.);
|
|
|
|
|
|
|
|
state.update("SOFR:PROD:1", 35.);
|
|
|
|
state.update("SOFR:PROD:2", 30.);
|
|
|
|
state.update("SOFR:PROD:3", 25.);
|
|
|
|
state.update("SOFR:PROD:4", 20.);
|
|
|
|
|
|
|
|
state.update("SGFR:PROD:1", 25.E3);
|
|
|
|
state.update("SGFR:PROD:2", 20.E3);
|
|
|
|
state.update("SGFR:PROD:3", 15.E3);
|
|
|
|
state.update("SGFR:PROD:4", 10.E3);
|
|
|
|
|
|
|
|
state.update("SWFR:PROD:1", 11.);
|
|
|
|
state.update("SWFR:PROD:2", 12.);
|
|
|
|
state.update("SWFR:PROD:3", 13.);
|
|
|
|
state.update("SWFR:PROD:4", 14.);
|
|
|
|
|
|
|
|
state.update("SPR:WINJ:1", 310.);
|
|
|
|
state.update("SPR:WINJ:2", 320.);
|
|
|
|
state.update("SPR:WINJ:3", 330.);
|
|
|
|
state.update("SPR:WINJ:4", 340.);
|
|
|
|
|
|
|
|
state.update("SWFR:WINJ:1", 21.);
|
|
|
|
state.update("SWFR:WINJ:2", 22.);
|
|
|
|
state.update("SWFR:WINJ:3", 23.);
|
|
|
|
state.update("SWFR:WINJ:4", 24.);
|
|
|
|
|
|
|
|
state.update("WBHP:WINJ", 234.);
|
|
|
|
return state;
|
2018-10-09 08:20:55 -05:00
|
|
|
}
|
2021-06-12 02:06:03 -05:00
|
|
|
Opm::data::Wells wr()
|
2021-02-26 07:56:00 -06:00
|
|
|
{
|
|
|
|
using o = ::Opm::data::Rates::opt;
|
2018-10-09 08:20:55 -05:00
|
|
|
|
2021-06-12 02:06:03 -05:00
|
|
|
auto xw = ::Opm::data::Wells {};
|
2018-10-09 08:20:55 -05:00
|
|
|
|
|
|
|
{
|
2021-02-26 07:56:00 -06:00
|
|
|
xw["PROD"].rates
|
|
|
|
.set(o::wat, 1.0)
|
|
|
|
.set(o::oil, 2.0)
|
|
|
|
.set(o::gas, 3.0);
|
|
|
|
xw["PROD"].bhp = 213.0;
|
|
|
|
double qo = 5.;
|
|
|
|
double qw = 4.;
|
|
|
|
double qg = 50.;
|
|
|
|
int firstConnectedCell = 90; // zero-based linear index of (1,5,2)
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
xw["PROD"].connections.emplace_back();
|
|
|
|
auto& c = xw["PROD"].connections.back();
|
|
|
|
|
|
|
|
c.rates.set(o::wat, qw*(float(i)+1.))
|
|
|
|
.set(o::oil, qo*(float(i)+1.))
|
|
|
|
.set(o::gas, qg*(float(i)+1.));
|
|
|
|
|
|
|
|
c.index = firstConnectedCell + i;
|
|
|
|
}
|
|
|
|
auto seg = Opm::data::Segment {};
|
|
|
|
for (std::size_t i = 1; i < 5; i++) {
|
|
|
|
xw["PROD"].segments.insert(std::pair<std::size_t,Opm::data::Segment>(i,seg));
|
|
|
|
}
|
|
|
|
xw["WINJ"].bhp = 234.0;
|
|
|
|
|
|
|
|
xw["WINJ"].rates.set(o::wat, 5.0);
|
|
|
|
xw["WINJ"].rates.set(o::oil, 0.0);
|
|
|
|
xw["WINJ"].rates.set(o::gas, 0.0);
|
|
|
|
qw = 7.;
|
|
|
|
firstConnectedCell = 409; // zero-based linear index of (10,1,9)
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
xw["WINJ"].connections.emplace_back();
|
|
|
|
auto& c = xw["WINJ"].connections.back();
|
|
|
|
|
|
|
|
c.rates.set(o::wat, qw*(float(i)+1.))
|
|
|
|
.set(o::oil, 0.)
|
|
|
|
.set(o::gas, 0.);
|
|
|
|
|
|
|
|
c.index = firstConnectedCell - i;
|
2018-10-09 08:20:55 -05:00
|
|
|
}
|
2019-02-19 02:03:13 -06:00
|
|
|
}
|
2021-02-26 07:56:00 -06:00
|
|
|
return xw;
|
|
|
|
}
|
2018-10-09 08:20:55 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
struct SimulationCase
|
|
|
|
{
|
|
|
|
explicit SimulationCase(const Opm::Deck& deck)
|
2019-03-05 08:29:10 -06:00
|
|
|
: es ( deck )
|
|
|
|
, grid ( deck )
|
2020-03-31 03:26:55 -05:00
|
|
|
, python( std::make_shared<Opm::Python>() )
|
2020-03-26 09:31:21 -05:00
|
|
|
, sched( deck, es, python )
|
2018-10-09 08:20:55 -05:00
|
|
|
{}
|
|
|
|
|
|
|
|
// Order requirement: 'es' must be declared/initialised before 'sched'.
|
|
|
|
Opm::EclipseState es;
|
2020-03-26 09:31:21 -05:00
|
|
|
Opm::EclipseGrid grid;
|
2020-03-31 03:26:55 -05:00
|
|
|
std::shared_ptr<Opm::Python> python;
|
2018-10-09 08:20:55 -05:00
|
|
|
Opm::Schedule sched;
|
|
|
|
};
|
|
|
|
|
|
|
|
// =====================================================================
|
2019-02-12 03:58:29 -06:00
|
|
|
|
2018-10-09 08:20:55 -05:00
|
|
|
BOOST_AUTO_TEST_SUITE(Aggregate_MSW)
|
|
|
|
|
|
|
|
|
2019-02-12 03:58:29 -06:00
|
|
|
// test dimensions of multisegment data
|
|
|
|
BOOST_AUTO_TEST_CASE (Constructor)
|
|
|
|
{
|
2021-02-26 07:56:00 -06:00
|
|
|
const auto simCase = SimulationCase {first_sim("TEST_AGGREGATE_MSW.DATA")};
|
|
|
|
|
|
|
|
Opm::EclipseState es = simCase.es;
|
|
|
|
Opm::Runspec rspec = es.runspec();
|
|
|
|
Opm::SummaryState st = sim_state();
|
|
|
|
Opm::Schedule sched = simCase.sched;
|
|
|
|
Opm::EclipseGrid grid = simCase.grid;
|
|
|
|
|
|
|
|
// Report Step 1: 2008-10-10 --> 2011-01-20
|
|
|
|
const auto rptStep = std::size_t {1};
|
|
|
|
|
|
|
|
double secs_elapsed = 3.1536E07;
|
|
|
|
const auto ih = Opm::RestartIO::Helpers::
|
|
|
|
createInteHead(es, grid, sched, secs_elapsed,
|
|
|
|
rptStep, rptStep+1, rptStep);
|
|
|
|
|
|
|
|
const auto amswd = Opm::RestartIO::Helpers::AggregateMSWData { ih };
|
|
|
|
const auto nswlmx = VI::intehead::NSWLMX;
|
|
|
|
const auto nsegmx = VI::intehead::NSEGMX;
|
|
|
|
const auto nisegz = VI::intehead::NISEGZ;
|
|
|
|
const auto nrsegz = VI::intehead::NRSEGZ;
|
|
|
|
const auto nlbrmx = VI::intehead::NLBRMX;
|
|
|
|
const auto nilbrz = VI::intehead::NILBRZ;
|
|
|
|
BOOST_CHECK_EQUAL(static_cast<int>(amswd.getISeg().size()), ih[nswlmx] * ih[nsegmx] * ih[nisegz]);
|
|
|
|
BOOST_CHECK_EQUAL(static_cast<int>(amswd.getRSeg().size()), ih[nswlmx] * ih[nsegmx] * ih[nrsegz]);
|
|
|
|
BOOST_CHECK_EQUAL(static_cast<int>(amswd.getILBs().size()), ih[nswlmx] * ih[nlbrmx]);
|
|
|
|
BOOST_CHECK_EQUAL(static_cast<int>(amswd.getILBr().size()), ih[nswlmx] * ih[nlbrmx] * ih[nilbrz]);
|
2019-02-12 03:58:29 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-02-19 02:03:13 -06:00
|
|
|
BOOST_AUTO_TEST_CASE (Declared_MSW_Data)
|
2019-02-12 03:58:29 -06:00
|
|
|
{
|
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
const auto simCase = SimulationCase {first_sim("TEST_AGGREGATE_MSW.DATA")};
|
2019-02-12 03:58:29 -06:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
Opm::EclipseState es = simCase.es;
|
|
|
|
Opm::Runspec rspec = es.runspec();
|
|
|
|
Opm::SummaryState smry = sim_state();
|
|
|
|
Opm::Schedule sched = simCase.sched;
|
|
|
|
Opm::EclipseGrid grid = simCase.grid;
|
|
|
|
const auto& units = es.getUnits();
|
2019-02-12 03:58:29 -06:00
|
|
|
|
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
// Report Step 1: 2008-10-10 --> 2011-01-20
|
|
|
|
const auto rptStep = std::size_t {1};
|
|
|
|
|
|
|
|
double secs_elapsed = 3.1536E07;
|
|
|
|
const auto ih = Opm::RestartIO::Helpers::
|
|
|
|
createInteHead(es, grid, sched, secs_elapsed,
|
|
|
|
rptStep, rptStep+1, rptStep);
|
|
|
|
|
|
|
|
//BOOST_CHECK_EQUAL(ih.nwells, MockIH::Sz{2});
|
|
|
|
|
2021-06-12 02:06:03 -05:00
|
|
|
const Opm::data::Wells wrc = wr();
|
2021-02-26 07:56:00 -06:00
|
|
|
auto amswd = Opm::RestartIO::Helpers::AggregateMSWData {ih};
|
2019-02-19 02:03:13 -06:00
|
|
|
amswd.captureDeclaredMSWData(simCase.sched,
|
2021-02-26 07:56:00 -06:00
|
|
|
rptStep,
|
|
|
|
units,
|
|
|
|
ih,
|
|
|
|
grid,
|
|
|
|
smry,
|
|
|
|
wrc
|
|
|
|
);
|
2019-02-12 03:58:29 -06:00
|
|
|
|
|
|
|
// ISEG (PROD)
|
|
|
|
{
|
2021-02-26 07:56:00 -06:00
|
|
|
auto start = 2*ih[VI::intehead::NISEGZ];
|
2019-02-19 02:03:13 -06:00
|
|
|
|
|
|
|
const auto& iSeg = amswd.getISeg();
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 0] , 10); // PROD-segment 3, ordered segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 1] , 2); // PROD-segment 3, outlet segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 2] , 4); // PROD-segment 3, inflow segment current branch
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 3] , 2); // PROD-segment 3, branch number
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 4] , 0); // PROD-segment 3, number of inflow branches
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 5] , 0); // PROD-segment 3, Sum number of inflow branches from first segment to current segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 6] , 1); // PROD-segment 3, number of connections in segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 7] , 1); // PROD-segment 3, sum of connections with lower segmeent number than current segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 8] , 8); // PROD-segment 3, ordered segment
|
|
|
|
|
|
|
|
start = 9*ih[VI::intehead::NISEGZ];
|
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 0] , 1); // PROD-segment 10, ordered segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 1] , 6); // PROD-segment 10, outlet segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 2] , 0); // PROD-segment 10, inflow segment current branch
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 3] , 5); // PROD-segment 10, branch number
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 4] , 0); // PROD-segment 10, number of inflow branches
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 5] , 0); // PROD-segment 10, Sum number of inflow branches from first segment to current segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 6] , 0); // PROD-segment 10, number of connections in segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 7] , 0); // PROD-segment 10, sum of connections with lower segmeent number than current segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 8] , 3); // PROD-segment 10, ordered segment
|
2019-02-12 03:58:29 -06:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2019-02-19 02:03:13 -06:00
|
|
|
// ISEG (WINJ)
|
2019-02-12 03:58:29 -06:00
|
|
|
{
|
2021-02-26 07:56:00 -06:00
|
|
|
auto start = ih[VI::intehead::NISEGZ]*ih[VI::intehead::NSEGMX] + 13*ih[VI::intehead::NISEGZ];
|
2019-02-19 02:03:13 -06:00
|
|
|
const auto& iSeg = amswd.getISeg();
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 0] , 5); // WINJ-segment 14, ordered segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 1] , 13); // WINJ-segment 14, outlet segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 2] , 15); // WINJ-segment 14, inflow segment current branch
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 3] , 2); // WINJ-segment 14, branch number
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 4] , 0); // WINJ-segment 14, number of inflow branches
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 5] , 0); // WINJ-segment 14, Sum number of inflow branches from first segment to current segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 6] , 1); // WINJ-segment 14, number of connections in segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 7] , 1); // WINJ-segment 14, sum of connections with lower segmeent number than current segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 8] , 5); // WINJ-segment 14, ordered segment
|
|
|
|
|
|
|
|
start = ih[VI::intehead::NISEGZ]*ih[VI::intehead::NSEGMX] + 16*ih[VI::intehead::NISEGZ];
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 0] , 2); // WINJ-segment 17, ordered segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 1] , 16); // WINJ-segment 17, outlet segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 2] , 18); // WINJ-segment 17, inflow segment current branch
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 3] , 2); // WINJ-segment 17, branch number
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 4] , 0); // WINJ-segment 17, number of inflow branches
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 5] , 0); // WINJ-segment 17, Sum number of inflow branches from first segment to current segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 6] , 1); // WINJ-segment 17, number of connections in segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 7] , 4); // WINJ-segment 17, sum of connections with lower segmeent number than current segment
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + 8] , 2); // WINJ-segment 17, ordered segment
|
2019-02-12 03:58:29 -06:00
|
|
|
|
|
|
|
}
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2019-02-19 02:03:13 -06:00
|
|
|
// RSEG (PROD) + (WINJ)
|
2019-02-12 03:58:29 -06:00
|
|
|
{
|
2021-02-26 07:56:00 -06:00
|
|
|
// well no 1 - PROD
|
|
|
|
const std::string wname = "PROD";
|
|
|
|
int segNo = 1;
|
|
|
|
// 'stringSegNum' is one-based (1 .. #segments inclusive)
|
|
|
|
std::string stringSegNo = std::to_string(segNo);
|
|
|
|
|
|
|
|
const auto i0 = (segNo-1)*ih[VI::intehead::NRSEGZ];
|
|
|
|
const auto gfactor = (units.getType() == Opm::UnitSystem::UnitType::UNIT_TYPE_FIELD)
|
|
|
|
? 0.1781076 : 0.001;
|
2019-02-19 02:03:13 -06:00
|
|
|
const auto& rseg = amswd.getRSeg();
|
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 ], 10. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 1], 7010. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 5], 0.31 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 6], 10. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 7], 7010. , 1.0e-10);
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
const double temp_o = smry.get("SOFR:PROD:1");
|
|
|
|
const double temp_w = smry.get("SWFR:PROD:1")*0.1;
|
|
|
|
const double temp_g = smry.get("SGFR:PROD:1")*gfactor;
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
auto t0 = temp_o + temp_w + temp_g;
|
|
|
|
double t1 = (std::abs(temp_w) > 0) ? temp_w / t0 : 0.;
|
|
|
|
double t2 = (std::abs(temp_g) > 0) ? temp_g / t0 : 0.;
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 8], t0, 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 9], t1, 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 10], t2, 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 11], 235., 1.0e-10);
|
2019-02-12 03:58:29 -06:00
|
|
|
}
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2018-10-26 09:14:31 -05:00
|
|
|
{
|
2021-02-26 07:56:00 -06:00
|
|
|
// well no 2 - WINJ
|
|
|
|
const std::string wname = "WINJ";
|
|
|
|
int segNo = 1;
|
|
|
|
// 'stringSegNum' is one-based (1 .. #segments inclusive)
|
|
|
|
std::string stringSegNo = std::to_string(segNo);
|
|
|
|
|
|
|
|
const auto i0 = ih[VI::intehead::NRSEGZ]*ih[VI::intehead::NSEGMX] + (segNo-1)*ih[VI::intehead::NRSEGZ];
|
|
|
|
using M = ::Opm::UnitSystem::measure;
|
|
|
|
const auto gfactor = (units.getType() == Opm::UnitSystem::UnitType::UNIT_TYPE_FIELD)
|
|
|
|
? 0.1781076 : 0.001;
|
2019-02-19 02:03:13 -06:00
|
|
|
const auto& rseg = amswd.getRSeg();
|
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 ], 10. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 1], 7010. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 5], 0.31 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 6], 10. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 7], 7010. , 1.0e-10);
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
const double temp_o = 0.;
|
|
|
|
const double temp_w = -units.from_si(M::liquid_surface_rate,105.)*0.1;
|
|
|
|
const double temp_g = 0.0*gfactor;
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
auto t0 = temp_o + temp_w + temp_g;
|
|
|
|
double t1 = (std::abs(temp_w) > 0) ? temp_w / t0 : 0.;
|
|
|
|
double t2 = (std::abs(temp_g) > 0) ? temp_g / t0 : 0.;
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 8], t0, 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 9], t1, 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 10], t2, 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + 11], 234., 1.0e-10);
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2018-10-09 08:20:55 -05:00
|
|
|
}
|
2019-05-04 05:00:32 -05:00
|
|
|
|
|
|
|
// ILBR
|
2018-10-09 08:20:55 -05:00
|
|
|
{
|
2021-02-26 07:56:00 -06:00
|
|
|
auto start = 0*ih[VI::intehead::NILBRZ];
|
2019-02-19 02:03:13 -06:00
|
|
|
|
|
|
|
const auto& iLBr = amswd.getILBr();
|
2021-02-26 07:56:00 -06:00
|
|
|
//PROD
|
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 0] , 0); // PROD-branch 1, outlet segment
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 1] , 2); // PROD-branch 1, No of segments in branch
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 2] , 1); // PROD-branch 1, first segment
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 3] , 2); // PROD-branch 1, last segment
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 4] , 0); // PROD-branch 1, branch no - 1
|
|
|
|
//PROD
|
|
|
|
start = 1*ih[VI::intehead::NILBRZ];
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 0] , 2); // PROD-branch 2, outlet segment
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 1] , 5); // PROD-branch 2, No of segments in branch
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 2] , 3); // PROD-branch 2, first segment
|
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 3] , 7); // PROD-branch 2, last segment
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 4] , 1); // PROD-branch 2, branch no - 1
|
|
|
|
|
|
|
|
|
|
|
|
start = ih[VI::intehead::NILBRZ]*ih[VI::intehead::NLBRMX] + 0*ih[VI::intehead::NILBRZ];
|
|
|
|
//WINJ
|
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 0] , 0); // WINJ-branch 1, outlet segment
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 1] , 13); // WINJ-branch 1, No of segments in branch
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 2] , 1); // WINJ-branch 1, first segment
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 3] , 13); // WINJ-branch 1, last segment
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 4] , 0); // WINJ-branch 1, branch no - 1
|
|
|
|
|
|
|
|
start = ih[VI::intehead::NILBRZ]*ih[VI::intehead::NLBRMX] + 1*ih[VI::intehead::NILBRZ];
|
|
|
|
//WINJ
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 0] , 13); // WINJ-branch 2, outlet segment
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 1] , 5); // WINJ-branch 2, No of segments in branch
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 2] , 14); // WINJ-branch 2, first segment
|
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 3] , 18); // WINJ-branch 2, last segment
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBr[start + 4] , 1); // WINJ-branch 2, branch no - 1
|
2018-10-09 08:20:55 -05:00
|
|
|
|
|
|
|
|
|
|
|
}
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
// ILBS
|
2018-10-09 08:20:55 -05:00
|
|
|
{
|
2021-02-26 07:56:00 -06:00
|
|
|
auto start = 0*ih[VI::intehead::NLBRMX];
|
2018-10-09 08:20:55 -05:00
|
|
|
|
2019-02-19 02:03:13 -06:00
|
|
|
const auto& iLBs = amswd.getILBs();
|
2021-02-26 07:56:00 -06:00
|
|
|
//PROD
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBs[start + 0] , 3); // PROD-branch 2, first segment in branch
|
2019-05-04 05:00:32 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
start = ih[VI::intehead::NLBRMX] + 0*ih[VI::intehead::NLBRMX];
|
|
|
|
//WINJ
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_EQUAL(iLBs[start + 0] , 14); // WINJ-branch 2, first segment in branch
|
2018-10-09 08:20:55 -05:00
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2019-02-19 02:03:13 -06:00
|
|
|
|
2018-10-09 08:20:55 -05:00
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_AUTO_TEST_CASE(MSW_AICD) {
|
|
|
|
const auto simCase = SimulationCase {first_sim("TEST_AGGREGATE_MSW.DATA")};
|
|
|
|
|
|
|
|
Opm::EclipseState es = simCase.es;
|
|
|
|
Opm::Runspec rspec = es.runspec();
|
|
|
|
Opm::SummaryState smry = sim_state();
|
|
|
|
Opm::Schedule sched = simCase.sched;
|
|
|
|
Opm::EclipseGrid grid = simCase.grid;
|
|
|
|
const auto& units = es.getUnits();
|
|
|
|
|
|
|
|
|
|
|
|
// Report Step 1: 2008-10-10 --> 2011-01-20
|
|
|
|
const auto rptStep = std::size_t {1};
|
|
|
|
|
|
|
|
double secs_elapsed = 3.1536E07;
|
|
|
|
const auto ih = Opm::RestartIO::Helpers::
|
|
|
|
createInteHead(es, grid, sched, secs_elapsed,
|
|
|
|
rptStep, rptStep+1, rptStep);
|
|
|
|
|
|
|
|
|
2021-06-12 02:06:03 -05:00
|
|
|
const Opm::data::Wells wrc = wr();
|
2021-02-26 07:56:00 -06:00
|
|
|
auto amswd = Opm::RestartIO::Helpers::AggregateMSWData {ih};
|
|
|
|
amswd.captureDeclaredMSWData(simCase.sched,
|
|
|
|
rptStep,
|
|
|
|
units,
|
|
|
|
ih,
|
|
|
|
grid,
|
|
|
|
smry,
|
|
|
|
wrc
|
|
|
|
);
|
|
|
|
|
|
|
|
// ISEG (PROD)
|
|
|
|
{
|
|
|
|
const auto& iSeg = amswd.getISeg();
|
2021-03-03 05:29:40 -06:00
|
|
|
auto start = 7*ih[VI::intehead::NISEGZ];
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + VI::ISeg::index::SegmentType], -8); // PROD-segment 8,
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + VI::ISeg::index::ICDScalingMode], 1); // PROD-segment 8,
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + VI::ISeg::index::ICDOpenShutFlag], 0); // PROD-segment 8,
|
2021-02-26 07:56:00 -06:00
|
|
|
|
2021-03-03 05:29:40 -06:00
|
|
|
start = 8*ih[VI::intehead::NISEGZ];
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + VI::ISeg::index::SegmentType], -8); // PROD-segment 9,
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + VI::ISeg::index::ICDScalingMode], 1); // PROD-segment 9,
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + VI::ISeg::index::ICDOpenShutFlag], 0); // PROD-segment 9,
|
2021-02-26 07:56:00 -06:00
|
|
|
|
2021-03-03 05:29:40 -06:00
|
|
|
start = 9*ih[VI::intehead::NISEGZ];
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + VI::ISeg::index::SegmentType], -8); // PROD-segment 10,
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + VI::ISeg::index::ICDScalingMode], 0); // PROD-segment 10,
|
|
|
|
BOOST_CHECK_EQUAL(iSeg[start + VI::ISeg::index::ICDOpenShutFlag], 0); // PROD-segment 10,
|
2021-02-26 07:56:00 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// RSEG (PROD)
|
|
|
|
{
|
|
|
|
// well no 1 - PROD
|
|
|
|
const auto& rseg = amswd.getRSeg();
|
|
|
|
|
2021-03-03 05:29:40 -06:00
|
|
|
int segNo = 8;
|
2021-02-26 07:56:00 -06:00
|
|
|
auto i0 = (segNo-1)*ih[VI::intehead::NRSEGZ];
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::DeviceBaseStrength], 3.260E-05 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::ScalingFactor], 0.06391 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::CalibrFluidDensity], 63.678 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::CalibrFluidViscosity], 0.48 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::CriticalWaterFraction], 0.5 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::TransitionRegWidth], 0.05 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::MaxEmulsionRatio], 5. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::FlowRateExponent], 2.1 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::ViscFuncExponent], 1.2 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::MaxValidFlowRate], -2e+20 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::ICDLength], 0.06391 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionOilDensityExponent], 1. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionWaterDensityExponent], 1. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionGasDensityExponent], 1. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionOilViscosityExponent], 1. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionWaterViscosityExponent], 1. , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionGasViscosityExponent], 1. , 1.0e-10);
|
|
|
|
|
2021-03-03 05:29:40 -06:00
|
|
|
segNo = 10;
|
2021-02-26 07:56:00 -06:00
|
|
|
i0 = (segNo-1)*ih[VI::intehead::NRSEGZ];
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::DeviceBaseStrength], 3.260E-05 , 1.0e-10);
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::ScalingFactor], 0.000876 , 1.0e-10);
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::CalibrFluidDensity], 63.678 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::CalibrFluidViscosity], 0.48 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::CriticalWaterFraction], 0.53 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::TransitionRegWidth], 0.048 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::MaxEmulsionRatio], 4.89 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::FlowRateExponent], 2.1 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::ViscFuncExponent], 1.2 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::MaxValidFlowRate], 9.876e+06 , 1.0e-10);
|
2021-03-03 05:29:40 -06:00
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::ICDLength], 0.0876 , 1.0e-10);
|
2021-02-26 07:56:00 -06:00
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionOilDensityExponent], 0.92 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionWaterDensityExponent], 0.89 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionGasDensityExponent], 0.91 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionOilViscosityExponent], 1.01 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionWaterViscosityExponent], 1.02 , 1.0e-10);
|
|
|
|
BOOST_CHECK_CLOSE(rseg[i0 + VI::RSeg::index::flowFractionGasViscosityExponent], 1.03 , 1.0e-10);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-01-15 04:41:28 -06:00
|
|
|
BOOST_AUTO_TEST_CASE(MSW_RST) {
|
2021-02-26 07:56:00 -06:00
|
|
|
const auto simCase = SimulationCase {first_sim("TEST_AGGREGATE_MSW.DATA")};
|
|
|
|
|
|
|
|
Opm::EclipseState es = simCase.es;
|
|
|
|
Opm::Runspec rspec = es.runspec();
|
|
|
|
Opm::SummaryState smry = sim_state();
|
|
|
|
Opm::Schedule sched = simCase.sched;
|
|
|
|
Opm::EclipseGrid grid = simCase.grid;
|
|
|
|
const auto& units = es.getUnits();
|
2020-01-15 04:41:28 -06:00
|
|
|
|
|
|
|
|
2021-02-26 07:56:00 -06:00
|
|
|
// Report Step 1: 2008-10-10 --> 2011-01-20
|
|
|
|
const auto rptStep = std::size_t {1};
|
|
|
|
|
|
|
|
double secs_elapsed = 3.1536E07;
|
|
|
|
const auto ih = Opm::RestartIO::Helpers::
|
|
|
|
createInteHead(es, grid, sched, secs_elapsed,
|
|
|
|
rptStep, rptStep+1, rptStep);
|
|
|
|
|
2020-01-15 04:41:28 -06:00
|
|
|
|
2021-06-12 02:06:03 -05:00
|
|
|
const Opm::data::Wells wrc = wr();
|
2021-02-26 07:56:00 -06:00
|
|
|
auto amswd = Opm::RestartIO::Helpers::AggregateMSWData {ih};
|
2020-01-15 04:41:28 -06:00
|
|
|
amswd.captureDeclaredMSWData(simCase.sched,
|
|
|
|
rptStep,
|
2021-02-26 07:56:00 -06:00
|
|
|
units,
|
|
|
|
ih,
|
|
|
|
grid,
|
2020-01-15 04:41:28 -06:00
|
|
|
smry,
|
|
|
|
wrc
|
2021-02-26 07:56:00 -06:00
|
|
|
);
|
|
|
|
|
2020-01-15 04:41:28 -06:00
|
|
|
const auto& iseg = amswd.getISeg();
|
|
|
|
const auto& rseg = amswd.getRSeg();
|
2020-03-26 13:44:43 -05:00
|
|
|
auto segment = Opm::RestartIO::RstSegment(simCase.es.getUnits(), 1, iseg.data(), rseg.data());
|
2020-01-15 04:41:28 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-10-09 08:20:55 -05:00
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|