Implements a reordering transport solver for incompressible two-phase flow with polymer in the water phase. More...
#include <TransportSolverTwophaseCompressiblePolymer.hpp>
Classes | |
class | ResCOnCurve |
struct | ResidualC |
class | ResidualCGrav |
class | ResidualEquation |
struct | ResidualS |
class | ResidualSGrav |
class | ResSOnCurve |
Public Types | |
enum | SingleCellMethod { Bracketing, Newton, NewtonC, Gradient } |
enum | GradientMethod { Analytic, FinDif } |
Public Member Functions | |
TransportSolverTwophaseCompressiblePolymer (const UnstructuredGrid &grid, const BlackoilPropertiesInterface &props, const PolymerProperties &polyprops, const SingleCellMethod method, const double tol, const int maxit) | |
Construct solver. | |
void | setPreferredMethod (SingleCellMethod method) |
Set the preferred method, Bracketing or Newton. | |
void | solve (const double *darcyflux, const std::vector< double > &initial_pressure, const std::vector< double > &pressure, const std::vector< double > &temperature, const double *porevolume0, const double *porevolume, const double *source, const double *polymer_inflow_c, const double dt, std::vector< double > &saturation, std::vector< double > &surfacevol, std::vector< double > &concentration, std::vector< double > &cmax) |
Solve for saturation, concentration and cmax at next timestep. | |
void | initGravity (const double *grav) |
Initialise quantities needed by gravity solver. | |
void | solveGravity (const std::vector< std::vector< int > > &columns, const double dt, std::vector< double > &saturation, std::vector< double > &surfacevol, std::vector< double > &concentration, std::vector< double > &cmax) |
Solve for gravity segregation. | |
Friends | |
class | TransportSolverTwophaseCompressiblePolymer::ResidualEquation |
class | TransportSolverTwophaseCompressiblePolymer::ResSOnCurve |
class | TransportSolverTwophaseCompressiblePolymer::ResCOnCurve |
Implements a reordering transport solver for incompressible two-phase flow with polymer in the water phase.
Include permeability reduction effect.
Opm::TransportSolverTwophaseCompressiblePolymer::TransportSolverTwophaseCompressiblePolymer | ( | const UnstructuredGrid & | grid, | |
const BlackoilPropertiesInterface & | props, | |||
const PolymerProperties & | polyprops, | |||
const SingleCellMethod | method, | |||
const double | tol, | |||
const int | maxit | |||
) |
Construct solver.
[in] | grid | A 2d or 3d grid. |
[in] | props | Rock and fluid properties. |
[in] | polyprops | Polymer properties. |
[in] | rock_comp | Rock compressibility properties |
[in] | method | Bracketing: 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] | tol | Tolerance used in the solver. |
[in] | maxit | Maximum number of non-linear iterations used. |
void Opm::TransportSolverTwophaseCompressiblePolymer::initGravity | ( | const double * | grav | ) |
Initialise quantities needed by gravity solver.
[in] | grav | Gravity vector |
void Opm::TransportSolverTwophaseCompressiblePolymer::solve | ( | const double * | darcyflux, | |
const std::vector< double > & | initial_pressure, | |||
const std::vector< double > & | pressure, | |||
const std::vector< double > & | temperature, | |||
const double * | porevolume0, | |||
const double * | porevolume, | |||
const double * | source, | |||
const double * | polymer_inflow_c, | |||
const double | dt, | |||
std::vector< double > & | saturation, | |||
std::vector< double > & | surfacevol, | |||
std::vector< double > & | concentration, | |||
std::vector< double > & | cmax | |||
) |
Solve for saturation, concentration and cmax at next timestep.
Using implicit Euler scheme, reordered.
[in] | darcyflux | Array of signed face fluxes. |
[in] | initial_pressure | Array with pressure at start of timestep. |
[in] | pressure | Array with pressure. |
[in] | temperature | Array with temperature. |
[in] | porevolume0 | Array with pore volume at start of timestep. |
[in] | porevolume | Array with pore volume. |
[in] | source | Transport source term, to be interpreted by sign: (+) Inflow, value is first phase flow (water) per second, in *surface* volumes (unlike the incompressible version). (-) Outflow, value is total flow of all phases per second, in reservoir volumes. |
[in] | polymer_inflow_c | Array of inflow polymer concentrations per cell. |
[in] | dt | Time step. |
[in,out] | saturation | Phase saturations. |
[in,out] | surfacevol | Surface volumes. |
[in,out] | concentration | Polymer concentration. |
[in,out] | cmax | Highest concentration that has occured in a given cell. |
void Opm::TransportSolverTwophaseCompressiblePolymer::solveGravity | ( | const std::vector< std::vector< int > > & | columns, | |
const double | dt, | |||
std::vector< double > & | saturation, | |||
std::vector< double > & | surfacevol, | |||
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.
[in] | columns | Vector of cell-columns. |
[in] | dt | Time step. |
[in,out] | saturation | Phase saturations. |
[in,out] | surfacevol | Surface volumes. |
[in,out] | concentration | Polymer concentration. |
[in,out] | cmax | Highest concentration that has occured in a given cell. |