Files
opm-common/opm/material/fluidstates/ModularFluidState.hpp
Andreas Lauser 7cbffc22c6 introduce SimpleModularFluidState and make ModularFluidState not depend on the FluidSystem anymore
it is called "simple" because the usage is somewhat simpler: The
quantities are stored and those which are not can be specified using
simple boolean template arguments instead of having to pass the class
names of the storage modules. The definition of the class is quite a
bit more involved than the non-"simple" variant, though.
2015-07-28 17:24:27 +02:00

115 lines
3.4 KiB
C++

// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
// vi: set et ts=4 sw=4 sts=4:
/*
Copyright (C) 2011-2013 by Andreas Lauser
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/>.
*/
/*!
* \file
* \copydoc Opm::ModularFluidState
*/
#ifndef OPM_MODULAR_FLUID_STATE_HPP
#define OPM_MODULAR_FLUID_STATE_HPP
#include "FluidStatePressureModules.hpp"
#include "FluidStateTemperatureModules.hpp"
#include "FluidStateCompositionModules.hpp"
#include "FluidStateFugacityModules.hpp"
#include "FluidStateSaturationModules.hpp"
#include "FluidStateDensityModules.hpp"
#include "FluidStateViscosityModules.hpp"
#include "FluidStateEnthalpyModules.hpp"
#include <opm/material/common/Valgrind.hpp>
#include <algorithm>
namespace Opm {
/*!
* \brief Represents all relevant thermodynamic quantities of a
* multi-phase, multi-component fluid system assuming
* thermodynamic equilibrium.
*
* This class uses a modular approach which results in storing only a
* set of requested thermodynamic quantities.
*/
template <class ScalarT,
int numPhasesV,
int numComponentsV,
class PressureModule,
class TemperatureModule,
class CompositionModule,
class FugacityModule,
class SaturationModule,
class DensityModule,
class ViscosityModule,
class EnthalpyModule>
class ModularFluidState
: public PressureModule
, public TemperatureModule
, public CompositionModule
, public FugacityModule
, public SaturationModule
, public DensityModule
, public ViscosityModule
, public EnthalpyModule
{
public:
typedef ScalarT Scalar;
enum { numPhases = numPhasesV };
enum { numComponents = numComponentsV };
/*!
* \brief Make sure that all attributes are defined.
*
* This method does not do anything if the program is not run
* under valgrind. If it is, then valgrind will print an error
* message if some attributes of the object have not been properly
* defined.
*/
void checkDefined() const
{
PressureModule::checkDefined();
TemperatureModule::checkDefined();
CompositionModule::checkDefined();
SaturationModule::checkDefined();
DensityModule::checkDefined();
ViscosityModule::checkDefined();
EnthalpyModule::checkDefined();
}
/*!
* \brief Retrieve all parameters from an arbitrary fluid
* state.
*/
template <class FluidState>
void assign(const FluidState& fs)
{
PressureModule::assign(fs);
TemperatureModule::assign(fs);
CompositionModule::assign(fs);
SaturationModule::assign(fs);
DensityModule::assign(fs);
ViscosityModule::assign(fs);
EnthalpyModule::assign(fs);
}
};
} // namespace Opm
#endif