mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
MultisegmentWell: move processFractions to MultisegmentWellPrimaryVariables
This commit is contained in:
parent
5212e9c100
commit
6404d69201
@ -171,76 +171,6 @@ getWellConvergence(const WellState& well_state,
|
||||
return report;
|
||||
}
|
||||
|
||||
template<typename FluidSystem, typename Indices, typename Scalar>
|
||||
void
|
||||
MultisegmentWellEval<FluidSystem,Indices,Scalar>::
|
||||
processFractions(const int seg)
|
||||
{
|
||||
static constexpr int Water = BlackoilPhases::Aqua;
|
||||
static constexpr int Oil = BlackoilPhases::Liquid;
|
||||
static constexpr int Gas = BlackoilPhases::Vapour;
|
||||
|
||||
const PhaseUsage& pu = baseif_.phaseUsage();
|
||||
|
||||
std::vector<double> fractions(baseif_.numPhases(), 0.0);
|
||||
|
||||
assert( FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) );
|
||||
const int oil_pos = pu.phase_pos[Oil];
|
||||
fractions[oil_pos] = 1.0;
|
||||
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx) ) {
|
||||
const int water_pos = pu.phase_pos[Water];
|
||||
fractions[water_pos] = primary_variables_.value_[seg][WFrac];
|
||||
fractions[oil_pos] -= fractions[water_pos];
|
||||
}
|
||||
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx) ) {
|
||||
const int gas_pos = pu.phase_pos[Gas];
|
||||
fractions[gas_pos] = primary_variables_.value_[seg][GFrac];
|
||||
fractions[oil_pos] -= fractions[gas_pos];
|
||||
}
|
||||
|
||||
if (FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx)) {
|
||||
const int water_pos = pu.phase_pos[Water];
|
||||
if (fractions[water_pos] < 0.0) {
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx) ) {
|
||||
fractions[pu.phase_pos[Gas]] /= (1.0 - fractions[water_pos]);
|
||||
}
|
||||
fractions[oil_pos] /= (1.0 - fractions[water_pos]);
|
||||
fractions[water_pos] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
if (FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx)) {
|
||||
const int gas_pos = pu.phase_pos[Gas];
|
||||
if (fractions[gas_pos] < 0.0) {
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx) ) {
|
||||
fractions[pu.phase_pos[Water]] /= (1.0 - fractions[gas_pos]);
|
||||
}
|
||||
fractions[oil_pos] /= (1.0 - fractions[gas_pos]);
|
||||
fractions[gas_pos] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
if (fractions[oil_pos] < 0.0) {
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx) ) {
|
||||
fractions[pu.phase_pos[Water]] /= (1.0 - fractions[oil_pos]);
|
||||
}
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx) ) {
|
||||
fractions[pu.phase_pos[Gas]] /= (1.0 - fractions[oil_pos]);
|
||||
}
|
||||
fractions[oil_pos] = 0.0;
|
||||
}
|
||||
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx) ) {
|
||||
primary_variables_.value_[seg][WFrac] = fractions[pu.phase_pos[Water]];
|
||||
}
|
||||
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx) ) {
|
||||
primary_variables_.value_[seg][GFrac] = fractions[pu.phase_pos[Gas]];
|
||||
}
|
||||
}
|
||||
|
||||
template<typename FluidSystem, typename Indices, typename Scalar>
|
||||
void
|
||||
MultisegmentWellEval<FluidSystem,Indices,Scalar>::
|
||||
@ -265,7 +195,7 @@ updatePrimaryVariablesNewton(const BVectorWell& dwells,
|
||||
}
|
||||
|
||||
// handling the overshooting or undershooting of the fractions
|
||||
processFractions(seg);
|
||||
primary_variables_.processFractions(seg);
|
||||
|
||||
// update the segment pressure
|
||||
{
|
||||
|
@ -131,9 +131,6 @@ protected:
|
||||
const double relaxed_inner_tolerance_pressure_ms_well,
|
||||
const bool relax_tolerance) const;
|
||||
|
||||
// handling the overshooting and undershooting of the fractions
|
||||
void processFractions(const int seg);
|
||||
|
||||
void updateUpwindingSegments();
|
||||
|
||||
// updating the well_state based on well solution dwells
|
||||
|
@ -142,6 +142,75 @@ update(const WellState& well_state)
|
||||
}
|
||||
}
|
||||
|
||||
template<class FluidSystem, class Indices, class Scalar>
|
||||
void MultisegmentWellPrimaryVariables<FluidSystem,Indices,Scalar>::
|
||||
processFractions(const int seg)
|
||||
{
|
||||
static constexpr int Water = BlackoilPhases::Aqua;
|
||||
static constexpr int Oil = BlackoilPhases::Liquid;
|
||||
static constexpr int Gas = BlackoilPhases::Vapour;
|
||||
|
||||
const PhaseUsage& pu = well_.phaseUsage();
|
||||
|
||||
std::vector<double> fractions(well_.numPhases(), 0.0);
|
||||
|
||||
assert(FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx));
|
||||
const int oil_pos = pu.phase_pos[Oil];
|
||||
fractions[oil_pos] = 1.0;
|
||||
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx) ) {
|
||||
const int water_pos = pu.phase_pos[Water];
|
||||
fractions[water_pos] = value_[seg][WFrac];
|
||||
fractions[oil_pos] -= fractions[water_pos];
|
||||
}
|
||||
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx) ) {
|
||||
const int gas_pos = pu.phase_pos[Gas];
|
||||
fractions[gas_pos] = value_[seg][GFrac];
|
||||
fractions[oil_pos] -= fractions[gas_pos];
|
||||
}
|
||||
|
||||
if (FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx)) {
|
||||
const int water_pos = pu.phase_pos[Water];
|
||||
if (fractions[water_pos] < 0.0) {
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx) ) {
|
||||
fractions[pu.phase_pos[Gas]] /= (1.0 - fractions[water_pos]);
|
||||
}
|
||||
fractions[oil_pos] /= (1.0 - fractions[water_pos]);
|
||||
fractions[water_pos] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
if (FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx)) {
|
||||
const int gas_pos = pu.phase_pos[Gas];
|
||||
if (fractions[gas_pos] < 0.0) {
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx) ) {
|
||||
fractions[pu.phase_pos[Water]] /= (1.0 - fractions[gas_pos]);
|
||||
}
|
||||
fractions[oil_pos] /= (1.0 - fractions[gas_pos]);
|
||||
fractions[gas_pos] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
if (fractions[oil_pos] < 0.0) {
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx) ) {
|
||||
fractions[pu.phase_pos[Water]] /= (1.0 - fractions[oil_pos]);
|
||||
}
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx) ) {
|
||||
fractions[pu.phase_pos[Gas]] /= (1.0 - fractions[oil_pos]);
|
||||
}
|
||||
fractions[oil_pos] = 0.0;
|
||||
}
|
||||
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx) ) {
|
||||
value_[seg][WFrac] = fractions[pu.phase_pos[Water]];
|
||||
}
|
||||
|
||||
if ( FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx) ) {
|
||||
value_[seg][GFrac] = fractions[pu.phase_pos[Gas]];
|
||||
}
|
||||
}
|
||||
|
||||
#define INSTANCE(...) \
|
||||
template class MultisegmentWellPrimaryVariables<BlackOilFluidSystem<double,BlackOilDefaultIndexTraits>,__VA_ARGS__,double>;
|
||||
|
||||
|
@ -90,6 +90,9 @@ public:
|
||||
// the Evaluation for the well primary variables, which contain derivativles and are used in AD calculation
|
||||
std::vector<std::array<EvalWell, numWellEq> > evaluation_;
|
||||
|
||||
//! \brief Handle non-reasonable fractions due to numerical overshoot.
|
||||
void processFractions(const int seg);
|
||||
|
||||
private:
|
||||
const WellInterfaceIndices<FluidSystem,Indices,Scalar>& well_; //!< Reference to well interface
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user