From 9ccba2b0ebab0edc3b46ddcd898d7fca0236b6bd Mon Sep 17 00:00:00 2001 From: Kai Bao Date: Fri, 25 Sep 2015 14:57:29 +0200 Subject: [PATCH] adding a mapping from segments to their outlet segments All the mapping related to the WellMultiSegment remained to be verfied. --- opm/autodiff/WellMultiSegment.cpp | 11 +++++++++++ opm/autodiff/WellMultiSegment.hpp | 1 + 2 files changed, 12 insertions(+) diff --git a/opm/autodiff/WellMultiSegment.cpp b/opm/autodiff/WellMultiSegment.cpp index 227bbe099..5017305b0 100644 --- a/opm/autodiff/WellMultiSegment.cpp +++ b/opm/autodiff/WellMultiSegment.cpp @@ -248,6 +248,7 @@ namespace Opm m_wops_.s2p = M(m_number_of_perforations_, m_number_of_segments_); m_wops_.p2s = M(m_number_of_segments_, m_number_of_perforations_); + typedef Eigen::Triplet Tri; std::vector s2p; @@ -273,11 +274,18 @@ namespace Opm std::vector s2s_gather; s2s_gather.reserve(m_number_of_segments_ * m_number_of_segments_); + + std::vector s2s_outlet; + s2s_outlet.reserve(m_number_of_segments_); // a brutal way first // will generate matrix with entries bigger than 1.0 // Then we need to normalize all the values. for (int s = 0; s < (int)m_number_of_segments_; ++s) { s2s_gather.push_back(Tri(s, s, 1.0)); + int s_outlet = m_outlet_segment_[s]; + if (s_outlet >=0) { + s2s_outlet.push_back(Tri(s_outlet, s, 1.0)); + } int temp_s = s; while (m_outlet_segment_[temp_s] >=0) { s2s_gather.push_back(Tri(m_outlet_segment_[temp_s], temp_s, 1.0)); @@ -299,6 +307,9 @@ namespace Opm // s2s_gather + // s2outlet + m_wops_.s2s_outlet = M(m_number_of_segments_, m_number_of_segments_); + m_wops_.s2s_outlet.setFromTriplets(s2s_outlet.begin(), s2s_outlet.end()); } const std::string& WellMultiSegment::name() const { diff --git a/opm/autodiff/WellMultiSegment.hpp b/opm/autodiff/WellMultiSegment.hpp index 082cc0adc..302326e4d 100644 --- a/opm/autodiff/WellMultiSegment.hpp +++ b/opm/autodiff/WellMultiSegment.hpp @@ -88,6 +88,7 @@ namespace Opm // means the outlet segments will gather all the contribution // from all the inlet segments in a recurisive way M p2s_gather; // perforation -> segment (in an accumative way) + M s2s_outlet; // segment -> their outlet segments }; const WellOps& wellOps() const;