2013-12-02 16:31:53 +01:00
/*
2013-12-02 16:41:45 +01:00
Copyright ( C ) 2011 - 2013 by Andreas Lauser
2013-12-02 16:31:53 +01:00
This file is part of the Open Porous Media project ( OPM ) .
OPM is free software : you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 2 of the License , or
( at your option ) any later version .
OPM is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with OPM . If not , see < http : //www.gnu.org/licenses/>.
*/
2013-05-30 18:44:10 +02:00
/*!
* \ file
* \ copydoc checkFluidSystem
*/
2013-11-13 18:45:52 +01:00
# ifndef OPM_CHECK_FLUIDSYSTEM_HPP
# define OPM_CHECK_FLUIDSYSTEM_HPP
2013-05-30 18:44:10 +02:00
// include all fluid systems in opm-material
2014-05-08 16:53:53 +02:00
# include <opm/material/fluidsystems/SinglePhaseFluidSystem.hpp>
# include <opm/material/fluidsystems/TwoPhaseImmiscibleFluidSystem.hpp>
2013-09-10 14:55:59 +02:00
# include <opm/material/fluidsystems/H2ON2FluidSystem.hpp>
# include <opm/material/fluidsystems/H2ON2LiquidPhaseFluidSystem.hpp>
# include <opm/material/fluidsystems/H2OAirFluidSystem.hpp>
# include <opm/material/fluidsystems/H2OAirMesityleneFluidSystem.hpp>
# include <opm/material/fluidsystems/H2OAirXyleneFluidSystem.hpp>
# include <opm/material/fluidsystems/Spe5FluidSystem.hpp>
2013-05-30 18:44:10 +02:00
// include all fluid states
2013-09-10 14:55:59 +02:00
# include <opm/material/fluidstates/PressureOverlayFluidState.hpp>
# include <opm/material/fluidstates/SaturationOverlayFluidState.hpp>
# include <opm/material/fluidstates/TemperatureOverlayFluidState.hpp>
# include <opm/material/fluidstates/CompositionalFluidState.hpp>
# include <opm/material/fluidstates/NonEquilibriumFluidState.hpp>
# include <opm/material/fluidstates/ImmiscibleFluidState.hpp>
2013-05-30 18:44:10 +02:00
2015-04-27 16:34:36 +02:00
# include <opm/material/common/Unused.hpp>
# include <opm/material/common/ClassName.hpp>
2013-05-30 18:44:10 +02:00
# include <iostream>
# include <string>
/*!
* \ brief This is a fluid state which makes sure that only the quantities
2013-12-03 11:56:45 +01:00
* allowed are accessed .
2013-05-30 18:44:10 +02:00
*/
2015-05-21 15:33:14 +02:00
template < class ScalarT ,
2013-05-30 18:44:10 +02:00
class FluidSystem ,
2015-05-21 15:33:14 +02:00
class BaseFluidState = Opm : : CompositionalFluidState < ScalarT , FluidSystem > >
2013-05-30 18:44:10 +02:00
class HairSplittingFluidState
: protected BaseFluidState
{
public :
enum { numPhases = FluidSystem : : numPhases } ;
enum { numComponents = FluidSystem : : numComponents } ;
2015-05-21 15:33:14 +02:00
typedef ScalarT Scalar ;
2013-05-30 18:44:10 +02:00
HairSplittingFluidState ( )
{
// initially, do not allow anything
allowTemperature ( false ) ;
allowPressure ( false ) ;
allowComposition ( false ) ;
allowDensity ( false ) ;
// do not allow accessing any phase
restrictToPhase ( 1000 ) ;
}
void allowTemperature ( bool yesno )
{ allowTemperature_ = yesno ; }
void allowPressure ( bool yesno )
{ allowPressure_ = yesno ; }
void allowComposition ( bool yesno )
{ allowComposition_ = yesno ; }
void allowDensity ( bool yesno )
{ allowDensity_ = yesno ; }
void restrictToPhase ( int phaseIdx )
{ restrictPhaseIdx_ = phaseIdx ; }
Scalar temperature ( int phaseIdx ) const
{
assert ( allowTemperature_ ) ;
assert ( restrictPhaseIdx_ < 0 | | restrictPhaseIdx_ = = phaseIdx ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : temperature ( phaseIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar pressure ( int phaseIdx ) const
{
assert ( allowPressure_ ) ;
assert ( restrictPhaseIdx_ < 0 | | restrictPhaseIdx_ = = phaseIdx ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : pressure ( phaseIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar moleFraction ( int phaseIdx , int compIdx ) const
{
assert ( allowComposition_ ) ;
assert ( restrictPhaseIdx_ < 0 | | restrictPhaseIdx_ = = phaseIdx ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : moleFraction ( phaseIdx , compIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar massFraction ( int phaseIdx , int compIdx ) const
{
assert ( allowComposition_ ) ;
assert ( restrictPhaseIdx_ < 0 | | restrictPhaseIdx_ = = phaseIdx ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : massFraction ( phaseIdx , compIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar averageMolarMass ( int phaseIdx ) const
{
assert ( allowComposition_ ) ;
assert ( restrictPhaseIdx_ < 0 | | restrictPhaseIdx_ = = phaseIdx ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : averageMolarMass ( phaseIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar molarity ( int phaseIdx , int compIdx ) const
{
assert ( allowDensity_ & & allowComposition_ ) ;
assert ( restrictPhaseIdx_ < 0 | | restrictPhaseIdx_ = = phaseIdx ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : molarity ( phaseIdx , compIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar molarDensity ( int phaseIdx ) const
{
assert ( allowDensity_ ) ;
assert ( restrictPhaseIdx_ < 0 | | restrictPhaseIdx_ = = phaseIdx ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : molarDensity ( phaseIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar molarVolume ( int phaseIdx ) const
{
assert ( allowDensity_ ) ;
assert ( restrictPhaseIdx_ < 0 | | restrictPhaseIdx_ = = phaseIdx ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : molarVolume ( phaseIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar density ( int phaseIdx ) const
{
assert ( allowDensity_ ) ;
assert ( restrictPhaseIdx_ < 0 | | restrictPhaseIdx_ = = phaseIdx ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : density ( phaseIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar saturation ( int phaseIdx ) const
{
assert ( false ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : saturation ( phaseIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar fugacity ( int phaseIdx , int compIdx ) const
{
assert ( false ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : fugacity ( phaseIdx , compIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar fugacityCoefficient ( int phaseIdx , int compIdx ) const
{
assert ( false ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : fugacityCoefficient ( phaseIdx , compIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar enthalpy ( int phaseIdx ) const
{
assert ( false ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : enthalpy ( phaseIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar internalEnergy ( int phaseIdx ) const
{
assert ( false ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : internalEnergy ( phaseIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
Scalar viscosity ( int phaseIdx ) const
{
assert ( false ) ;
2013-09-20 15:04:27 +02:00
OPM_UNUSED Scalar tmp = BaseFluidState : : viscosity ( phaseIdx ) ;
2013-05-30 18:44:10 +02:00
return 1e100 ;
}
private :
bool allowSaturation_ ;
bool allowTemperature_ ;
bool allowPressure_ ;
bool allowComposition_ ;
bool allowDensity_ ;
int restrictPhaseIdx_ ;
} ;
template < class Scalar , class BaseFluidState >
void checkFluidState ( const BaseFluidState & fs )
{
// fluid states must be copy-able
BaseFluidState tmpFs ( fs ) ;
tmpFs = fs ;
// a fluid state must provide a checkDefined() method
fs . checkDefined ( ) ;
2015-05-21 15:33:14 +02:00
// fluid states must export the types which they use as Scalars
typedef typename BaseFluidState : : Scalar FsScalar ;
static_assert ( std : : is_same < FsScalar , Scalar > : : value ,
" Fluid states must export the type they are given as scalar in an unmodified way " ) ;
2013-05-30 18:44:10 +02:00
// make sure the fluid state provides all mandatory methods
while ( false ) {
2013-09-20 15:04:27 +02:00
Scalar OPM_UNUSED val ;
2013-05-30 18:44:10 +02:00
val = fs . temperature ( /*phaseIdx=*/ 0 ) ;
val = fs . pressure ( /*phaseIdx=*/ 0 ) ;
val = fs . moleFraction ( /*phaseIdx=*/ 0 , /*compIdx=*/ 0 ) ;
val = fs . massFraction ( /*phaseIdx=*/ 0 , /*compIdx=*/ 0 ) ;
val = fs . averageMolarMass ( /*phaseIdx=*/ 0 ) ;
val = fs . molarity ( /*phaseIdx=*/ 0 , /*compIdx=*/ 0 ) ;
val = fs . molarDensity ( /*phaseIdx=*/ 0 ) ;
val = fs . molarVolume ( /*phaseIdx=*/ 0 ) ;
val = fs . density ( /*phaseIdx=*/ 0 ) ;
val = fs . saturation ( /*phaseIdx=*/ 0 ) ;
val = fs . fugacity ( /*phaseIdx=*/ 0 , /*compIdx=*/ 0 ) ;
val = fs . fugacityCoefficient ( /*phaseIdx=*/ 0 , /*compIdx=*/ 0 ) ;
val = fs . enthalpy ( /*phaseIdx=*/ 0 ) ;
val = fs . internalEnergy ( /*phaseIdx=*/ 0 ) ;
val = fs . viscosity ( /*phaseIdx=*/ 0 ) ;
} ;
}
/*!
* \ brief Checks whether a fluid system adheres to the specification .
*/
2015-05-21 15:33:16 +02:00
template < class Scalar , class FluidSystem , class RhsEval , class LhsEval >
2013-05-30 18:44:10 +02:00
void checkFluidSystem ( )
{
2013-09-20 15:04:27 +02:00
std : : cout < < " Testing fluid system ' " < < Opm : : className < FluidSystem > ( ) < < " ' \n " ;
2013-05-30 18:44:10 +02:00
// make sure the fluid system provides the number of phases and
// the number of components
enum { numPhases = FluidSystem : : numPhases } ;
enum { numComponents = FluidSystem : : numComponents } ;
2015-05-21 15:33:16 +02:00
typedef HairSplittingFluidState < RhsEval , FluidSystem > FluidState ;
FluidState fs ;
2013-05-30 18:44:10 +02:00
fs . allowTemperature ( true ) ;
fs . allowPressure ( true ) ;
fs . allowComposition ( true ) ;
fs . restrictToPhase ( - 1 ) ;
// check whether the parameter cache adheres to the API
typedef typename FluidSystem : : ParameterCache PC ;
PC paramCache ;
try { paramCache . updateAll ( fs ) ; } catch ( . . . ) { } ;
try { paramCache . updateAll ( fs , /*except=*/ PC : : None ) ; } catch ( . . . ) { } ;
try { paramCache . updateAll ( fs , /*except=*/ PC : : Temperature | PC : : Pressure | PC : : Composition ) ; } catch ( . . . ) { } ;
try { paramCache . updateAllPressures ( fs ) ; } catch ( . . . ) { } ;
for ( int phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
fs . restrictToPhase ( phaseIdx ) ;
try { paramCache . updatePhase ( fs , phaseIdx ) ; } catch ( . . . ) { } ;
try { paramCache . updatePhase ( fs , phaseIdx , /*except=*/ PC : : None ) ; } catch ( . . . ) { } ;
try { paramCache . updatePhase ( fs , phaseIdx , /*except=*/ PC : : Temperature | PC : : Pressure | PC : : Composition ) ; } catch ( . . . ) { } ;
try { paramCache . updateTemperature ( fs , phaseIdx ) ; } catch ( . . . ) { } ;
try { paramCache . updatePressure ( fs , phaseIdx ) ; } catch ( . . . ) { } ;
try { paramCache . updateComposition ( fs , phaseIdx ) ; } catch ( . . . ) { } ;
try { paramCache . updateSingleMoleFraction ( fs , phaseIdx , /*compIdx=*/ 0 ) ; } catch ( . . . ) { } ;
}
// some value to make sure the return values of the fluid system
// are convertible to scalars
2015-05-21 15:33:16 +02:00
LhsEval OPM_UNUSED val ;
Scalar OPM_UNUSED scalarVal ;
2013-05-30 18:44:10 +02:00
// actually check the fluid system API
try { FluidSystem : : init ( ) ; } catch ( . . . ) { } ;
for ( int phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
fs . restrictToPhase ( phaseIdx ) ;
fs . allowPressure ( FluidSystem : : isCompressible ( phaseIdx ) ) ;
fs . allowComposition ( true ) ;
fs . allowDensity ( false ) ;
2015-05-21 15:33:16 +02:00
try { auto OPM_UNUSED tmpVal = FluidSystem : : density ( fs , paramCache , phaseIdx ) ; static_assert ( std : : is_same < decltype ( tmpVal ) , RhsEval > : : value , " The default return value must be the scalar used by the fluid state! " ) ; } catch ( . . . ) { } ;
try { val = FluidSystem : : template density < FluidState , LhsEval > ( fs , paramCache , phaseIdx ) ; } catch ( . . . ) { } ;
try { scalarVal = FluidSystem : : template density < FluidState , Scalar > ( fs , paramCache , phaseIdx ) ; } catch ( . . . ) { } ;
2013-05-30 18:44:10 +02:00
fs . allowPressure ( true ) ;
fs . allowDensity ( true ) ;
2015-05-21 15:33:16 +02:00
try { auto OPM_UNUSED tmpVal = FluidSystem : : viscosity ( fs , paramCache , phaseIdx ) ; static_assert ( std : : is_same < decltype ( tmpVal ) , RhsEval > : : value , " The default return value must be the scalar used by the fluid state! " ) ; } catch ( . . . ) { } ;
try { auto OPM_UNUSED tmpVal = FluidSystem : : enthalpy ( fs , paramCache , phaseIdx ) ; static_assert ( std : : is_same < decltype ( tmpVal ) , RhsEval > : : value , " The default return value must be the scalar used by the fluid state! " ) ; } catch ( . . . ) { } ;
try { auto OPM_UNUSED tmpVal = FluidSystem : : heatCapacity ( fs , paramCache , phaseIdx ) ; static_assert ( std : : is_same < decltype ( tmpVal ) , RhsEval > : : value , " The default return value must be the scalar used by the fluid state! " ) ; } catch ( . . . ) { } ;
try { auto OPM_UNUSED tmpVal = FluidSystem : : thermalConductivity ( fs , paramCache , phaseIdx ) ; static_assert ( std : : is_same < decltype ( tmpVal ) , RhsEval > : : value , " The default return value must be the scalar used by the fluid state! " ) ; } catch ( . . . ) { } ;
try { val = FluidSystem : : template viscosity < FluidState , LhsEval > ( fs , paramCache , phaseIdx ) ; } catch ( . . . ) { } ;
try { val = FluidSystem : : template enthalpy < FluidState , LhsEval > ( fs , paramCache , phaseIdx ) ; } catch ( . . . ) { } ;
try { val = FluidSystem : : template heatCapacity < FluidState , LhsEval > ( fs , paramCache , phaseIdx ) ; } catch ( . . . ) { } ;
try { val = FluidSystem : : template thermalConductivity < FluidState , LhsEval > ( fs , paramCache , phaseIdx ) ; } catch ( . . . ) { } ;
try { scalarVal = FluidSystem : : template viscosity < FluidState , Scalar > ( fs , paramCache , phaseIdx ) ; } catch ( . . . ) { } ;
try { scalarVal = FluidSystem : : template enthalpy < FluidState , Scalar > ( fs , paramCache , phaseIdx ) ; } catch ( . . . ) { } ;
try { scalarVal = FluidSystem : : template heatCapacity < FluidState , Scalar > ( fs , paramCache , phaseIdx ) ; } catch ( . . . ) { } ;
try { scalarVal = FluidSystem : : template thermalConductivity < FluidState , Scalar > ( fs , paramCache , phaseIdx ) ; } catch ( . . . ) { } ;
2013-05-30 18:44:10 +02:00
for ( int compIdx = 0 ; compIdx < numComponents ; + + compIdx ) {
fs . allowComposition ( ! FluidSystem : : isIdealMixture ( phaseIdx ) ) ;
2015-05-21 15:33:16 +02:00
try { auto OPM_UNUSED tmpVal = FluidSystem : : fugacityCoefficient ( fs , paramCache , phaseIdx , compIdx ) ; static_assert ( std : : is_same < decltype ( tmpVal ) , RhsEval > : : value , " The default return value must be the scalar used by the fluid state! " ) ; } catch ( . . . ) { } ;
try { val = FluidSystem : : template fugacityCoefficient < FluidState , LhsEval > ( fs , paramCache , phaseIdx , compIdx ) ; } catch ( . . . ) { } ;
try { scalarVal = FluidSystem : : template fugacityCoefficient < FluidState , Scalar > ( fs , paramCache , phaseIdx , compIdx ) ; } catch ( . . . ) { } ;
2013-05-30 18:44:10 +02:00
fs . allowComposition ( true ) ;
2015-05-21 15:33:16 +02:00
try { auto OPM_UNUSED tmpVal = FluidSystem : : diffusionCoefficient ( fs , paramCache , phaseIdx , compIdx ) ; static_assert ( std : : is_same < decltype ( tmpVal ) , RhsEval > : : value , " The default return value must be the scalar used by the fluid state! " ) ; } catch ( . . . ) { } ;
try { val = FluidSystem : : template diffusionCoefficient < FluidState , LhsEval > ( fs , paramCache , phaseIdx , compIdx ) ; } catch ( . . . ) { } ;
try { scalarVal = FluidSystem : : template fugacityCoefficient < FluidState , Scalar > ( fs , paramCache , phaseIdx , compIdx ) ; } catch ( . . . ) { } ;
2013-05-30 18:44:10 +02:00
}
}
// test for phaseName(), isLiquid() and isIdealGas()
for ( int phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
2013-09-20 15:04:27 +02:00
std : : string OPM_UNUSED name = FluidSystem : : phaseName ( phaseIdx ) ;
bool OPM_UNUSED bVal = FluidSystem : : isLiquid ( phaseIdx ) ;
2013-05-30 18:44:10 +02:00
bVal = FluidSystem : : isIdealGas ( phaseIdx ) ;
}
2015-05-21 15:33:16 +02:00
// test for molarMass() and componentName()
2013-05-30 18:44:10 +02:00
for ( int compIdx = 0 ; compIdx < numComponents ; + + compIdx ) {
val = FluidSystem : : molarMass ( compIdx ) ;
2013-09-20 15:04:27 +02:00
std : : string OPM_UNUSED name = FluidSystem : : componentName ( compIdx ) ;
2013-05-30 18:44:10 +02:00
}
std : : cout < < " ---------------------------------- \n " ;
}
# endif