mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
adding extractWellPerfProperties to MultisegmentWells
removing extractWellPerfProperties in all the model classes.
This commit is contained in:
parent
718ba5470b
commit
508de4dc37
@ -379,13 +379,6 @@ namespace Opm {
|
||||
void
|
||||
assembleMassBalanceEq(const SolutionState& state);
|
||||
|
||||
// TODO: only kept for now due to flow_multisegment
|
||||
// will be removed soon
|
||||
void
|
||||
extractWellPerfProperties(const SolutionState& state,
|
||||
std::vector<ADB>& mob_perfcells,
|
||||
std::vector<ADB>& b_perfcells) const;
|
||||
|
||||
// TODO: only kept for now due to flow_multisegment
|
||||
// will be removed soon
|
||||
void updateWellState(const V& dwells,
|
||||
|
@ -965,36 +965,6 @@ namespace detail {
|
||||
|
||||
|
||||
|
||||
|
||||
template <class Grid, class WellModel, class Implementation>
|
||||
void
|
||||
BlackoilModelBase<Grid, WellModel, Implementation>::
|
||||
extractWellPerfProperties(const SolutionState&,
|
||||
std::vector<ADB>& mob_perfcells,
|
||||
std::vector<ADB>& b_perfcells) const
|
||||
{
|
||||
// If we have wells, extract the mobilities and b-factors for
|
||||
// the well-perforated cells.
|
||||
if (!asImpl().localWellsActive()) {
|
||||
mob_perfcells.clear();
|
||||
b_perfcells.clear();
|
||||
return;
|
||||
} else {
|
||||
const int np = asImpl().numPhases();
|
||||
const std::vector<int>& well_cells = stdWells().wellOps().well_cells;
|
||||
mob_perfcells.resize(np, ADB::null());
|
||||
b_perfcells.resize(np, ADB::null());
|
||||
for (int phase = 0; phase < np; ++phase) {
|
||||
mob_perfcells[phase] = subset(rq_[phase].mob, well_cells);
|
||||
b_perfcells[phase] = subset(rq_[phase].b, well_cells);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
template <class Grid, class WellModel, class Implementation>
|
||||
bool
|
||||
BlackoilModelBase<Grid, WellModel, Implementation>::
|
||||
|
@ -491,7 +491,7 @@ namespace Opm {
|
||||
|
||||
std::vector<ADB> mob_perfcells;
|
||||
std::vector<ADB> b_perfcells;
|
||||
asImpl().extractWellPerfProperties(state, mob_perfcells, b_perfcells);
|
||||
msWells().extractWellPerfProperties(state, rq_, mob_perfcells, b_perfcells);
|
||||
if (param_.solve_welleq_initially_ && initial_assembly) {
|
||||
// solve the well equations as a pre-processing step
|
||||
asImpl().solveWellEq(mob_perfcells, b_perfcells, state, well_state);
|
||||
|
@ -215,11 +215,6 @@ namespace Opm {
|
||||
const std::vector<PhasePresence>
|
||||
phaseCondition() const {return this->phaseCondition_;}
|
||||
|
||||
void extractWellPerfProperties(const SolutionState& state,
|
||||
std::vector<ADB>& mob_perfcells,
|
||||
std::vector<ADB>& b_perfcells);
|
||||
|
||||
|
||||
// compute effective viscosities (mu_eff_) and effective b factors (b_eff_) using the ToddLongstaff model
|
||||
void computeEffectiveProperties(const SolutionState& state);
|
||||
|
||||
|
@ -816,43 +816,6 @@ namespace Opm {
|
||||
|
||||
}
|
||||
|
||||
template <class Grid>
|
||||
void
|
||||
BlackoilSolventModel<Grid>::extractWellPerfProperties(const SolutionState& state,
|
||||
std::vector<ADB>& mob_perfcells,
|
||||
std::vector<ADB>& b_perfcells)
|
||||
{
|
||||
Base::extractWellPerfProperties(state, mob_perfcells, b_perfcells);
|
||||
if (has_solvent_) {
|
||||
int gas_pos = fluid_.phaseUsage().phase_pos[Gas];
|
||||
const std::vector<int>& well_cells = stdWells().wellOps().well_cells;
|
||||
const int nperf = well_cells.size();
|
||||
// Gas and solvent is combinded and solved together
|
||||
// The input in the well equation is then the
|
||||
// total gas phase = hydro carbon gas + solvent gas
|
||||
|
||||
// The total mobility is the sum of the solvent and gas mobiliy
|
||||
mob_perfcells[gas_pos] += subset(rq_[solvent_pos_].mob, well_cells);
|
||||
|
||||
// A weighted sum of the b-factors of gas and solvent are used.
|
||||
const int nc = Opm::AutoDiffGrid::numCells(grid_);
|
||||
|
||||
const Opm::PhaseUsage& pu = fluid_.phaseUsage();
|
||||
const ADB zero = ADB::constant(V::Zero(nc));
|
||||
const ADB& ss = state.solvent_saturation;
|
||||
const ADB& sg = (active_[ Gas ]
|
||||
? state.saturation[ pu.phase_pos[ Gas ] ]
|
||||
: zero);
|
||||
|
||||
Selector<double> zero_selector(ss.value() + sg.value(), Selector<double>::Zero);
|
||||
ADB F_solvent = subset(zero_selector.select(ss, ss / (ss + sg)),well_cells);
|
||||
V ones = V::Constant(nperf,1.0);
|
||||
|
||||
b_perfcells[gas_pos] = (ones - F_solvent) * b_perfcells[gas_pos];
|
||||
b_perfcells[gas_pos] += (F_solvent * subset(rq_[solvent_pos_].b, well_cells));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
template <class Grid>
|
||||
void
|
||||
|
@ -105,6 +105,18 @@ namespace Opm {
|
||||
|
||||
int numPerf() const { return nperf_total_; };
|
||||
|
||||
bool localWellsActive() const { return ! wells_multisegment_.empty(); }
|
||||
|
||||
// TODO: will be wrong for the parallel version.
|
||||
// TODO: to be fixed after other interfaces are unified.
|
||||
bool WellsActive() const { return localWellsActive(); };
|
||||
|
||||
template <class ReservoirResidualQuant, class SolutionState>
|
||||
void extractWellPerfProperties(const SolutionState& state,
|
||||
const std::vector<ReservoirResidualQuant>& rq,
|
||||
std::vector<ADB>& mob_perfcells,
|
||||
std::vector<ADB>& b_perfcells) const;
|
||||
|
||||
Vector& wellPerforationCellPressureDiffs() { return well_perforation_cell_pressure_diffs_; };
|
||||
|
||||
Vector& wellSegmentPerforationDepthDiffs() { return well_segment_perforation_depth_diffs_; };
|
||||
|
@ -47,6 +47,37 @@ namespace Opm
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
template <class ReservoirResidualQuant, class SolutionState>
|
||||
void
|
||||
MultisegmentWells::
|
||||
extractWellPerfProperties(const SolutionState& /* state */,
|
||||
const std::vector<ReservoirResidualQuant>& rq,
|
||||
std::vector<ADB>& mob_perfcells,
|
||||
std::vector<ADB>& b_perfcells) const
|
||||
{
|
||||
// If we have wells, extract the mobilities and b-factors for
|
||||
// the well-perforated cells.
|
||||
if ( !localWellsActive() ) {
|
||||
mob_perfcells.clear();
|
||||
b_perfcells.clear();
|
||||
return;
|
||||
} else {
|
||||
const std::vector<int>& well_cells = wellOps().well_cells;
|
||||
mob_perfcells.resize(num_phases_, ADB::null());
|
||||
b_perfcells.resize(num_phases_, ADB::null());
|
||||
for (int phase = 0; phase < num_phases_; ++phase) {
|
||||
mob_perfcells[phase] = subset(rq[phase].mob, well_cells);
|
||||
b_perfcells[phase] = subset(rq[phase].b, well_cells);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
template <class WellState>
|
||||
void
|
||||
MultisegmentWells::
|
||||
|
Loading…
Reference in New Issue
Block a user