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()