mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Update collection of wells after ACTIONX
This commit is contained in:
parent
5fe43c09cb
commit
98f6a9a7ac
@ -45,6 +45,7 @@
|
||||
#include <dune/geometry/referenceelements.hh>
|
||||
|
||||
#include <map>
|
||||
#include <unordered_set>
|
||||
|
||||
namespace Opm {
|
||||
|
||||
@ -1449,8 +1450,8 @@ protected:
|
||||
|
||||
|
||||
void
|
||||
updateEclWell(int, const std::string&) {
|
||||
throw std::logic_error("updateEclWell() method not implemented for class eclpeacemanwell");
|
||||
updateEclWells(int, const std::unordered_set<std::string>&) {
|
||||
throw std::logic_error("updateEclWells() method not implemented for class eclpeacemanwell");
|
||||
}
|
||||
|
||||
|
||||
|
@ -1393,14 +1393,10 @@ public:
|
||||
|
||||
const auto& wellpi = this->fetchWellPI(reportStep, *action, schedule, matching_wells);
|
||||
|
||||
schedule.applyAction(reportStep, Opm::TimeService::from_time_t(simTime), *action, actionResult, wellpi);
|
||||
auto affected_wells = schedule.applyAction(reportStep, Opm::TimeService::from_time_t(simTime), *action, actionResult, wellpi);
|
||||
actionState.add_run(*action, simTime);
|
||||
this->wellModel_.updateEclWells(reportStep, affected_wells);
|
||||
|
||||
for ( const auto& [wname, _] : wellpi) {
|
||||
(void)_;
|
||||
if (this->wellModel_.hasWell(wname))
|
||||
this->wellModel_.updateEclWell(reportStep, wname);
|
||||
}
|
||||
} else {
|
||||
std::string msg = "The action: " + action->name() + " evaluated to false at " + ts;
|
||||
Opm::OpmLog::info(msg);
|
||||
|
@ -51,6 +51,7 @@
|
||||
#include <dune/grid/common/gridenums.hh>
|
||||
|
||||
#include <map>
|
||||
#include <unordered_set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
@ -658,7 +659,7 @@ public:
|
||||
|
||||
|
||||
void
|
||||
updateEclWell(int, const std::string&) {
|
||||
updateEclWells(int, const std::unordered_set<std::string>&) {
|
||||
throw std::logic_error("wellPI() method not implemented for class eclwellmanager");
|
||||
}
|
||||
|
||||
|
@ -365,7 +365,7 @@ namespace Opm {
|
||||
/// Returns true if the well was actually found and shut.
|
||||
bool forceShutWellByNameIfPredictionMode(const std::string& wellname, const double simulation_time);
|
||||
|
||||
void updateEclWell(const int timeStepIdx, const std::string& wname);
|
||||
void updateEclWells(const int timeStepIdx, const std::unordered_set<std::string>& wells);
|
||||
bool hasWell(const std::string& wname);
|
||||
double wellPI(const int well_index) const;
|
||||
double wellPI(const std::string& well_name) const;
|
||||
|
@ -2628,25 +2628,32 @@ namespace Opm {
|
||||
template<typename TypeTag>
|
||||
void
|
||||
BlackoilWellModel<TypeTag>::
|
||||
updateEclWell(const int timeStepIdx, const std::string& wname)
|
||||
{
|
||||
auto well_iter = std::find_if(this->wells_ecl_.begin(), this->wells_ecl_.end(),
|
||||
[&wname](const auto& well) -> bool
|
||||
{
|
||||
return well.name() == wname;
|
||||
});
|
||||
updateEclWells(const int timeStepIdx, const std::unordered_set<std::string>& wells) {
|
||||
const auto& schedule = this->ebosSimulator_.vanguard().schedule();
|
||||
for (const auto& wname : wells) {
|
||||
auto well_iter = std::find_if( this->wells_ecl_.begin(), this->wells_ecl_.end(), [wname] (const auto& well) -> bool { return well.name() == wname;});
|
||||
if (well_iter != this->wells_ecl_.end()) {
|
||||
auto well_index = std::distance( this->wells_ecl_.begin(), well_iter );
|
||||
this->wells_ecl_[well_index] = schedule.getWell(wname, timeStepIdx);
|
||||
|
||||
if (well_iter == this->wells_ecl_.end()) {
|
||||
throw std::logic_error { "Could not find well: " + wname };
|
||||
const auto& well = this->wells_ecl_[well_index];
|
||||
auto& pd = this->well_perf_data_[well_index];
|
||||
auto pdIter = pd.begin();
|
||||
for (const auto& conn : well.getConnections()) {
|
||||
if (conn.state() != Connection::State::SHUT) {
|
||||
pdIter->connection_transmissibility_factor = conn.CF();
|
||||
++pdIter;
|
||||
}
|
||||
}
|
||||
this->wellState().updateStatus(well_index, well.getStatus());
|
||||
this->wellState().resetConnectionTransFactors(well_index, pd);
|
||||
this->prod_index_calc_[well_index].reInit(well);
|
||||
}
|
||||
}
|
||||
|
||||
auto well_index = std::distance(this->wells_ecl_.begin(), well_iter);
|
||||
this->updateEclWell(timeStepIdx, well_index);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
template<typename TypeTag>
|
||||
double
|
||||
BlackoilWellModel<TypeTag>::
|
||||
@ -2753,7 +2760,7 @@ namespace Opm {
|
||||
++pdIter;
|
||||
}
|
||||
}
|
||||
this->well_state_.resetConnectionTransFactors(well_index, pd);
|
||||
this->wellState().resetConnectionTransFactors(well_index, pd);
|
||||
this->prod_index_calc_[well_index].reInit(well);
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user