Opm::TransportSolverTwophasePolymer Class Reference

#include <TransportSolverTwophasePolymer.hpp>

Inheritance diagram for Opm::TransportSolverTwophasePolymer:
Inheritance graph

Public Types

enum  SingleCellMethod {
  Bracketing , Newton , Gradient , NewtonSimpleSC ,
  NewtonSimpleC
}
 
enum  GradientMethod { Analytic , FinDif }
 

Public Member Functions

 TransportSolverTwophasePolymer (const UnstructuredGrid &grid, const IncompPropertiesInterface &props, const PolymerProperties &polyprops, const SingleCellMethod method, const double tol, const int maxit)
 
void setPreferredMethod (SingleCellMethod method)
 Set the preferred method, Bracketing or Newton. More...
 
void solve (const double *darcyflux, const double *porevolume, const double *source, const double *polymer_inflow_c, const double dt, std::vector< double > &saturation, std::vector< double > &concentration, std::vector< double > &cmax)
 
void solveGravity (const std::vector< std::vector< int > > &columns, const double *porevolume, const double dt, std::vector< double > &saturation, std::vector< double > &concentration, std::vector< double > &cmax)
 
virtual void solveSingleCell (const int cell)
 
virtual void solveMultiCell (const int num_cells, const int *cells)
 
void solveSingleCellBracketing (int cell)
 
void solveSingleCellNewton (int cell)
 
void solveSingleCellGradient (int cell)
 
void solveSingleCellNewtonSimple (int cell, bool use_sc)
 
void initGravity (const double *grav)
 
void solveSingleCellGravity (const std::vector< int > &cells, const int pos, const double *gravflux)
 
int solveGravityColumn (const std::vector< int > &cells)
 
void scToc (const double *x, double *x_c) const
 

Detailed Description

Implements a reordering transport solver for incompressible two-phase flow with polymer in the water phase. \TODO Include permeability reduction effect.

Member Enumeration Documentation

◆ GradientMethod

Enumerator
Analytic 
FinDif 

◆ SingleCellMethod

Enumerator
Bracketing 
Newton 
Gradient 
NewtonSimpleSC 
NewtonSimpleC 

Constructor & Destructor Documentation

◆ TransportSolverTwophasePolymer()

Opm::TransportSolverTwophasePolymer::TransportSolverTwophasePolymer ( const UnstructuredGrid &  grid,
const IncompPropertiesInterface &  props,
const PolymerProperties polyprops,
const SingleCellMethod  method,
const double  tol,
const int  maxit 
)

Construct solver.

Parameters
[in]gridA 2d or 3d grid.
[in]propsRock and fluid properties.
[in]polypropsPolymer properties.
[in]methodBracketing: solve for c in outer loop, s in inner loop, each solve being bracketed for robustness. Newton: solve simultaneously for c and s with Newton's method. (using gradient variant and bracketing as fallbacks).
[in]tolTolerance used in the solver.
[in]maxitMaximum number of non-linear iterations used.

Member Function Documentation

◆ initGravity()

void Opm::TransportSolverTwophasePolymer::initGravity ( const double *  grav)

◆ scToc()

void Opm::TransportSolverTwophasePolymer::scToc ( const double *  x,
double *  x_c 
) const

◆ setPreferredMethod()

void Opm::TransportSolverTwophasePolymer::setPreferredMethod ( SingleCellMethod  method)

Set the preferred method, Bracketing or Newton.

◆ solve()

void Opm::TransportSolverTwophasePolymer::solve ( const double *  darcyflux,
const double *  porevolume,
const double *  source,
const double *  polymer_inflow_c,
const double  dt,
std::vector< double > &  saturation,
std::vector< double > &  concentration,
std::vector< double > &  cmax 
)

Solve for saturation, concentration and cmax at next timestep. Using implicit Euler scheme, reordered.

Parameters
[in]darcyfluxArray of signed face fluxes.
[in]porevolumeArray of pore volumes.
[in]sourceTransport source term, to be interpreted by sign: (+) Inflow, value is first phase flow (water) per second, in reservoir volumes. (-) Outflow, value is total flow of all phases per second, in reservoir volumes.
[in]polymer_inflow_cArray of inflow polymer concentrations per cell.
[in]dtTime step.
[in,out]saturationPhase saturations.
[in,out]concentrationPolymer concentration.
[in,out]cmaxHighest concentration that has occured in a given cell.

◆ solveGravity()

void Opm::TransportSolverTwophasePolymer::solveGravity ( const std::vector< std::vector< int > > &  columns,
const double *  porevolume,
const double  dt,
std::vector< double > &  saturation,
std::vector< double > &  concentration,
std::vector< double > &  cmax 
)

Solve for gravity segregation. This uses a column-wise nonlinear Gauss-Seidel approach. It assumes that the input columns contain cells in a single vertical stack, that do not interact with other columns (for gravity segregation.

Parameters
[in]columnsVector of cell-columns.
[in]porevolumeArray of pore volumes.
[in]dtTime step.
[in,out]saturationPhase saturations.
[in,out]concentrationPolymer concentration.
[in,out]cmaxHighest concentration that has occured in a given cell.

◆ solveGravityColumn()

int Opm::TransportSolverTwophasePolymer::solveGravityColumn ( const std::vector< int > &  cells)

◆ solveMultiCell()

virtual void Opm::TransportSolverTwophasePolymer::solveMultiCell ( const int  num_cells,
const int *  cells 
)
virtual

◆ solveSingleCell()

virtual void Opm::TransportSolverTwophasePolymer::solveSingleCell ( const int  cell)
virtual

◆ solveSingleCellBracketing()

void Opm::TransportSolverTwophasePolymer::solveSingleCellBracketing ( int  cell)

◆ solveSingleCellGradient()

void Opm::TransportSolverTwophasePolymer::solveSingleCellGradient ( int  cell)

◆ solveSingleCellGravity()

void Opm::TransportSolverTwophasePolymer::solveSingleCellGravity ( const std::vector< int > &  cells,
const int  pos,
const double *  gravflux 
)

◆ solveSingleCellNewton()

void Opm::TransportSolverTwophasePolymer::solveSingleCellNewton ( int  cell)

◆ solveSingleCellNewtonSimple()

void Opm::TransportSolverTwophasePolymer::solveSingleCellNewtonSimple ( int  cell,
bool  use_sc 
)

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