Move getPerfCellPressure to wellInterface

The cell pressure is independent of well model and belongs to the interface
This should move the MSW model one step closer to supporting GasWater cases
This commit is contained in:
Tor Harald Sandve 2021-11-30 10:48:02 +00:00
parent 3d02e29da1
commit 2c17b1942c
5 changed files with 28 additions and 32 deletions

View File

@ -887,7 +887,7 @@ namespace Opm
{
const auto& fs = int_quants.fluidState();
const EvalWell pressure_cell = this->extendEval(fs.pressure(FluidSystem::oilPhaseIdx));
const EvalWell pressure_cell = this->extendEval(this->getPerfCellPressure(fs));
const EvalWell rs = this->extendEval(fs.Rs());
const EvalWell rv = this->extendEval(fs.Rv());
@ -944,7 +944,7 @@ namespace Opm
{
const auto& fs = int_quants.fluidState();
const Scalar pressure_cell = getValue(fs.pressure(FluidSystem::oilPhaseIdx));
const Scalar pressure_cell = getValue(this->getPerfCellPressure(fs));
const Scalar rs = getValue(fs.Rs());
const Scalar rv = getValue(fs.Rv());
@ -1225,7 +1225,7 @@ namespace Opm
const double perf_seg_press_diff = this->gravity_ * this->segment_densities_[seg].value() * this->perforation_segment_depth_diffs_[perf];
// pressure difference between the perforation and the grid cell
const double cell_perf_press_diff = this->cell_perforation_pressure_diffs_[perf];
const double pressure_cell = fs.pressure(FluidSystem::oilPhaseIdx).value();
const double pressure_cell = this->getPerfCellPressure(fs).value();
// calculating the b for the connection
std::vector<double> b_perf(this->num_components_);
@ -1674,7 +1674,7 @@ namespace Opm
// pressure difference between the perforation and the grid cell
const double cell_perf_press_diff = this->cell_perforation_pressure_diffs_[perf];
const double pressure_cell = (fs.pressure(FluidSystem::oilPhaseIdx)).value();
const double pressure_cell = this->getPerfCellPressure(fs).value();
const double perf_press = pressure_cell - cell_perf_press_diff;
// Pressure drawdown (also used to determine direction of flow)
// TODO: not 100% sure about the sign of the seg_perf_press_diff
@ -1844,7 +1844,7 @@ namespace Opm
const int cell_idx = this->well_cells_[perf];
const auto& int_quants = *(ebos_simulator.model().cachedIntensiveQuantities(cell_idx, /*timeIdx=*/ 0));
const auto& fs = int_quants.fluidState();
double pressure_cell = fs.pressure(FluidSystem::oilPhaseIdx).value();
double pressure_cell = this->getPerfCellPressure(fs).value();
max_pressure = std::max(max_pressure, pressure_cell);
}
}

View File

@ -263,8 +263,6 @@ namespace Opm
protected:
Eval getPerfCellPressure(const FluidState& fs) const;
// xw = inv(D)*(rw - C*x)
void recoverSolutionWell(const BVector& x, BVectorWell& xw) const;

View File

@ -82,24 +82,6 @@ namespace Opm
template<typename TypeTag>
typename StandardWell<TypeTag>::Eval
StandardWell<TypeTag>::getPerfCellPressure(const typename StandardWell<TypeTag>::FluidState& fs) const
{
Eval pressure;
if (Indices::oilEnabled) {
pressure = fs.pressure(FluidSystem::oilPhaseIdx);
} else {
if (Indices::waterEnabled) {
pressure = fs.pressure(FluidSystem::waterPhaseIdx);
} else {
pressure = fs.pressure(FluidSystem::gasPhaseIdx);
}
}
return pressure;
}
template<typename TypeTag>
void
StandardWell<TypeTag>::
@ -115,7 +97,7 @@ namespace Opm
DeferredLogger& deferred_logger) const
{
const auto& fs = intQuants.fluidState();
const EvalWell pressure = this->extendEval(getPerfCellPressure(fs));
const EvalWell pressure = this->extendEval(this->getPerfCellPressure(fs));
const EvalWell rs = this->extendEval(fs.Rs());
const EvalWell rv = this->extendEval(fs.Rv());
std::vector<EvalWell> b_perfcells_dense(this->num_components_, EvalWell{this->numWellEq_ + Indices::numEq, 0.0});
@ -182,7 +164,7 @@ namespace Opm
DeferredLogger& deferred_logger) const
{
const auto& fs = intQuants.fluidState();
const Scalar pressure = getPerfCellPressure(fs).value();
const Scalar pressure = this->getPerfCellPressure(fs).value();
const Scalar rs = fs.Rs().value();
const Scalar rv = fs.Rv().value();
std::vector<Scalar> b_perfcells_dense(this->num_components_, 0.0);
@ -964,8 +946,7 @@ namespace Opm
const auto& int_quantities = *(ebos_simulator.model().cachedIntensiveQuantities(cell_idx, /*timeIdx=*/ 0));
const auto& fs = int_quantities.fluidState();
// the pressure of the reservoir grid block the well connection is in
Eval perf_pressure = getPerfCellPressure(fs);
double p_r = perf_pressure.value();
double p_r = this->getPerfCellPressure(fs).value();
// calculating the b for the connection
std::vector<double> b_perf(this->num_components_);
@ -1145,7 +1126,7 @@ namespace Opm
const auto& intQuants = *(ebos_simulator.model().cachedIntensiveQuantities(cell_idx, /*timeIdx=*/0));
const auto& fs = intQuants.fluidState();
const double pressure = (fs.pressure(FluidSystem::oilPhaseIdx)).value();
const double pressure = this->getPerfCellPressure(fs).value();
const double bhp = this->getBhp().value();
// Pressure drawdown (also used to determine direction of flow)

View File

@ -332,6 +332,9 @@ protected:
bool solveWellForTesting(const Simulator& ebosSimulator, WellState& well_state, const GroupState& group_state,
DeferredLogger& deferred_logger);
Eval getPerfCellPressure(const FluidState& fs) const;
};
}

View File

@ -1024,6 +1024,20 @@ namespace Opm
}
}
}
template<typename TypeTag>
typename WellInterface<TypeTag>::Eval
WellInterface<TypeTag>::getPerfCellPressure(const typename WellInterface<TypeTag>::FluidState& fs) const
{
Eval pressure;
if (Indices::oilEnabled) {
pressure = fs.pressure(FluidSystem::oilPhaseIdx);
} else {
if (Indices::waterEnabled) {
pressure = fs.pressure(FluidSystem::waterPhaseIdx);
} else {
pressure = fs.pressure(FluidSystem::gasPhaseIdx);
}
}
return pressure;
}
} // namespace Opm