324 lines
12 KiB
C++
324 lines
12 KiB
C++
/*
|
|
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/>.
|
|
*/
|
|
|
|
#define BOOST_TEST_MODULE Aggregate_Group_Data
|
|
#include <opm/output/eclipse/AggregateGroupData.hpp>
|
|
#include <opm/output/eclipse/AggregateNetworkData.hpp>
|
|
#include <opm/output/eclipse/WriteRestartHelpers.hpp>
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
#include <opm/output/eclipse/AggregateWellData.hpp>
|
|
|
|
#include <opm/output/eclipse/VectorItems/intehead.hpp>
|
|
#include <opm/output/eclipse/VectorItems/group.hpp>
|
|
#include <opm/output/eclipse/VectorItems/well.hpp>
|
|
#include <opm/input/eclipse/Python/Python.hpp>
|
|
|
|
#include <opm/output/data/Wells.hpp>
|
|
|
|
#include <opm/input/eclipse/Deck/Deck.hpp>
|
|
#include <opm/input/eclipse/Parser/Parser.hpp>
|
|
#include <opm/input/eclipse/EclipseState/EclipseState.hpp>
|
|
#include <opm/input/eclipse/Schedule/Schedule.hpp>
|
|
#include <opm/input/eclipse/Schedule/SummaryState.hpp>
|
|
|
|
#include <opm/io/eclipse/OutputStream.hpp>
|
|
#include <opm/common/utility/TimeService.hpp>
|
|
|
|
#include <exception>
|
|
#include <stdexcept>
|
|
#include <utility>
|
|
#include <vector>
|
|
#include <iostream>
|
|
#include <cstddef>
|
|
|
|
namespace {
|
|
|
|
|
|
Opm::Deck first_sim(std::string fname) {
|
|
return Opm::Parser{}.parseFile(fname);
|
|
}
|
|
|
|
Opm::SummaryState sum_state()
|
|
{
|
|
auto state = Opm::SummaryState{Opm::TimeService::now()};
|
|
|
|
state.update_well_var("P1", "WOPR", 3342.673828);
|
|
state.update_well_var("P1", "WWPR", 0.000005);
|
|
state.update_well_var("P1", "WGPR", 334267.375);
|
|
state.update_well_var("P1", "WGLIR", 111000.);
|
|
|
|
state.update_well_var("P2", "WOPR", 3882.443848);
|
|
state.update_well_var("P2", "WWPR", 0.000002);
|
|
state.update_well_var("P2", "WGPR", 672736.9375);
|
|
state.update_well_var("P2", "WGLIR", 99666.);
|
|
|
|
state.update_well_var("P3", "WOPR", 3000.000000);
|
|
state.update_well_var("P3", "WWPR", 0.000002);
|
|
state.update_well_var("P3", "WGPR", 529658.8125);
|
|
state.update_well_var("P3", "WGLIR", 55000.);
|
|
|
|
state.update_group_var("B1", "GPR", 81.6848);
|
|
state.update_group_var("N1", "GPR", 72.);
|
|
state.update_group_var("N2", "GPR", 69.);
|
|
state.update_group_var("PLAT-A", "GPR", 67.);
|
|
state.update_group_var("B2", "GPR", 79.0666);
|
|
state.update_group_var("M1", "GPR", 72.);
|
|
|
|
return state;
|
|
}
|
|
|
|
std::string pad8(const std::string& s) {
|
|
return s + std::string( 8 - s.size(), ' ');
|
|
}
|
|
}
|
|
|
|
struct SimulationCase
|
|
{
|
|
explicit SimulationCase(const Opm::Deck& deck)
|
|
: es ( deck )
|
|
, grid { deck }
|
|
, python( std::make_shared<Opm::Python>() )
|
|
, sched (deck, es, python )
|
|
{}
|
|
|
|
// Order requirement: 'es' must be declared/initialised before 'sched'.
|
|
Opm::EclipseState es;
|
|
Opm::EclipseGrid grid;
|
|
std::shared_ptr<Opm::Python> python;
|
|
Opm::Schedule sched;
|
|
};
|
|
|
|
// =====================================================================
|
|
|
|
BOOST_AUTO_TEST_SUITE(Aggregate_Network)
|
|
|
|
|
|
// test dimensions of multisegment data
|
|
BOOST_AUTO_TEST_CASE (Constructor)
|
|
{
|
|
namespace VI = ::Opm::RestartIO::Helpers::VectorItems;
|
|
const auto simCase = SimulationCase{first_sim("TEST_NETWORK_ALL.DATA")};
|
|
|
|
Opm::EclipseState es = simCase.es;
|
|
Opm::Runspec rspec = es.runspec();
|
|
Opm::SummaryState st = sum_state();
|
|
Opm::Schedule sched = simCase.sched;
|
|
Opm::EclipseGrid grid = simCase.grid;
|
|
//const auto& ioConfig = es.getIOConfig();
|
|
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);
|
|
|
|
auto networkData = Opm::RestartIO::Helpers::AggregateNetworkData(ih);
|
|
networkData.captureDeclaredNetworkData(es, sched, units, rptStep, st, ih);
|
|
|
|
BOOST_CHECK_EQUAL(static_cast<int>(networkData.getINode().size()), ih[VI::NINODE] * ih[VI::NODMAX]);
|
|
BOOST_CHECK_EQUAL(static_cast<int>(networkData.getIBran().size()), ih[VI::NIBRAN] * ih[VI::NBRMAX]);
|
|
BOOST_CHECK_EQUAL(static_cast<int>(networkData.getINobr().size()), ih[VI::NINOBR]);
|
|
BOOST_CHECK_EQUAL(static_cast<int>(networkData.getZNode().size()), ih[VI::NZNODE] * ih[VI::NODMAX]);
|
|
BOOST_CHECK_EQUAL(static_cast<int>(networkData.getRNode().size()), ih[VI::NRNODE] * ih[VI::NODMAX]);
|
|
BOOST_CHECK_EQUAL(static_cast<int>(networkData.getRBran().size()), ih[VI::NRBRAN] * ih[VI::NBRMAX]);
|
|
|
|
//INode-parameters
|
|
const auto& iNode = networkData.getINode();
|
|
auto start = 0*ih[VI::NINODE];
|
|
BOOST_CHECK_EQUAL(iNode[start + 0], 1);
|
|
BOOST_CHECK_EQUAL(iNode[start + 1], 1);
|
|
BOOST_CHECK_EQUAL(iNode[start + 2], 4);
|
|
BOOST_CHECK_EQUAL(iNode[start + 3], 0);
|
|
BOOST_CHECK_EQUAL(iNode[start + 4], 1);
|
|
|
|
start = 1*ih[VI::NINODE];
|
|
BOOST_CHECK_EQUAL(iNode[start + 0], 2);
|
|
BOOST_CHECK_EQUAL(iNode[start + 1], 2);
|
|
BOOST_CHECK_EQUAL(iNode[start + 2], 3);
|
|
BOOST_CHECK_EQUAL(iNode[start + 3], 0);
|
|
BOOST_CHECK_EQUAL(iNode[start + 4], 1);
|
|
|
|
start = 2*ih[VI::NINODE];
|
|
BOOST_CHECK_EQUAL(iNode[start + 0], 3);
|
|
BOOST_CHECK_EQUAL(iNode[start + 1], 4);
|
|
BOOST_CHECK_EQUAL(iNode[start + 2], 1);
|
|
BOOST_CHECK_EQUAL(iNode[start + 3], 0);
|
|
BOOST_CHECK_EQUAL(iNode[start + 4], 1);
|
|
|
|
start = 3*ih[VI::NINODE];
|
|
BOOST_CHECK_EQUAL(iNode[start + 0], 1);
|
|
BOOST_CHECK_EQUAL(iNode[start + 1], 7);
|
|
BOOST_CHECK_EQUAL(iNode[start + 2], 2);
|
|
BOOST_CHECK_EQUAL(iNode[start + 3], 1);
|
|
BOOST_CHECK_EQUAL(iNode[start + 4], 1);
|
|
|
|
start = 4*ih[VI::NINODE];
|
|
BOOST_CHECK_EQUAL(iNode[start + 0], 1);
|
|
BOOST_CHECK_EQUAL(iNode[start + 1], 8);
|
|
BOOST_CHECK_EQUAL(iNode[start + 2], 6);
|
|
BOOST_CHECK_EQUAL(iNode[start + 3], 0);
|
|
BOOST_CHECK_EQUAL(iNode[start + 4], 1);
|
|
|
|
start = 5*ih[VI::NINODE];
|
|
BOOST_CHECK_EQUAL(iNode[start + 0], 2);
|
|
BOOST_CHECK_EQUAL(iNode[start + 1], 9);
|
|
BOOST_CHECK_EQUAL(iNode[start + 2], 5);
|
|
BOOST_CHECK_EQUAL(iNode[start + 3], 0);
|
|
BOOST_CHECK_EQUAL(iNode[start + 4], 1);
|
|
|
|
//IBran-parameters
|
|
const auto& iBran = networkData.getIBran();
|
|
start = 0*ih[VI::NIBRAN];
|
|
BOOST_CHECK_EQUAL(iBran[start + 0], 1);
|
|
BOOST_CHECK_EQUAL(iBran[start + 1], 2);
|
|
BOOST_CHECK_EQUAL(iBran[start + 2], 3);
|
|
|
|
start = 1*ih[VI::NIBRAN];
|
|
BOOST_CHECK_EQUAL(iBran[start + 0], 2);
|
|
BOOST_CHECK_EQUAL(iBran[start + 1], 3);
|
|
BOOST_CHECK_EQUAL(iBran[start + 2], 8);
|
|
|
|
start = 2*ih[VI::NIBRAN];
|
|
BOOST_CHECK_EQUAL(iBran[start + 0], 3);
|
|
BOOST_CHECK_EQUAL(iBran[start + 1], 4);
|
|
BOOST_CHECK_EQUAL(iBran[start + 2], 7);
|
|
|
|
start = 3*ih[VI::NIBRAN];
|
|
BOOST_CHECK_EQUAL(iBran[start + 0], 5);
|
|
BOOST_CHECK_EQUAL(iBran[start + 1], 6);
|
|
BOOST_CHECK_EQUAL(iBran[start + 2], 3);
|
|
|
|
start = 4*ih[VI::NIBRAN];
|
|
BOOST_CHECK_EQUAL(iBran[start + 0], 6);
|
|
BOOST_CHECK_EQUAL(iBran[start + 1], 3);
|
|
BOOST_CHECK_EQUAL(iBran[start + 2], 8);
|
|
|
|
//ZNode-parameters
|
|
const std::string blank8 = " ";
|
|
|
|
const auto& zNode = networkData.getZNode();
|
|
start = 0*ih[VI::NZNODE];
|
|
BOOST_CHECK_EQUAL(zNode[start + 0].c_str(), pad8("B1"));
|
|
BOOST_CHECK_EQUAL(zNode[start + 1].c_str(), blank8);
|
|
|
|
start = 1*ih[VI::NZNODE];
|
|
BOOST_CHECK_EQUAL(zNode[start + 0].c_str(), pad8("N1"));
|
|
BOOST_CHECK_EQUAL(zNode[start + 1].c_str(), blank8);
|
|
|
|
start = 2*ih[VI::NZNODE];
|
|
BOOST_CHECK_EQUAL(zNode[start + 0].c_str(), pad8("N2"));
|
|
BOOST_CHECK_EQUAL(zNode[start + 1].c_str(), blank8);
|
|
|
|
start = 3*ih[VI::NZNODE];
|
|
BOOST_CHECK_EQUAL(zNode[start + 0].c_str(), pad8("PLAT-A"));
|
|
BOOST_CHECK_EQUAL(zNode[start + 1].c_str(), blank8);
|
|
|
|
start = 4*ih[VI::NZNODE];
|
|
BOOST_CHECK_EQUAL(zNode[start + 0].c_str(), pad8("B2"));
|
|
BOOST_CHECK_EQUAL(zNode[start + 1].c_str(), blank8);
|
|
|
|
start = 5*ih[VI::NZNODE];
|
|
BOOST_CHECK_EQUAL(zNode[start + 0].c_str(), pad8("M1"));
|
|
BOOST_CHECK_EQUAL(zNode[start + 1].c_str(), blank8);
|
|
|
|
//INobr-parameters
|
|
const auto& iNobr = networkData.getINobr();
|
|
start = 0;
|
|
BOOST_CHECK_EQUAL(iNobr[start + 0], -1);
|
|
BOOST_CHECK_EQUAL(iNobr[start + 1], 1);
|
|
BOOST_CHECK_EQUAL(iNobr[start + 2], -2);
|
|
BOOST_CHECK_EQUAL(iNobr[start + 3], 2);
|
|
BOOST_CHECK_EQUAL(iNobr[start + 4], -3);
|
|
BOOST_CHECK_EQUAL(iNobr[start + 5], 5);
|
|
BOOST_CHECK_EQUAL(iNobr[start + 6], 3);
|
|
BOOST_CHECK_EQUAL(iNobr[start + 7], -4);
|
|
BOOST_CHECK_EQUAL(iNobr[start + 8], 4);
|
|
BOOST_CHECK_EQUAL(iNobr[start + 9], -5);
|
|
|
|
//RNode-parameters
|
|
const auto& rNode = networkData.getRNode();
|
|
start = 0*ih[VI::NRNODE];
|
|
BOOST_CHECK_CLOSE(rNode[start + 0], 81.6848, 1.0e-10);
|
|
//BOOST_CHECK_CLOSE(rNode[start + 1], 1., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 2], 50., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 15], 1., 1.0e-10);
|
|
|
|
start = 1*ih[VI::NRNODE];
|
|
BOOST_CHECK_CLOSE(rNode[start + 0], 72., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 1], 1., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 2], 67., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 15], 1., 1.0e-10);
|
|
|
|
start = 2*ih[VI::NRNODE];
|
|
BOOST_CHECK_CLOSE(rNode[start + 0], 69., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 1], 1., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 2], 67., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 15], 1., 1.0e-10);
|
|
|
|
start = 3*ih[VI::NRNODE];
|
|
BOOST_CHECK_CLOSE(rNode[start + 0], 67., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 1], 0., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 2], 67., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 15], 1., 1.0e-10);
|
|
|
|
start = 4*ih[VI::NRNODE];
|
|
BOOST_CHECK_CLOSE(rNode[start + 0], 79.0666, 1.0e-10);
|
|
//BOOST_CHECK_CLOSE(rNode[start + 1], 1., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 2], 52., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 15], 1., 1.0e-10);
|
|
|
|
start = 5*ih[VI::NRNODE];
|
|
BOOST_CHECK_CLOSE(rNode[start + 0], 72., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 1], 1., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 2], 67., 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rNode[start + 15], 1., 1.0e-10);
|
|
|
|
|
|
//RNode-parameters
|
|
const auto& rBran = networkData.getRBran();
|
|
start = 0*ih[VI::NRBRAN];
|
|
BOOST_CHECK_CLOSE(rBran[start + 0], 6342.673828, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 1], 7.0e-06, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 2], 1029926.1875, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 8], 841.77298664275565, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 9], 0.91567670595811512, 1.0e-10);
|
|
|
|
start = 2*ih[VI::NRBRAN];
|
|
BOOST_CHECK_CLOSE(rBran[start + 0], 10225.117676, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 1], 9.0e-06, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 2], 1802329.125, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 8], 841.97309189645352, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 9], 0.91752948909927878, 1.0e-10);
|
|
|
|
start = 3*ih[VI::NRBRAN];
|
|
BOOST_CHECK_CLOSE(rBran[start + 0], 3882.4438479999999, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 1], 1.9999999999999999e-06, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 2], 772402.9375, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 8], 842.3, 1.0e-10);
|
|
BOOST_CHECK_CLOSE(rBran[start + 9], 0.92, 1.0e-10);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|