Files
opm-common/tests/test_data_InterRegFlowMap.cpp
Bård Skaflestad 68975be966 Add Accumulating Mapping Structure for Inter-Region Flows
This commit introduces a new helper facility,

    data::InterRegFlowMap

that knows how to interpret region IDs.  It is a simple wrapper
around a common CSR representation of (source, destination) region
ID pairs with the additional feature that the element type of the
connection is a linear sequence values of arithmetic type.  We've
initially elected to make this sequence out of 'float' in order to
conserve memory since we expect to do little arithmetic to the
sequence itself outside of compression and parallel communication.

Client code will be of two primary categories

  1. Producing side which inserts flow rates from individual
     connections, compresses the result when done, and communicates
     the results to one or more parallel I/O ranks

  2. Consuming side, typically on an I/O rank, which merges the
     contributions from multiple source ranks and extracts values
     pertaining inter-region flows for purpose of outputting time
     series data to a summary file.

The first case will create and populate 'FlowRates' and add these
into the container using the 'addConnection' function and finally
call 'compress' when complete.  Consumers will then use member
function 'getInterRegFlows' to extract a signed view of flow rate
values associated to a particular region ID pair (nullopt if no such
pair is registered).
2022-02-16 23:28:46 +01:00

979 lines
47 KiB
C++

