mirror of
https://github.com/OPM/opm-simulators.git
synced 2024-12-28 18:21:00 -06:00
set the Rv and Rs factors to the saturated values for cells which have no gas and no oil
the purpose of this is to get a more defined behaviour when doing the gravity correction/upstream cell determination in the flux term. I consider this to be just a kludge, so if anyone has a better idea of what the composition for the non-existing gas and oil phases is, please tell me. (note that generic compositional models do not exhibit this issue because the composition of all fluids is always fully defined because each component is assumed to dissolve in every phase.)
This commit is contained in:
parent
39647c6ad3
commit
5b40f3e643
@ -25,7 +25,7 @@
|
||||
#include <opm/core/grid/GridHelpers.hpp>
|
||||
#include <opm/core/simulator/EquilibrationHelpers.hpp>
|
||||
#include <opm/core/simulator/BlackoilState.hpp>
|
||||
#include <opm/core/props/BlackoilPropertiesInterface.hpp>
|
||||
#include <opm/core/props/BlackoilPropertiesFromDeck.hpp>
|
||||
#include <opm/core/props/BlackoilPhases.hpp>
|
||||
#include <opm/core/utility/RegionMapping.hpp>
|
||||
#include <opm/core/utility/Units.hpp>
|
||||
@ -163,7 +163,7 @@ namespace Opm
|
||||
phaseSaturations(const Grid& grid,
|
||||
const Region& reg,
|
||||
const CellRange& cells,
|
||||
BlackoilPropertiesInterface& props,
|
||||
BlackoilPropertiesFromDeck& props,
|
||||
const std::vector<double> swat_init,
|
||||
std::vector< std::vector<double> >& phase_pressures);
|
||||
|
||||
|
@ -885,7 +885,7 @@ namespace Opm
|
||||
*/
|
||||
template<class Grid>
|
||||
void initStateEquil(const Grid& grid,
|
||||
BlackoilPropertiesInterface& props,
|
||||
BlackoilPropertiesFromDeck& props,
|
||||
const Opm::DeckConstPtr deck,
|
||||
const Opm::EclipseStateConstPtr eclipseState,
|
||||
const double gravity,
|
||||
@ -901,6 +901,36 @@ namespace Opm
|
||||
state.saturation() = Details::convertSats(isc.saturation());
|
||||
state.gasoilratio() = isc.rs();
|
||||
state.rv() = isc.rv();
|
||||
|
||||
// set the Rs and Rv factors to the saturated ones if both the gas and the oil
|
||||
// saturations are zero. in most cases this does not matter, but when doing the
|
||||
// gravity correction (in particular, when determining the upstream direction) it
|
||||
// does.
|
||||
if (pu.phase_used[BlackoilPhases::Liquid] && pu.phase_used[BlackoilPhases::Vapour]) {
|
||||
const int posOil = pu.phase_pos[BlackoilPhases::Liquid];
|
||||
const int posGas = pu.phase_pos[BlackoilPhases::Vapour];
|
||||
for (unsigned cellIdx = 0; cellIdx < state.pressure().size(); ++ cellIdx) {
|
||||
const double so = isc.saturation()[posOil][cellIdx];
|
||||
const double sg = isc.saturation()[posGas][cellIdx];
|
||||
|
||||
if (so <= 0.0 && sg <= 0.0) {
|
||||
int pvtRegionIdx = props.cellPvtRegionIndex()[cellIdx];
|
||||
const double po = state.pressure()[cellIdx];
|
||||
const double pg = po; // hack: include capillary pressure!
|
||||
const double T = 273.15 + 25.0; // does not matter for isothermal simulations!
|
||||
const double rsSat = props.oilPvt().saturatedGasDissolutionFactor(pvtRegionIdx,
|
||||
T,
|
||||
pg);
|
||||
const double rvSat = props.gasPvt().saturatedOilVaporizationFactor(pvtRegionIdx,
|
||||
T,
|
||||
po);
|
||||
|
||||
state.gasoilratio()[cellIdx] = rsSat;
|
||||
state.rv()[cellIdx] = rvSat;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
initBlackoilSurfvolUsingRSorRV(UgGridHelpers::numCells(grid), props, state);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user