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]);
+}