Made phase mixing functors a class hierarchy.

In summary:
 - added RsFunction (base class),
 - made NoMixing, RsVD, RsSatAtContact inherit RsFunction,
 - RS and RV are no longer template arguments for EquilReg class,
 - EquilReg constructor now takes two shared_ptr<Miscibility::RsFunction>,
 - use of constructor updated, mostly using make_shared.
This commit is contained in:
Atgeirr Flø Rasmussen 2014-02-26 14:47:24 +01:00
parent 75ca41805e
commit 8ef54b7c64
3 changed files with 65 additions and 61 deletions

View File

@ -26,6 +26,8 @@
#include <opm/core/utility/RegionMapping.hpp> #include <opm/core/utility/RegionMapping.hpp>
#include <opm/core/utility/RootFinders.hpp> #include <opm/core/utility/RootFinders.hpp>
#include <memory>
/* /*
---- synopsis of EquilibrationHelpers.hpp ---- ---- synopsis of EquilibrationHelpers.hpp ----
@ -41,6 +43,7 @@ namespace Opm
class DensityCalculator< BlackoilPropertiesInterface >; class DensityCalculator< BlackoilPropertiesInterface >;
namespace Miscibility { namespace Miscibility {
class RsFunction;
class NoMixing; class NoMixing;
class RsVD; class RsVD;
class RsSatAtContact; class RsSatAtContact;
@ -48,9 +51,7 @@ namespace Opm
struct EquilRecord; struct EquilRecord;
template <class DensCalc, template <class DensCalc>
class RS = Miscibility::NoMixing,
class RV = Miscibility::NoMixing>
class EquilReg; class EquilReg;
@ -148,15 +149,40 @@ namespace Opm
const std::vector<int> c_; const std::vector<int> c_;
}; };
/** /**
* Types and routines relating to phase mixing in * Types and routines relating to phase mixing in
* equilibration calculations. * equilibration calculations.
*/ */
namespace Miscibility { namespace Miscibility {
/**
* Base class for phase mixing functions.
*/
class RsFunction
{
public:
/**
* Function call operator.
*
* \param[in] depth Depth at which to calculate RS
* value.
*
* \param[in] press Pressure at which to calculate RS
* value.
*
* \return Dissolved gas-oil ratio (RS) at depth @c
* depth and pressure @c press.
*/
virtual double operator()(const double depth,
const double press) const = 0;
};
/** /**
* Type that implements "no phase mixing" policy. * Type that implements "no phase mixing" policy.
*/ */
class NoMixing { class NoMixing : public RsFunction {
public: public:
/** /**
* Function call. * Function call.
@ -179,12 +205,13 @@ namespace Opm
} }
}; };
/** /**
* Type that implements "dissolved gas-oil ratio" * Type that implements "dissolved gas-oil ratio"
* tabulated as a function of depth policy. Data * tabulated as a function of depth policy. Data
* typically taken from keyword 'RSVD'. * typically taken from keyword 'RSVD'.
*/ */
class RsVD { class RsVD : public RsFunction {
public: public:
/** /**
* Constructor. * Constructor.
@ -238,7 +265,7 @@ namespace Opm
* This should yield Rs-values that are constant below the * This should yield Rs-values that are constant below the
* contact, and decreasing above the contact. * contact, and decreasing above the contact.
*/ */
class RsSatAtContact { class RsSatAtContact : public RsFunction {
public: public:
/** /**
* Constructor. * Constructor.
@ -295,6 +322,7 @@ namespace Opm
return A_[np*opos + gpos] / A_[np*opos + opos]; return A_[np*opos + gpos] / A_[np*opos + opos];
} }
}; };
} // namespace Miscibility } // namespace Miscibility
@ -347,34 +375,8 @@ namespace Opm
* </CODE> * </CODE>
* that calculates the phase densities of all phases in @c * that calculates the phase densities of all phases in @c
* svol at fluid pressure @c press. * svol at fluid pressure @c press.
*
* \tparam RS Type that provides access to a calculator for
* (initial) dissolved gas-oil ratios as a function of depth
* and (oil) pressure. Must implement an operator() declared
* as
* <CODE>
* double
* operator()(const double depth,
* const double press)
* </CODE>
* that calculates the dissolved gas-oil ratio at depth @c
* depth and (oil) pressure @c press.
*
* \tparam RV Type that provides access to a calculator for
* (initial) vapourised oil-gas ratios as a function of depth
* and (gas) pressure. Must implement an operator() declared
* as
* <CODE>
* double
* operator()(const double depth,
* const double press)
* </CODE>
* that calculates the vapourised oil-gas ratio at depth @c
* depth and (gas) pressure @c press.
*/ */
template <class DensCalc, template <class DensCalc>
class RS = Miscibility::NoMixing,
class RV = Miscibility::NoMixing>
class EquilReg { class EquilReg {
public: public:
/** /**
@ -388,8 +390,8 @@ namespace Opm
*/ */
EquilReg(const EquilRecord& rec, EquilReg(const EquilRecord& rec,
const DensCalc& density, const DensCalc& density,
const RS& rs, std::shared_ptr<Miscibility::RsFunction> rs,
const RV& rv, std::shared_ptr<Miscibility::RsFunction> rv,
const PhaseUsage& pu) const PhaseUsage& pu)
: rec_ (rec) : rec_ (rec)
, density_(density) , density_(density)
@ -407,12 +409,12 @@ namespace Opm
/** /**
* Type of dissolved gas-oil ratio calculator. * Type of dissolved gas-oil ratio calculator.
*/ */
typedef RS CalcDissolution; typedef Miscibility::RsFunction CalcDissolution;
/** /**
* Type of vapourised oil-gas ratio calculator. * Type of vapourised oil-gas ratio calculator.
*/ */
typedef RV CalcEvaporation; typedef Miscibility::RsFunction CalcEvaporation;
/** /**
* Datum depth in current region * Datum depth in current region
@ -459,14 +461,14 @@ namespace Opm
* region. * region.
*/ */
const CalcDissolution& const CalcDissolution&
dissolutionCalculator() const { return this->rs_; } dissolutionCalculator() const { return *this->rs_; }
/** /**
* Retrieve vapourised oil-gas ratio calculator of current * Retrieve vapourised oil-gas ratio calculator of current
* region. * region.
*/ */
const CalcEvaporation& const CalcEvaporation&
evaporationCalculator() const { return this->rv_; } evaporationCalculator() const { return *this->rv_; }
/** /**
* Retrieve active fluid phase summary. * Retrieve active fluid phase summary.
@ -477,8 +479,8 @@ namespace Opm
private: private:
EquilRecord rec_; /**< Equilibration data */ EquilRecord rec_; /**< Equilibration data */
DensCalc density_; /**< Density calculator */ DensCalc density_; /**< Density calculator */
RS rs_; /**< RS calculator */ std::shared_ptr<Miscibility::RsFunction> rs_; /**< RS calculator */
RV rv_; /**< RV calculator */ std::shared_ptr<Miscibility::RsFunction> rv_; /**< RV calculator */
PhaseUsage pu_; /**< Active phase summary */ PhaseUsage pu_; /**< Active phase summary */
}; };

View File

@ -296,7 +296,8 @@ namespace Opm
const int repcell = *cells.begin(); const int repcell = *cells.begin();
const RhoCalc calc(props, repcell); const RhoCalc calc(props, repcell);
const EqReg eqreg(rec[r], calc, NoMix(), NoMix(), const EqReg eqreg(rec[r], calc,
std::make_shared<NoMix>(), std::make_shared<NoMix>(),
props.phaseUsage()); props.phaseUsage());
const PPress& res = phasePressures(G, eqreg, cells, grav); const PPress& res = phasePressures(G, eqreg, cells, grav);
@ -334,7 +335,8 @@ namespace Opm
const int repcell = *cells.begin(); const int repcell = *cells.begin();
const RhoCalc calc(props, repcell); const RhoCalc calc(props, repcell);
const EqReg eqreg(rec[r], calc, NoMix(), NoMix(), const EqReg eqreg(rec[r], calc,
std::make_shared<NoMix>(), std::make_shared<NoMix>(),
props.phaseUsage()); props.phaseUsage());
const PPress press = phasePressures(G, eqreg, cells, grav); const PPress press = phasePressures(G, eqreg, cells, grav);

View File

@ -76,8 +76,8 @@ BOOST_AUTO_TEST_CASE (PhasePressure)
Opm::Equil::EquilReg<RhoCalc> Opm::Equil::EquilReg<RhoCalc>
region(record, calc, region(record, calc,
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
props.phaseUsage()); props.phaseUsage());
std::vector<int> cells(G->number_of_cells); std::vector<int> cells(G->number_of_cells);
@ -139,23 +139,23 @@ BOOST_AUTO_TEST_CASE (CellSubset)
Opm::Equil::EquilReg<RhoCalc> region[] = Opm::Equil::EquilReg<RhoCalc> region[] =
{ {
Opm::Equil::EquilReg<RhoCalc>(record[0], calc, Opm::Equil::EquilReg<RhoCalc>(record[0], calc,
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
props.phaseUsage()) props.phaseUsage())
, ,
Opm::Equil::EquilReg<RhoCalc>(record[0], calc, Opm::Equil::EquilReg<RhoCalc>(record[0], calc,
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
props.phaseUsage()) props.phaseUsage())
, ,
Opm::Equil::EquilReg<RhoCalc>(record[1], calc, Opm::Equil::EquilReg<RhoCalc>(record[1], calc,
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
props.phaseUsage()) props.phaseUsage())
, ,
Opm::Equil::EquilReg<RhoCalc>(record[1], calc, Opm::Equil::EquilReg<RhoCalc>(record[1], calc,
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
props.phaseUsage()) props.phaseUsage())
}; };
@ -254,23 +254,23 @@ BOOST_AUTO_TEST_CASE (RegMapping)
Opm::Equil::EquilReg<RhoCalc> region[] = Opm::Equil::EquilReg<RhoCalc> region[] =
{ {
Opm::Equil::EquilReg<RhoCalc>(record[0], calc, Opm::Equil::EquilReg<RhoCalc>(record[0], calc,
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
props.phaseUsage()) props.phaseUsage())
, ,
Opm::Equil::EquilReg<RhoCalc>(record[0], calc, Opm::Equil::EquilReg<RhoCalc>(record[0], calc,
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
props.phaseUsage()) props.phaseUsage())
, ,
Opm::Equil::EquilReg<RhoCalc>(record[1], calc, Opm::Equil::EquilReg<RhoCalc>(record[1], calc,
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
props.phaseUsage()) props.phaseUsage())
, ,
Opm::Equil::EquilReg<RhoCalc>(record[1], calc, Opm::Equil::EquilReg<RhoCalc>(record[1], calc,
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
Opm::Equil::Miscibility::NoMixing(), std::make_shared<Opm::Equil::Miscibility::NoMixing>(),
props.phaseUsage()) props.phaseUsage())
}; };