Switch condition interface to phase presence facility

Commit 4aa0eaf introduced density and viscosity evaluators into the
BlackoilPropsAdInterface that accepted an externally assignable
condition to distinguish saturated from unsaturated cases.  As a
result of a few low-level technical problems with that approach,
this commit changes those affected interfaces to use the black-oil
specific 'PhasePresence' facility of opm-core's commit a033329.

Update callers accordingly.
This commit is contained in:
Bård Skaflestad 2013-12-03 18:12:54 +01:00
parent fc25415066
commit cb483e92cc
8 changed files with 118 additions and 83 deletions

View File

@ -121,12 +121,12 @@ namespace Opm
/// Oil viscosity.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n viscosity values.
V BlackoilPropsAd::muOil(const V& po,
const V& rs,
const bool* /*isSat*/,
const std::vector<PhasePresence>& /*cond*/,
const Cells& cells) const
{
if (!pu_.phase_used[Oil]) {
@ -199,16 +199,16 @@ namespace Opm
/// Oil viscosity.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n viscosity values.
ADB BlackoilPropsAd::muOil(const ADB& po,
const ADB& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const
{
#if 1
return ADB::constant(muOil(po.value(), rs.value(), isSat,cells), po.blockPattern());
return ADB::constant(muOil(po.value(), rs.value(), cond, cells), po.blockPattern());
#else
if (!pu_.phase_used[Oil]) {
OPM_THROW(std::runtime_error, "Cannot call muOil(): oil phase not present.");
@ -310,12 +310,12 @@ namespace Opm
/// Oil formation volume factor.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n formation volume factor values.
V BlackoilPropsAd::bOil(const V& po,
const V& rs,
const bool* /*isSat*/,
const std::vector<PhasePresence>& /*cond*/,
const Cells& cells) const
{
if (!pu_.phase_used[Oil]) {
@ -388,12 +388,12 @@ namespace Opm
/// Oil formation volume factor.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n formation volume factor values.
ADB BlackoilPropsAd::bOil(const ADB& po,
const ADB& rs,
const bool* /*isSat*/,
const std::vector<PhasePresence>& /*cond*/,
const Cells& cells) const
{
if (!pu_.phase_used[Oil]) {

View File

@ -109,12 +109,12 @@ namespace Opm
/// Oil viscosity.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n viscosity values.
V muOil(const V& po,
const V& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const;
/// Gas viscosity.
@ -134,12 +134,12 @@ namespace Opm
/// Oil viscosity.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n viscosity values.
ADB muOil(const ADB& po,
const ADB& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const;
/// Gas viscosity.
@ -162,12 +162,12 @@ namespace Opm
/// Oil formation volume factor.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n formation volume factor values.
V bOil(const V& po,
const V& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const;
/// Gas formation volume factor.
@ -187,12 +187,12 @@ namespace Opm
/// Oil formation volume factor.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n formation volume factor values.
ADB bOil(const ADB& po,
const ADB& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const;
/// Gas formation volume factor.

View File

@ -212,12 +212,12 @@ namespace Opm
/// Oil viscosity.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n viscosity values.
V BlackoilPropsAdFromDeck::muOil(const V& po,
const V& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const
{
if (!phase_usage_.phase_used[Oil]) {
@ -229,7 +229,7 @@ namespace Opm
V dmudp(n);
V dmudr(n);
props_[phase_usage_.phase_pos[Oil]]->mu(n, po.data(), rs.data(),isSat,
props_[phase_usage_.phase_pos[Oil]]->mu(n, po.data(), rs.data(), &cond[0],
mu.data(), dmudp.data(), dmudr.data());
return mu;
}
@ -287,12 +287,12 @@ namespace Opm
/// Oil viscosity.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n viscosity values.
ADB BlackoilPropsAdFromDeck::muOil(const ADB& po,
const ADB& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const
{
if (!phase_usage_.phase_used[Oil]) {
@ -304,8 +304,8 @@ namespace Opm
V dmudp(n);
V dmudr(n);
props_[phase_usage_.phase_pos[Oil]]->mu(n, po.value().data(), rs.value().data(), isSat,
mu.data(), dmudp.data(), dmudr.data());
props_[phase_usage_.phase_pos[Oil]]->mu(n, po.value().data(), rs.value().data(),
&cond[0], mu.data(), dmudp.data(), dmudr.data());
ADB::M dmudp_diag = spdiag(dmudp);
ADB::M dmudr_diag = spdiag(dmudr);
@ -391,11 +391,12 @@ namespace Opm
/// Oil formation volume factor.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n formation volume factor values.
V BlackoilPropsAdFromDeck::bOil(const V& po,
const V& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const
{
if (!phase_usage_.phase_used[Oil]) {
@ -408,7 +409,7 @@ namespace Opm
V dbdp(n);
V dbdr(n);
props_[phase_usage_.phase_pos[Oil]]->b(n, po.data(), rs.data(),isSat,
props_[phase_usage_.phase_pos[Oil]]->b(n, po.data(), rs.data(), &cond[0],
b.data(), dbdp.data(), dbdr.data());
return b;
@ -471,12 +472,12 @@ namespace Opm
/// Oil formation volume factor.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n formation volume factor values.
ADB BlackoilPropsAdFromDeck::bOil(const ADB& po,
const ADB& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const
{
if (!phase_usage_.phase_used[Oil]) {
@ -489,8 +490,8 @@ namespace Opm
V dbdp(n);
V dbdr(n);
props_[phase_usage_.phase_pos[Oil]]->b(n, po.value().data(), rs.value().data(),isSat,
b.data(), dbdp.data(), dbdr.data());
props_[phase_usage_.phase_pos[Oil]]->b(n, po.value().data(), rs.value().data(),
&cond[0], b.data(), dbdp.data(), dbdr.data());
ADB::M dbdp_diag = spdiag(dbdp);
ADB::M dbdr_diag = spdiag(dbdr);

View File

@ -110,12 +110,12 @@ namespace Opm
/// Oil viscosity.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n viscosity values.
V muOil(const V& po,
const V& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const;
/// Gas viscosity.
@ -135,12 +135,12 @@ namespace Opm
/// Oil viscosity.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n viscosity values.
ADB muOil(const ADB& po,
const ADB& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const;
/// Gas viscosity.
@ -163,12 +163,12 @@ namespace Opm
/// Oil formation volume factor.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n formation volume factor values.
V bOil(const V& po,
const V& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const;
/// Gas formation volume factor.
@ -188,12 +188,12 @@ namespace Opm
/// Oil formation volume factor.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n formation volume factor values.
ADB bOil(const ADB& po,
const ADB& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const;
/// Gas formation volume factor.

View File

@ -100,13 +100,13 @@ namespace Opm
/// Oil viscosity.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n viscosity values.
virtual
V muOil(const V& po,
const V& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const = 0;
/// Gas viscosity.
@ -128,13 +128,13 @@ namespace Opm
/// Oil viscosity.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n viscosity values.
virtual
ADB muOil(const ADB& po,
const ADB& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const = 0;
/// Gas viscosity.
@ -159,13 +159,13 @@ namespace Opm
/// Oil formation volume factor.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n formation volume factor values.
virtual
V bOil(const V& po,
const V& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const = 0;
/// Gas formation volume factor.
@ -187,13 +187,13 @@ namespace Opm
/// Oil formation volume factor.
/// \param[in] po Array of n oil pressure values.
/// \param[in] rs Array of n gas solution factor values.
/// \param[in] isSat Array of n booleans telling whether the fluid is saturated or not.
/// \param[in] cond Array of n taxonomies classifying fluid condition.
/// \param[in] cells Array of n cell indices to be associated with the pressure values.
/// \return Array of n formation volume factor values.
virtual
ADB bOil(const ADB& po,
const ADB& rs,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const Cells& cells) const = 0;
/// Gas formation volume factor.

View File

@ -528,8 +528,8 @@ namespace {
const std::vector<ADB>& sat = state.saturation;
const ADB& rs = state.rs;
bool isSat[rs.size()];
getSaturatedCells(state,&isSat[0]);
std::vector<PhasePresence> cond;
classifyCondition(state, cond);
const ADB pv_mult = poroMult(press);
@ -537,7 +537,7 @@ namespace {
for (int phase = 0; phase < maxnp; ++phase) {
if (active_[ phase ]) {
const int pos = pu.phase_pos[ phase ];
rq_[pos].b = fluidReciprocFVF(phase, press, rs, &isSat[0], cells_);
rq_[pos].b = fluidReciprocFVF(phase, press, rs, cond, cells_);
rq_[pos].accum[aix] = pv_mult * rq_[pos].b * sat[pos];
// DUMP(rq_[pos].b);
// DUMP(rq_[pos].accum[aix]);
@ -595,8 +595,6 @@ namespace {
// DUMP(residual_.mass_balance[phase]);
}
bool isSat[grid_.number_of_cells];
getSaturatedCells(state,isSat);
// -------- Extra (optional) sg or rs equation, and rs contributions to the mass balance equations --------
// Add the extra (flux) terms to the gas mass balance equations
@ -654,11 +652,15 @@ namespace {
assert(g[dd] == 0.0);
}
}
std::vector<PhasePresence> cond;
classifyCondition(state, cond);
ADB cell_rho_total = ADB::constant(V::Zero(nc), state.pressure.blockPattern());
for (int phase = 0; phase < 3; ++phase) {
if (active_[phase]) {
const int pos = pu.phase_pos[phase];
const ADB cell_rho = fluidDensity(phase, state.pressure, state.rs, &isSat[0],cells_);
const ADB cell_rho = fluidDensity(phase, state.pressure, state.rs, cond, cells_);
cell_rho_total += state.saturation[pos] * cell_rho;
}
}
@ -668,7 +670,7 @@ namespace {
for (int phase = 0; phase < 3; ++phase) {
if (active_[phase]) {
const int pos = pu.phase_pos[phase];
const ADB cell_rho = fluidDensity(phase, state.pressure, state.rs, &isSat[0],cells_);
const ADB cell_rho = fluidDensity(phase, state.pressure, state.rs, cond, cells_);
const V fraction = compi.col(pos);
inj_rho_total += (wops_.w2p * fraction.matrix()).array() * subset(cell_rho, well_cells);
}
@ -1007,14 +1009,16 @@ namespace {
const SolutionState& state )
{
const int phase = canph_[ actph ];
bool isSat[grid_.number_of_cells];
getSaturatedCells(state,&isSat[0]);
const ADB mu = fluidViscosity(phase, state.pressure, state.rs, &isSat[0],cells_);
std::vector<PhasePresence> cond;
classifyCondition(state, cond);
const ADB mu = fluidViscosity(phase, state.pressure, state.rs, cond, cells_);
const ADB tr_mult = transMult(state.pressure);
rq_[ actph ].mob = tr_mult * kr[ phase ] / mu;
const ADB rho = fluidDensity(phase, state.pressure, state.rs, &isSat[0],cells_);
const ADB rho = fluidDensity(phase, state.pressure, state.rs, cond, cells_);
ADB& head = rq_[ actph ].head;
@ -1067,14 +1071,14 @@ namespace {
FullyImplicitBlackoilSolver::fluidViscosity(const int phase,
const ADB& p ,
const ADB& rs ,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const std::vector<int>& cells) const
{
switch (phase) {
case Water:
return fluid_.muWat(p, cells);
case Oil: {
return fluid_.muOil(p, rs, isSat,cells);
return fluid_.muOil(p, rs, cond, cells);
}
case Gas:
return fluid_.muGas(p, cells);
@ -1091,14 +1095,14 @@ namespace {
FullyImplicitBlackoilSolver::fluidReciprocFVF(const int phase,
const ADB& p ,
const ADB& rs ,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const std::vector<int>& cells) const
{
switch (phase) {
case Water:
return fluid_.bWat(p, cells);
case Oil: {
return fluid_.bOil(p, rs, isSat, cells);
return fluid_.bOil(p, rs, cond, cells);
}
case Gas:
return fluid_.bGas(p, cells);
@ -1115,11 +1119,11 @@ namespace {
FullyImplicitBlackoilSolver::fluidDensity(const int phase,
const ADB& p ,
const ADB& rs ,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const std::vector<int>& cells) const
{
const double* rhos = fluid_.surfaceDensity();
ADB b = fluidReciprocFVF(phase, p, rs, isSat, cells);
ADB b = fluidReciprocFVF(phase, p, rs, cond, cells);
ADB rho = V::Constant(p.size(), 1, rhos[phase]) * b;
if (phase == Oil && active_[Gas]) {
// It is correct to index into rhos with canonical phase indices.
@ -1206,16 +1210,41 @@ namespace {
void
FullyImplicitBlackoilSolver::getSaturatedCells(const SolutionState& state, bool* isSat) const
FullyImplicitBlackoilSolver::
classifyCondition(const SolutionState& state,
std::vector<PhasePresence>& cond ) const
{
const int pg = fluid_.phaseUsage().phase_pos[ Gas ];
const V sg = state.saturation[pg].value();
for (int c=0; c < sg.size(); ++ c) {
if (sg[c]>0){
isSat[c] = true;
const PhaseUsage& pu = fluid_.phaseUsage();
if (active_[ Gas ]) {
// Oil/Gas or Water/Oil/Gas system
const int po = pu.phase_pos[ Oil ];
const int pg = pu.phase_pos[ Gas ];
const V& so = state.saturation[ po ].value();
const V& sg = state.saturation[ pg ].value();
cond.resize(sg.size());
for (V::Index c = 0, e = sg.size(); c != e; ++c) {
if (so[c] > 0) { cond[c].setFreeOil (); }
if (sg[c] > 0) { cond[c].setFreeGas (); }
if (active_[ Water ]) { cond[c].setFreeWater(); }
}
else{
isSat[c] = false;
}
else {
// Water/Oil system
assert (active_[ Water ]);
const int po = pu.phase_pos[ Oil ];
const V& so = state.saturation[ po ].value();
cond.resize(so.size());
for (V::Index c = 0, e = so.size(); c != e; ++c) {
cond[c].setFreeWater();
if (so[c] > 0) { cond[c].setFreeOil(); }
}
}
}

View File

@ -189,21 +189,21 @@ namespace Opm {
fluidViscosity(const int phase,
const ADB& p ,
const ADB& rs ,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const std::vector<int>& cells) const;
ADB
fluidReciprocFVF(const int phase,
const ADB& p ,
const ADB& rs ,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const std::vector<int>& cells) const;
ADB
fluidDensity(const int phase,
const ADB& p ,
const ADB& rs ,
const bool* isSat,
const std::vector<PhasePresence>& cond,
const std::vector<int>& cells) const;
V
@ -221,7 +221,8 @@ namespace Opm {
transMult(const ADB& p) const;
void
getSaturatedCells(const SolutionState& state, bool* isSat) const;
classifyCondition(const SolutionState& state,
std::vector<PhasePresence>& cond ) const;
};
} // namespace Opm

View File

@ -533,8 +533,9 @@ namespace {
return fluid_.muWat(p, cells);
case Oil: {
V dummy_rs = V::Zero(p.size(), 1) * p;
bool dummy_isSat[p.size()];
return fluid_.muOil(p, dummy_rs, dummy_isSat, cells);
std::vector<PhasePresence> cond(dummy_rs.size());
return fluid_.muOil(p, dummy_rs, cond, cells);
}
case Gas:
return fluid_.muGas(p, cells);
@ -554,8 +555,9 @@ namespace {
return fluid_.muWat(p, cells);
case Oil: {
ADB dummy_rs = V::Zero(p.size(), 1) * p;
bool dummy_isSat[p.size()];
return fluid_.muOil(p, dummy_rs, dummy_isSat, cells);
std::vector<PhasePresence> cond(dummy_rs.size());
return fluid_.muOil(p, dummy_rs, cond, cells);
}
case Gas:
return fluid_.muGas(p, cells);
@ -575,8 +577,9 @@ namespace {
return fluid_.bWat(p, cells);
case Oil: {
V dummy_rs = V::Zero(p.size(), 1) * p;
bool dummy_isSat[p.size()];
return fluid_.bOil(p, dummy_rs, dummy_isSat,cells);
std::vector<PhasePresence> cond(dummy_rs.size());
return fluid_.bOil(p, dummy_rs, cond, cells);
}
case Gas:
return fluid_.bGas(p, cells);
@ -596,8 +599,9 @@ namespace {
return fluid_.bWat(p, cells);
case Oil: {
ADB dummy_rs = V::Zero(p.size(), 1) * p;
bool dummy_isSat[p.size()];
return fluid_.bOil(p, dummy_rs, dummy_isSat,cells);
std::vector<PhasePresence> cond(dummy_rs.size());
return fluid_.bOil(p, dummy_rs, cond, cells);
}
case Gas:
return fluid_.bGas(p, cells);