/*
Copyright 2015 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 3 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 .
*/
#ifndef OPM_BLACKOIL_STATE_TO_FLUID_STATE_HEADER_INCLUDED
#define OPM_BLACKOIL_STATE_TO_FLUID_STATE_HEADER_INCLUDED
#include
namespace Opm
{
/*!
* \brief This is an light weight "impedance adaption" class with a well defined API for
* saturation and PVT functions.
*
* It uses a stripped down version of opm-material's FluidState API and takes an
* Opm::BlackoilState plus a cell index.
*
* Note that this class requires that is underlying BlackoilState must valid for at least
* as long as an object of BlackoilStateToFluidState is used.
*/
class BlackoilStateToFluidState
{
public:
typedef double Scalar;
enum { numPhases = 3 };
enum { numComponents = 3 };
/*!
* \brief Create a BlackoilState to Fluid state wrapper object.
*
* Note that this class requires that is underlying BlackoilState must valid for at least
* as long as an object of BlackoilStateToFluidState is used.
*/
BlackoilStateToFluidState(const BlackoilState& blackoilState)
: blackoilState_(blackoilState)
{
if (blackoilState_.numPhases() != numPhases) {
OPM_THROW(std::runtime_error,
"Only " << numPhases << " are supported, but the deck specifies " << blackoilState_.numPhases());
}
}
/*!
* \brief Sets the index of the currently used cell.
*
* After calling this, the values returned by the other methods are specific for this
* cell.
*/
void setCurrentCellIndex(unsigned cellIdx)
{ cellIdx_ = cellIdx; }
/*!
* \brief Returns the saturation of a phase for the current cell index.
*/
Scalar saturation(int phaseIdx) const
{ return blackoilState_.saturation()[numPhases*cellIdx_ + phaseIdx]; }
/*!
* \brief Returns the temperature [K] of a phase for the current cell index.
*/
Scalar temperature(int phaseIdx) const
{ return blackoilState_.temperature()[cellIdx_]; }
// TODO (?) pressure, composition, etc
private:
size_t numCells() const
{ return blackoilState_.pressure().size(); }
const BlackoilState& blackoilState_;
unsigned cellIdx_;
}
} // namespace Opm
#endif // OPM_SIMULATORTIMER_HEADER_INCLUDED