quantitycallbacks.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
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 2 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 Consult the COPYING file in the top-level source directory of this
20 module for the precise wording of the license and the list of
21 copyright holders.
22*/
29#ifndef EWOMS_QUANTITY_CALLBACKS_HH
30#define EWOMS_QUANTITY_CALLBACKS_HH
31
33
34#include <opm/material/common/MathToolbox.hpp>
35#include <opm/material/common/Valgrind.hpp>
36
37#include <type_traits>
38#include <utility>
39
40namespace Opm {
46template <class TypeTag>
48{
51
52 using IQFluidState = decltype(std::declval<IntensiveQuantities>().fluidState());
53 using ResultRawType = decltype(std::declval<IQFluidState>().temperature(0));
54
55public:
56 using ResultType = typename std::remove_const<typename std::remove_reference<ResultRawType>::type>::type;
57 using ResultValueType = typename MathToolbox<ResultType>::ValueType;
58
59 TemperatureCallback(const ElementContext& elemCtx)
60 : elemCtx_(elemCtx)
61 {}
62
70 ResultType operator()(unsigned dofIdx) const
71 { return elemCtx_.intensiveQuantities(dofIdx, /*timeIdx=*/0).fluidState().temperature(/*phaseIdx=*/0); }
72
73private:
74 const ElementContext& elemCtx_;
75};
76
82template <class TypeTag>
84{
87
88 using IQFluidState = decltype(std::declval<IntensiveQuantities>().fluidState());
89 using ResultRawType = decltype(std::declval<IQFluidState>().pressure(0));
90
91public:
92 using ResultType = typename std::remove_const<typename std::remove_reference<ResultRawType>::type>::type;
93 using ResultValueType = typename MathToolbox<ResultType>::ValueType;
94
95 PressureCallback(const ElementContext& elemCtx)
96 : elemCtx_(elemCtx)
97 { Valgrind::SetUndefined(phaseIdx_); }
98
99 PressureCallback(const ElementContext& elemCtx, unsigned phaseIdx)
100 : elemCtx_(elemCtx)
101 , phaseIdx_(static_cast<unsigned short>(phaseIdx))
102 {}
103
108 void setPhaseIndex(unsigned phaseIdx)
109 { phaseIdx_ = static_cast<unsigned short>(phaseIdx); }
110
115 ResultType operator()(unsigned dofIdx) const
116 {
117 Valgrind::CheckDefined(phaseIdx_);
118 return elemCtx_.intensiveQuantities(dofIdx, /*timeIdx=*/0).fluidState().pressure(phaseIdx_);
119 }
120
121private:
122 const ElementContext& elemCtx_;
123 unsigned short phaseIdx_;
124};
125
131template <class TypeTag, class FluidState>
133{
137
138 using IQRawFluidState = decltype(std::declval<IntensiveQuantities>().fluidState());
139 using IQFluidState = typename std::remove_const<typename std::remove_reference<IQRawFluidState>::type>::type;
140 using IQScalar = typename IQFluidState::Scalar;
141 using Toolbox = MathToolbox<IQScalar>;
142
143public:
144 using ResultType = IQScalar;
145
146 BoundaryPressureCallback(const ElementContext& elemCtx, const FluidState& boundaryFs)
147 : elemCtx_(elemCtx)
148 , boundaryFs_(boundaryFs)
149 { Valgrind::SetUndefined(phaseIdx_); }
150
151 BoundaryPressureCallback(const ElementContext& elemCtx,
152 const FluidState& boundaryFs,
153 unsigned phaseIdx)
154 : elemCtx_(elemCtx)
155 , boundaryFs_(boundaryFs)
156 , phaseIdx_(static_cast<unsigned short>(phaseIdx))
157 {}
158
163 void setPhaseIndex(unsigned phaseIdx)
164 { phaseIdx_ = static_cast<unsigned short>(phaseIdx); }
165
170 ResultType operator()(unsigned dofIdx) const
171 {
172 Valgrind::CheckDefined(phaseIdx_);
173 return elemCtx_.intensiveQuantities(dofIdx, /*timeIdx=*/0).fluidState().pressure(phaseIdx_);
174 }
175
176 IQScalar boundaryValue() const
177 {
178 Valgrind::CheckDefined(phaseIdx_);
179 return boundaryFs_.pressure(phaseIdx_);
180 }
181
182private:
183 const ElementContext& elemCtx_;
184 const FluidState& boundaryFs_;
185 unsigned short phaseIdx_;
186};
187
193template <class TypeTag>
195{
198
199 using IQFluidState = decltype(std::declval<IntensiveQuantities>().fluidState());
200 using ResultRawType = decltype(std::declval<IQFluidState>().density(0));
201
202public:
203 using ResultType = typename std::remove_const<typename std::remove_reference<ResultRawType>::type>::type;
204 using ResultValueType = typename MathToolbox<ResultType>::ValueType;
205
206 DensityCallback(const ElementContext& elemCtx)
207 : elemCtx_(elemCtx)
208 { Valgrind::SetUndefined(phaseIdx_); }
209
210 DensityCallback(const ElementContext& elemCtx, unsigned phaseIdx)
211 : elemCtx_(elemCtx)
212 , phaseIdx_(static_cast<unsigned short>(phaseIdx))
213 {}
214
219 void setPhaseIndex(unsigned phaseIdx)
220 { phaseIdx_ = static_cast<unsigned short>(phaseIdx); }
221
226 ResultType operator()(unsigned dofIdx) const
227 {
228 Valgrind::CheckDefined(phaseIdx_);
229 return elemCtx_.intensiveQuantities(dofIdx, /*timeIdx=*/0).fluidState().density(phaseIdx_);
230 }
231
232private:
233 const ElementContext& elemCtx_;
234 unsigned short phaseIdx_;
235};
236
242template <class TypeTag>
244{
247
248 using IQFluidState = decltype(std::declval<IntensiveQuantities>().fluidState());
249
250public:
251 using ResultType = decltype(std::declval<IQFluidState>().molarDensity(0));
252 using ResultValueType = typename MathToolbox<ResultType>::ValueType;
253
254 MolarDensityCallback(const ElementContext& elemCtx)
255 : elemCtx_(elemCtx)
256 { Valgrind::SetUndefined(phaseIdx_); }
257
258 MolarDensityCallback(const ElementContext& elemCtx, unsigned phaseIdx)
259 : elemCtx_(elemCtx)
260 , phaseIdx_(static_cast<unsigned short>(phaseIdx))
261 {}
262
267 void setPhaseIndex(unsigned phaseIdx)
268 { phaseIdx_ = static_cast<unsigned short>(phaseIdx); }
269
274 ResultType operator()(unsigned dofIdx) const
275 {
276 Valgrind::CheckDefined(phaseIdx_);
277 return elemCtx_.intensiveQuantities(dofIdx, /*timeIdx=*/0).fluidState().molarDensity(phaseIdx_);
278 }
279
280private:
281 const ElementContext& elemCtx_;
282 unsigned short phaseIdx_;
283};
284
290template <class TypeTag>
292{
295
296 using IQFluidState = decltype(std::declval<IntensiveQuantities>().fluidState());
297 using ResultRawType = decltype(std::declval<IQFluidState>().viscosity(0));
298
299public:
300 using ResultType = typename std::remove_const<typename std::remove_reference<ResultRawType>::type>::type;
301 using ResultValueType = typename MathToolbox<ResultType>::ValueType;
302
303 ViscosityCallback(const ElementContext& elemCtx)
304 : elemCtx_(elemCtx)
305 { Valgrind::SetUndefined(phaseIdx_); }
306
307 ViscosityCallback(const ElementContext& elemCtx, unsigned phaseIdx)
308 : elemCtx_(elemCtx)
309 , phaseIdx_(static_cast<unsigned short>(phaseIdx))
310 {}
311
316 void setPhaseIndex(unsigned phaseIdx)
317 { phaseIdx_ = static_cast<unsigned short>(phaseIdx); }
318
323 ResultType operator()(unsigned dofIdx) const
324 {
325 Valgrind::CheckDefined(phaseIdx_);
326 return elemCtx_.intensiveQuantities(dofIdx, /*timeIdx=*/0).fluidState().viscosity(phaseIdx_);
327 }
328
329private:
330 const ElementContext& elemCtx_;
331 unsigned short phaseIdx_;
332};
333
339template <class TypeTag>
341{
345
346 using ResultRawType = decltype(IntensiveQuantities().velocityCenter());
347
348 enum { dim = GridView::dimensionworld };
349
350public:
351 using ResultType = typename std::remove_const<typename std::remove_reference<ResultRawType>::type>::type;
352 using ResultFieldType = typename ResultType::field_type;
353 using ResultFieldValueType = typename MathToolbox<ResultFieldType>::ValueType;
354
355 VelocityCallback(const ElementContext& elemCtx)
356 : elemCtx_(elemCtx)
357 {}
358
363 ResultType operator()(unsigned dofIdx) const
364 { return elemCtx_.intensiveQuantities(dofIdx, /*timeIdx=*/0).velocityCenter(); }
365
366private:
367 const ElementContext& elemCtx_;
368};
369
375template <class TypeTag>
377{
380
381 using ResultRawType = decltype(IntensiveQuantities().velocityCenter()[0]);
382
383public:
384 using ResultType = typename std::remove_const<typename std::remove_reference<ResultRawType>::type>::type;
385 using ResultValueType = typename MathToolbox<ResultType>::ValueType;
386
387 VelocityComponentCallback(const ElementContext& elemCtx)
388 : elemCtx_(elemCtx)
389 { Valgrind::SetUndefined(dimIdx_); }
390
391 VelocityComponentCallback(const ElementContext& elemCtx, unsigned dimIdx)
392 : elemCtx_(elemCtx)
393 , dimIdx_(dimIdx)
394 {}
395
400 void setDimIndex(unsigned dimIdx)
401 { dimIdx_ = dimIdx; }
402
407 ResultType operator()(unsigned dofIdx) const
408 {
409 Valgrind::CheckDefined(dimIdx_);
410 return elemCtx_.intensiveQuantities(dofIdx, /*timeIdx=*/0).velocityCenter()[dimIdx_];
411 }
412
413private:
414 const ElementContext& elemCtx_;
415 unsigned dimIdx_;
416};
417
423template <class TypeTag>
425{
428
429 using IQFluidState = decltype(std::declval<IntensiveQuantities>().fluidState());
430 using ResultRawType = decltype(std::declval<IQFluidState>().moleFraction(0, 0));
431
432public:
433 using ResultType = typename std::remove_const<typename std::remove_reference<ResultRawType>::type>::type;
434 using ResultValueType = typename MathToolbox<ResultType>::ValueType;
435
436 MoleFractionCallback(const ElementContext& elemCtx)
437 : elemCtx_(elemCtx)
438 {
439 Valgrind::SetUndefined(phaseIdx_);
440 Valgrind::SetUndefined(compIdx_);
441 }
442
443 MoleFractionCallback(const ElementContext& elemCtx, unsigned phaseIdx, unsigned compIdx)
444 : elemCtx_(elemCtx)
445 , phaseIdx_(static_cast<unsigned short>(phaseIdx))
446 , compIdx_(static_cast<unsigned short>(compIdx))
447 {}
448
453 void setPhaseIndex(unsigned phaseIdx)
454 { phaseIdx_ = static_cast<unsigned short>(phaseIdx); }
455
460 void setComponentIndex(unsigned compIdx)
461 { compIdx_ = static_cast<unsigned short>(compIdx); }
462
467 ResultType operator()(unsigned dofIdx) const
468 {
469 Valgrind::CheckDefined(phaseIdx_);
470 Valgrind::CheckDefined(compIdx_);
471 return elemCtx_.intensiveQuantities(dofIdx, /*timeIdx=*/0).fluidState().moleFraction(phaseIdx_, compIdx_);
472 }
473
474private:
475 const ElementContext& elemCtx_;
476 unsigned short phaseIdx_;
477 unsigned short compIdx_;
478};
479
480} // namespace Opm
481
482#endif
Callback class for a phase pressure.
Definition: quantitycallbacks.hh:133
IQScalar ResultType
Definition: quantitycallbacks.hh:144
BoundaryPressureCallback(const ElementContext &elemCtx, const FluidState &boundaryFs, unsigned phaseIdx)
Definition: quantitycallbacks.hh:151
BoundaryPressureCallback(const ElementContext &elemCtx, const FluidState &boundaryFs)
Definition: quantitycallbacks.hh:146
IQScalar boundaryValue() const
Definition: quantitycallbacks.hh:176
void setPhaseIndex(unsigned phaseIdx)
Set the index of the fluid phase for which the pressure should be returned.
Definition: quantitycallbacks.hh:163
ResultType operator()(unsigned dofIdx) const
Return the pressure of a phase given the index of a degree of freedom within an element context.
Definition: quantitycallbacks.hh:170
Callback class for the density of a phase.
Definition: quantitycallbacks.hh:195
void setPhaseIndex(unsigned phaseIdx)
Set the index of the fluid phase for which the density should be returned.
Definition: quantitycallbacks.hh:219
typename std::remove_const< typename std::remove_reference< ResultRawType >::type >::type ResultType
Definition: quantitycallbacks.hh:203
DensityCallback(const ElementContext &elemCtx, unsigned phaseIdx)
Definition: quantitycallbacks.hh:210
ResultType operator()(unsigned dofIdx) const
Return the density of a phase given the index of a degree of freedom within an element context.
Definition: quantitycallbacks.hh:226
typename MathToolbox< ResultType >::ValueType ResultValueType
Definition: quantitycallbacks.hh:204
DensityCallback(const ElementContext &elemCtx)
Definition: quantitycallbacks.hh:206
Callback class for the molar density of a phase.
Definition: quantitycallbacks.hh:244
typename MathToolbox< ResultType >::ValueType ResultValueType
Definition: quantitycallbacks.hh:252
decltype(std::declval< IQFluidState >().molarDensity(0)) ResultType
Definition: quantitycallbacks.hh:251
void setPhaseIndex(unsigned phaseIdx)
Set the index of the fluid phase for which the molar density should be returned.
Definition: quantitycallbacks.hh:267
MolarDensityCallback(const ElementContext &elemCtx, unsigned phaseIdx)
Definition: quantitycallbacks.hh:258
ResultType operator()(unsigned dofIdx) const
Return the molar density of a phase given the index of a degree of freedom within an element context.
Definition: quantitycallbacks.hh:274
MolarDensityCallback(const ElementContext &elemCtx)
Definition: quantitycallbacks.hh:254
Callback class for a mole fraction of a component in a phase.
Definition: quantitycallbacks.hh:425
void setComponentIndex(unsigned compIdx)
Set the index of the component for which the mole fraction should be returned.
Definition: quantitycallbacks.hh:460
void setPhaseIndex(unsigned phaseIdx)
Set the index of the fluid phase for which a mole fraction should be returned.
Definition: quantitycallbacks.hh:453
MoleFractionCallback(const ElementContext &elemCtx, unsigned phaseIdx, unsigned compIdx)
Definition: quantitycallbacks.hh:443
typename std::remove_const< typename std::remove_reference< ResultRawType >::type >::type ResultType
Definition: quantitycallbacks.hh:433
typename MathToolbox< ResultType >::ValueType ResultValueType
Definition: quantitycallbacks.hh:434
ResultType operator()(unsigned dofIdx) const
Return the mole fraction of a component in a phase given the index of a degree of freedom within an e...
Definition: quantitycallbacks.hh:467
MoleFractionCallback(const ElementContext &elemCtx)
Definition: quantitycallbacks.hh:436
Callback class for a phase pressure.
Definition: quantitycallbacks.hh:84
typename std::remove_const< typename std::remove_reference< ResultRawType >::type >::type ResultType
Definition: quantitycallbacks.hh:92
PressureCallback(const ElementContext &elemCtx, unsigned phaseIdx)
Definition: quantitycallbacks.hh:99
ResultType operator()(unsigned dofIdx) const
Return the pressure of the specified phase given the index of a degree of freedom within an element c...
Definition: quantitycallbacks.hh:115
PressureCallback(const ElementContext &elemCtx)
Definition: quantitycallbacks.hh:95
typename MathToolbox< ResultType >::ValueType ResultValueType
Definition: quantitycallbacks.hh:93
void setPhaseIndex(unsigned phaseIdx)
Set the index of the fluid phase for which the pressure should be returned.
Definition: quantitycallbacks.hh:108
Callback class for temperature.
Definition: quantitycallbacks.hh:48
typename std::remove_const< typename std::remove_reference< ResultRawType >::type >::type ResultType
Definition: quantitycallbacks.hh:56
ResultType operator()(unsigned dofIdx) const
Return the temperature given the index of a degree of freedom within an element context.
Definition: quantitycallbacks.hh:70
TemperatureCallback(const ElementContext &elemCtx)
Definition: quantitycallbacks.hh:59
typename MathToolbox< ResultType >::ValueType ResultValueType
Definition: quantitycallbacks.hh:57
Callback class for the velocity of a phase at the center of a DOF.
Definition: quantitycallbacks.hh:341
ResultType operator()(unsigned dofIdx) const
Return the velocity of a phase given the index of a degree of freedom within an element context.
Definition: quantitycallbacks.hh:363
typename ResultType::field_type ResultFieldType
Definition: quantitycallbacks.hh:352
typename MathToolbox< ResultFieldType >::ValueType ResultFieldValueType
Definition: quantitycallbacks.hh:353
typename std::remove_const< typename std::remove_reference< ResultRawType >::type >::type ResultType
Definition: quantitycallbacks.hh:351
VelocityCallback(const ElementContext &elemCtx)
Definition: quantitycallbacks.hh:355
Callback class for the velocity of a phase at the center of a DOF.
Definition: quantitycallbacks.hh:377
typename std::remove_const< typename std::remove_reference< ResultRawType >::type >::type ResultType
Definition: quantitycallbacks.hh:384
void setDimIndex(unsigned dimIdx)
Set the index of the component of the velocity which should be returned.
Definition: quantitycallbacks.hh:400
ResultType operator()(unsigned dofIdx) const
Return the velocity of a phase given the index of a degree of freedom within an element context.
Definition: quantitycallbacks.hh:407
typename MathToolbox< ResultType >::ValueType ResultValueType
Definition: quantitycallbacks.hh:385
VelocityComponentCallback(const ElementContext &elemCtx)
Definition: quantitycallbacks.hh:387
VelocityComponentCallback(const ElementContext &elemCtx, unsigned dimIdx)
Definition: quantitycallbacks.hh:391
Callback class for the viscosity of a phase.
Definition: quantitycallbacks.hh:292
typename std::remove_const< typename std::remove_reference< ResultRawType >::type >::type ResultType
Definition: quantitycallbacks.hh:300
typename MathToolbox< ResultType >::ValueType ResultValueType
Definition: quantitycallbacks.hh:301
ViscosityCallback(const ElementContext &elemCtx, unsigned phaseIdx)
Definition: quantitycallbacks.hh:307
ViscosityCallback(const ElementContext &elemCtx)
Definition: quantitycallbacks.hh:303
ResultType operator()(unsigned dofIdx) const
Return the viscosity of a phase given the index of a degree of freedom within an element context.
Definition: quantitycallbacks.hh:323
void setPhaseIndex(unsigned phaseIdx)
Set the index of the fluid phase for which the viscosity should be returned.
Definition: quantitycallbacks.hh:316
Declare the properties used by the infrastructure code of the finite volume discretizations.
Definition: blackoilboundaryratevector.hh:37
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:242