diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake index bf91c3d9b..1d11e874f 100644 --- a/CMakeLists_files.cmake +++ b/CMakeLists_files.cmake @@ -92,6 +92,7 @@ list (APPEND TEST_SOURCE_FILES tests/test_singlecellsolves.cpp tests/test_solventprops_ad.cpp tests/test_multisegmentwells.cpp + tests/test_multiphaseupwind.cpp # tests/test_thresholdpressure.cpp tests/test_wellswitchlogger.cpp tests/test_timer.cpp diff --git a/tests/test_multiphaseupwind.cpp b/tests/test_multiphaseupwind.cpp new file mode 100644 index 000000000..1d9cf60a6 --- /dev/null +++ b/tests/test_multiphaseupwind.cpp @@ -0,0 +1,107 @@ +/* + Copyright 2017 SINTEF Digital, Mathematics and Cybernetics. + Copyright 2017 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 . +*/ + +#include + +#if HAVE_DYNAMIC_BOOST_TEST +#define BOOST_TEST_DYN_LINK +#endif + +#define NVERBOSE // Suppress own messages when throw()ing + +#define BOOST_TEST_MODULE OPM-multiPhaseUpwind +#include + +#include + +// For all the following cases we test a setup with two cells, +// forming a gravity column: +// +// ------------------- +// | | +// | Cell 1 | +// | | +// | | | +// ------------------- | flux +// | | V +// | Cell 2 | +// | | +// | | +// ------------------- +// +// The gravity-related head differences are (4, -1, -2) for (w, o, g). +// The mobilities are all 1 and the transmissibility is 1. +// The total flux from cell 1 to 2 will vary from case to case. + +BOOST_AUTO_TEST_CASE(GravityColumnLowFlux) +{ + // Case 1: a gravity column with two cells and low total flux. + // The total flux from cell 1 to 2 is 1.0. + + const std::array head_diff = {{ 4.0, -1.0, -2.0 }}; + const std::array mob1 = {{ 1.0, 1.0, 1.0 }}; + const std::array mob2 = {{ 1.0, 1.0, 1.0 }}; + const double transmissibility = 1.0; + const double flux = 1.0; + + const std::array expected_upw = {{ 1.0, -1.0, -1.0 }}; + const std::array upw = Opm::connectionMultiPhaseUpwind(head_diff, mob1, mob2, transmissibility, flux); + BOOST_CHECK_EQUAL(upw[0], expected_upw[0]); + BOOST_CHECK_EQUAL(upw[1], expected_upw[1]); + BOOST_CHECK_EQUAL(upw[2], expected_upw[2]); +} + + +BOOST_AUTO_TEST_CASE(GravityColumnMediumFlux) +{ + // Case 2: a gravity column with two cells and medium-sized total flux. + // The total flux from cell 1 to 2 is 5.0. + + const std::array head_diff = {{ 4.0, -1.0, -2.0 }}; + const std::array mob1 = {{ 1.0, 1.0, 1.0 }}; + const std::array mob2 = {{ 1.0, 1.0, 1.0 }}; + const double transmissibility = 1.0; + const double flux = 5.0; + + const std::array expected_upw = {{ 1.0, 1.0, -1.0 }}; + const std::array upw = Opm::connectionMultiPhaseUpwind(head_diff, mob1, mob2, transmissibility, flux); + BOOST_CHECK_EQUAL(upw[0], expected_upw[0]); + BOOST_CHECK_EQUAL(upw[1], expected_upw[1]); + BOOST_CHECK_EQUAL(upw[2], expected_upw[2]); +} + + +BOOST_AUTO_TEST_CASE(GravityColumnHighFlux) +{ + // Case 3: a gravity column with two cell and high total flux. + // The total flux from cell 1 to 2 is 10.0. + + const std::array head_diff = {{ 4.0, -1.0, -2.0 }}; + const std::array mob1 = {{ 1.0, 1.0, 1.0 }}; + const std::array mob2 = {{ 1.0, 1.0, 1.0 }}; + const double transmissibility = 1.0; + const double flux = 10.0; + + const std::array expected_upw = {{ 1.0, 1.0, 1.0 }}; + const std::array upw = Opm::connectionMultiPhaseUpwind(head_diff, mob1, mob2, transmissibility, flux); + BOOST_CHECK_EQUAL(upw[0], expected_upw[0]); + BOOST_CHECK_EQUAL(upw[1], expected_upw[1]); + BOOST_CHECK_EQUAL(upw[2], expected_upw[2]); +}