Merge pull request #1731 from joakim-hove/segment-depth-change
Add method WellSegments::segmentDepthChange()
This commit is contained in:
commit
60e9a9c6b9
@ -437,6 +437,7 @@ if(ENABLE_ECL_OUTPUT)
|
||||
tests/SPE1CASE2.X0060
|
||||
tests/PYACTION.DATA
|
||||
tests/act1.py
|
||||
tests/MSW.DATA
|
||||
tests/EXIT_TEST.DATA
|
||||
tests/action_syntax_error.py
|
||||
tests/action_missing_run.py
|
||||
|
@ -89,6 +89,8 @@ namespace Opm {
|
||||
bool operator!=( const WellSegments& ) const;
|
||||
|
||||
double segmentLength(const int segment_number) const;
|
||||
double segmentDepthChange(const int segment_number) const;
|
||||
std::vector<Segment> branchSegments(int branch) const;
|
||||
|
||||
// it returns true if there is no error encountered during the update
|
||||
bool updateWSEGSICD(const std::vector<std::pair<int, SpiralICD> >& sicd_pairs);
|
||||
|
@ -16,10 +16,11 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OPM. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <unordered_set>
|
||||
|
||||
#ifdef _WIN32
|
||||
#define _USE_MATH_DEFINES
|
||||
@ -442,19 +443,13 @@ namespace Opm {
|
||||
}
|
||||
|
||||
double WellSegments::segmentLength(const int segment_number) const {
|
||||
double segment_length;
|
||||
|
||||
const Segment& segment = getFromSegmentNumber(segment_number);
|
||||
if (segment_number == 1) {// top segment
|
||||
segment_length = segment.totalLength();
|
||||
} else {
|
||||
// other segments
|
||||
const int outlet_segment_number = segment.outletSegment();
|
||||
const Segment &outlet_segment = getFromSegmentNumber(outlet_segment_number);
|
||||
|
||||
segment_length = segment.totalLength() - outlet_segment.totalLength();
|
||||
}
|
||||
const Segment& segment = this->getFromSegmentNumber(segment_number);
|
||||
if (segment_number == 1) // top segment
|
||||
return segment.totalLength();
|
||||
|
||||
// other segments
|
||||
const Segment &outlet_segment = getFromSegmentNumber(segment.outletSegment());
|
||||
const double segment_length = segment.totalLength() - outlet_segment.totalLength();
|
||||
if (segment_length <= 0.)
|
||||
throw std::runtime_error(" non positive segment length is obtained for segment "
|
||||
+ std::to_string(segment_number));
|
||||
@ -462,6 +457,44 @@ namespace Opm {
|
||||
return segment_length;
|
||||
}
|
||||
|
||||
|
||||
double WellSegments::segmentDepthChange(const int segment_number) const {
|
||||
const Segment& segment = getFromSegmentNumber(segment_number);
|
||||
if (segment_number == 1) // top segment
|
||||
return segment.depth();
|
||||
|
||||
// other segments
|
||||
const Segment &outlet_segment = this->getFromSegmentNumber(segment.outletSegment());
|
||||
return segment.depth() - outlet_segment.depth();
|
||||
}
|
||||
|
||||
|
||||
std::vector<Segment> WellSegments::branchSegments(int branch) const {
|
||||
std::vector<Segment> segments;
|
||||
std::unordered_set<int> segment_set;
|
||||
for (const auto& segment : this->m_segments) {
|
||||
if (segment.branchNumber() == branch) {
|
||||
segments.push_back(segment);
|
||||
segment_set.insert( segment.segmentNumber() );
|
||||
}
|
||||
}
|
||||
|
||||
std::size_t head_index = 0;
|
||||
while (head_index < segments.size()) {
|
||||
auto head_iter = std::find_if(segments.begin() + head_index, segments.end(),
|
||||
[&segment_set] (const Segment& segment) { return (segment_set.count(segment.outletSegment()) == 0); });
|
||||
|
||||
if (head_iter == segments.end())
|
||||
throw std::logic_error("Loop detected in branch/segment structure");
|
||||
|
||||
segment_set.erase( head_iter->segmentNumber() );
|
||||
std::swap( segments[head_index], *head_iter);
|
||||
head_index++;
|
||||
}
|
||||
|
||||
return segments;
|
||||
}
|
||||
|
||||
bool WellSegments::updateWSEGSICD(const std::vector<std::pair<int, SpiralICD> >& sicd_pairs) {
|
||||
if (m_comp_pressure_drop == CompPressureDrop::H__) {
|
||||
const std::string msg = "to use spiral ICD segment you have to activate the frictional pressure drop calculation";
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
|
||||
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
|
||||
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/MSW/SpiralICD.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/MSW/Valve.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/Well/Connection.hpp>
|
||||
@ -439,3 +440,62 @@ BOOST_AUTO_TEST_CASE(testwsegvalv) {
|
||||
BOOST_CHECK_EQUAL(segment2.roughness(), valv2->pipeRoughness());
|
||||
BOOST_CHECK_EQUAL(segment2.crossArea(), valv2->pipeCrossArea());
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(MSW_SEGMENT_LENGTH) {
|
||||
Opm::Parser parser;
|
||||
Opm::Deck deck = parser.parseFile("MSW.DATA");
|
||||
Opm::EclipseState st(deck);
|
||||
Opm::Schedule sched(deck, st);
|
||||
|
||||
|
||||
const auto& well = sched.getWell("PROD01", 0);
|
||||
const auto& segments = well.getSegments();
|
||||
BOOST_CHECK_CLOSE( segments.segmentLength(1), 2512.50, 1e-5);
|
||||
BOOST_CHECK_CLOSE( segments.segmentLength(2), 25, 1e-5);
|
||||
BOOST_CHECK_CLOSE( segments.segmentLength(6), 25, 1e-5);
|
||||
BOOST_CHECK_CLOSE( segments.segmentLength(7), 200, 1e-5);
|
||||
|
||||
BOOST_CHECK_CLOSE( segments.segmentDepthChange(1), 2512.50, 1e-5);
|
||||
BOOST_CHECK_CLOSE( segments.segmentDepthChange(2), 22, 1e-5);
|
||||
BOOST_CHECK_CLOSE( segments.segmentDepthChange(6), 21, 1e-5);
|
||||
BOOST_CHECK_CLOSE( segments.segmentDepthChange(7), 4, 1e-5);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(MSW_BRANCH_SEGMENTS) {
|
||||
Opm::Parser parser;
|
||||
Opm::Deck deck = parser.parseFile("MSW.DATA");
|
||||
Opm::EclipseState st(deck);
|
||||
Opm::Schedule sched(deck, st);
|
||||
|
||||
|
||||
const auto& well = sched.getWell("PROD01", 0);
|
||||
const auto& segments = well.getSegments();
|
||||
{
|
||||
auto seg100 = segments.branchSegments(100);
|
||||
BOOST_CHECK(seg100.empty());
|
||||
}
|
||||
{
|
||||
auto seg1 = segments.branchSegments(1);
|
||||
BOOST_CHECK_EQUAL( seg1.size(), 6 );
|
||||
const std::vector<int> expected = {1,2,3,4,5,6};
|
||||
for (std::size_t index = 0; index < seg1.size(); index++)
|
||||
BOOST_CHECK_EQUAL( expected[index], seg1[index].segmentNumber());
|
||||
}
|
||||
{
|
||||
auto seg2 = segments.branchSegments(2);
|
||||
const std::vector<int> expected = {7,8,9,10,11};
|
||||
BOOST_CHECK_EQUAL( seg2.size(), 5 );
|
||||
for (std::size_t index = 0; index < seg2.size(); index++)
|
||||
BOOST_CHECK_EQUAL( expected[index], seg2[index].segmentNumber());
|
||||
}
|
||||
{
|
||||
auto seg5 = segments.branchSegments(5);
|
||||
const std::vector<int> expected = {22,23,24,25,26};
|
||||
BOOST_CHECK_EQUAL( seg5.size(), 5 );
|
||||
for (std::size_t index = 0; index < seg5.size(); index++)
|
||||
BOOST_CHECK_EQUAL( expected[index], seg5[index].segmentNumber());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user