Opm::BlackoilPolymerModel< Grid > Class Template Reference

A model implementation for three-phase black oil with polymer. More...

#include <BlackoilPolymerModel.hpp>

Inheritance diagram for Opm::BlackoilPolymerModel< Grid >:
Opm::BlackoilModelBase< Grid, WellModel, Implementation >

Public Types

typedef BlackoilModelBase< Grid, StandardWells, BlackoilPolymerModel< Grid > > Base
 
typedef Base::ReservoirState ReservoirState
 
typedef Base::WellState WellState
 
- Public Types inherited from Opm::BlackoilModelBase< Grid, WellModel, Implementation >
typedef AutoDiffBlock< double > ADB
 
typedef ADB::V V
 
typedef ADB::M M
 
typedef Opm::FIPData FIPDataType
 
typedef ModelTraits< Implementation >::ReservoirState ReservoirState
 
typedef ModelTraits< Implementation >::WellState WellState
 
typedef ModelTraits< Implementation >::ModelParameters ModelParameters
 
typedef ModelTraits< Implementation >::SolutionState SolutionState
 
using RateConverterType = RateConverter::SurfaceToReservoirVoidage< BlackoilPropsAdFromDeck::FluidSystem, std::vector< int > >
 

Public Member Functions

 BlackoilPolymerModel (const typename Base::ModelParameters &param, const Grid &grid, const BlackoilPropsAdFromDeck &fluid, const DerivedGeology &geo, const RockCompressibility *rock_comp_props, const PolymerPropsAd &polymer_props_ad, const StandardWells &well_model, const NewtonIterationBlackoilInterface &linsolver, std::shared_ptr< const EclipseState > eclipseState, const bool has_disgas, const bool has_vapoil, const bool has_polymer, const bool has_plyshlog, const bool has_shrate, const std::vector< double > &wells_rep_radius, const std::vector< double > &wells_perf_length, const std::vector< double > &wells_bore_diameter, const bool terminal_output)
 Construct the model. More...
 
void prepareStep (const SimulatorTimerInterface &timer, const ReservoirState &reservoir_state, const WellState &well_state)
 Called once before each time step. More...
 
void afterStep (const SimulatorTimerInterface &timer, ReservoirState &reservoir_state, WellState &well_state)
 Called once after each time step. More...
 
void updateState (const V &dx, ReservoirState &reservoir_state, WellState &well_state)
 Apply an update to the primary variables, chopped if appropriate. More...
 
SimulatorReport assemble (const ReservoirState &reservoir_state, WellState &well_state, const bool initial_assembly)
 Assemble the residual and Jacobian of the nonlinear system. More...
 
- Public Member Functions inherited from Opm::BlackoilModelBase< Grid, WellModel, Implementation >
 BlackoilModelBase (const ModelParameters &param, const Grid &grid, const BlackoilPropsAdFromDeck &fluid, const DerivedGeology &geo, const RockCompressibility *rock_comp_props, const WellModel &well_model, const NewtonIterationBlackoilInterface &linsolver, std::shared_ptr< const EclipseState > eclState, const bool has_disgas, const bool has_vapoil, const bool terminal_output)
 Construct the model. More...
 
void setThresholdPressures (const std::vector< double > &threshold_pressures_by_face)
 Set threshold pressures that prevent or reduce flow. More...
 
void prepareStep (const SimulatorTimerInterface &timer, const ReservoirState &reservoir_state, const WellState &well_state)
 Called once before each time step. More...
 
template<class NonlinearSolverType >
SimulatorReport nonlinearIteration (const int iteration, const SimulatorTimerInterface &timer, NonlinearSolverType &nonlinear_solver, ReservoirState &reservoir_state, WellState &well_state)
 Called once per nonlinear iteration. More...
 
void afterStep (const SimulatorTimerInterface &timer, ReservoirState &reservoir_state, WellState &well_state)
 Called once after each time step. More...
 
SimulatorReport assemble (const ReservoirState &reservoir_state, WellState &well_state, const bool initial_assembly)
 Assemble the residual and Jacobian of the nonlinear system. More...
 
std::vector< double > computeResidualNorms () const
 Compute the residual norms of the mass balance for each phase, the well flux, and the well equation. More...
 
double relativeChange (const SimulationDataContainer &previous, const SimulationDataContainer &current) const
 compute the relative change between to simulation states
 
int sizeNonLinear () const
 The size (number of unknowns) of the nonlinear system of equations.
 
int linearIterationsLastSolve () const
 Number of linear iterations used in last call to solveJacobianSystem().
 
solveJacobianSystem () const
 Solve the Jacobian system Jx = r where J is the Jacobian and r is the residual. More...
 
void updateState (const V &dx, ReservoirState &reservoir_state, WellState &well_state)
 Apply an update to the primary variables, chopped if appropriate. More...
 
