70 RsConstInfo() =
default;
71 RsConstInfo(
const bool en,
const Scalar val)
83 static const std::uint64_t event_mask = ScheduleEvents::WELL_STATUS_CHANGE
84 | ScheduleEvents::PRODUCTION_UPDATE
85 | ScheduleEvents::INJECTION_UPDATE;
91 static const int waterPhaseIdx = IndexTraits::waterPhaseIdx;
92 static const int oilPhaseIdx = IndexTraits::oilPhaseIdx;
93 static const int gasPhaseIdx = IndexTraits::gasPhaseIdx;
104 std::size_t size()
const
106 return this->wells_.size();
109 std::vector<std::string> wells()
const
111 return this->wells_.wells();
120 const PhaseUsageInfo<IndexTraits>& phaseUsageInfo()
const
122 return this->phaseUsageInfo_;
125 const ParallelWellInfo<Scalar>& parallelWellInfo(std::size_t well_index)
const;
130 void init(
const std::vector<Scalar>& cellPressures,
131 const std::vector<Scalar>& cellTemperatures,
132 const Schedule& schedule,
133 const std::vector<Well>& wells_ecl,
134 const std::vector<std::reference_wrapper<ParallelWellInfo<Scalar>>>& parallel_well_info,
135 const int report_step,
136 const WellState* prevState,
137 const std::vector<std::vector<PerforationData<Scalar>>>& well_perf_data,
138 const SummaryState& summary_state,
139 const bool enableDistributedWells);
141 void resize(
const std::vector<Well>& wells_ecl,
142 const std::vector<std::reference_wrapper<ParallelWellInfo<Scalar>>>& parallel_well_info,
143 const Schedule& schedule,
144 const bool handle_ms_well,
145 const std::size_t numCells,
146 const std::vector<std::vector<PerforationData<Scalar>>>& well_perf_data,
147 const SummaryState& summary_state,
148 const bool enable_distributed_wells);
150 void setCurrentWellRates(
const std::string& wellName,
151 const std::vector<Scalar>& new_rates)
153 auto& [owner, rates] = this->well_rates.at(wellName);
158 const std::vector<Scalar>& currentWellRates(
const std::string& wellName)
const;
160 bool hasWellRates(
const std::string& wellName)
const
162 return this->well_rates.find(wellName) != this->well_rates.end();
165 void clearWellRates()
167 this->well_rates.clear();
170 void gatherVectorsOnRoot(
const std::vector<data::Connection>& from_connections,
171 std::vector<data::Connection>& to_connections,
172 const Parallel::Communication& comm)
const;
175 report(
const int* globalCellIdxMap,
176 const std::function<
bool(
const int)>& wasDynamicallyClosed,
179 void reportConnections(std::vector<data::Connection>& connections,
180 std::size_t well_index,
181 const int* globalCellIdxMap)
const;
185 const WellState* prev_well_state);
187 static void calculateSegmentRates(
const ParallelWellInfo<Scalar>& pw_info,
188 const std::vector<std::vector<int>>& segment_inlets,
189 const std::vector<std::vector<int>>& segment_perforations,
190 const std::vector<Scalar>& perforation_rates,
193 std::vector<Scalar>& segment_rates);
196 void communicateGroupRates(
const Parallel::Communication& comm);
198 void updateGlobalIsGrup(
const Parallel::Communication& comm,
199 const std::vector<WellStatus>& well_status);
200 void updateEfficiencyScalingFactor(
const std::string& wellName,
203 bool isInjectionGrup(
const std::string& name)
const
205 return this->global_well_info.value().in_injecting_group(name);
208 bool isProductionGrup(
const std::string& name)
const
210 return this->global_well_info.value().in_producing_group(name);
213 bool isOpen(
const std::string& name)
const
215 return this->global_well_info.value().is_open(name);
218 Scalar getGlobalEfficiencyScalingFactor(
const std::string& name)
const
220 return this->global_well_info.value().efficiency_scaling_factor(name);
227 void updateWellsDefaultALQ(
const Schedule& schedule,
228 const int report_step,
229 const SummaryState& summary_state);
231 void gliftTimeStepInit()
233 for (
size_t i = 0; i < this->size(); ++i) {
234 this->wells_[i].alq_state.reset_count();
239 int wellNameToGlobalIdx(
const std::string& name)
241 return this->global_well_info.value().well_index(name);
244 std::string globalIdxToWellName(
const int index)
246 return this->global_well_info.value().well_name(index);
249 bool wellIsOwned(std::size_t well_index,
250 const std::string& wellName)
const;
252 bool wellIsOwned(
const std::string& wellName)
const;
254 bool isRank0()
const {
255 return this->global_well_info.value().isRank0();
258 void updateStatus(
int well_index, WellStatus status);
260 void openWell(
int well_index);
261 void shutWell(
int well_index);
262 void stopWell(
int well_index);
267 return phaseUsageInfo_.numActivePhases();
272 {
return this->wells_[well_index].surface_rates; }
273 const std::vector<Scalar>&
wellRates(std::size_t well_index)
const
274 {
return this->wells_[well_index].surface_rates; }
276 const std::string& name(std::size_t well_index)
const
278 return this->wells_.well_name(well_index);
281 std::optional<std::size_t> index(
const std::string& well_name)
const
283 return this->wells_.well_index(well_name);
286 const SingleWellState<Scalar, IndexTraits>& operator[](std::size_t well_index)
const
288 return this->wells_[well_index];
291 const SingleWellState<Scalar, IndexTraits>& operator[](
const std::string& well_name)
const
293 return this->wells_[well_name];
296 SingleWellState<Scalar, IndexTraits>& operator[](std::size_t well_index)
298 return this->wells_[well_index];
301 SingleWellState<Scalar, IndexTraits>& operator[](
const std::string& well_name)
303 return this->wells_[well_name];
306 const SingleWellState<Scalar, IndexTraits>& well(std::size_t well_index)
const
308 return this->operator[](well_index);
311 const SingleWellState<Scalar, IndexTraits>& well(
const std::string& well_name)
const
313 return this->operator[](well_name);
316 SingleWellState<Scalar, IndexTraits>& well(std::size_t well_index)
318 return this->operator[](well_index);
321 SingleWellState<Scalar, IndexTraits>& well(
const std::string& well_name)
323 return this->operator[](well_name);
326 bool has(
const std::string& well_name)
const
328 return this->wells_.has(well_name);
331 bool operator==(
const WellState&)
const;
333 template<
class Serializer>
334 void serializeOp(Serializer& serializer)
336 serializer(well_rates);
337 if (serializer.isSerializing()) {
338 serializer(wells_.size());
340 std::size_t size = 0;
342 if (size != wells_.size()) {
343 OPM_THROW(std::runtime_error,
"Error deserializing WellState: size mismatch");
346 for (
auto& w : wells_) {
349 serializer(permanently_inactive_well_names_);
352 bool is_permanently_inactive_well(
const std::string& wname)
const {
353 return std::ranges::find(this->permanently_inactive_well_names_, wname) !=
354 this->permanently_inactive_well_names_.end();
358 bool enableDistributedWells_ =
false;
360 PhaseUsageInfo<IndexTraits> phaseUsageInfo_;
365 WellContainer<SingleWellState<Scalar, IndexTraits>> wells_;
373 std::optional<GlobalWellInfo<Scalar>> global_well_info;
378 std::map<std::string, std::pair<bool, std::vector<Scalar>>> well_rates;
381 std::vector<std::string> permanently_inactive_well_names_;
384 reportSegmentResults(
const int well_id,
386 const int seg_no)
const;
394 void base_init(
const std::vector<Scalar>& cellPressures,
395 const std::vector<Scalar>& cellTemperatures,
396 const std::vector<Well>& wells_ecl,
397 const std::vector<std::reference_wrapper<ParallelWellInfo<Scalar>>>& parallel_well_info,
398 const std::vector<std::vector<PerforationData<Scalar>>>& well_perf_data,
399 const SummaryState& summary_state);
401 void initSingleWell(
const std::vector<Scalar>& cellPressures,
402 const std::vector<Scalar>& cellTemperatures,
404 const std::vector<PerforationData<Scalar>>& well_perf_data,
405 const ParallelWellInfo<Scalar>& well_info,
406 const SummaryState& summary_state);
408 void initSingleProducer(
const Well& well,
409 const ParallelWellInfo<Scalar>& well_info,
410 Scalar pressure_first_connection,
411 const std::vector<PerforationData<Scalar>>& well_perf_data,
412 const SummaryState& summary_state);
414 void initSingleInjector(
const Well& well,
415 const ParallelWellInfo<Scalar>& well_info,
416 Scalar pressure_first_connection,
417 Scalar temperature_first_connection,
418 const std::vector<PerforationData<Scalar>>& well_perf_data,
419 const SummaryState& summary_state);
421 static void calculateSegmentRatesBeforeSum(
const ParallelWellInfo<Scalar>& pw_info,
422 const std::vector<std::vector<int>>& segment_inlets,
423 const std::vector<std::vector<int>>& segment_perforations,
424 const std::vector<Scalar>& perforation_rates,
427 std::vector<Scalar>& segment_rates);
429 void reportConnectionFactors(
const std::size_t well_index,
430 std::vector<data::Connection>& connections)
const;
432 void reportConnectionPressuresAndRates(
const std::size_t well_index,
433 std::vector<data::Connection>& connections)
const;
435 void reportConnectionFilterCake(
const std::size_t well_index,
436 std::vector<data::Connection>& connections)
const;
438 void reportFractureStatistics(
const std::vector<ConnFracStatistics<Scalar>>& stats,
439 std::vector<data::Connection>& connections)
const;