/*
Copyright (c) 2022 Equinor 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 data_InterRegFlowMap
#include <boost/test/unit_test.hpp>
#include <opm/output/data/InterRegFlowMap.hpp>
#include <optional>
#include <stdexcept>
#include <utility>
#include <tuple>
#include "tests/MessageBuffer.cpp"
namespace {
Opm::data::InterRegFlowMap::FlowRates conn_1()
{
using Component = Opm::data::InterRegFlowMap::Component;
auto rate = Opm::data::InterRegFlowMap::FlowRates{};
rate[Component::Oil] = 1.0;
rate[Component::Gas] = 2.0;
rate[Component::Water] = 3.0;
rate[Component::Disgas] = 4.0;
rate[Component::Vapoil] = 5.0;
return rate;
}
Opm::data::InterRegFlowMap::FlowRates conn_2()
{
using Component = Opm::data::InterRegFlowMap::Component;
auto rate = Opm::data::InterRegFlowMap::FlowRates{};
rate[Component::Oil] = 0.1;
rate[Component::Gas] = 0.2;
rate[Component::Water] = 0.3;
rate[Component::Disgas] = 0.4;
rate[Component::Vapoil] = 0.5;
return rate;
}
Opm::data::InterRegFlowMap::FlowRates conn_3()
{
using Component = Opm::data::InterRegFlowMap::Component;
auto rate = Opm::data::InterRegFlowMap::FlowRates{};
rate[Component::Oil] = -0.2;
rate[Component::Gas] = -0.4;
rate[Component::Water] = -0.6;
rate[Component::Disgas] = -0.8;
rate[Component::Vapoil] = -1.0;
return rate;
}
}
BOOST_AUTO_TEST_SUITE(InterRegMap)
BOOST_AUTO_TEST_CASE(Basic)
{
using Component = Opm::data::InterRegFlowMap::ReadOnlyWindow::Component;
using Direction = Opm::data::InterRegFlowMap::ReadOnlyWindow::Direction;
auto flowMap = Opm::data::InterRegFlowMap{};
flowMap.addConnection(0, 1, conn_1());
// Invalid source region index
BOOST_CHECK_THROW(flowMap.addConnection(-1, 1, conn_1()),
std::logic_error);
// Invalid destination region index
BOOST_CHECK_THROW(flowMap.addConnection(1, -1, conn_1()),
std::logic_error);
flowMap.compress(2);
BOOST_CHECK_EQUAL(flowMap.numRegions(), 2);
// Invalid source region index
BOOST_CHECK_THROW(std::ignore = flowMap.getInterRegFlows(-1, 0),
std::invalid_argument);
// Invalid destination region index
BOOST_CHECK_THROW(std::ignore = flowMap.getInterRegFlows(0, -1),
std::invalid_argument);
// Invalid region index pair (source == destination)
BOOST_CHECK_THROW(std::ignore = flowMap.getInterRegFlows(0, 0),
std::invalid_argument);
{
auto flows = flowMap.getInterRegFlows(0, 1729);
BOOST_CHECK_MESSAGE(! flows.has_value(),
"Unregistered region pair must NOT have a value");
}
{
auto flows = flowMap.getInterRegFlows(0, 1);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, 1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), 0.0, 1.0e-6);
}
{
auto flows = flowMap.getInterRegFlows(1, 0);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), 0.0, 1.0e-6);
}
}
BOOST_AUTO_TEST_CASE(Basic_Reverse)
{
using Component = Opm::data::InterRegFlowMap::ReadOnlyWindow::Component;
using Direction = Opm::data::InterRegFlowMap::ReadOnlyWindow::Direction;
auto flowMap = Opm::data::InterRegFlowMap{};
flowMap.addConnection(1, 0, conn_1());
flowMap.compress(2);
BOOST_CHECK_EQUAL(flowMap.numRegions(), 2);
{
auto flows = flowMap.getInterRegFlows(0, 1);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, 1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), -1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), -2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), -3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), -4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), -5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -5.0, 1.0e-6);
}
{
auto flows = flowMap.getInterRegFlows(1, 0);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), -1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), -2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), -3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), -4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), -5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -5.0, 1.0e-6);
}
}
BOOST_AUTO_TEST_CASE(Not_All_Pairs)
{
auto flowMap = Opm::data::InterRegFlowMap{};
flowMap.addConnection(3, 2, conn_1());
flowMap.addConnection(3, 1, conn_1());
flowMap.addConnection(2, 0, conn_1());
flowMap.addConnection(1, 0, conn_1());
flowMap.compress(4);
{
auto flows = flowMap.getInterRegFlows(0, 1);
BOOST_CHECK_MESSAGE(flows.has_value(),
"Registered region pair (0,1) must have a value");
}
{
auto flows = flowMap.getInterRegFlows(0, 2);
BOOST_CHECK_MESSAGE(flows.has_value(),
"Registered region pair (0,2) must have a value");
}
{
auto flows = flowMap.getInterRegFlows(0, 3);
BOOST_CHECK_MESSAGE(! flows.has_value(),
"Unregistered region pair (0,3) must NOT have a value");
}
{
auto flows = flowMap.getInterRegFlows(1, 2);
BOOST_CHECK_MESSAGE(! flows.has_value(),
"Unregistered region pair (1,2) must NOT have a value");
}
{
auto flows = flowMap.getInterRegFlows(1, 3);
BOOST_CHECK_MESSAGE(flows.has_value(),
"Registered region pair (1,3) must have a value");
}
{
auto flows = flowMap.getInterRegFlows(2, 3);
BOOST_CHECK_MESSAGE(flows.has_value(),
"Registered region pair (2,3) must have a value");
}
}
BOOST_AUTO_TEST_CASE(Clear)
{
using Component = Opm::data::InterRegFlowMap::ReadOnlyWindow::Component;
using Direction = Opm::data::InterRegFlowMap::ReadOnlyWindow::Direction;
auto flowMap = Opm::data::InterRegFlowMap{};
flowMap.addConnection(0, 1, conn_1());
flowMap.compress(2);
BOOST_CHECK_EQUAL(flowMap.numRegions(), 2);
flowMap.clear();
BOOST_CHECK_EQUAL(flowMap.numRegions(), 0);
flowMap.addConnection(0, 1, conn_1());
flowMap.compress(2);
BOOST_CHECK_EQUAL(flowMap.numRegions(), 2);
{
auto flows = flowMap.getInterRegFlows(0, 1729);
BOOST_CHECK_MESSAGE(! flows.has_value(),
"Unregistered region pair must NOT have a value");
}
{
auto flows = flowMap.getInterRegFlows(0, 1);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, 1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), 0.0, 1.0e-6);
}
{
auto flows = flowMap.getInterRegFlows(1, 0);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), 0.0, 1.0e-6);
}
}
BOOST_AUTO_TEST_CASE(MultiConn_Contrib)
{
using Component = Opm::data::InterRegFlowMap::ReadOnlyWindow::Component;
using Direction = Opm::data::InterRegFlowMap::ReadOnlyWindow::Direction;
auto flowMap = Opm::data::InterRegFlowMap{};
flowMap.addConnection(0, 1, conn_1());
flowMap.addConnection(0, 1, conn_2());
flowMap.addConnection(0, 1, conn_3());
flowMap.addConnection(2, 1, conn_1());
flowMap.addConnection(1, 2, conn_2());
flowMap.addConnection(2, 1, conn_3());
flowMap.compress(4);
{
auto flows = flowMap.getInterRegFlows(0, 1);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, 1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 1.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 2.7, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 3.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.1, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -1.0, 5.0e-6);
}
{
auto flows = flowMap.getInterRegFlows(1, 0);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 1.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 2.7, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 3.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.1, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -1.0, 5.0e-6);
}
{
auto flows = flowMap.getInterRegFlows(0, 2);
BOOST_CHECK_MESSAGE(! flows.has_value(),
"Registered region pair must have a value");
}
{
auto flows = flowMap.getInterRegFlows(1, 3);
BOOST_CHECK_MESSAGE(! flows.has_value(),
"Registered region pair must have a value");
}
{
auto flows = flowMap.getInterRegFlows(2, 1);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), -0.7, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), -1.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), -2.1, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), -2.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), -3.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 0.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 1.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 1.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -2.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -3.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -4.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -5.0, 5.0e-6);
}
}
BOOST_AUTO_TEST_CASE(Merge_MultiConn)
{
using Component = Opm::data::InterRegFlowMap::ReadOnlyWindow::Component;
using Direction = Opm::data::InterRegFlowMap::ReadOnlyWindow::Direction;
auto flowMap = Opm::data::InterRegFlowMap{};
flowMap.addConnection(0, 1, conn_1());
flowMap.addConnection(0, 1, conn_2());
flowMap.addConnection(0, 1, conn_3());
flowMap.compress(4);
flowMap.addConnection(2, 1, conn_1());
flowMap.addConnection(1, 2, conn_2());
flowMap.addConnection(2, 1, conn_3());
flowMap.compress(4);
flowMap.addConnection(0, 2, conn_1());
flowMap.addConnection(2, 0, conn_2());
flowMap.addConnection(3, 1, conn_3());
flowMap.compress(4);
{
auto flows = flowMap.getInterRegFlows(0, 1);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, 1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 1.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 2.7, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 3.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.1, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -1.0, 5.0e-6);
}
{
auto flows = flowMap.getInterRegFlows(1, 0);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 1.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 2.7, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 3.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.1, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -1.0, 5.0e-6);
}
{
auto flows = flowMap.getInterRegFlows(2, 1);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), -0.7, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), -1.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), -2.1, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), -2.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), -3.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 0.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 1.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 1.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -2.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -3.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -4.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -5.0, 5.0e-6);
}
{
auto flows = flowMap.getInterRegFlows(2, 0);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 1.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 2.7, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 3.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -0.1, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -0.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -0.5, 5.0e-6);
}
{
auto flows = flowMap.getInterRegFlows(1, 3);
BOOST_CHECK_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, 1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 0.6, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), 0.0, 5.0e-6);
}
}
BOOST_AUTO_TEST_CASE(LinearBufferReadWrite)
{
using Component = Opm::data::InterRegFlowMap::ReadOnlyWindow::Component;
using Direction = Opm::data::InterRegFlowMap::ReadOnlyWindow::Direction;
auto flowMap1 = Opm::data::InterRegFlowMap{};
flowMap1.addConnection(0, 1, conn_1());
flowMap1.addConnection(0, 1, conn_2());
flowMap1.addConnection(0, 1, conn_3());
flowMap1.addConnection(2, 1, conn_1());
flowMap1.addConnection(1, 2, conn_2());
flowMap1.addConnection(2, 1, conn_3());
flowMap1.addConnection(0, 2, conn_1());
flowMap1.addConnection(2, 0, conn_2());
flowMap1.addConnection(3, 1, conn_3());
flowMap1.compress(4);
auto buffer = MessageBuffer{};
flowMap1.write(buffer);
auto flowMap2 = Opm::data::InterRegFlowMap{};
flowMap2.read(buffer);
flowMap2.compress(4);
{
auto flows = flowMap2.getInterRegFlows(0, 1);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, 1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 1.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 2.7, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 3.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.1, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -1.0, 5.0e-6);
}
{
auto flows = flowMap2.getInterRegFlows(1, 0);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 1.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 2.7, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 3.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.1, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -1.0, 5.0e-6);
}
{
auto flows = flowMap2.getInterRegFlows(2, 1);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), -0.7, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), -1.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), -2.1, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), -2.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), -3.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 0.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 1.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 1.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -2.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -3.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -4.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -5.0, 5.0e-6);
}
{
auto flows = flowMap2.getInterRegFlows(2, 0);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 1.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 2.7, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 3.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 2.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 3.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 5.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), -0.1, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), -0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), -0.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), -0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), -0.5, 5.0e-6);
}
{
auto flows = flowMap2.getInterRegFlows(1, 3);
BOOST_CHECK_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, 1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 0.6, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), 0.0, 5.0e-6);
}
}
BOOST_AUTO_TEST_CASE(LinearBuffer_ManyReadWrite)
{
using Component = Opm::data::InterRegFlowMap::ReadOnlyWindow::Component;
using Direction = Opm::data::InterRegFlowMap::ReadOnlyWindow::Direction;
auto flowMap1 = Opm::data::InterRegFlowMap{};
flowMap1.addConnection(0, 1, conn_1());
flowMap1.addConnection(0, 1, conn_2());
flowMap1.addConnection(0, 1, conn_3());
flowMap1.addConnection(2, 1, conn_1());
flowMap1.addConnection(1, 2, conn_2());
flowMap1.addConnection(2, 1, conn_3());
flowMap1.addConnection(0, 2, conn_1());
flowMap1.addConnection(2, 0, conn_2());
flowMap1.addConnection(3, 1, conn_3());
flowMap1.compress(4);
auto buffer = MessageBuffer{};
flowMap1.write(buffer);
flowMap1.write(buffer);
flowMap1.write(buffer);
flowMap1.write(buffer);
auto flowMap2 = Opm::data::InterRegFlowMap{};
flowMap2.read(buffer);
flowMap2.read(buffer);
flowMap2.read(buffer);
flowMap2.read(buffer);
flowMap2.compress(4);
{
auto flows = flowMap2.getInterRegFlows(0, 1);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, 1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 4 * 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 4 * 1.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 4 * 2.7, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 4 * 3.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4 * 4.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 4 * 1.1, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 4 * 2.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 4 * 3.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4 * 4.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 4 * 5.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), 4 * (-0.2), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), 4 * (-0.4), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), 4 * (-0.6), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), 4 * (-0.8), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), 4 * (-1.0), 5.0e-6);
}
{
auto flows = flowMap2.getInterRegFlows(1, 0);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 4 * 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 4 * 1.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 4 * 2.7, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 4 * 3.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4 * 4.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 4 * 1.1, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 4 * 2.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 4 * 3.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4 * 4.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 4 * 5.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), 4 * (-0.2), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), 4 * (-0.4), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), 4 * (-0.6), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), 4 * (-0.8), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), 4 * (-1.0), 5.0e-6);
}
{
auto flows = flowMap2.getInterRegFlows(2, 1);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 4 * (-0.7), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 4 * (-1.4), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 4 * (-2.1), 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 4 * (-2.8), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4 * (-3.5), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 4 * 0.3, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 4 * 0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 4 * 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4 * 1.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 4 * 1.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), 4 * (-1.0), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), 4 * (-2.0), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), 4 * -3.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), 4 * (-4.0), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), 4 * (-5.0), 5.0e-6);
}
{
auto flows = flowMap2.getInterRegFlows(2, 0);
BOOST_REQUIRE_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, -1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 4 * 0.9, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 4 * 1.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 4 * 2.7, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 4 * 3.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4 * 4.5, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 4 * 1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 4 * 2.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 4 * 3.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4 * 4.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 4 * 5.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), 4 * (-0.1), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), 4 * (-0.2), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), 4 * (-0.3), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), 4 * (-0.4), 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), 4 * (-0.5), 5.0e-6);
}
{
auto flows = flowMap2.getInterRegFlows(1, 3);
BOOST_CHECK_MESSAGE(flows.has_value(),
"Registered region pair must have a value");
const auto& [ iregFlow, sign ] = flows.value();
BOOST_CHECK_EQUAL(sign, 1.0);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 4 * 0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 4 * 0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 4 * 0.6, 8.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 4 * 0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 4 * 1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Positive), 4 * 0.2, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 4 * 0.4, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 4 * 0.6, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 4 * 0.8, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 4 * 1.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Negative), 0.0, 5.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Negative), 0.0, 5.0e-6);
}
}
BOOST_AUTO_TEST_SUITE_END() // InterRegMap