20 #ifndef OPM_OUTPUT_AQUIFER_HPP
21 #define OPM_OUTPUT_AQUIFER_HPP
27 #include <unordered_map>
32 namespace Opm {
namespace data {
34 enum class AquiferType
36 Fetkovich, CarterTracy, Numerical,
43 double timeConstant{};
48 template <
class MessageBufferType>
49 void write(MessageBufferType& buffer)
const;
52 template <
class MessageBufferType>
53 void read(MessageBufferType& buffer);
58 double timeConstant{};
59 double influxConstant{};
60 double waterDensity{};
61 double waterViscosity{};
63 double dimensionless_time{};
64 double dimensionless_pressure{};
69 template <
class MessageBufferType>
70 void write(MessageBufferType& buffer)
const;
73 template <
class MessageBufferType>
74 void read(MessageBufferType& buffer);
79 std::vector<double> initPressure{};
84 template <
class MessageBufferType>
85 void write(MessageBufferType& buffer)
const;
88 template <
class MessageBufferType>
89 void read(MessageBufferType& buffer);
93 template <AquiferType>
96 template <>
struct TypeMap<AquiferType::CarterTracy>
101 template <>
struct TypeMap<AquiferType::Fetkovich>
106 template <>
struct TypeMap<AquiferType::Numerical>
111 template <AquiferType t>
118 template <
typename T>
121 return std::holds_alternative<T>(this->options_);
124 template <
typename T>
127 return this->
template is<T>()
128 ? &std::get<T>(this->options_)
132 template <
typename T>
135 return this->
template is<T>()
136 ? &std::get<T>(this->options_)
151 return std::visit(Equal{}, this->options_, that.options_);
154 template <AquiferType t>
157 return &this->options_.emplace<detail::TypeMap_t<t>>();
160 template <AquiferType t>
163 return this->
template is<detail::TypeMap_t<t>>();
166 template <AquiferType t>
167 auto const* get()
const
169 return this->
template get<detail::TypeMap_t<t>>();
172 template <AquiferType t>
175 return this->
template get<detail::TypeMap_t<t>>();
178 template <
typename MessageBufferType>
179 void write(MessageBufferType& buffer)
const
181 buffer.write(this->options_.index());
182 std::visit(Write<MessageBufferType>{buffer}, this->options_);
185 template <
typename MessageBufferType>
186 void read(MessageBufferType& buffer)
188 auto type = 0 * this->options_.index();
191 if (type < std::variant_size_v<Types>) {
194 std::visit(Read<MessageBufferType>{buffer}, this->options_);
199 using Types = std::variant<std::monostate,
206 template <
typename T1,
typename T2>
207 bool operator()(
const T1&,
const T2&)
const
212 template <
typename T>
213 bool operator()(
const T& e1,
const T& e2)
const
218 bool operator()(
const std::monostate&,
219 const std::monostate&)
const
225 template <
typename MessageBufferType>
229 explicit Read(MessageBufferType& buffer)
233 template <
typename T>
234 void operator()(T& alternative)
236 return alternative.read(this->buffer_);
239 void operator()(std::monostate&)
243 MessageBufferType& buffer_;
246 template <
typename MessageBufferType>
250 explicit Write(MessageBufferType& buffer)
254 template <
typename T>
255 void operator()(
const T& alternative)
const
257 return alternative.write(this->buffer_);
260 void operator()(
const std::monostate&)
const
264 MessageBufferType& buffer_;
269 void create(
const std::size_t option);
275 double pressure = 0.0;
276 double fluxRate = 0.0;
278 double initPressure = 0.0;
279 double datumDepth = 0.0;
283 double get(
const std::string& key)
const;
288 template <
class MessageBufferType>
289 void write(MessageBufferType& buffer)
const;
292 template <
class MessageBufferType>
293 void read(MessageBufferType& buffer);
296 using GetSummaryValue = double (
AquiferData::*)()
const;
297 using SummaryValueDispatchTable = std::unordered_map<std::string, GetSummaryValue>;
299 static SummaryValueDispatchTable summaryValueDispatchTable_;
301 double aquiferFlowRate()
const;
302 double aquiferPressure()
const;
303 double aquiferTotalProduction()
const;
304 double carterTracyDimensionlessTime()
const;
305 double carterTracyDimensionlessPressure()
const;
309 using Aquifers = std::map<int, AquiferData>;
311 template <
class MessageBufferType>
312 void FetkovichData::write(MessageBufferType& buffer)
const
314 buffer.write(this->initVolume);
315 buffer.write(this->prodIndex);
316 buffer.write(this->timeConstant);
319 template <
class MessageBufferType>
320 void FetkovichData::read(MessageBufferType& buffer)
322 buffer.read(this->initVolume);
323 buffer.read(this->prodIndex);
324 buffer.read(this->timeConstant);
327 template <
class MessageBufferType>
328 void CarterTracyData::write(MessageBufferType& buffer)
const
330 buffer.write(this->timeConstant);
331 buffer.write(this->influxConstant);
332 buffer.write(this->waterDensity);
333 buffer.write(this->waterViscosity);
334 buffer.write(this->dimensionless_time);
335 buffer.write(this->dimensionless_pressure);
338 template <
class MessageBufferType>
339 void CarterTracyData::read(MessageBufferType& buffer)
341 buffer.read(this->timeConstant);
342 buffer.read(this->influxConstant);
343 buffer.read(this->waterDensity);
344 buffer.read(this->waterViscosity);
345 buffer.read(this->dimensionless_time);
346 buffer.read(this->dimensionless_pressure);
349 template <
class MessageBufferType>
350 void NumericAquiferData::write(MessageBufferType& buffer)
const
352 buffer.write(this->initPressure.size());
354 for (
const auto& pressure : this->initPressure) {
355 buffer.write(pressure);
359 template <
class MessageBufferType>
360 void NumericAquiferData::read(MessageBufferType& buffer)
362 decltype(this->initPressure.size()) size{};
365 this->initPressure.resize(size, 0.0);
366 for (
auto& pressure : this->initPressure) {
367 buffer.read(pressure);
371 template <
class MessageBufferType>
372 void AquiferData::write(MessageBufferType& buffer)
const
374 buffer.write(this->aquiferID);
375 buffer.write(this->pressure);
376 buffer.write(this->fluxRate);
377 buffer.write(this->volume);
378 buffer.write(this->initPressure);
379 buffer.write(this->datumDepth);
381 this->typeData.write(buffer);
384 template <
class MessageBufferType>
385 void AquiferData::read(MessageBufferType& buffer)
387 buffer.read(this->aquiferID);
388 buffer.read(this->pressure);
389 buffer.read(this->fluxRate);
390 buffer.read(this->volume);
391 buffer.read(this->initPressure);
392 buffer.read(this->datumDepth);
394 this->typeData.read(buffer);
Definition: Aquifer.hpp:116
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:29
Definition: Aquifer.hpp:273
Definition: Aquifer.hpp:57
Definition: Aquifer.hpp:40
Definition: Aquifer.hpp:78
Definition: Aquifer.hpp:94