mirror of
https://github.com/OPM/opm-simulators.git
synced 2024-11-25 02:30:18 -06:00
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:
parent
fc25415066
commit
cb483e92cc
@ -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]) {
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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(); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user