bool isParallel () const
 Return true if this is a parallel run.
 
bool terminalOutputEnabled () const
 Return true if output to cout is wanted.
 
bool getConvergence (const SimulatorTimerInterface &timer, const int iteration)
 Compute convergence based on total mass balance (tol_mb) and maximum residual mass balance (tol_cnv). More...
 
int numPhases () const
 The number of active fluid phases in the model.
 
int numMaterials () const
 The number of active materials in the model. More...
 
const std::string & materialName (int material_index) const
 The name of an active material in the model. More...
 
void updateEquationsScaling ()
 Update the scaling factors for mass balance equations.
 
WellModel & wellModel ()
 return the WellModel object
 
const WellModel & wellModel () const
 
const SimulatorDatagetSimulatorData (const SimulationDataContainer &) const
 Return reservoir simulation data (for output functionality)
 
FIPDataType getFIPData () const
 Return fluid-in-place data (for output functionality)
 
std::vector< std::vector< double > > computeFluidInPlace (const ReservoirState &x, const std::vector< int > &fipnum)
 Compute fluid in place. More...
 
void computeWellVoidageRates (const ReservoirState &reservoir_state, const WellState &well_state, std::vector< double > &well_voidage_rates, std::vector< double > &voidage_conversion_coeffs)
 Function to compute the resevoir voidage for the production wells. More...
 
void applyVREPGroupControl (const ReservoirState &reservoir_state, WellState &well_state)
 
const SimulatorReport & failureReport () const
 return the statistics if the nonlinearIteration() method failed. More...
 

Protected Types

enum  { Concentration = CanonicalVariablePositions::Next }
 
typedef Base::SolutionState SolutionState
 
typedef Base::DataBlock DataBlock
 
- Protected Types inherited from Opm::BlackoilModelBase< Grid, WellModel, Implementation >
typedef Eigen::Array< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > DataBlock
 

Protected Member Functions

void makeConstantState (SolutionState &state) const
 
std::vector< V > variableStateInitials (const ReservoirState &x, const WellState &xw) const
 
std::vector< int > variableStateIndices () const
 
SolutionState variableStateExtractVars (const ReservoirState &x, const std::vector< int > &indices, std::vector< ADB > &vars) const
 
void computeAccum (const SolutionState &state, const int aix)
 
void computeInjectionMobility (const SolutionState &state, std::vector< ADB > &mob_perfcells)
 
void assembleMassBalanceEq (const SolutionState &state)
 
void addWellContributionToMassBalanceEq (const std::vector< ADB > &cq_s, const SolutionState &state, WellState &xw)
 
void updateEquationsScaling ()
 
void computeMassFlux (const int actph, const V &transi, const ADB &kr, const ADB &mu, const ADB &rho, const ADB &p, const SolutionState &state)
 
void computeCmax (ReservoirState &state)
 
ADB computeMc (const SolutionState &state) const
 
const std::vector< PhasePresence > phaseCondition () const
 
void computeWaterShearVelocityFaces (const V &transi, const std::vector< ADB > &phasePressure, const SolutionState &state, std::vector< double > &water_vel, std::vector< double > &visc_mult)
 Computing the water velocity without shear-thinning for the cell faces. More...
 
void computeWaterShearVelocityWells (const SolutionState &state, WellState &xw, const ADB &cq_sw, std::vector< double > &water_vel_wells, std::vector< double > &visc_mult_wells)
 Computing the water velocity without shear-thinning for the well perforations based on the water flux rate. More...
 
- Protected Member Functions inherited from Opm::BlackoilModelBase< Grid, WellModel, Implementation >
Implementation & asImpl ()
 Access the most-derived class used for static polymorphism (CRTP). More...
 
const Implementation & asImpl () const
 Access the most-derived class used for static polymorphism (CRTP). More...
 
const Wells & wells () const
 return the Well struct in the WellModel
 
bool wellsActive () const
 return true if wells are available in the reservoir
 
bool localWellsActive () const
 return true if wells are available on this process
 
void makeConstantState (SolutionState &state) const
 
SolutionState variableState (const ReservoirState &x, const WellState &xw) const
 
std::vector< V > variableStateInitials (const ReservoirState &x, const WellState &xw) const
 
void variableReservoirStateInitials (const ReservoirState &x, std::vector< V > &vars0) const
 
std::vector< int > variableStateIndices () const
 
SolutionState variableStateExtractVars (const ReservoirState &x, const std::vector< int > &indices, std::vector< ADB > &vars) const
 
void computeAccum (const SolutionState &state, const int aix)
 
void assembleMassBalanceEq (const SolutionState &state)
 
SimulatorReport solveWellEq (const std::vector< ADB > &mob_perfcells, const std::vector< ADB > &b_perfcells, const ReservoirState &reservoir_state, SolutionState &state, WellState &well_state)
 
