opm-common/tests/test_data_InterRegFlow.cpp
Bård Skaflestad 7ef3d6c0b3 Add Protocol to Linearise Connection Flow Rates Into Subrange
This commit introduces a wrapper for a linear subrange of
consecutive elements of an arithmetic type that imposes an ordering
of the elements when treated as directional component surface flow
rates.  The wrapper distinguishes negative from positive flow rate
contributions and tracks those separately.  This is a building block
for accounting for the inter-region flows in a parallel context.
2022-02-16 23:28:46 +01:00

495 lines
25 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_InterRegFlow
#include <boost/test/unit_test.hpp>
#include <opm/output/data/InterRegFlow.hpp>
#include <array>
#include <cstddef>
#include <type_traits>
#include <utility>
#include <vector>
BOOST_AUTO_TEST_SUITE(InterReg_View)
BOOST_AUTO_TEST_CASE(Construct)
{
using IRegFlow = Opm::data::InterRegFlow<decltype(std::declval<std::vector<double>>().begin())>;
using IRegRate = IRegFlow::FlowRates;
using Component = IRegFlow::Component;
using Direction = IRegFlow::Direction;
auto store = std::vector<double>(IRegFlow::bufferSize(), 0.0);
{
auto iregFlow = IRegFlow{ store.begin(), store.begin() }; // empty
BOOST_CHECK_MESSAGE(iregFlow.empty(), "[begin, begin) must be an empty range");
}
{
auto iregFlow = IRegFlow{ store.begin(), store.begin() + static_cast<std::size_t>(Component::NumComponents) };
BOOST_CHECK_MESSAGE(!iregFlow.isValid(), "Small range must be invalid");
}
auto iregFlow = IRegFlow{ store.begin(), store.end() };
BOOST_REQUIRE_MESSAGE(iregFlow.isValid(), "Valid range must be valid");
auto rate = IRegRate{};
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;
iregFlow.addFlow(1.0, rate); // 1->2
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);
iregFlow.addFlow(-1.0, rate); // 2->1
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Oil), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas), 0.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil), 0.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), -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);
iregFlow.addFlow(1.0, rate); // 1->2
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), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Gas, Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Water, Direction::Positive), 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Disgas, Direction::Positive), 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(Component::Vapoil, Direction::Positive), 10.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_CHECK_CLOSE(store[0], 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[1], - 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[2], 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[3], - 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[4], 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[5], - 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[6], 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[7], - 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[8], 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[9], - 5.0, 1.0e-6);
}
BOOST_AUTO_TEST_CASE(Copy_Move_Assign_Add)
{
using IRegFlow = Opm::data::InterRegFlow<decltype(std::declval<std::vector<double>>().begin())>;
using IRegRate = IRegFlow::FlowRates;
using Component = IRegFlow::Component;
using Direction = IRegFlow::Direction;
auto store = std::vector<double>(2 * IRegFlow::bufferSize(), 0.0);
{
auto iregFlow = IRegFlow{ store.begin(), store.begin() }; // empty
BOOST_CHECK_MESSAGE(iregFlow.empty(), "[begin, begin) must be an empty range");
}
{
auto iregFlow = IRegFlow{ store.begin(), store.end() };
BOOST_CHECK_MESSAGE(!iregFlow.isValid(), "Large range must be invalid");
}
auto iregFlow_1 = IRegFlow{ store.begin(), store.begin() + IRegFlow::bufferSize() };
auto iregFlow_2 = IRegFlow{ store.begin() + IRegFlow::bufferSize(), store.end() };
BOOST_REQUIRE_MESSAGE(iregFlow_1.isValid(), "Valid range 1 must be valid");
BOOST_REQUIRE_MESSAGE(iregFlow_2.isValid(), "Valid range 2 must be valid");
auto rate = IRegRate{};
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;
iregFlow_1.addFlow( 1.0, rate); // 1->2
iregFlow_1.addFlow(- 1.0, rate); // 2->1
iregFlow_1.addFlow( 1.0, rate); // 1->2
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Oil), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Gas), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Water), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Disgas), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Vapoil), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Oil, Direction::Positive), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Gas, Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Water, Direction::Positive), 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Disgas, Direction::Positive), 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Vapoil, Direction::Positive), 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Oil, Direction::Negative), -1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Gas, Direction::Negative), -2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Water, Direction::Negative), -3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Disgas, Direction::Negative), -4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Vapoil, Direction::Negative), -5.0, 1.0e-6);
const auto iregFlow_3 = std::move(iregFlow_1);
BOOST_CHECK_MESSAGE(! iregFlow_1.isValid(), "Moved-from range must be invalid");
BOOST_CHECK_MESSAGE( iregFlow_3.isValid(), "Move-constructed range must be valid");
BOOST_CHECK_CLOSE(store[0], 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[1], - 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[2], 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[3], - 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[4], 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[5], - 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[6], 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[7], - 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[8], 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[9], - 5.0, 1.0e-6);
iregFlow_2 = iregFlow_3;
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Oil), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Gas), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Water), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Disgas), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Vapoil), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Oil, Direction::Positive), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Gas, Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Water, Direction::Positive), 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Disgas, Direction::Positive), 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Vapoil, Direction::Positive), 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Oil, Direction::Negative), -1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Gas, Direction::Negative), -2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Water, Direction::Negative), -3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Disgas, Direction::Negative), -4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Vapoil, Direction::Negative), -5.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 0], 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 1], - 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 2], 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 3], - 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 4], 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 5], - 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 6], 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 7], - 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 8], 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 9], - 5.0, 1.0e-6);
iregFlow_2 += iregFlow_3;
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Oil), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Gas), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Water), 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Disgas), 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Vapoil), 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Oil, Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Gas, Direction::Positive), 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Water, Direction::Positive), 12.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Disgas, Direction::Positive), 16.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Vapoil, Direction::Positive), 20.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Oil, Direction::Negative), -2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Gas, Direction::Negative), -4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Water, Direction::Negative), -6.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Disgas, Direction::Negative), -8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_2.flow(Component::Vapoil, Direction::Negative), -10.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[0], 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[1], - 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[2], 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[3], - 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[4], 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[5], - 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[6], 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[7], - 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[8], 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[9], - 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 0], 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 1], - 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 2], 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 3], - 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 4], 12.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 5], - 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 6], 16.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 7], - 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 8], 20.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 9], -10.0, 1.0e-6);
iregFlow_1 = std::move(iregFlow_2);
BOOST_CHECK_MESSAGE(! iregFlow_2.isValid(), "Moved-from source range must be invalid");
BOOST_CHECK_MESSAGE( iregFlow_1.isValid(), "Moved-assigned destination range must be valid");
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Oil), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Gas), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Water), 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Disgas), 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Vapoil), 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Oil, Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Gas, Direction::Positive), 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Water, Direction::Positive), 12.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Disgas, Direction::Positive), 16.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Vapoil, Direction::Positive), 20.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Oil, Direction::Negative), -2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Gas, Direction::Negative), -4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Water, Direction::Negative), -6.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Disgas, Direction::Negative), -8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow_1.flow(Component::Vapoil, Direction::Negative), -10.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[0], 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[1], - 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[2], 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[3], - 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[4], 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[5], - 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[6], 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[7], - 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[8], 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[9], - 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 0], 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 1], - 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 2], 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 3], - 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 4], 12.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 5], - 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 6], 16.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 7], - 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 8], 20.0, 1.0e-6);
BOOST_CHECK_CLOSE(store[10 + 9], -10.0, 1.0e-6);
}
BOOST_AUTO_TEST_CASE(Assign_Different_Iterator)
{
using IRegFlow = Opm::data::InterRegFlow<decltype(std::declval<std::vector<double>>().begin())>;
using ArrayBuffer = std::array<double, IRegFlow::bufferSize()>;
using IRegFlow_ArrayBacked = Opm::data::InterRegFlow<decltype(std::declval<ArrayBuffer>().begin())>;
using IRegRate = IRegFlow_ArrayBacked::FlowRates;
using Component = IRegFlow_ArrayBacked::Component;
auto buffer = ArrayBuffer{};
buffer.fill(0.0);
auto iregFlow_array = IRegFlow_ArrayBacked{ buffer.begin(), buffer.end() };
auto rate = IRegRate{};
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;
iregFlow_array.addFlow( 1.0, rate); // 1->2
iregFlow_array.addFlow(- 1.0, rate); // 2->1
iregFlow_array.addFlow( 1.0, rate); // 1->2
auto range = std::vector<double>(IRegFlow::bufferSize(), 0.0);
auto iregFlow = IRegFlow{ range.begin(), range.end() };
iregFlow = iregFlow_array;
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Oil), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Gas), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Water), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Disgas), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Vapoil), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Oil, IRegFlow::Direction::Positive), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Gas, IRegFlow::Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Water, IRegFlow::Direction::Positive), 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Disgas, IRegFlow::Direction::Positive), 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Vapoil, IRegFlow::Direction::Positive), 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Oil, IRegFlow::Direction::Negative), -1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Gas, IRegFlow::Direction::Negative), -2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Water, IRegFlow::Direction::Negative), -3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Disgas, IRegFlow::Direction::Negative), -4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Vapoil, IRegFlow::Direction::Negative), -5.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[0], 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[1], - 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[2], 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[3], - 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[4], 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[5], - 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[6], 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[7], - 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[8], 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[9], - 5.0, 1.0e-6);
}
BOOST_AUTO_TEST_CASE(Assign_Different_ElmT)
{
using IRegFlow = Opm::data::InterRegFlow<decltype(std::declval<std::vector<double>>().begin())>;
using IRegFlow_float = Opm::data::InterRegFlow<decltype(std::declval<std::vector<float>>().begin())>;
using IRegRate = IRegFlow_float::FlowRates;
using Component = IRegFlow_float::Component;
auto buffer = std::vector<float>(IRegFlow_float::bufferSize(), 0.0f);
auto iregFlow_float = IRegFlow_float{ buffer.begin(), buffer.end() };
auto rate = IRegRate{};
rate[Component::Oil] = 1.0f;
rate[Component::Gas] = 2.0f;
rate[Component::Water] = 3.0f;
rate[Component::Disgas] = 4.0f;
rate[Component::Vapoil] = 5.0f;
iregFlow_float.addFlow( 1.0, rate); // 1->2
iregFlow_float.addFlow(- 1.0, rate); // 2->1
iregFlow_float.addFlow( 1.0, rate); // 1->2
auto range = std::vector<double>(IRegFlow::bufferSize(), 0.0);
auto iregFlow = IRegFlow{ range.begin(), range.end() };
iregFlow = iregFlow_float;
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Oil), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Gas), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Water), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Disgas), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Vapoil), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Oil, IRegFlow::Direction::Positive), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Gas, IRegFlow::Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Water, IRegFlow::Direction::Positive), 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Disgas, IRegFlow::Direction::Positive), 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Vapoil, IRegFlow::Direction::Positive), 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Oil, IRegFlow::Direction::Negative), -1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Gas, IRegFlow::Direction::Negative), -2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Water, IRegFlow::Direction::Negative), -3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Disgas, IRegFlow::Direction::Negative), -4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Vapoil, IRegFlow::Direction::Negative), -5.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[0], 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[1], - 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[2], 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[3], - 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[4], 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[5], - 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[6], 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[7], - 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[8], 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[9], - 5.0, 1.0e-6);
}
BOOST_AUTO_TEST_CASE(Assign_Different_ElmT_Different_Iterator)
{
using IRegFlow = Opm::data::InterRegFlow<decltype(std::declval<std::vector<double>>().begin())>;
using ArrayBuffer = std::array<float, IRegFlow::bufferSize()>;
using IRegFlow_ArrayBacked = Opm::data::InterRegFlow<decltype(std::declval<ArrayBuffer>().begin())>;
using IRegRate = IRegFlow_ArrayBacked::FlowRates;
using Component = IRegFlow_ArrayBacked::Component;
auto buffer = ArrayBuffer{};
buffer.fill(0.0f);
auto iregFlow_array = IRegFlow_ArrayBacked{ buffer.begin(), buffer.end() };
auto rate = IRegRate{};
rate[Component::Oil] = 1.0f;
rate[Component::Gas] = 2.0f;
rate[Component::Water] = 3.0f;
rate[Component::Disgas] = 4.0f;
rate[Component::Vapoil] = 5.0f;
iregFlow_array.addFlow( 1.0, rate); // 1->2
iregFlow_array.addFlow(- 1.0, rate); // 2->1
iregFlow_array.addFlow( 1.0, rate); // 1->2
auto range = std::vector<double>(IRegFlow::bufferSize(), 0.0);
auto iregFlow = IRegFlow{ range.begin(), range.end() };
iregFlow = iregFlow_array;
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Oil), 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Gas), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Water), 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Disgas), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Vapoil), 5.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Oil, IRegFlow::Direction::Positive), 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Gas, IRegFlow::Direction::Positive), 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Water, IRegFlow::Direction::Positive), 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Disgas, IRegFlow::Direction::Positive), 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Vapoil, IRegFlow::Direction::Positive), 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Oil, IRegFlow::Direction::Negative), -1.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Gas, IRegFlow::Direction::Negative), -2.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Water, IRegFlow::Direction::Negative), -3.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Disgas, IRegFlow::Direction::Negative), -4.0, 1.0e-6);
BOOST_CHECK_CLOSE(iregFlow.flow(IRegFlow::Component::Vapoil, IRegFlow::Direction::Negative), -5.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[0], 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[1], - 1.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[2], 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[3], - 2.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[4], 6.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[5], - 3.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[6], 8.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[7], - 4.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[8], 10.0, 1.0e-6);
BOOST_CHECK_CLOSE(range[9], - 5.0, 1.0e-6);
}
BOOST_AUTO_TEST_SUITE_END() // InterReg_View