27 #ifndef OPM_CHECK_FLUIDSYSTEM_HPP 28 #define OPM_CHECK_FLUIDSYSTEM_HPP 30 #include <opm/common/utility/DemangledType.hpp> 42 #include <opm/input/eclipse/EclipseState/Compositional/CompositionalConfig.hpp> 60 template <
class ValueT,
64 :
protected BaseFluidState
67 static constexpr
int numPhases = FluidSystem::numPhases;
68 static constexpr
int numComponents = FluidSystem::numComponents;
70 using ValueType = ValueT;
75 allowTemperature(
false);
77 allowComposition(
false);
81 restrictToPhase(1000);
84 void allowTemperature(
bool yesno)
85 { allowTemperature_ = yesno; }
87 void allowPressure(
bool yesno)
88 { allowPressure_ = yesno; }
90 void allowComposition(
bool yesno)
91 { allowComposition_ = yesno; }
93 void allowDensity(
bool yesno)
94 { allowDensity_ = yesno; }
96 void restrictToPhase(
int phaseIdx)
97 { restrictPhaseIdx_ = phaseIdx; }
99 BaseFluidState& base()
100 {
return *
static_cast<BaseFluidState*
>(
this); }
102 const BaseFluidState& base()
const 103 {
return *
static_cast<const BaseFluidState*
>(
this); }
105 auto temperature(
unsigned phaseIdx)
const 106 -> decltype(this->base().temperature(phaseIdx))
108 assert(allowTemperature_);
109 assert(restrictPhaseIdx_ < 0 || restrictPhaseIdx_ == static_cast<int>(phaseIdx));
110 return this->base().temperature(phaseIdx);
113 auto pressure(
unsigned phaseIdx)
const 114 -> decltype(this->base().pressure(phaseIdx))
116 assert(allowPressure_);
117 assert(restrictPhaseIdx_ < 0 || restrictPhaseIdx_ == static_cast<int>(phaseIdx));
118 return this->base().pressure(phaseIdx);
121 auto moleFraction(
unsigned phaseIdx,
unsigned compIdx)
const 122 -> decltype(this->base().moleFraction(phaseIdx, compIdx))
124 assert(allowComposition_);
125 assert(restrictPhaseIdx_ < 0 || restrictPhaseIdx_ == static_cast<int>(phaseIdx));
126 return this->base().moleFraction(phaseIdx, compIdx);
129 auto massFraction(
unsigned phaseIdx,
unsigned compIdx)
const 130 -> decltype(this->base().massFraction(phaseIdx, compIdx))
132 assert(allowComposition_);
133 assert(restrictPhaseIdx_ < 0 || restrictPhaseIdx_ == static_cast<int>(phaseIdx));
134 return this->base().massFraction(phaseIdx, compIdx);
137 auto averageMolarMass(
unsigned phaseIdx)
const 138 -> decltype(this->base().averageMolarMass(phaseIdx))
140 assert(allowComposition_);
141 assert(restrictPhaseIdx_ < 0 || restrictPhaseIdx_ == static_cast<int>(phaseIdx));
142 return this->base().averageMolarMass(phaseIdx);
145 auto molarity(
unsigned phaseIdx,
unsigned compIdx)
const 146 -> decltype(this->base().molarity(phaseIdx, compIdx))
148 assert(allowDensity_ && allowComposition_);
149 assert(restrictPhaseIdx_ < 0 || restrictPhaseIdx_ == static_cast<int>(phaseIdx));
150 return this->base().molarity(phaseIdx, compIdx);
153 auto molarDensity(
unsigned phaseIdx)
const 154 -> decltype(this->base().molarDensity(phaseIdx))
156 assert(allowDensity_);
157 assert(restrictPhaseIdx_ < 0 || restrictPhaseIdx_ == static_cast<int>(phaseIdx));
158 return this->base().molarDensity(phaseIdx);
161 auto molarVolume(
unsigned phaseIdx)
const 162 -> decltype(this->base().molarVolume(phaseIdx))
164 assert(allowDensity_);
165 assert(restrictPhaseIdx_ < 0 || restrictPhaseIdx_ == static_cast<int>(phaseIdx));
166 return this->base().molarVolume(phaseIdx);
169 auto density(
unsigned phaseIdx)
const 170 -> decltype(this->base().density(phaseIdx))
172 assert(allowDensity_);
173 assert(restrictPhaseIdx_ < 0 || restrictPhaseIdx_ == static_cast<int>(phaseIdx));
174 return this->base().density(phaseIdx);
177 auto saturation(
unsigned phaseIdx)
const 178 -> decltype(this->base().saturation(phaseIdx))
181 return this->base().saturation(phaseIdx);
184 auto fugacity(
unsigned phaseIdx,
unsigned compIdx)
const 185 -> decltype(this->base().fugacity(phaseIdx, compIdx))
188 return this->base().fugacity(phaseIdx, compIdx);
191 auto fugacityCoefficient(
unsigned phaseIdx,
unsigned compIdx)
const 192 -> decltype(this->base().fugacityCoefficient(phaseIdx, compIdx))
195 return this->base().fugacityCoefficient(phaseIdx, compIdx);
198 auto enthalpy(
unsigned phaseIdx)
const 199 -> decltype(this->base().enthalpy(phaseIdx))
202 return this->base().enthalpy(phaseIdx);
205 auto internalEnergy(
unsigned phaseIdx)
const 206 -> decltype(this->base().internalEnergy(phaseIdx))
209 return this->base().internalEnergy(phaseIdx);
212 auto viscosity(
unsigned phaseIdx)
const 213 -> decltype(this->base().viscosity(phaseIdx))
216 return this->base().viscosity(phaseIdx);
219 auto compressFactor(
unsigned phaseIdx)
const 220 -> decltype(this->base().compressFactor(phaseIdx))
222 return this->base().compressFactor(phaseIdx);
226 bool allowSaturation_{
false};
227 bool allowTemperature_{
false};
228 bool allowPressure_{
false};
229 bool allowComposition_{
false};
230 bool allowDensity_{
false};
231 int restrictPhaseIdx_{};
234 template <
class ValueType,
class BaseFlu
idState>
235 void checkFluidState(
const BaseFluidState& fs)
238 [[maybe_unused]] BaseFluidState tmpFs(fs);
245 using FsValueType =
typename BaseFluidState::ValueType;
246 static_assert(std::is_same<FsValueType, ValueType>::value,
247 "Fluid states must export the type they are given as value type in an unmodified way");
251 std::ignore = fs.temperature(0);
252 std::ignore = fs.pressure(0);
253 std::ignore = fs.moleFraction(0, 0);
254 std::ignore = fs.massFraction(0, 0);
255 std::ignore = fs.averageMolarMass(0);
256 std::ignore = fs.molarity(0, 0);
257 std::ignore = fs.molarDensity(0);
258 std::ignore = fs.molarVolume(0);
259 std::ignore = fs.density(0);
260 std::ignore = fs.saturation(0);
261 std::ignore = fs.fugacity(0, 0);
262 std::ignore = fs.fugacityCoefficient(0, 0);
272 std::ignore = fs.viscosity(0);
276 template<
typename ParameterCache,
class Scalar,
class Flu
idSystem>
277 ParameterCache initParamCache()
279 constexpr
bool is_same = std::is_same<ParameterCache, Opm::PTFlashParameterCache<Scalar, FluidSystem>>::value;
280 if constexpr (is_same) {
281 using EOSType = Opm::CompositionalConfig::EOSType;
282 ParameterCache paramCache(EOSType::PR);
286 ParameterCache paramCache;
294 template <
class Scalar,
class Flu
idSystem,
class RhsEval,
class LhsEval>
297 std::cout <<
"Testing fluid system '" 298 << Opm::getDemangledType<FluidSystem>()
299 <<
", RhsEval = " << Opm::getDemangledType<RhsEval>()
300 <<
", LhsEval = " << Opm::getDemangledType<LhsEval>() <<
"'\n";
304 static constexpr
int numPhases = FluidSystem::numPhases;
305 static constexpr
int numComponents = FluidSystem::numComponents;
309 fs.allowTemperature(
true);
310 fs.allowPressure(
true);
311 fs.allowComposition(
true);
312 fs.restrictToPhase(-1);
315 fs.base().setTemperature(273.15 + 20.0);
316 for (
int phaseIdx = 0; phaseIdx < numPhases; ++ phaseIdx) {
317 fs.base().setPressure(phaseIdx, 1e5);
318 fs.base().setSaturation(phaseIdx, 1.0/numPhases);
319 for (
int compIdx = 0; compIdx < numComponents; ++ compIdx) {
320 fs.base().setMoleFraction(phaseIdx, compIdx, 1.0/numComponents);
324 static_assert(std::is_same<typename FluidSystem::Scalar, Scalar>::value,
325 "The type used for floating point used by the fluid system must be the same" 326 " as the one passed to the checkFluidSystem() function");
329 typedef typename FluidSystem::template ParameterCache<LhsEval> ParameterCache;
331 ParameterCache paramCache = initParamCache<ParameterCache, LhsEval, FluidSystem>();
332 try { paramCache.updateAll(fs); }
catch (...) {};
333 try { paramCache.updateAll(fs, ParameterCache::None); }
catch (...) {};
334 try { paramCache.updateAll(fs, ParameterCache::Temperature | ParameterCache::Pressure | ParameterCache::Composition); }
catch (...) {};
335 try { paramCache.updateAllPressures(fs); }
catch (...) {};
337 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
338 fs.restrictToPhase(static_cast<int>(phaseIdx));
339 try { paramCache.updatePhase(fs, phaseIdx); }
catch (...) {};
340 try { paramCache.updatePhase(fs, phaseIdx, ParameterCache::None); }
catch (...) {};
341 try { paramCache.updatePhase(fs, phaseIdx, ParameterCache::Temperature | ParameterCache::Pressure | ParameterCache::Composition); }
catch (...) {};
342 try { paramCache.updateTemperature(fs, phaseIdx); }
catch (...) {};
343 try { paramCache.updatePressure(fs, phaseIdx); }
catch (...) {};
344 try { paramCache.updateComposition(fs, phaseIdx); }
catch (...) {};
345 try { paramCache.updateSingleMoleFraction(fs, phaseIdx, 0); }
catch (...) {};
351 Scalar scalarVal = 0.0;
353 scalarVal = 2*scalarVal;
357 try { FluidSystem::init(); }
catch (...) {};
358 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++ phaseIdx) {
359 fs.restrictToPhase(static_cast<int>(phaseIdx));
360 fs.allowPressure(FluidSystem::isCompressible(phaseIdx));
361 fs.allowComposition(
true);
362 fs.allowDensity(
false);
363 try { [[maybe_unused]]
auto tmpVal = FluidSystem::density(fs, paramCache, phaseIdx); static_assert(std::is_same<decltype(tmpVal), RhsEval>::
value,
"The default return value must be the value type used by the fluid state!"); }
catch (...) {};
364 try { val = FluidSystem::template density<FluidState, LhsEval>(fs, paramCache, phaseIdx); }
catch (...) {};
365 try { scalarVal = FluidSystem::template density<FluidState, Scalar>(fs, paramCache, phaseIdx); }
catch (...) {};
367 fs.allowPressure(
true);
368 fs.allowDensity(
true);
369 try { [[maybe_unused]]
auto tmpVal = FluidSystem::viscosity(fs, paramCache, phaseIdx); static_assert(std::is_same<decltype(tmpVal), RhsEval>::
value,
"The default return value must be the value type used by the fluid state!"); }
catch (...) {};
370 try { [[maybe_unused]]
auto tmpVal = FluidSystem::enthalpy(fs, paramCache, phaseIdx); static_assert(std::is_same<decltype(tmpVal), RhsEval>::
value,
"The default return value must be the value type used by the fluid state!"); }
catch (...) {};
371 try { [[maybe_unused]]
auto tmpVal = FluidSystem::heatCapacity(fs, paramCache, phaseIdx); static_assert(std::is_same<decltype(tmpVal), RhsEval>::
value,
"The default return value must be the value type used by the fluid state!"); }
catch (...) {};
372 try { [[maybe_unused]]
auto tmpVal = FluidSystem::thermalConductivity(fs, paramCache, phaseIdx); static_assert(std::is_same<decltype(tmpVal), RhsEval>::
value,
"The default return value must be the value type used by the fluid state!"); }
catch (...) {};
373 try { val = FluidSystem::template viscosity<FluidState, LhsEval>(fs, paramCache, phaseIdx); }
catch (...) {};
374 try { val = FluidSystem::template enthalpy<FluidState, LhsEval>(fs, paramCache, phaseIdx); }
catch (...) {};
375 try { val = FluidSystem::template heatCapacity<FluidState, LhsEval>(fs, paramCache, phaseIdx); }
catch (...) {};
376 try { val = FluidSystem::template thermalConductivity<FluidState, LhsEval>(fs, paramCache, phaseIdx); }
catch (...) {};
377 try { scalarVal = FluidSystem::template viscosity<FluidState, Scalar>(fs, paramCache, phaseIdx); }
catch (...) {};
378 try { scalarVal = FluidSystem::template enthalpy<FluidState, Scalar>(fs, paramCache, phaseIdx); }
catch (...) {};
379 try { scalarVal = FluidSystem::template heatCapacity<FluidState, Scalar>(fs, paramCache, phaseIdx); }
catch (...) {};
380 try { scalarVal = FluidSystem::template thermalConductivity<FluidState, Scalar>(fs, paramCache, phaseIdx); }
catch (...) {};
382 for (
unsigned compIdx = 0; compIdx < numComponents; ++ compIdx) {
383 fs.allowComposition(!FluidSystem::isIdealMixture(phaseIdx));
384 try { [[maybe_unused]]
auto tmpVal = FluidSystem::fugacityCoefficient(fs, paramCache, phaseIdx, compIdx); static_assert(std::is_same<decltype(tmpVal), RhsEval>::
value,
"The default return value must be the value type used by the fluid state!"); }
catch (...) {};
385 try { val = FluidSystem::template fugacityCoefficient<FluidState, LhsEval>(fs, paramCache, phaseIdx, compIdx); }
catch (...) {};
386 try { scalarVal = FluidSystem::template fugacityCoefficient<FluidState, Scalar>(fs, paramCache, phaseIdx, compIdx); }
catch (...) {};
387 fs.allowComposition(
true);
388 try { [[maybe_unused]]
auto tmpVal = FluidSystem::diffusionCoefficient(fs, paramCache, phaseIdx, compIdx); static_assert(std::is_same<decltype(tmpVal), RhsEval>::
value,
"The default return value must be the value type used by the fluid state!"); }
catch (...) {};
389 try { val = FluidSystem::template diffusionCoefficient<FluidState, LhsEval>(fs, paramCache, phaseIdx, compIdx); }
catch (...) {};
390 try { scalarVal = FluidSystem::template fugacityCoefficient<FluidState, Scalar>(fs, paramCache, phaseIdx, compIdx); }
catch (...) {};
395 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++ phaseIdx) {
396 [[maybe_unused]] std::string name{FluidSystem::phaseName(phaseIdx)};
397 std::ignore = FluidSystem::isLiquid(phaseIdx);
398 std::ignore = FluidSystem::isIdealGas(phaseIdx);
402 for (
unsigned compIdx = 0; compIdx < numComponents; ++ compIdx) {
403 std::ignore = FluidSystem::molarMass(compIdx);
404 std::string{FluidSystem::componentName(compIdx)};
Represents all relevant thermodynamic quantities of a multi-phase, multi-component fluid system assum...
This is a fluid state which allows to set the fluid temperatures and takes all other quantities from ...
A fluid system with water, gas and NAPL as phases and water, air and NAPL (contaminant) as components...
A fluid system for single phase models.
This is a fluid state which makes sure that only the quantities allowed are accessed.
Definition: checkFluidSystem.hpp:63
Represents all relevant thermodynamic quantities of a multi-phase, multi-component fluid system assum...
A fluid system with water, gas and NAPL as phases and water, air and mesitylene (DNAPL) as components...
A two-phase fluid system with water and nitrogen as components.
This is a fluid state which allows to set the fluid saturations and takes all other quantities from a...
The fluid system for the oil, gas and water phases of the SPE5 problem.
This is a fluid state which allows to set the fluid pressures and takes all other quantities from an ...
A liquid-phase-only fluid system with water and nitrogen as components.
A fluid system with a liquid and a gaseous phase and water and air as components. ...
A fluid system for two-phase models assuming immiscibility and thermodynamic equilibrium.
void checkFluidSystem()
Checks whether a fluid system adheres to the specification.
Definition: checkFluidSystem.hpp:295
Represents all relevant thermodynamic quantities of a multi-phase, multi-component fluid system not a...
Specifies the parameter cache used by the SPE-5 fluid system.
Represents all relevant thermodynamic quantities of a multi-phase, multi-component fluid system assum...
Definition: CompositionalFluidState.hpp:53