/*
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 .
*/
#define BOOST_TEST_MODULE data_InterRegFlow
#include
#include
#include
#include
#include
#include
#include
BOOST_AUTO_TEST_SUITE(InterReg_View)
BOOST_AUTO_TEST_CASE(Construct)
{
using IRegFlow = Opm::data::InterRegFlow>().begin())>;
using IRegRate = IRegFlow::FlowRates;
using Component = IRegFlow::Component;
using Direction = IRegFlow::Direction;
auto store = std::vector(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(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>().begin())>;
using IRegRate = IRegFlow::FlowRates;
using Component = IRegFlow::Component;
using Direction = IRegFlow::Direction;
auto store = std::vector(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>().begin())>;
using ArrayBuffer = std::array;
using IRegFlow_ArrayBacked = Opm::data::InterRegFlow().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(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>().begin())>;
using IRegFlow_float = Opm::data::InterRegFlow>().begin())>;
using IRegRate = IRegFlow_float::FlowRates;
using Component = IRegFlow_float::Component;
auto buffer = std::vector(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(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>().begin())>;
using ArrayBuffer = std::array;
using IRegFlow_ArrayBacked = Opm::data::InterRegFlow().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(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