35 #include <opm/input/eclipse/Deck/UDAValue.hpp>
36 #include <opm/input/eclipse/EclipseState/Runspec.hpp>
37 #include <opm/input/eclipse/Schedule/Well/WellConnections.hpp>
38 #include <opm/input/eclipse/Schedule/MSW/WellSegments.hpp>
39 #include <opm/input/eclipse/Schedule/ScheduleTypes.hpp>
40 #include <opm/input/eclipse/Schedule/Well/PAvg.hpp>
41 #include <opm/input/eclipse/Schedule/Well/PAvgCalculator.hpp>
42 #include <opm/input/eclipse/Schedule/Well/ProductionControls.hpp>
43 #include <opm/input/eclipse/Schedule/Well/InjectionControls.hpp>
44 #include <opm/input/eclipse/Schedule/Well/WellFoamProperties.hpp>
45 #include <opm/input/eclipse/Schedule/Well/WellBrineProperties.hpp>
46 #include <opm/input/eclipse/Schedule/Well/WellTracerProperties.hpp>
47 #include <opm/input/eclipse/Schedule/Well/WellPolymerProperties.hpp>
48 #include <opm/input/eclipse/Schedule/Well/WellMICPProperties.hpp>
49 #include <opm/input/eclipse/Schedule/Well/WellEconProductionLimits.hpp>
50 #include <opm/input/eclipse/Schedule/Well/WVFPEXP.hpp>
51 #include <opm/input/eclipse/Schedule/VFPProdTable.hpp>
52 #include <opm/input/eclipse/Units/Units.hpp>
53 #include <opm/input/eclipse/Units/UnitSystem.hpp>
55 #include <opm/common/utility/ActiveGridCells.hpp>
59 class ActiveGridCells;
87 static std::string Status2String(Status enumValue);
88 static Status StatusFromString(
const std::string& stringValue);
97 enum class InjectorCMode : int{
103 CMODE_UNDEFINED = 512
105 static const std::string InjectorCMode2String( InjectorCMode enumValue );
106 static InjectorCMode InjectorCModeFromString(
const std::string& stringValue );
120 enum class ProducerCMode : int {
131 CMODE_UNDEFINED = 1024
133 static const std::string ProducerCMode2String( ProducerCMode enumValue );
134 static ProducerCMode ProducerCModeFromString(
const std::string& stringValue );
138 enum class WELTARGCMode {
152 static WELTARGCMode WELTARGCModeFromString(
const std::string& stringValue);
155 enum class GuideRateTarget {
167 static const std::string GuideRateTarget2String( GuideRateTarget enumValue );
168 static GuideRateTarget GuideRateTargetFromString(
const std::string& stringValue );
171 enum class GasInflowEquation {
177 static const std::string GasInflowEquation2String(GasInflowEquation enumValue);
178 static GasInflowEquation GasInflowEquationFromString(
const std::string& stringValue);
185 GuideRateTarget guide_phase;
191 result.available =
true;
192 result.guide_rate = 1.0;
193 result.guide_phase = GuideRateTarget::COMB;
194 result.scale_factor = 2.0;
200 return available == data.available &&
201 guide_rate == data.guide_rate &&
202 guide_phase == data.guide_phase &&
203 scale_factor == data.scale_factor;
206 template<
class Serializer>
209 serializer(available);
210 serializer(guide_rate);
211 serializer(guide_phase);
212 serializer(scale_factor);
220 controls(controls_arg)
227 InjectorType injector_type;
228 InjectorCMode cmode = InjectorCMode::CMODE_UNDEFINED;
230 double reservoir_rate;
232 int vfp_table_number;
233 bool prediction_mode;
235 bool hasControl(InjectorCMode cmode_arg)
const {
236 return (this->controls &
static_cast<int>(cmode_arg)) != 0;
252 double bhp_hist_limit = 0.0;
253 double thp_hist_limit = 0.0;
260 int injectionControls;
261 InjectorType injectorType;
262 InjectorCMode controlMode;
272 void handleWELTARG(WELTARGCMode cmode,
const UDAValue& new_arg,
double SIFactorP);
273 void handleWCONINJE(
const DeckRecord& record,
bool availableForGroupControl,
const std::string& well_name);
274 void handleWCONINJH(
const DeckRecord& record,
bool is_producer,
const std::string& well_name);
275 bool hasInjectionControl(InjectorCMode controlModeArg)
const {
276 if (injectionControls &
static_cast<int>(controlModeArg))
282 void dropInjectionControl(InjectorCMode controlModeArg) {
283 auto int_arg =
static_cast<int>(controlModeArg);
284 if ((injectionControls & int_arg) != 0)
285 injectionControls -= int_arg;
288 void addInjectionControl(InjectorCMode controlModeArg) {
289 auto int_arg =
static_cast<int>(controlModeArg);
290 if ((injectionControls & int_arg) == 0)
291 injectionControls += int_arg;
294 void clearControls();
296 void resetDefaultHistoricalBHPLimit();
297 void resetBHPLimit();
298 void setBHPLimit(
const double limit);
302 void handleWTMULT(Well::WELTARGCMode cmode,
double factor);
304 template<
class Serializer>
308 surfaceInjectionRate.serializeOp(serializer);
309 reservoirInjectionRate.serializeOp(serializer);
310 BHPTarget.serializeOp(serializer);
311 THPTarget.serializeOp(serializer);
312 serializer(bhp_hist_limit);
313 serializer(thp_hist_limit);
314 serializer(temperature);
317 serializer(VFPTableNumber);
318 serializer(predictionMode);
319 serializer(injectionControls);
320 serializer(injectorType);
321 serializer(controlMode);
328 controls(controls_arg)
332 ProducerCMode cmode = ProducerCMode::NONE;
334 double water_rate{0};
336 double liquid_rate{0};
338 double bhp_history{0};
339 double thp_history{0};
343 int vfp_table_number{0};
344 bool prediction_mode{0};
346 bool hasControl(ProducerCMode cmode_arg)
const {
347 return (this->controls &
static_cast<int>(cmode_arg)) != 0;
351 return this->cmode == other.cmode &&
352 this->oil_rate == other.oil_rate &&
353 this->water_rate == other.water_rate &&
354 this->gas_rate == other.gas_rate &&
355 this->liquid_rate == other.liquid_rate &&
356 this->resv_rate == other.resv_rate &&
357 this->bhp_history == other.bhp_history &&
358 this->thp_history == other.thp_history &&
359 this->bhp_limit == other.bhp_limit &&
360 this->thp_limit == other.thp_limit &&
361 this->alq_value == other.alq_value &&
362 this->vfp_table_number == other.vfp_table_number &&
363 this->prediction_mode == other.prediction_mode;
387 double bhp_hist_limit = 0.0;
388 double thp_hist_limit = 0.0;
393 int VFPTableNumber = 0;
394 bool predictionMode =
false;
395 ProducerCMode controlMode = ProducerCMode::CMODE_UNDEFINED;
396 ProducerCMode whistctl_cmode = ProducerCMode::CMODE_UNDEFINED;
406 bool hasProductionControl(ProducerCMode controlModeArg)
const {
407 return (m_productionControls &
static_cast<int>(controlModeArg)) != 0;
410 void dropProductionControl(ProducerCMode controlModeArg) {
411 if (hasProductionControl(controlModeArg))
412 m_productionControls -=
static_cast<int>(controlModeArg);
415 void addProductionControl(ProducerCMode controlModeArg) {
416 if (! hasProductionControl(controlModeArg))
417 m_productionControls +=
static_cast<int>(controlModeArg);
421 static bool effectiveHistoryProductionControl(ProducerCMode cmode);
422 void handleWCONPROD(
const std::optional<VFPProdTable::ALQ_TYPE>& alq_type,
const UnitSystem& unit_system,
const std::string& well,
const DeckRecord& record);
423 void handleWCONHIST(
const std::optional<VFPProdTable::ALQ_TYPE>& alq_type,
const UnitSystem& unit_system,
const DeckRecord& record);
424 void handleWELTARG( WELTARGCMode cmode,
const UDAValue& new_arg,
double SiFactorP);
425 void resetDefaultBHPLimit();
426 void clearControls();
431 void setBHPLimit(
const double limit);
432 int productionControls()
const {
return this->m_productionControls; }
433 void handleWTMULT(Well::WELTARGCMode cmode,
double factor);
435 template<
class Serializer>
439 OilRate.serializeOp(serializer);
440 WaterRate.serializeOp(serializer);
441 GasRate.serializeOp(serializer);
442 LiquidRate.serializeOp(serializer);
443 ResVRate.serializeOp(serializer);
444 BHPTarget.serializeOp(serializer);
445 THPTarget.serializeOp(serializer);
446 ALQValue.serializeOp(serializer);
447 serializer(bhp_hist_limit);
448 serializer(thp_hist_limit);
451 serializer(VFPTableNumber);
452 serializer(predictionMode);
453 serializer(controlMode);
454 serializer(whistctl_cmode);
455 serializer(m_productionControls);
459 int m_productionControls = 0;
463 void init_vfp(
const std::optional<VFPProdTable::ALQ_TYPE>& alq_type,
const UnitSystem& unit_system,
const DeckRecord& record);
467 double getBHPLimit()
const;
470 static int eclipseControlMode(
const Well::InjectorCMode imode,
471 const InjectorType itype);
473 static int eclipseControlMode(
const Well::ProducerCMode pmode);
475 static int eclipseControlMode(
const Well& well,
480 Well(
const std::string& wname,
481 const std::string& gname,
482 std::size_t init_step,
483 std::size_t insert_index,
486 const std::optional<double>& ref_depth,
488 ProducerCMode whistctl_cmode,
489 Connection::Order ordering,
491 double udq_undefined,
496 GasInflowEquation inflow_eq);
502 double udq_undefined);
504 static Well serializeObject();
506 bool isMultiSegment()
const;
507 bool isAvailableForGroupControl()
const;
508 double getGuideRate()
const;
509 GuideRateTarget getGuideRatePhase()
const;
510 double getGuideRateScalingFactor()
const;
512 bool hasBeenDefined(
size_t timeStep)
const;
513 std::size_t firstTimeStep()
const;
515 bool predictionMode()
const;
516 bool canOpen()
const;
517 bool isProducer()
const;
518 bool isInjector()
const;
519 InjectorCMode injection_cmode()
const;
520 ProducerCMode production_cmode()
const;
521 InjectorType injectorType()
const;
522 size_t seqIndex()
const;
523 bool getAutomaticShutIn()
const;
524 bool getAllowCrossFlow()
const;
525 const std::string& name()
const;
526 const std::vector<std::string>& wListNames()
const;
527 int getHeadI()
const;
528 int getHeadJ()
const;
529 double getWPaveRefDepth()
const;
530 bool hasRefDepth()
const;
531 double getRefDepth()
const;
532 double getDrainageRadius()
const;
533 double getEfficiencyFactor()
const;
534 double getSolventFraction()
const;
535 Status getStatus()
const;
536 const std::string& groupName()
const;
537 Phase getPreferredPhase()
const;
539 const std::vector<const Connection *> getConnections(
int completion)
const;
551 const WVFPEXP& getWVFPEXP()
const;
560 double production_rate(
const SummaryState& st, Phase phase)
const;
561 double injection_rate(
const SummaryState& st, Phase phase)
const;
562 static bool wellNameInWellNamePattern(
const std::string& wellName,
const std::string& wellNamePattern);
577 std::map<int, std::vector<Connection>> getCompletions()
const;
583 bool hasCompletion(
int completion)
const;
584 bool updatePrediction(
bool prediction_mode);
585 bool updateAutoShutin(
bool auto_shutin);
586 bool updateCrossFlow(
bool allow_cross_flow);
587 bool updatePVTTable(
int pvt_table);
588 bool updateHead(
int I,
int J);
589 void updateRefDepth();
590 bool updateRefDepth(
const std::optional<double>& ref_dpeth);
591 bool updateDrainageRadius(
double drainage_radius);
592 void updateSegments(std::shared_ptr<WellSegments> segments_arg);
593 bool updateConnections(std::shared_ptr<WellConnections> connections,
bool force);
594 bool updateConnections(std::shared_ptr<WellConnections> connections,
const ScheduleGrid& grid);
595 bool updateStatus(Status status);
596 bool updateGroup(
const std::string& group);
597 bool updateWellGuideRate(
bool available,
double guide_rate, GuideRateTarget guide_phase,
double scale_factor);
598 bool updateWellGuideRate(
double guide_rate);
599 bool updateEfficiencyFactor(
double efficiency_factor);
600 bool updateSolventFraction(
double solvent_fraction);
601 bool updateTracer(std::shared_ptr<WellTracerProperties> tracer_properties);
602 bool updateFoamProperties(std::shared_ptr<WellFoamProperties> foam_properties);
603 bool updatePolymerProperties(std::shared_ptr<WellPolymerProperties> polymer_properties);
604 bool updateMICPProperties(std::shared_ptr<WellMICPProperties> micp_properties);
605 bool updateBrineProperties(std::shared_ptr<WellBrineProperties> brine_properties);
606 bool updateEconLimits(std::shared_ptr<WellEconProductionLimits> econ_limits);
607 bool updateProduction(std::shared_ptr<WellProductionProperties> production);
608 bool updateInjection(std::shared_ptr<WellInjectionProperties> injection);
609 bool updateWellProductivityIndex();
610 bool updateWSEGSICD(
const std::vector<std::pair<int, SICD> >& sicd_pairs);
611 bool updateWSEGVALV(
const std::vector<std::pair<int, Valve> >& valve_pairs);
612 bool updateWSEGAICD(
const std::vector<std::pair<int, AutoICD> >& aicd_pairs,
const KeywordLocation& location);
613 bool updateWPAVE(
const PAvg& pavg);
614 void updateWPaveRefDepth(
double ref_depth);
615 bool updateWVFPEXP(std::shared_ptr<WVFPEXP> wvfpexp);
619 bool handleWELOPENConnections(
const DeckRecord& record, Connection::State status);
620 bool handleCOMPLUMP(
const DeckRecord& record);
626 int vfp_table_number()
const;
627 int pvt_table_number()
const;
628 int fip_region_number()
const;
629 GasInflowEquation gas_inflow_equation()
const;
630 bool segmented_density_calculation()
const {
return true; }
631 double alq_value()
const;
632 double temperature()
const;
633 bool hasInjected( )
const;
634 bool hasProduced( )
const;
635 bool updateHasInjected( );
636 bool updateHasProduced();
637 bool cmp_structure(
const Well& other)
const;
638 bool operator==(
const Well& data)
const;
639 bool hasSameConnectionsPointers(
const Well& other)
const;
640 void setInsertIndex(std::size_t index);
641 double convertDeckPI(
double deckPI)
const;
642 void applyWellProdIndexScaling(
const double scalingFactor,
643 std::vector<bool>& scalingApplicable);
644 const PAvg& pavg()
const;
647 template<
class Serializer>
651 serializer(group_name);
652 serializer(init_step);
653 serializer(insert_index);
656 serializer(ref_depth);
657 serializer(wpave_ref_depth);
658 unit_system.serializeOp(serializer);
659 serializer(udq_undefined);
661 serializer(drainage_radius);
662 serializer(allow_cross_flow);
663 serializer(automatic_shutin);
664 serializer(pvt_table);
665 serializer(gas_inflow);
666 wtype.serializeOp(serializer);
667 guide_rate.serializeOp(serializer);
668 serializer(efficiency_factor);
669 serializer(solvent_fraction);
670 serializer(has_produced);
671 serializer(has_injected);
672 serializer(prediction_mode);
673 serializer(econ_limits);
674 serializer(foam_properties);
675 serializer(polymer_properties);
676 serializer(micp_properties);
677 serializer(brine_properties);
678 serializer(tracer_properties);
679 serializer(connections);
680 serializer(production);
681 serializer(injection);
682 serializer(segments);
684 m_pavg.serializeOp(serializer);
688 void switchToInjector();
689 void switchToProducer();
692 std::string group_name;
693 std::size_t init_step;
694 std::size_t insert_index;
697 std::optional<double> ref_depth;
698 std::optional<double> wpave_ref_depth;
699 double drainage_radius;
700 bool allow_cross_flow;
701 bool automatic_shutin;
703 GasInflowEquation gas_inflow = GasInflowEquation::STD;
704 UnitSystem unit_system;
705 double udq_undefined;
707 WellGuideRate guide_rate;
708 double efficiency_factor;
709 double solvent_fraction;
710 bool has_produced =
false;
711 bool has_injected =
false;
712 bool prediction_mode =
true;
714 std::shared_ptr<WellEconProductionLimits> econ_limits;
715 std::shared_ptr<WellFoamProperties> foam_properties;
716 std::shared_ptr<WellPolymerProperties> polymer_properties;
717 std::shared_ptr<WellMICPProperties> micp_properties;
718 std::shared_ptr<WellBrineProperties> brine_properties;
719 std::shared_ptr<WellTracerProperties> tracer_properties;
720 std::shared_ptr<WellConnections> connections;
721 std::shared_ptr<WellProductionProperties> production;
722 std::shared_ptr<WellInjectionProperties> injection;
723 std::shared_ptr<WellSegments> segments;
724 std::shared_ptr<WVFPEXP> wvfpexp;
729 std::ostream& operator<<( std::ostream&,
const Well::WellInjectionProperties& );
730 std::ostream& operator<<( std::ostream&,
const Well::WellProductionProperties& );
733 std::ostream& operator<<(std::ostream& os,
const Well::Status& st);
734 std::ostream& operator<<(std::ostream& os,
const Well::ProducerCMode& cm);
735 std::ostream& operator<<(std::ostream& os,
const Well::InjectorCMode& cm);
Simple class capturing active cells of a grid.
Definition: ActiveGridCells.hpp:35
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:88
Definition: ScheduleGrid.hpp:29
Definition: Serializer.hpp:38
Definition: SummaryState.hpp:69
Definition: TracerConfig.hpp:31
Definition: UDAValue.hpp:32
Definition: UDQActive.hpp:43
Definition: UDQConfig.hpp:51
Definition: UnitSystem.hpp:34
Definition: WVFPEXP.hpp:28
Definition: WellConnections.hpp:40
Definition: WellEconProductionLimits.hpp:29
Definition: WellSegments.hpp:41
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:29
Definition: WellBrineProperties.hpp:29
Definition: WellFoamProperties.hpp:29
Definition: WellMICPProperties.hpp:29
Definition: WellPolymerProperties.hpp:28