mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
WIP in storing the filtration_particle_volume in BlackoilWellModelGeneric
instead of PerfData to handle the situation that well can be SHUT and OPEN again.
This commit is contained in:
parent
274c431492
commit
cb74d26e85
@ -1421,6 +1421,21 @@ void BlackoilWellModelGeneric::initInjMult() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void BlackoilWellModelGeneric::updateFiltrationParticleVolume(const double dt, const size_t water_index) {
|
||||
for (auto& well : this->well_container_generic_) {
|
||||
if (well->isInjector() && well->wellEcl().getFilterConc() > 0.) {
|
||||
auto &values = this->filtration_particle_volume_[well->name()];
|
||||
const auto& ws = this->wellState().well(well->indexOfWell());
|
||||
if (values.empty()) {
|
||||
values.assign(ws.perf_data.size(), 0.); // initializing to be zero
|
||||
}
|
||||
well->updateFiltrationParticleVolume(dt, water_index, this->wellState(), values);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void BlackoilWellModelGeneric::updateInjMult(DeferredLogger& deferred_logger) {
|
||||
for (const auto& well : this->well_container_generic_) {
|
||||
if (well->isInjector() && well->wellEcl().getInjMultMode() != Well::InjMultMode::NONE) {
|
||||
|
@ -376,6 +376,8 @@ protected:
|
||||
|
||||
void updateInjMult(DeferredLogger& deferred_logger);
|
||||
|
||||
void updateFiltrationParticleVolume(const double dt, const size_t water_index);
|
||||
|
||||
// create the well container
|
||||
virtual void createWellContainer(const int time_step) = 0;
|
||||
virtual void initWellContainer(const int reportStepIdx) = 0;
|
||||
@ -438,6 +440,9 @@ protected:
|
||||
// previous injection multiplier, it is used in the injection multiplier calculation for WINJMULT keyword
|
||||
std::unordered_map<std::string, std::vector<double>> prev_inj_multipliers_;
|
||||
|
||||
// the volume of the filtration particles during water injection
|
||||
std::unordered_map<std::string, std::vector<double>> filtration_particle_volume_;
|
||||
|
||||
/*
|
||||
The various wellState members should be accessed and modified
|
||||
through the accessor functions wellState(), prevWellState(),
|
||||
|
@ -312,9 +312,11 @@ namespace Opm {
|
||||
|
||||
for (auto& well : well_container_) {
|
||||
if (well->isInjector()) {
|
||||
const auto& ws = this->wellState().well(well->indexOfWell());
|
||||
const auto& filtration_particle_volume = ws.perf_data.filtration_particle_volume;
|
||||
well->updateInjFCMult(filtration_particle_volume);
|
||||
const auto it = this->filtration_particle_volume_.find(well->name());
|
||||
if (it != this->filtration_particle_volume_.end()) {
|
||||
const auto& filtration_particle_volume = it->second;
|
||||
well->updateInjFCMult(filtration_particle_volume);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -480,10 +482,10 @@ namespace Opm {
|
||||
if (getPropValue<TypeTag, Properties::EnablePolymerMW>() && well->isInjector()) {
|
||||
well->updateWaterThroughput(dt, this->wellState());
|
||||
}
|
||||
}
|
||||
|
||||
if (well->isInjector() && Indices::waterEnabled) {
|
||||
well->updateFiltrationParticleVolume(dt, FluidSystem::waterPhaseIdx, this->wellState());
|
||||
}
|
||||
if (Indices::waterEnabled) {
|
||||
this->updateFiltrationParticleVolume(dt, FluidSystem::waterPhaseIdx);
|
||||
}
|
||||
|
||||
// at the end of the time step, updating the inj_multiplier saved in WellState for later use
|
||||
|
@ -46,7 +46,6 @@ PerfData::PerfData(std::size_t num_perf, double pressure_first_connection_, bool
|
||||
this->water_throughput.resize(num_perf);
|
||||
this->skin_pressure.resize(num_perf);
|
||||
this->water_velocity.resize(num_perf);
|
||||
this->filtration_particle_volume.resize(num_perf);
|
||||
}
|
||||
}
|
||||
|
||||
@ -98,7 +97,6 @@ bool PerfData::try_assign(const PerfData& other) {
|
||||
this->water_throughput = other.water_throughput;
|
||||
this->skin_pressure = other.skin_pressure;
|
||||
this->water_velocity = other.water_velocity;
|
||||
this->filtration_particle_volume = other.filtration_particle_volume;
|
||||
this->prod_index = other.prod_index;
|
||||
this->micp_rates = other.micp_rates;
|
||||
return true;
|
||||
|
@ -84,18 +84,6 @@ public:
|
||||
std::vector<double> water_throughput;
|
||||
std::vector<double> skin_pressure;
|
||||
std::vector<double> water_velocity;
|
||||
|
||||
// This is the accumulated water injection volume
|
||||
// At the moment, it will only be used for the filtration cake modeling
|
||||
// TODO: it might be problematic to handle the well open and shut, connection open and shut, since the
|
||||
// information in PerfData will disappear if the well is SHUT
|
||||
// TODO: if the injection concentration change, only the water injection volume will not be enough to
|
||||
// calculate the formation of the filter cake.
|
||||
// TODO: will change to track the volume of the solid formed during the injection
|
||||
// because the injection concentration may vary during the simulation, we track the solid particle volume
|
||||
// instead of tracking the water injection volume
|
||||
// std::vector<double> water_injection_volume;
|
||||
std::vector<double> filtration_particle_volume;
|
||||
};
|
||||
|
||||
} // namespace Opm
|
||||
|
@ -719,7 +719,8 @@ checkNegativeWellPotentials(std::vector<double>& well_potentials,
|
||||
}
|
||||
|
||||
void WellInterfaceGeneric::
|
||||
updateFiltrationParticleVolume(const double dt, const size_t water_index, WellState& well_state) const
|
||||
updateFiltrationParticleVolume(const double dt, const size_t water_index,
|
||||
const WellState& well_state, std::vector<double>& filtration_particle_volume) const
|
||||
{
|
||||
if (!this->isInjector()) {
|
||||
return;
|
||||
@ -738,8 +739,6 @@ updateFiltrationParticleVolume(const double dt, const size_t water_index, WellSt
|
||||
// it is currently used for the filter cake modeling related to formation damage study
|
||||
auto& ws = well_state.well(this->index_of_well_);
|
||||
const auto& connection_rates = ws.perf_data.phase_rates;
|
||||
// per connection
|
||||
auto& filtration_particle_volume = ws.perf_data.filtration_particle_volume;
|
||||
|
||||
const size_t np = well_state.numPhases();
|
||||
for (int perf = 0; perf < this->number_of_perforations_; ++perf) {
|
||||
|
@ -189,7 +189,8 @@ public:
|
||||
double getInjMult(const int perf, const double bhp, const double perf_pres) const;
|
||||
|
||||
// update the water injection volume, it will be used for calculation related to cake filtration due to injection activity
|
||||
void updateFiltrationParticleVolume(const double dt, const size_t water_index, WellState& well_state) const;
|
||||
void updateFiltrationParticleVolume(const double dt, const size_t water_index,
|
||||
const WellState& well_state, std::vector<double>& filtration_particle_volume) const;
|
||||
|
||||
// update the multiplier for well transmissbility due to cake filteration
|
||||
void updateInjFCMult(const std::vector<double>& filtration_particle_volume);
|
||||
@ -376,7 +377,7 @@ protected:
|
||||
std::vector<double> prev_inj_multiplier_;
|
||||
|
||||
// the multiplier due to injection filtration cake
|
||||
mutable std::vector<double> inj_fc_multiplier_;
|
||||
std::vector<double> inj_fc_multiplier_;
|
||||
|
||||
double well_efficiency_factor_;
|
||||
const VFPProperties* vfp_properties_;
|
||||
|
Loading…
Reference in New Issue
Block a user