Implements gas lift optimization for groups.

Extends PR #2824 to include support for GLIFTOPT (item 2, maximum lift
gas supply for a group) and group production constraints.

The optimization is split into two phases. First the wells are optimized
separately (as in PR #2824). In this phase LIFTOPT and WLIFTOPT constraints
(e.g. maxmimum lift gas injection for a well, minimum economic gradient) are
considered together with well production constraints.

Then, in the next phase the wells are optimized in groups. Here, the ALQ
distribution from the first phase is used as a starting point. If a group
has any production rate constraints, and/or a limit on its total rate of
lift gas supply, lift gas is redistributed to the wells that gain the most
benefit from it by considering which wells that currently has the largest
weighted incremental gradient (i.e. increase in oil rate compared to
increase in ALQ).
This commit is contained in:
Håkon Hægland
2021-03-03 13:59:26 +01:00
parent 41063bc735
commit 434640fdf5
16 changed files with 3185 additions and 1012 deletions

View File

@@ -41,6 +41,15 @@
#include <opm/simulators/wells/WellGroupHelpers.hpp>
#include <opm/simulators/wells/WellProdIndexCalculator.hpp>
#include <opm/simulators/wells/WellStateFullyImplicitBlackoil.hpp>
// NOTE: GasLiftSingleWell.hpp includes StandardWell.hpp which includes ourself
// (WellInterface.hpp), so we need to forward declare GasLiftSingleWell
// for it to be defined in this file. Similar for BlackoilWellModel
namespace Opm {
template<typename TypeTag> class GasLiftSingleWell;
template<typename TypeTag> class BlackoilWellModel;
}
#include <opm/simulators/wells/GasLiftSingleWell.hpp>
#include <opm/simulators/wells/BlackoilWellModel.hpp>
#include <opm/simulators/flow/BlackoilModelParametersEbos.hpp>
#include <opm/simulators/timestepping/ConvergenceReport.hpp>
@@ -83,6 +92,11 @@ namespace Opm
using MaterialLaw = GetPropType<TypeTag, Properties::MaterialLaw>;
using SparseMatrixAdapter = GetPropType<TypeTag, Properties::SparseMatrixAdapter>;
using RateVector = GetPropType<TypeTag, Properties::RateVector>;
using GasLiftSingleWell = Opm::GasLiftSingleWell<TypeTag>;
using GLiftOptWells = typename Opm::BlackoilWellModel<TypeTag>::GLiftOptWells;
using GLiftProdWells = typename Opm::BlackoilWellModel<TypeTag>::GLiftProdWells;
using GLiftWellStateMap =
typename Opm::BlackoilWellModel<TypeTag>::GLiftWellStateMap;
static const int numEq = Indices::numEq;
static const int numPhases = Indices::numPhases;
@@ -174,10 +188,13 @@ namespace Opm
Opm::DeferredLogger& deferred_logger
) = 0;
virtual void maybeDoGasLiftOptimization (
virtual void gasLiftOptimizationStage1 (
WellState& well_state,
const Simulator& ebosSimulator,
DeferredLogger& deferred_logger
DeferredLogger& deferred_logger,
GLiftProdWells& prod_wells,
GLiftOptWells& glift_wells,
GLiftWellStateMap& state_map
) const = 0;
void updateWellTestState(const WellState& well_state,
@@ -324,6 +341,7 @@ namespace Opm
WellState& well_state,
Opm::DeferredLogger& deferred_logger);
const PhaseUsage& phaseUsage() const;
protected:
@@ -435,8 +453,6 @@ namespace Opm
bool changed_to_stopped_this_step_ = false;
const PhaseUsage& phaseUsage() const;
int flowPhaseToEbosCompIdx( const int phaseIdx ) const;
int flowPhaseToEbosPhaseIdx( const int phaseIdx ) const;