33#include <opm/input/eclipse/Deck/UDAValue.hpp>
34#include <opm/input/eclipse/EclipseState/Phase.hpp>
35#include <opm/input/eclipse/Schedule/ScheduleTypes.hpp>
36#include <opm/input/eclipse/Schedule/VFPProdTable.hpp>
37#include <opm/input/eclipse/Schedule/Well/PAvg.hpp>
38#include <opm/input/eclipse/Schedule/Well/PAvgCalculator.hpp>
39#include <opm/input/eclipse/Schedule/Well/WellEnums.hpp>
40#include <opm/input/eclipse/Schedule/Well/WellInjectionControls.hpp>
41#include <opm/input/eclipse/Schedule/Well/WellProductionControls.hpp>
42#include <opm/input/eclipse/Units/UnitSystem.hpp>
61struct WellBrineProperties;
62class WellEconProductionLimits;
63struct WellFoamProperties;
64struct WellMICPProperties;
65struct WellPolymerProperties;
67class WellTracerProperties;
76 using Status = WellStatus;
83 using InjectorCMode = WellInjectorCMode;
90 using ProducerCMode = WellProducerCMode;
92 using WELTARGCMode = WellWELTARGCMode;
94 using GuideRateTarget = WellGuideRateTarget;
96 using GasInflowEquation = WellGasInflowEquation;
101 GuideRateTarget guide_phase;
107 result.available =
true;
108 result.guide_rate = 1.0;
109 result.guide_phase = GuideRateTarget::COMB;
110 result.scale_factor = 2.0;
116 return available == data.available &&
117 guide_rate == data.guide_rate &&
118 guide_phase == data.guide_phase &&
119 scale_factor == data.scale_factor;
122 template<
class Serializer>
125 serializer(available);
126 serializer(guide_rate);
127 serializer(guide_phase);
128 serializer(scale_factor);
141 double bhp_hist_limit = 0.0;
142 double thp_hist_limit = 0.0;
148 int injectionControls;
149 InjectorType injectorType;
150 InjectorCMode controlMode;
162 void handleWELTARG(WELTARGCMode cmode,
const UDAValue& new_arg,
double SIFactorP);
163 void handleWCONINJE(
const DeckRecord& record,
bool availableForGroupControl,
const std::string& well_name);
164 void handleWCONINJH(
const DeckRecord& record,
bool is_producer,
const std::string& well_name);
165 bool hasInjectionControl(InjectorCMode controlModeArg)
const {
166 if (injectionControls &
static_cast<int>(controlModeArg))
172 void dropInjectionControl(InjectorCMode controlModeArg) {
173 auto int_arg =
static_cast<int>(controlModeArg);
174 if ((injectionControls & int_arg) != 0)
175 injectionControls -= int_arg;
178 void addInjectionControl(InjectorCMode controlModeArg) {
179 auto int_arg =
static_cast<int>(controlModeArg);
180 if ((injectionControls & int_arg) == 0)
181 injectionControls += int_arg;
184 void clearControls();
186 void resetDefaultHistoricalBHPLimit();
187 void resetBHPLimit();
188 void setBHPLimit(
const double limit);
191 bool updateUDQActive(
const UDQConfig& udq_config,
const WELTARGCMode cmode,
UDQActive& active)
const;
193 void handleWTMULT(Well::WELTARGCMode cmode,
double factor);
195 template<
class Serializer>
199 serializer(surfaceInjectionRate);
200 serializer(reservoirInjectionRate);
201 serializer(BHPTarget);
202 serializer(THPTarget);
203 serializer(bhp_hist_limit);
204 serializer(thp_hist_limit);
207 serializer(VFPTableNumber);
208 serializer(predictionMode);
209 serializer(injectionControls);
210 serializer(injectorType);
211 serializer(controlMode);
233 double bhp_hist_limit = 0.0;
234 double thp_hist_limit = 0.0;
239 int VFPTableNumber = 0;
240 bool predictionMode =
false;
241 ProducerCMode controlMode = ProducerCMode::CMODE_UNDEFINED;
242 ProducerCMode whistctl_cmode = ProducerCMode::CMODE_UNDEFINED;
252 bool hasProductionControl(ProducerCMode controlModeArg)
const {
253 return (m_productionControls &
static_cast<int>(controlModeArg)) != 0;
256 void dropProductionControl(ProducerCMode controlModeArg) {
257 if (hasProductionControl(controlModeArg))
258 m_productionControls -=
static_cast<int>(controlModeArg);
261 void addProductionControl(ProducerCMode controlModeArg) {
262 if (! hasProductionControl(controlModeArg))
263 m_productionControls +=
static_cast<int>(controlModeArg);
267 static bool effectiveHistoryProductionControl(ProducerCMode cmode);
268 void handleWCONPROD(
const std::optional<VFPProdTable::ALQ_TYPE>& alq_type,
const UnitSystem& unit_system,
const std::string& well,
const DeckRecord& record);
269 void handleWCONHIST(
const std::optional<VFPProdTable::ALQ_TYPE>& alq_type,
const UnitSystem& unit_system,
const DeckRecord& record);
270 void handleWELTARG( WELTARGCMode cmode,
const UDAValue& new_arg,
double SiFactorP);
271 void resetDefaultBHPLimit();
272 void clearControls();
275 bool updateUDQActive(
const UDQConfig& udq_config,
const WELTARGCMode cmode,
UDQActive& active)
const;
278 void setBHPLimit(
const double limit);
279 int productionControls()
const {
return this->m_productionControls; }
280 void handleWTMULT(Well::WELTARGCMode cmode,
double factor);
282 template<
class Serializer>
287 serializer(WaterRate);
289 serializer(LiquidRate);
290 serializer(ResVRate);
291 serializer(BHPTarget);
292 serializer(THPTarget);
293 serializer(ALQValue);
294 serializer(bhp_hist_limit);
295 serializer(thp_hist_limit);
298 serializer(VFPTableNumber);
299 serializer(predictionMode);
300 serializer(controlMode);
301 serializer(whistctl_cmode);
302 serializer(m_productionControls);
306 int m_productionControls = 0;
310 void init_vfp(
const std::optional<VFPProdTable::ALQ_TYPE>& alq_type,
const UnitSystem& unit_system,
const DeckRecord& record);
314 double getBHPLimit()
const;
317 static int eclipseControlMode(
const Well::InjectorCMode imode,
318 const InjectorType itype);
320 static int eclipseControlMode(
const Well::ProducerCMode pmode);
322 static int eclipseControlMode(
const Well& well,
327 Well(
const std::string& wname,
328 const std::string& gname,
329 std::size_t init_step,
330 std::size_t insert_index,
333 const std::optional<double>& ref_depth,
335 ProducerCMode whistctl_cmode,
336 Connection::Order ordering,
338 double udq_undefined,
343 GasInflowEquation inflow_eq);
349 double udq_undefined);
351 static Well serializationTestObject();
353 bool isMultiSegment()
const;
354 bool isAvailableForGroupControl()
const;
355 double getGuideRate()
const;
356 GuideRateTarget getGuideRatePhase()
const;
357 GuideRateTarget getRawGuideRatePhase()
const;
358 double getGuideRateScalingFactor()
const;
360 bool hasBeenDefined(std::size_t timeStep)
const;
361 std::size_t firstTimeStep()
const;
363 bool predictionMode()
const;
364 bool canOpen()
const;
365 bool isProducer()
const;
366 bool isInjector()
const;
367 InjectorCMode injection_cmode()
const;
368 ProducerCMode production_cmode()
const;
369 InjectorType injectorType()
const;
370 std::size_t seqIndex()
const;
371 bool getAutomaticShutIn()
const;
372 bool getAllowCrossFlow()
const;
373 const std::string& name()
const;
374 const std::vector<std::string>& wListNames()
const;
375 int getHeadI()
const;
376 int getHeadJ()
const;
377 double getWPaveRefDepth()
const;
378 bool hasRefDepth()
const;
379 double getRefDepth()
const;
380 double getDrainageRadius()
const;
381 double getEfficiencyFactor()
const;
382 double getSolventFraction()
const;
383 Status getStatus()
const;
384 const std::string& groupName()
const;
385 Phase getPreferredPhase()
const;
387 bool hasConnections()
const;
388 const std::vector<const Connection *> getConnections(
int completion)
const;
400 const WVFPEXP& getWVFPEXP()
const;
409 double production_rate(
const SummaryState& st, Phase phase)
const;
410 double injection_rate(
const SummaryState& st, Phase phase)
const;
411 static bool wellNameInWellNamePattern(
const std::string& wellName,
const std::string& wellNamePattern);
426 std::map<int, std::vector<Connection>> getCompletions()
const;
432 bool hasCompletion(
int completion)
const;
433 bool updatePrediction(
bool prediction_mode);
434 bool updateAutoShutin(
bool auto_shutin);
435 bool updateCrossFlow(
bool allow_cross_flow);
436 bool updatePVTTable(
int pvt_table);
437 bool updateHead(
int I,
int J);
438 void updateRefDepth();
439 bool updateRefDepth(
const std::optional<double>& ref_dpeth);
440 bool updateDrainageRadius(
double drainage_radius);
441 void updateSegments(std::shared_ptr<WellSegments> segments_arg);
442 bool updateConnections(std::shared_ptr<WellConnections> connections,
bool force);
443 bool updateConnections(std::shared_ptr<WellConnections> connections,
const ScheduleGrid& grid);
444 bool updateStatus(Status status);
445 bool updateGroup(
const std::string& group);
446 bool updateWellGuideRate(
bool available,
double guide_rate, GuideRateTarget guide_phase,
double scale_factor);
447 bool updateWellGuideRate(
double guide_rate);
448 bool updateEfficiencyFactor(
double efficiency_factor);
449 bool updateSolventFraction(
double solvent_fraction);
450 bool updateTracer(std::shared_ptr<WellTracerProperties> tracer_properties);
451 bool updateFoamProperties(std::shared_ptr<WellFoamProperties> foam_properties);
452 bool updatePolymerProperties(std::shared_ptr<WellPolymerProperties> polymer_properties);
453 bool updateMICPProperties(std::shared_ptr<WellMICPProperties> micp_properties);
454 bool updateBrineProperties(std::shared_ptr<WellBrineProperties> brine_properties);
455 bool updateEconLimits(std::shared_ptr<WellEconProductionLimits> econ_limits);
456 bool updateProduction(std::shared_ptr<WellProductionProperties> production);
457 bool updateInjection(std::shared_ptr<WellInjectionProperties> injection);
458 bool updateWellProductivityIndex();
459 bool updateWSEGSICD(
const std::vector<std::pair<int, SICD> >& sicd_pairs);
460 bool updateWSEGVALV(
const std::vector<std::pair<int, Valve> >& valve_pairs);
461 bool updateWSEGAICD(
const std::vector<std::pair<int, AutoICD> >& aicd_pairs,
const KeywordLocation& location);
462 bool updateWPAVE(
const PAvg& pavg);
463 void updateWPaveRefDepth(
double ref_depth);
464 bool updateWVFPEXP(std::shared_ptr<WVFPEXP> wvfpexp);
468 bool handleWELOPENConnections(
const DeckRecord& record, Connection::State status);
469 bool handleCOMPLUMP(
const DeckRecord& record);
471 bool applyGlobalWPIMULT(
double scale_factor);
476 int vfp_table_number()
const;
477 int pvt_table_number()
const;
478 int fip_region_number()
const;
479 GasInflowEquation gas_inflow_equation()
const;
480 bool segmented_density_calculation()
const {
return true; }
481 double alq_value()
const;
482 double temperature()
const;
483 void setWellTemperature(
const double temp);
484 bool hasInjected( )
const;
485 bool hasProduced( )
const;
486 bool updateHasInjected( );
487 bool updateHasProduced();
488 bool cmp_structure(
const Well& other)
const;
489 bool operator==(
const Well& data)
const;
490 bool hasSameConnectionsPointers(
const Well& other)
const;
491 void setInsertIndex(std::size_t index);
492 double convertDeckPI(
double deckPI)
const;
493 void applyWellProdIndexScaling(
const double scalingFactor,
494 std::vector<bool>& scalingApplicable);
495 const PAvg& pavg()
const;
498 template<
class Serializer>
502 serializer(group_name);
503 serializer(init_step);
504 serializer(insert_index);
507 serializer(ref_depth);
508 serializer(wpave_ref_depth);
509 serializer(unit_system);
510 serializer(udq_undefined);
512 serializer(drainage_radius);
513 serializer(allow_cross_flow);
514 serializer(automatic_shutin);
515 serializer(pvt_table);
516 serializer(gas_inflow);
518 serializer(guide_rate);
519 serializer(efficiency_factor);
520 serializer(solvent_fraction);
521 serializer(has_produced);
522 serializer(has_injected);
523 serializer(prediction_mode);
524 serializer(econ_limits);
525 serializer(foam_properties);
526 serializer(polymer_properties);
527 serializer(micp_properties);
528 serializer(brine_properties);
529 serializer(tracer_properties);
530 serializer(connections);
531 serializer(production);
532 serializer(injection);
533 serializer(segments);
536 serializer(well_temperature);
540 void switchToInjector();
541 void switchToProducer();
543 GuideRateTarget preferredPhaseAsGuideRatePhase()
const;
546 std::string group_name;
547 std::size_t init_step;
548 std::size_t insert_index;
551 std::optional<double> ref_depth;
552 std::optional<double> wpave_ref_depth;
553 double drainage_radius;
554 bool allow_cross_flow;
555 bool automatic_shutin;
557 GasInflowEquation gas_inflow = GasInflowEquation::STD;
558 UnitSystem unit_system;
559 double udq_undefined;
561 WellGuideRate guide_rate;
562 double efficiency_factor;
563 double solvent_fraction;
564 bool has_produced =
false;
565 bool has_injected =
false;
566 bool prediction_mode =
true;
568 std::shared_ptr<WellEconProductionLimits> econ_limits;
569 std::shared_ptr<WellFoamProperties> foam_properties;
570 std::shared_ptr<WellPolymerProperties> polymer_properties;
571 std::shared_ptr<WellMICPProperties> micp_properties;
572 std::shared_ptr<WellBrineProperties> brine_properties;
573 std::shared_ptr<WellTracerProperties> tracer_properties;
574 std::shared_ptr<WellConnections> connections;
575 std::shared_ptr<WellProductionProperties> production;
576 std::shared_ptr<WellInjectionProperties> injection;
577 std::shared_ptr<WellSegments> segments;
578 std::shared_ptr<WVFPEXP> wvfpexp;
581 double well_temperature;
584std::ostream& operator<<( std::ostream&,
const Well::WellInjectionProperties& );
585std::ostream& operator<<( std::ostream&,
const Well::WellProductionProperties& );
Simple class capturing active cells of a grid.
Definition: ActiveGridCells.hpp:36
Definition: DeckKeyword.hpp:36
Definition: DeckRecord.hpp:32
About cell information and dimension: The actual grid information is held in a pointer to an ERT ecl_...
Definition: EclipseGrid.hpp:54
Definition: ErrorGuard.hpp:29
Definition: KeywordLocation.hpp:27
Definition: PAvgCalculator.hpp:37
Definition: ParseContext.hpp:84
Definition: ScheduleGrid.hpp:29
Class for (de-)serializing.
Definition: Serializer.hpp:84
Definition: SummaryState.hpp:68
Definition: TracerConfig.hpp:33
Definition: UDAValue.hpp:32
Definition: UDQActive.hpp:43
Definition: UDQConfig.hpp:57
Definition: UnitSystem.hpp:33
Definition: WVFPEXP.hpp:34
Definition: WellConnections.hpp:45
Definition: WellEconProductionLimits.hpp:33
Definition: WellSegments.hpp:47
Definition: WellTracerProperties.hpp:28
Definition: ScheduleTypes.hpp:38
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30
Definition: WellBrineProperties.hpp:29
Definition: WellFoamProperties.hpp:29
Definition: WellInjectionControls.hpp:29
Definition: WellMICPProperties.hpp:29
Definition: WellPolymerProperties.hpp:28
Definition: WellProductionControls.hpp:29