22#define OPM_BLACKOILWELLMODEL_GASLIFT_IMPL_HEADER_INCLUDED
23#define OPM_BLACKOILWELLMODEL_GASLIFT_IMPL_HEADER_INCLUDED
26#ifndef OPM_BLACKOILWELLMODEL_GASLIFT_HEADER_INCLUDED
30#include <opm/common/TimingMacros.hpp>
39template<
typename TypeTag>
43 const std::vector<WellInterfacePtr>& well_container,
49 const auto& glo = simulator.vanguard().schedule().glo(simulator.episodeIndex());
53 bool do_glift_optimization =
false;
54 int num_wells_changed = 0;
55 const double simulation_time = simulator.time();
56 const Scalar min_wait = glo.min_wait();
61 if (simulation_time == this->last_glift_opt_time_ ||
62 simulation_time >= (this->last_glift_opt_time_ + min_wait))
64 do_glift_optimization =
true;
65 this->last_glift_opt_time_ = simulation_time;
68 if (do_glift_optimization) {
80 initGliftEclWellMap(well_container, ecl_well_map);
83 simulator.vanguard().schedule(),
84 simulator.vanguard().summaryState(),
85 simulator.episodeIndex(),
86 simulator.model().newtonMethod().numIterations(),
91 simulator.vanguard().grid().comm(),
94 group_info.initialize();
96 gasLiftOptimizationStage1(simulator,
106 this->gasLiftOptimizationStage2(simulator.vanguard().gridView().comm(),
107 simulator.vanguard().schedule(),
108 simulator.vanguard().summaryState(),
115 simulator.episodeIndex(),
118 if constexpr (glift_debug) {
119 std::vector<WellInterfaceGeneric<Scalar>*> wc;
120 wc.reserve(well_container.size());
121 std::transform(well_container.begin(), well_container.end(),
122 std::back_inserter(wc),
124 { return static_cast<WellInterfaceGeneric<Scalar>*>(w.get()); });
125 this->gliftDebugShowALQ(wc,
129 num_wells_changed = glift_wells.size();
131 num_wells_changed = simulator.vanguard().gridView().comm().sum(num_wells_changed);
132 return num_wells_changed > 0;
135template<
typename TypeTag>
139 const std::vector<WellInterfacePtr>& well_container,
142 GLiftProdWells& prod_wells,
143 GLiftOptWells &glift_wells,
145 GLiftWellStateMap& state_map,
149 auto comm = simulator.
vanguard().grid().comm();
150 int num_procs = comm.size();
176 for (
int i = 0; i< num_procs; i++) {
177 int num_rates_to_sync = 0;
178 GLiftSyncGroups groups_to_sync;
179 if (comm.rank() == i) {
181 for (
const auto& well : well_container) {
183 if (group_info.
hasWell(well->name())) {
184 gasLiftOptimizationStage1SingleWell(well.get(),
196 num_rates_to_sync = groups_to_sync.size();
199 OPM_TIMEBLOCK(WaitForGasLiftSyncGroups);
200 num_rates_to_sync = comm.sum(num_rates_to_sync);
202 if (num_rates_to_sync > 0) {
203 OPM_TIMEBLOCK(GasLiftSyncGroups);
204 std::vector<int> group_indexes;
205 group_indexes.reserve(num_rates_to_sync);
206 std::vector<Scalar> group_alq_rates;
207 group_alq_rates.reserve(num_rates_to_sync);
208 std::vector<Scalar> group_oil_rates;
209 group_oil_rates.reserve(num_rates_to_sync);
210 std::vector<Scalar> group_gas_rates;
211 group_gas_rates.reserve(num_rates_to_sync);
212 std::vector<Scalar> group_water_rates;
213 group_water_rates.reserve(num_rates_to_sync);
214 if (comm.rank() == i) {
215 for (
auto idx : groups_to_sync) {
216 auto [oil_rate, gas_rate, water_rate, alq] = group_info.
getRates(idx);
217 group_indexes.push_back(idx);
218 group_oil_rates.push_back(oil_rate);
219 group_gas_rates.push_back(gas_rate);
220 group_water_rates.push_back(water_rate);
221 group_alq_rates.push_back(alq);
224 group_indexes.resize(num_rates_to_sync);
225 group_oil_rates.resize(num_rates_to_sync);
226 group_gas_rates.resize(num_rates_to_sync);
227 group_water_rates.resize(num_rates_to_sync);
228 group_alq_rates.resize(num_rates_to_sync);
231 Parallel::MpiSerializer ser(comm);
232 ser.broadcast(Parallel::RootRank{i}, group_indexes, group_oil_rates,
233 group_gas_rates, group_water_rates, group_alq_rates);
235 if (comm.rank() != i) {
236 for (
int j = 0; j < num_rates_to_sync; ++j) {
240 group_water_rates[j],
244 if constexpr (glift_debug) {
246 if (comm.rank() == i) {
247 counter = wellState.gliftGetDebugCounter();
249 counter = comm.sum(counter);
250 if (comm.rank() != i) {
251 wellState.gliftSetDebugCounter(counter);
261template<
typename TypeTag>
263BlackoilWellModelGasLift<TypeTag>::
264gasLiftOptimizationStage1SingleWell(WellInterface<TypeTag>* well,
265 const Simulator& simulator,
266 WellState<Scalar>& wellState,
267 GroupState<Scalar>& groupState,
268 GLiftProdWells& prod_wells,
269 GLiftOptWells& glift_wells,
270 GasLiftGroupInfo<Scalar>& group_info,
271 GLiftWellStateMap& state_map,
272 GLiftSyncGroups& sync_groups,
273 DeferredLogger& deferred_logger)
276 const auto& summary_state = simulator.vanguard().summaryState();
277 auto glift = std::make_unique<GasLiftSingleWell<TypeTag>>(*well,
285 simulator.vanguard().gridView().comm(),
287 auto state = glift->runOptimize(simulator.model().newtonMethod().numIterations());
289 state_map.emplace(well->name(), std::move(state));
290 glift_wells.emplace(well->name(), std::move(glift));
293 prod_wells.insert({well->name(), well});
296template<
typename TypeTag>
302 for (
const auto& well : well_container) {
303 ecl_well_map.try_emplace(well->name(), &well->wellEcl(), well->indexOfWell());
Class for handling the gaslift in the blackoil well model.
Definition: BlackoilWellModelGasLift.hpp:94
GetPropType< TypeTag, Properties::Simulator > Simulator
Definition: BlackoilWellModelGasLift.hpp:105
static void initGliftEclWellMap(const std::vector< WellInterfacePtr > &well_container, GLiftEclWells &ecl_well_map)
Definition: BlackoilWellModelGasLift_impl.hpp:299
bool maybeDoGasLiftOptimize(const Simulator &simulator, const std::vector< WellInterfacePtr > &well_container, WellState< Scalar > &wellState, GroupState< Scalar > &groupState, DeferredLogger &deferred_logger)
Definition: BlackoilWellModelGasLift_impl.hpp:42
typename Base::GLiftWellStateMap GLiftWellStateMap
Definition: BlackoilWellModelGasLift.hpp:104
typename GasLiftGroupInfo< Scalar >::GLiftEclWells GLiftEclWells
Definition: BlackoilWellModelGasLift.hpp:100
typename Base::GLiftOptWells GLiftOptWells
Definition: BlackoilWellModelGasLift.hpp:101
typename Base::GLiftProdWells GLiftProdWells
Definition: BlackoilWellModelGasLift.hpp:102
GetPropType< TypeTag, Properties::Scalar > Scalar
Definition: BlackoilWellModelGasLift.hpp:99
Definition: DeferredLogger.hpp:57
Definition: GasLiftGroupInfo.hpp:46
std::tuple< Scalar, Scalar, Scalar, Scalar > getRates(const int group_idx) const
bool hasWell(const std::string &well_name)
void updateRate(int idx, Scalar oil_rate, Scalar gas_rate, Scalar water_rate, Scalar alq)
Definition: GroupState.hpp:43
Manages the initializing and running of time dependent problems.
Definition: simulator.hh:84
Vanguard & vanguard()
Return a reference to the grid manager of simulation.
Definition: simulator.hh:234
Definition: WellState.hpp:65
Definition: blackoilboundaryratevector.hh:39