My Project
Loading...
Searching...
No Matches
WellProductionControls.hpp
1/*
2 Copyright 2019 Equinor ASA.
3
4 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20
21#ifndef WELL_PRODUCTION_CONTROLS_HPP
22#define WELL_PRODUCTION_CONTROLS_HPP
23
24#include <opm/input/eclipse/Schedule/ScheduleTypes.hpp>
25#include <opm/input/eclipse/Schedule/Well/WellEnums.hpp>
26
27#include <cmath>
28
29namespace Opm {
30
32public:
33 explicit WellProductionControls(int controls_arg) :
34 controls(controls_arg)
35 {
36 }
37
38 bool hasControl(WellProducerCMode cmode_arg) const
39 {
40 return (this->controls & static_cast<int>(cmode_arg)) != 0;
41 }
42
43 void skipControl(WellProducerCMode cmode_arg) {
44 auto int_arg = static_cast<int>(cmode_arg);
45 if ((this->controls & int_arg) != 0)
46 this->controls -= int_arg;
47 }
48
49 void addControl(WellProducerCMode cmode_arg) {
50 auto int_arg = static_cast<int>(cmode_arg);
51 if ((this->controls & int_arg) == 0)
52 this->controls += int_arg;
53 }
54
55 void clearControls(){
56 this->controls = 0;
57 }
58
59 bool anyZeroRateConstraint() const {
60 auto is_zero = [](const double x)
61 {
62 return std::isfinite(x) && !std::isnormal(x);
63 };
64
65 if (this->hasControl(WellProducerCMode::ORAT) && is_zero(this->oil_rate)) {
66 return true;
67 }
68
69 if (this->hasControl(WellProducerCMode::WRAT) && is_zero(this->water_rate)) {
70 return true;
71 }
72
73 if (this->hasControl(WellProducerCMode::GRAT) && is_zero(this->gas_rate)) {
74 return true;
75 }
76
77 if (this->hasControl(WellProducerCMode::LRAT) && is_zero(this->liquid_rate)) {
78 return true;
79 }
80
81 if (this->hasControl(WellProducerCMode::RESV) && is_zero(this->resv_rate)) {
82 return true;
83 }
84
85 return false;
86 }
87
88 bool operator==(const WellProductionControls& other) const
89 {
90 return this->cmode == other.cmode &&
91 this->oil_rate == other.oil_rate &&
92 this->water_rate == other.water_rate &&
93 this->gas_rate == other.gas_rate &&
94 this->liquid_rate == other.liquid_rate &&
95 this->resv_rate == other.resv_rate &&
96 this->bhp_history == other.bhp_history &&
97 this->thp_history == other.thp_history &&
98 this->bhp_limit == other.bhp_limit &&
99 this->thp_limit == other.thp_limit &&
100 this->alq_value == other.alq_value &&
101 this->vfp_table_number == other.vfp_table_number &&
102 this->prediction_mode == other.prediction_mode;
103 }
104
105 WellProducerCMode cmode = WellProducerCMode::NONE;
106 double oil_rate{0};
107 double water_rate{0};
108 double gas_rate{0};
109 double liquid_rate{0};
110 double resv_rate{0};
111 double bhp_history{0};
112 double thp_history{0};
113 double bhp_limit{0};
114 double thp_limit{0};
115 double alq_value{0};
116 int vfp_table_number{0};
117 bool prediction_mode{0};
118
119private:
120 int controls;
121};
122
123}
124
125#endif
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30
Definition WellProductionControls.hpp:31