void addWellContributionToMassBalanceEq (const std::vector< ADB > &cq_s, const SolutionState &state, const WellState &xw)
 
bool getWellConvergence (const int iteration)
 
bool isVFPActive () const
 
std::vector< ADBcomputePressures (const ADB &po, const ADB &sw, const ADB &so, const ADB &sg) const
 
computeGasPressure (const V &po, const V &sw, const V &so, const V &sg) const
 
std::vector< ADBcomputeRelPerm (const SolutionState &state) const
 
void computeMassFlux (const int actph, const V &transi, const ADB &kr, const ADB &mu, const ADB &rho, const ADB &p, const SolutionState &state)
 
void applyThresholdPressures (ADB &dp)
 
ADB fluidViscosity (const int phase, const ADB &p, const ADB &temp, const ADB &rs, const ADB &rv, const std::vector< PhasePresence > &cond) const
 
ADB fluidReciprocFVF (const int phase, const ADB &p, const ADB &temp, const ADB &rs, const ADB &rv, const std::vector< PhasePresence > &cond) const
 
ADB fluidDensity (const int phase, const ADB &b, const ADB &rs, const ADB &rv) const
 
fluidRsSat (const V &p, const V &so, const std::vector< int > &cells) const
 
ADB fluidRsSat (const ADB &p, const ADB &so, const std::vector< int > &cells) const
 
fluidRvSat (const V &p, const V &so, const std::vector< int > &cells) const
 
ADB fluidRvSat (const ADB &p, const ADB &so, const std::vector< int > &cells) const
 
ADB poroMult (const ADB &p) const
 
ADB transMult (const ADB &p) const
 
const std::vector< PhasePresence > phaseCondition () const
 
void classifyCondition (const ReservoirState &state)
 
void updatePrimalVariableFromState (const ReservoirState &state)
 update the primal variable for Sg, Rv or Rs. More...
 
void updatePhaseCondFromPrimalVariable (const ReservoirState &state)
 Update the phaseCondition_ member based on the primalVariable_ member. More...
 
void computeWellConnectionPressures (const SolutionState &state, const WellState &well_state)
 
double convergenceReduction (const Eigen::Array< double, Eigen::Dynamic, Eigen::Dynamic > &B, const Eigen::Array< double, Eigen::Dynamic, Eigen::Dynamic > &tempV, const Eigen::Array< double, Eigen::Dynamic, Eigen::Dynamic > &R, std::vector< double > &R_sum, std::vector< double > &maxCoeff, std::vector< double > &B_avg, std::vector< double > &maxNormWell, int nc) const
 Compute the reduction within the convergence check. More...
 
void setupGroupControl (const ReservoirState &reservoir_state, WellState &well_state)
 Set up the group control related at the beginning of each time step.
 
double dpMaxRel () const
 
double dbhpMaxRel () const
 
double dsMax () const
 
double drMaxRel () const
 
double maxResidualAllowed () const
 

Protected Attributes

const PolymerPropsAdpolymer_props_ad_
 
const bool has_polymer_
 
const bool has_plyshlog_
 
const bool has_shrate_
 
const int poly_pos_
 
cmax_
 
std::vector< double > wells_rep_radius_
 
std::vector< double > wells_perf_length_
 
std::vector< double > wells_bore_diameter_
 
std::vector< double > shear_mult_faces_
 
std::vector< double > shear_mult_wells_
 
- Protected Attributes inherited from Opm::BlackoilModelBase< Grid, WellModel, Implementation >
SimulatorReport failureReport_
 
const Grid & grid_
 
const BlackoilPropsAdFromDeckfluid_
 
const DerivedGeologygeo_
 
const RockCompressibility * rock_comp_props_
 
VFPProperties vfp_properties_
 
const NewtonIterationBlackoilInterfacelinsolver_
 
const std::vector< bool > active_
 
const std::vector< int > canph_
 
const std::vector< int > cells_
 
HelperOps ops_
 
const bool has_disgas_
 
const bool has_vapoil_
 
ModelParameters param_
 
bool use_threshold_pressure_
 
threshold_pressures_by_connection_
 
SimulatorData sd_
 
std::vector< PhasePresence > phaseCondition_
 
WellModel well_model_
 
isRs_
 
isRv_
 
isSg_
 
LinearisedBlackoilResidual residual_
 
bool terminal_output_
 Whether we print something to std::cout.
 
int global_nc_
 The number of cells of the global grid.
 
pvdt_
 
std::vector< std::string > material_name_
 
std::vector< std::vector< double > > residual_norms_history_
 
double current_relaxation_
 
dx_old_
 
RateConverterType rate_converter_
 

Friends

class BlackoilModelBase< Grid, StandardWells, BlackoilPolymerModel< Grid > >
 

