My Project
UDQSet.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 #ifndef UDQSET_HPP
21 #define UDQSET_HPP
22 
23 #include <optional>
24 #include <stdexcept>
25 #include <string>
26 #include <unordered_map>
27 #include <vector>
28 
29 #include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp>
30 
31 namespace Opm {
32 
33 class Serializer;
34 
35 class UDQScalar {
36 public:
37  UDQScalar() = default;
38  explicit UDQScalar(double value);
39  explicit UDQScalar(const std::string& wgname);
40 
41  void operator+=(const UDQScalar& rhs);
42  void operator+=(double rhs);
43  void operator*=(const UDQScalar& rhs);
44  void operator*=(double rhs);
45  void operator/=(const UDQScalar& rhs);
46  void operator/=(double rhs);
47  void operator-=(const UDQScalar& rhs);
48  void operator-=(double rhs);
49 
50  operator bool() const;
51  void assign(const std::optional<double>& value);
52  void assign(double value);
53  bool defined() const;
54  double get() const;
55  const std::optional<double>& value() const;
56  const std::string& wgname() const;
57  bool operator==(const UDQScalar& other) const;
58  static UDQScalar deserialize(Serializer& ser);
59  void serialize(Serializer& ser) const;
60 public:
61  std::optional<double> m_value;
62  std::string m_wgname;
63 };
64 
65 
66 class UDQSet {
67 public:
68  UDQSet(const std::string& name, UDQVarType var_type);
69  UDQSet(const std::string& name, UDQVarType var_type, const std::vector<std::string>& wgnames);
70  UDQSet(const std::string& name, UDQVarType var_type, std::size_t size);
71  UDQSet(const std::string& name, std::size_t size);
72  void serialize(Serializer& ser) const;
73  static UDQSet deserialize(Serializer& ser);
74  static UDQSet scalar(const std::string& name, const std::optional<double>& scalar_value);
75  static UDQSet scalar(const std::string& name, double value);
76  static UDQSet empty(const std::string& name);
77  static UDQSet wells(const std::string& name, const std::vector<std::string>& wells);
78  static UDQSet wells(const std::string& name, const std::vector<std::string>& wells, double scalar_value);
79  static UDQSet groups(const std::string& name, const std::vector<std::string>& groups);
80  static UDQSet groups(const std::string& name, const std::vector<std::string>& groups, double scalar_value);
81  static UDQSet field(const std::string& name, double scalar_value);
82 
83  void assign(const std::optional<double>& value);
84  void assign(const std::string& wgname, const std::optional<double>& value);
85 
86  void assign(double value);
87  void assign(std::size_t index, double value);
88  void assign(const std::string& wgname, double value);
89 
90  bool has(const std::string& name) const;
91  std::size_t size() const;
92  void operator+=(const UDQSet& rhs);
93  void operator+=(double rhs);
94  void operator-=(const UDQSet& rhs);
95  void operator-=(double rhs);
96  void operator*=(const UDQSet& rhs);
97  void operator*=(double rhs);
98  void operator/=(const UDQSet& rhs);
99  void operator/=(double rhs);
100 
101  const UDQScalar& operator[](std::size_t index) const;
102  const UDQScalar& operator[](const std::string& wgname) const;
103  std::vector<UDQScalar>::const_iterator begin() const;
104  std::vector<UDQScalar>::const_iterator end() const;
105 
106  std::vector<std::string> wgnames() const;
107  std::vector<double> defined_values() const;
108  std::size_t defined_size() const;
109  const std::string& name() const;
110  void name(const std::string& name);
111  UDQVarType var_type() const;
112  bool operator==(const UDQSet& other) const;
113 private:
114  UDQSet() = default;
115 
116  std::string m_name;
117  UDQVarType m_var_type = UDQVarType::NONE;
118  std::vector<UDQScalar> values;
119 };
120 
121 
122 UDQScalar operator+(const UDQScalar&lhs, const UDQScalar& rhs);
123 UDQScalar operator+(const UDQScalar&lhs, double rhs);
124 UDQScalar operator+(double lhs, const UDQScalar& rhs);
125 
126 UDQScalar operator-(const UDQScalar&lhs, const UDQScalar& rhs);
127 UDQScalar operator-(const UDQScalar&lhs, double rhs);
128 UDQScalar operator-(double lhs, const UDQScalar& rhs);
129 
130 UDQScalar operator*(const UDQScalar&lhs, const UDQScalar& rhs);
131 UDQScalar operator*(const UDQScalar&lhs, double rhs);
132 UDQScalar operator*(double lhs, const UDQScalar& rhs);
133 
134 UDQScalar operator/(const UDQScalar&lhs, const UDQScalar& rhs);
135 UDQScalar operator/(const UDQScalar&lhs, double rhs);
136 UDQScalar operator/(double lhs, const UDQScalar& rhs);
137 
138 UDQSet operator+(const UDQSet&lhs, const UDQSet& rhs);
139 UDQSet operator+(const UDQSet&lhs, double rhs);
140 UDQSet operator+(double lhs, const UDQSet& rhs);
141 
142 UDQSet operator-(const UDQSet&lhs, const UDQSet& rhs);
143 UDQSet operator-(const UDQSet&lhs, double rhs);
144 UDQSet operator-(double lhs, const UDQSet& rhs);
145 
146 UDQSet operator*(const UDQSet&lhs, const UDQSet& rhs);
147 UDQSet operator*(const UDQSet&lhs, double rhs);
148 UDQSet operator*(double lhs, const UDQSet& rhs);
149 
150 UDQSet operator/(const UDQSet&lhs, const UDQSet& rhs);
151 UDQSet operator/(const UDQSet&lhs, double rhs);
152 UDQSet operator/(double lhs, const UDQSet&rhs);
153 
154 }
155 
156 
157 
158 #endif
Definition: Serializer.hpp:38
Definition: UDQSet.hpp:35
Definition: UDQSet.hpp:66
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:29