00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef OPM_WELLMULTISEGMENT_HEADER_INCLUDED
00021 #define OPM_WELLMULTISEGMENT_HEADER_INCLUDED
00022
00023
00024 #include <opm/common/utility/platform_dependent/disable_warnings.h>
00025 #include <Eigen/Eigen>
00026 #include <Eigen/Sparse>
00027 #include <opm/common/utility/platform_dependent/reenable_warnings.h>
00028
00029 #include <opm/core/wells.h>
00030 #include <opm/core/well_controls.h>
00031 #include <opm/core/simulator/WellState.hpp>
00032 #include <opm/common/ErrorMacros.hpp>
00033 #include <opm/parser/eclipse/EclipseState/Schedule/ScheduleEnums.hpp>
00034 #include <opm/parser/eclipse/EclipseState/Schedule/MSW/SegmentSet.hpp>
00035 #include <opm/parser/eclipse/EclipseState/Schedule/Well.hpp>
00036 #include <vector>
00037 #include <cassert>
00038 #include <string>
00039 #include <utility>
00040 #include <map>
00041 #include <algorithm>
00042 #include <array>
00043
00044 namespace Opm
00045 {
00046
00047 class WellMultiSegment
00048 {
00049 public:
00050
00051 typedef Eigen::SparseMatrix<double> Matrix;
00052
00057 WellMultiSegment(const Well* well, size_t time_step, const Wells* wells);
00058
00060 const std::string& name() const;
00061
00063 bool isMultiSegmented() const;
00064
00066 int numberOfPerforations() const;
00067
00069 int numberOfSegments() const;
00070
00075 std::string compPressureDrop() const;
00076
00078 const WellControls* wellControls() const;
00079
00081 const std::vector<double>& compFrac() const;
00082
00084 int numberOfPhases() const;
00085
00087 WellType wellType() const;
00088
00090 const std::vector<double>& wellIndex() const;
00091
00093 const std::vector<double>& perfDepth() const;
00094
00096 const std::vector<int>& wellCells() const;
00097
00099 const std::vector<int>& segmentCells() const;
00100
00103 const std::vector<int>& outletSegment() const;
00104
00106 const std::vector<std::vector<int>>& inletSegments() const;
00107
00109 const std::vector<double>& segmentLength() const;
00110
00112 const std::vector<double>& segmentDepth() const;
00113
00115 const std::vector<double>& segmentDiameter() const;
00116
00118 const std::vector<double>& segmentCrossArea() const;
00119
00121 const std::vector<double>& segmentRoughness() const;
00122
00124 const std::vector<double>& segmentVolume() const;
00125
00127 const std::vector<std::vector<int>>& segmentPerforations() const;
00128
00131 struct WellOps {
00132 Matrix s2p;
00133 Matrix p2s;
00134 Matrix p2s_average;
00135 Matrix s2s_gather;
00136
00137
00138 Matrix p2s_gather;
00139 Matrix s2s_inlets;
00140 Matrix s2s_outlet;
00141 };
00142
00144 const WellOps& wellOps() const;
00145
00146 private:
00147
00148
00149 void initMultiSegmentWell(const Well* well, size_t time_step, const Wells* wells);
00150 void initNonMultiSegmentWell(const Well* well, size_t time_step, const Wells* wells);
00151 void updateWellOps();
00152
00153 private:
00154
00155 std::string m_well_name_;
00156
00157
00158 bool m_is_multi_segment_;
00159
00160
00161 enum WellType m_well_type_;
00162
00163 int m_number_of_phases_;
00164
00165 std::vector<double> m_comp_frac_;
00166
00167
00168
00169 struct WellControls *m_well_controls_;
00170
00171 WellSegment::CompPressureDropEnum m_comp_pressure_drop_;
00172
00173 WellSegment::MultiPhaseModelEnum m_multiphase_model_;
00174
00175 int m_number_of_perforations_;
00176
00177 int m_number_of_segments_;
00178
00179 std::vector<double> m_well_index_;
00180
00181 std::vector<double> m_perf_depth_;
00182
00183 std::vector<int> m_well_cell_;
00184
00185 std::vector<int> m_segment_cell_;
00186
00187
00188
00189
00190
00191
00192 std::vector<int> m_outlet_segment_;
00193
00194 std::vector<std::vector<int>> m_inlet_segments_;
00195
00196
00197
00198
00199
00200 std::vector<double> m_segment_length_;
00201
00202 std::vector<double> m_segment_depth_;
00203
00204 std::vector<double> m_segment_internal_diameter_;
00205
00206 std::vector<double> m_segment_roughness_;
00207
00208 std::vector<double> m_segment_cross_area_;
00209
00210 std::vector<double> m_segment_volume_;
00211
00212
00213
00214
00215
00216 std::vector<std::vector<int>> m_segment_perforations_;
00217
00218 WellOps m_wops_;
00219 };
00220
00221 typedef std::shared_ptr<WellMultiSegment> WellMultiSegmentPtr;
00222 typedef std::shared_ptr<const WellMultiSegment> WellMultiSegmentConstPtr;
00223
00224 }
00225
00226
00227 #endif // OPM_WELLMULTISEGMENT_HEADER_INCLUDE