Merge pull request #108 from andlaus/FullyImplicitBlackoilSolver_unify_state_conversion

FullyImplicitBlackoilSolver: unify the state conversion routines
This commit is contained in:
Atgeirr Flø Rasmussen 2014-03-26 14:29:08 +01:00
commit 2db726268b

View File

@ -333,90 +333,19 @@ namespace {
FullyImplicitBlackoilSolver::constantState(const BlackoilState& x, FullyImplicitBlackoilSolver::constantState(const BlackoilState& x,
const WellStateFullyImplicitBlackoil& xw) const WellStateFullyImplicitBlackoil& xw)
{ {
const int nc = grid_.number_of_cells; auto state = variableState(x, xw);
const int np = x.numPhases();
// The block pattern assumes the following primary variables: // HACK: throw away the derivatives. this may not be the most
// pressure // performant way to do things, but it will make the state
// water saturation (if water present) // automatically consistent with variableState() (and doing
// gas saturation, Rv (vapor oil/gas ratio) or Rs (solution gas/oil ratio) depending on hydrocarbon state // things automatically is all the rage in this module ;)
// Gas only (undersaturated gas): Rv state.pressure = ADB::constant(state.pressure.value());
// Gas and oil: Sg state.rs = ADB::constant(state.rs.value());
// Oil only (undersaturated oil): Rs state.rv = ADB::constant(state.rv.value());
// well rates per active phase and well for (int phaseIdx= 0; phaseIdx < x.numPhases(); ++ phaseIdx)
// well bottom-hole pressure state.saturation[phaseIdx] = ADB::constant(state.saturation[phaseIdx].value());
// Note that oil is assumed to always be present, but is never state.qs = ADB::constant(state.qs.value());
// a primary variable. state.bhp = ADB::constant(state.bhp.value());
assert(active_[ Oil ]);
std::vector<int> bpat(np, nc);
bpat.push_back(xw.bhp().size() * np);
bpat.push_back(xw.bhp().size());
SolutionState state(np);
// Pressure.
assert (not x.pressure().empty());
const V p = Eigen::Map<const V>(& x.pressure()[0], nc, 1);
state.pressure = ADB::constant(p, bpat);
// Saturation.
assert (not x.saturation().empty());
const DataBlock s = Eigen::Map<const DataBlock>(& x.saturation()[0], nc, np);
const Opm::PhaseUsage pu = fluid_.phaseUsage();
{
V so = V::Ones(nc, 1);
if (active_[ Water ]) {
const int pos = pu.phase_pos[ Water ];
const V sw = s.col(pos);
so -= sw;
state.saturation[pos] = ADB::constant(sw, bpat);
}
if (active_[ Gas ]) {
const int pos = pu.phase_pos[ Gas ];
const V sg = s.col(pos);
so -= sg;
state.saturation[pos] = ADB::constant(sg, bpat);
}
if (active_[ Oil ]) {
const int pos = pu.phase_pos[ Oil ];
state.saturation[pos] = ADB::constant(so, bpat);
}
}
// Solution Gas-oil ratio (rs).
if (active_[ Oil ] && active_[ Gas ]) {
const V rs = Eigen::Map<const V>(& x.gasoilratio()[0], x.gasoilratio().size());
state.rs = ADB::constant(rs, bpat);
} else {
const V Rs = V::Zero(nc, 1);
state.rs = ADB::constant(Rs, bpat);
}
// Vapor Oil-gas ratio (rv).
if (active_[ Oil ] && active_[ Gas ]) {
const V rv = Eigen::Map<const V>(& x.rv()[0], x.rv().size());
state.rv = ADB::constant(rv, bpat);
} else {
const V rv = V::Zero(nc, 1);
state.rv = ADB::constant(rv, bpat);
}
// Well rates.
assert (not xw.wellRates().empty());
// Need to reshuffle well rates, from ordered by wells, then phase,
// to ordered by phase, then wells.
const int nw = wells_.number_of_wells;
// The transpose() below switches the ordering.
const DataBlock wrates = Eigen::Map<const DataBlock>(& xw.wellRates()[0], nw, np).transpose();
const V qs = Eigen::Map<const V>(wrates.data(), nw*np);
state.qs = ADB::constant(qs, bpat);
// Well bottom-hole pressure.
assert (not xw.bhp().empty());
const V bhp = Eigen::Map<const V>(& xw.bhp()[0], xw.bhp().size());
state.bhp = ADB::constant(bhp, bpat);
return state; return state;
} }