Detailed Description

template<class Grid>
class Opm::BlackoilPolymerModel< Grid >

A model implementation for three-phase black oil with polymer.

The simulator is capable of handling three-phase problems where gas can be dissolved in oil and vice versa, with polymer in the water phase. It uses an industry-standard TPFA discretization with per-phase upwind weighting of mobilities.

It uses automatic differentiation via the class AutoDiffBlock to simplify assembly of the jacobian matrix.

Constructor & Destructor Documentation

◆ BlackoilPolymerModel()

template<class Grid>
Opm::BlackoilPolymerModel< Grid >::BlackoilPolymerModel ( const typename Base::ModelParameters &  param,
const Grid &  grid,
const BlackoilPropsAdFromDeck fluid,
const DerivedGeology geo,
const RockCompressibility *  rock_comp_props,
const PolymerPropsAd polymer_props_ad,
const StandardWells well_model,
const NewtonIterationBlackoilInterface linsolver,
std::shared_ptr< const EclipseState >  eclipseState,
const bool  has_disgas,
const bool  has_vapoil,
const bool  has_polymer,
const bool  has_plyshlog,
const bool  has_shrate,
const std::vector< double > &  wells_rep_radius,
const std::vector< double > &  wells_perf_length,
const std::vector< double > &  wells_bore_diameter,
const bool  terminal_output 
)

Construct the model.

It will retain references to the arguments of this functions, and they are expected to remain in scope for the lifetime of the solver.

Parameters
[in]paramparameters
[in]gridgrid data structure
[in]fluidfluid properties
[in]georock properties
[in]rock_comp_propsif non-null, rock compressibility properties
[in]wellswell structure
[in]linsolverlinear solver
[in]has_disgasturn on dissolved gas
[in]has_vapoilturn on vaporized oil feature
[in]has_polymerturn on polymer feature
[in]has_plyshlogtrue when PLYSHLOG keyword available
[in]has_shratetrue when PLYSHLOG keyword available
[in]wells_rep_radiusrepresentative radius of well perforations during shear effects calculation
[in]wells_perf_lengthperforation length for well perforations
[in]wells_bore_diameterwellbore diameters for well performations
[in]terminal_outputrequest output to cout/cerr

Member Function Documentation

◆ afterStep()

template<class Grid >
void Opm::BlackoilPolymerModel< Grid >::afterStep ( const SimulatorTimerInterface timer,
ReservoirState &  reservoir_state,
WellState &  well_state 
)

Called once after each time step.

Parameters
[in]timersimulation timer
[in,out]reservoir_statereservoir state variables
[in,out]well_statewell state variables

◆ assemble()

template<class Grid >
SimulatorReport Opm::BlackoilPolymerModel< Grid >::assemble ( const ReservoirState &  reservoir_state,
WellState &  well_state,
const bool  initial_assembly 
)

Assemble the residual and Jacobian of the nonlinear system.

Parameters
[in]reservoir_statereservoir state variables
[in,out]well_statewell state variables
[in]initial_assemblypass true if this is the first call to assemble() in this timestep

◆ computeWaterShearVelocityFaces()

template<class Grid >
void Opm::BlackoilPolymerModel< Grid >::computeWaterShearVelocityFaces ( const V &  transi,
const std::vector< ADB > &  phasePressure,
const SolutionState &  state,
std::vector< double > &  water_vel,
std::vector< double > &  visc_mult 
)
protected

Computing the water velocity without shear-thinning for the cell faces.

The water velocity will be used for shear-thinning calculation.

◆ computeWaterShearVelocityWells()

template<class Grid >
void Opm::BlackoilPolymerModel< Grid >::computeWaterShearVelocityWells ( const SolutionState &  state,
WellState &  xw,
const ADB cq_sw,
std::vector< double > &  water_vel_wells,
std::vector< double > &  visc_mult_wells 
)
protected

Computing the water velocity without shear-thinning for the well perforations based on the water flux rate.

The water velocity will be used for shear-thinning calculation.

◆ prepareStep()

template<class Grid >
void Opm::BlackoilPolymerModel< Grid >::prepareStep ( const SimulatorTimerInterface timer,
const ReservoirState &  reservoir_state,
const WellState &  well_state 
)

Called once before each time step.

Parameters
[in]timersimulation timer
[in,out]reservoir_statereservoir state variables
[in,out]well_statewell state variables

◆ updateState()

template<class Grid >
void Opm::BlackoilPolymerModel< Grid >::updateState ( const V &  dx,
ReservoirState &  reservoir_state,
WellState &  well_state 
)

Apply an update to the primary variables, chopped if appropriate.

Parameters
[in]dxupdates to apply to primary variables
[in,out]reservoir_statereservoir state variables
[in,out]well_statewell state variables

The documentation for this class was generated from the following files: