diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake
index 8bb210d6c..a21c44383 100644
--- a/CMakeLists_files.cmake
+++ b/CMakeLists_files.cmake
@@ -60,6 +60,7 @@ list (APPEND MAIN_SOURCE_FILES
opm/simulators/wells/GlobalWellInfo.cpp
opm/simulators/wells/GroupState.cpp
opm/simulators/wells/ParallelWellInfo.cpp
+ opm/simulators/wells/SegmentState.cpp
opm/simulators/wells/TargetCalculator.cpp
opm/simulators/wells/VFPHelpers.cpp
opm/simulators/wells/VFPProdProperties.cpp
@@ -205,6 +206,7 @@ list (APPEND PUBLIC_HEADER_FILES
opm/core/props/phaseUsageFromDeck.hpp
opm/core/props/satfunc/RelpermDiagnostics.hpp
opm/simulators/timestepping/SimulatorReport.hpp
+ opm/simulators/wells/SegmentState.hpp
opm/simulators/wells/WellContainer.hpp
opm/simulators/aquifers/AquiferInterface.hpp
opm/simulators/aquifers/AquiferCarterTracy.hpp
diff --git a/opm/simulators/wells/SegmentState.cpp b/opm/simulators/wells/SegmentState.cpp
new file mode 100644
index 000000000..fe4564d5a
--- /dev/null
+++ b/opm/simulators/wells/SegmentState.cpp
@@ -0,0 +1,47 @@
+/*
+ Copyright Equinor ASA 2021
+
+ 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
+
+#include
+#include
+
+namespace Opm
+{
+
+SegmentState::SegmentState(int num_phases, const WellSegments& segments) :
+ rates(segments.size() * num_phases),
+ pressure(segments.size()),
+ pressure_drop_friction(segments.size()),
+ pressure_drop_hydrostatic(segments.size()),
+ pressure_drop_accel(segments.size())
+{
+
+}
+
+double SegmentState::pressure_drop(std::size_t index) const {
+ return this->pressure_drop_friction[index] + this->pressure_drop_hydrostatic[index] + this->pressure_drop_accel[index];
+}
+
+
+bool SegmentState::empty() const {
+ return this->rates.empty();
+}
+
+}
diff --git a/opm/simulators/wells/SegmentState.hpp b/opm/simulators/wells/SegmentState.hpp
new file mode 100644
index 000000000..935c424da
--- /dev/null
+++ b/opm/simulators/wells/SegmentState.hpp
@@ -0,0 +1,49 @@
+/*
+ Copyright Equinor ASA 2021
+
+ 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 .
+*/
+
+#ifndef OPM_SEGMENTSTATE_HEADER_INCLUDED
+#define OPM_SEGMENTSTATE_HEADER_INCLUDED
+
+#include
+
+namespace Opm
+{
+
+class WellSegments;
+class WellConnections;
+
+
+class SegmentState
+{
+public:
+ SegmentState() = default;
+ SegmentState(int num_phases, const WellSegments& segments);
+ double pressure_drop(std::size_t index) const;
+ bool empty() const;
+
+ std::vector rates;
+ std::vector pressure;
+ std::vector pressure_drop_friction;
+ std::vector pressure_drop_hydrostatic;
+ std::vector pressure_drop_accel;
+};
+
+}
+
+#endif
diff --git a/tests/test_wellstate.cpp b/tests/test_wellstate.cpp
index 587d9b552..56d42e79c 100644
--- a/tests/test_wellstate.cpp
+++ b/tests/test_wellstate.cpp
@@ -26,6 +26,7 @@
#include
#include
#include
+#include
#include
#include
@@ -522,5 +523,20 @@ BOOST_AUTO_TEST_CASE(TESTWellContainer) {
BOOST_CHECK(!wx.has_value());
}
+BOOST_AUTO_TEST_CASE(TESTSegmentState) {
+ const Setup setup{ "msw.data" };
+ const auto& well = setup.sched.getWell("PROD01", 0);
+ const auto& segments = well.getSegments();
+ Opm::SegmentState ss1(3, segments);
+ Opm::SegmentState ss2;
+
+
+ ss1.pressure_drop_hydrostatic[0] = 1;
+ ss1.pressure_drop_friction[0] = 2;
+ ss1.pressure_drop_accel[0] = 3;
+
+ BOOST_CHECK_EQUAL(ss1.pressure_drop(0), 6);
+}
+
BOOST_AUTO_TEST_SUITE_END()