Compositional Transport step in a Finite Volume discretization for a adaptive 2D-grid. More...
#include <dumux/porousmediumflow/2p2c/sequential/fv2dtransportadaptive.hh>
Compositional Transport step in a Finite Volume discretization for a adaptive 2D-grid.
The finite volume model for the solution of the transport equation for compositional two-phase flow.
\frac{\partial C^\kappa}{\partial t} = - \nabla \cdot \left( \sum_{\alpha} X^{\kappa}_{\alpha} \varrho_{alpha} \bf{v}_{\alpha}\right) + q^{\kappa},
where \bf{v}_{\alpha} = - \lambda_{\alpha} \bf{K} \left(\nabla p_{\alpha} + \rho_{\alpha} \bf{g} \right) . p_{\alpha} denotes the phase pressure, \bf{K} the absolute permeability, \lambda_{\alpha} the phase mobility, \rho_{\alpha} the phase density and \bf{g} the gravity constant and C^{\kappa} the total Component concentration.
TypeTag | The Type Tag |
Public Types | |
using | EntryType = Dune::FieldVector< Scalar, 2 > |
using | TimeStepFluxType = Dune::FieldVector< Scalar, 2 > |
Public Member Functions | |
virtual void | update (const Scalar t, Scalar &dt, TransportSolutionType &updateVec, bool impes=false) |
Calculate the update vector and determine timestep size. More... | |
void | getMpfaFlux (Dune::FieldVector< Scalar, 2 > &, Dune::FieldVector< Scalar, 2 > &, const IntersectionIterator &, CellData &) |
Compute flux over an irregular interface using a mpfa method. More... | |
FV2dTransport2P2CAdaptive (Problem &problem) | |
Constructs a FV2dTransport2P2CAdaptive object. More... | |
virtual | ~FV2dTransport2P2CAdaptive () |
void | updateTransportedQuantity (TransportSolutionType &updateVector) |
Updates the transported quantity once an update is calculated. More... | |
void | updateTransportedQuantity (TransportSolutionType &updateVector, Scalar dt) |
Updates the transported quantity once an update is calculated. More... | |
void | updateConcentrations (TransportSolutionType &updateVector, Scalar dt) |
Updates the concentrations once an update is calculated. More... | |
void | getFlux (ComponentVector &fluxEntries, EntryType ×tepFlux, const Intersection &intersection, CellData &cellDataI) |
Get flux at an interface between two cells The flux through \gamma is calculated according to the underlying pressure field, calculated by the pressure model. More... | |
void | getFluxOnBoundary (ComponentVector &fluxEntries, EntryType ×tepFlux, const Intersection &intersection, const CellData &cellDataI) |
Get flux on Boundary. More... | |
void | evalBoundary (GlobalPosition globalPosFace, const Intersection &intersection, FluidState &BCfluidState, PhaseVector &pressBound) |
Evaluate the boundary conditions. More... | |
void | initialize () |
Set the initial values before the first pressure equation This method is called before first pressure equation is solved from IMPET. More... | |
template<class MultiWriter > | |
void | addOutputVtkFields (MultiWriter &writer) |
Write transport variables into the output files. More... | |
void | serializeEntity (std::ostream &outstream, const Element &element) |
Function needed for restart option of the transport model: Write out. More... | |
void | deserializeEntity (std::istream &instream, const Element &element) |
Function needed for restart option of the transport model: Read in. More... | |
Protected Member Functions | |
void | innerUpdate (TransportSolutionType &updateVec) |
Protected Attributes | |
Problem & | problem_ |
bool | enableMPFA |
Static Protected Attributes | |
static const int | pressureType = getPropValue<TypeTag, Properties::PressureFormulation>() |
gives kind of pressure used ( 0 = p_w , 1 = p_n , 2 = p_{global} ) More... | |
Access functions for protected variables <br> | |
TransportSolutionType | totalConcentration_ |
private vector of transported primary variables More... | |
bool | impet_ |
indicating if we are in an estimate (false) or real impet (true) step. More... | |
int | averagedFaces_ |
number of faces were flux was restricted More... | |
int | restrictFluxInTransport_ |
Restriction of flux on new pressure field if direction reverses from the pressure equation. More... | |
bool | regulateBoundaryPermeability |
Enables regulation of permeability in the direction of a Dirichlet Boundary Condition. More... | |
Scalar | minimalBoundaryPermeability |
Minimal limit for the boundary permeability. More... | |
bool | switchNormals |
Scalar | accumulatedDt_ |
Current time-interval in sub-time-stepping routine. More... | |
const Scalar | dtThreshold_ |
Threshold for sub-time-stepping routine. More... | |
std::vector< LocalTimesteppingData > | timeStepData_ |
Stores data for sub-time-stepping. More... | |
Scalar | subCFLFactor_ |
bool | localTimeStepping_ |
int | verbosity_ |
void | getTransportedQuantity (TransportSolutionType &transportedQuantity) |
Return the vector of the transported quantity For an immiscible IMPES scheme, this is the saturation. For compositional simulations, however, the total concentration of all components is transported. More... | |
Scalar & | totalConcentration (int compIdx, int eIdxGlobal) |
Return the the total concentration stored in the transport vector To get real cell values, do not acess this method, but rather call the respective function in the cell data object. More... | |
void | getSource (Scalar &update, const Element &element, CellData &cellDataI) |
template<class DataEntry > | |
bool | inPhysicalRange (DataEntry &entry) |
Function to control the abort of the transport-sub-time-stepping depending on a physical parameter range. More... | |
bool | enableLocalTimeStepping () |
Function to check if local time stepping is activated. More... | |
void | updatedTargetDt_ (Scalar &dt) |
void | resetTimeStepData_ () |
|
inherited |
Type of the vector of entries
Contains the return values of the get*()-functions (matrix or right-hand side entry).
|
inherited |
|
inline |
Constructs a FV2dTransport2P2CAdaptive object.
The compositional transport scheme can not be applied with a global pressure / total velocity formulation. This is a 2D-specific implementation! In case of 3d, use the class FV3dTransport2P2CAdaptive
problem | a problem class object |
|
inlinevirtual |
|
inlineinherited |
Write transport variables into the output files.
writer | applied VTK-writer |
|
inlineinherited |
Function needed for restart option of the transport model: Read in.
|
inlineinherited |
Function to check if local time stepping is activated.
|
inherited |
Evaluate the boundary conditions.
As the transport primary variable in this formulation is the total component concentration, C^{\kappa} it seems natural that the boundary values are also total concentrations. However, as for the initial conditions, it is possible to define boundaries by means of a saturation. This choice determines which version of flash calculation is necessary to get to the composition at the boundary.
globalPosFace | The global position of the face of the current boundary cell |
intersection | The current intersection |
BCfluidState | FluidState object that is used for the boundary |
pressBound | Boundary values of phase pressures |
|
inherited |
Get flux at an interface between two cells The flux through \gamma is calculated according to the underlying pressure field, calculated by the pressure model.
- A_{\gamma} \mathbf{n}^T_{\gamma} \mathbf{K} \sum_{\alpha} \varrho_{\alpha} \lambda_{\alpha} \mathbf{d}_{ij} \left( \frac{p_{\alpha,j}^t - p^{t}_{\alpha,i}}{\Delta x} + \varrho_{\alpha} \mathbf{g}^T \mathbf{d}_{ij} \right) \sum_{\kappa} X^{\kappa}_{\alpha}
Here, \mathbf{d}_{ij} is the normalized vector connecting the cell centers, and \mathbf{n}_{\gamma} represents the normal of the face \gamma . Due to the nature of the primay Variable, the (volume-)specific total mass concentration, this represents a mass flux per cell volume.
fluxEntries | The flux entries, mass influx from cell j to i. |
timestepFlux | flow velocities for timestep estimation |
intersection | The intersection |
cellDataI | The cell data for cell i |
|
inherited |
Get flux on Boundary.
The flux through \gamma is calculated according to the underlying pressure field, calculated by the pressure model.
- A_{\gamma} \mathbf{n}^T_{\gamma} \mathbf{K} \mathbf{d}_{i-Boundary} \sum_{\alpha} \varrho_{\alpha} \lambda_{\alpha} \sum_{\kappa} X^{\kappa}_{\alpha} \left( \frac{p_{\alpha,Boundary}^t - p^{t}_{\alpha,i}}{\Delta x} + \varrho_{\alpha}\mathbf{g}^T \mathbf{d}_{i-Boundary}\right)
Here, \mathbf{u} is the normalized vector connecting the cell centers, and \mathbf{n}_{\gamma_{ij}} represents the normal of the face \gamma{ij} .
fluxEntries | The flux entries, mass influx from cell j to i. |
timestepFlux | flow velocities for timestep estimation |
intersection | The intersection |
cellDataI | The cell data for cell i |
void Dumux::FV2dTransport2P2CAdaptive< TypeTag >::getMpfaFlux | ( | Dune::FieldVector< Scalar, 2 > & | fluxEntries, |
Dune::FieldVector< Scalar, 2 > & | timestepFlux, | ||
const IntersectionIterator & | intersectionIterator, | ||
CellData & | cellDataI | ||
) |
Compute flux over an irregular interface using a mpfa method.
A mpfa l-method is applied to calculate fluxes near hanging nodes, using:
- \sum_{\alpha} \varrho_{\alpha} \lambda_{\alpha} \left( \sum_k \tau_{2k} p^t_{\alpha,k} + \varrho_{\alpha} \sum_k \tau_{2k} \mathbf{g}^T \mathbf{x}_{k} \right) \sum_{\kappa} X^{\kappa}_{\alpha}
We provide two options: Calculating the flux expressed by twice the flux through the one unique interaction region on the hanging node if one halfedge is stored (eg on boundaries). Or using the second interaction region covering neighboring cells.
fluxEntries | The flux entries, mass influx from cell j to i. |
timestepFlux | flow velocities for timestep estimation |
intersectionIterator | Iterator of the intersection between cell I and J |
cellDataI | The cell data for cell i |
get geometrical Info, transmissibility matrix
|
inlineinherited |
|
inlineinherited |
Return the vector of the transported quantity For an immiscible IMPES scheme, this is the saturation. For compositional simulations, however, the total concentration of all components is transported.
transportedQuantity | Vector of both transported components |
|
inlineinherited |
Set the initial values before the first pressure equation This method is called before first pressure equation is solved from IMPET.
|
protectedinherited |
|
inlineinherited |
Function to control the abort of the transport-sub-time-stepping depending on a physical parameter range.
entry | Cell entries of the update vector |
|
inlineprotectedinherited |
|
inlineinherited |
Function needed for restart option of the transport model: Write out.
|
inlineinherited |
Return the the total concentration stored in the transport vector To get real cell values, do not acess this method, but rather call the respective function in the cell data object.
compIdx | The index of the component |
eIdxGlobal | The global index of the current cell. |
|
virtual |
Calculate the update vector and determine timestep size.
This method calculates the update vector u of the discretized equation
C^{\kappa , new} = C^{\kappa , old} + u,
where u = \sum_{\gamma} \boldsymbol{v}_{\alpha} * \varrho_{\alpha} * X^{\kappa}_{\alpha} * \boldsymbol{n} * A_{\gamma} , \boldsymbol{n} is the face normal and A_{\gamma} is the face area of face \gamma . In addition to the update vector, the recommended time step size dt is calculated employing a CFL condition. This method uses a standard Tpfa method for regular fluxes, and a MPFA can be used near hanging nodes. The lengths of the vectors are resized to agree with the current grid resolution.
t | Current simulation time \mathrm{[s]} | |
[out] | dt | Time step size \mathrm{[s]} |
[out] | updateVec | Update vector, or update estimate for secants, resp. Here in \mathrm{[kg/m^3]} |
impet | Flag that determines if it is a real impet step or an update estimate for volume derivatives |
Reimplemented from Dumux::FVTransport2P2C< TypeTag >.
|
inherited |
Updates the concentrations once an update is calculated.
This method updates both, the internal transport solution vector and the entries in the cellData.
updateVector | Update vector, or update estimate for secants, resp. Here in \mathrm{[kg/m^3]} |
dt | Time step size \mathrm{[s]} |
|
protectedinherited |
|
inherited |
Updates the transported quantity once an update is calculated.
This method updates both, the internal transport solution vector and the entries in the cellData.
updateVector | Update vector, or update estimate for secants, resp. Here in \mathrm{[kg/m^3]} |
|
inherited |
Updates the transported quantity once an update is calculated.
This method updates both, the internal transport solution vector and the entries in the cellData.
updateVector | Update vector, or update estimate for secants, resp. Here in \mathrm{[kg/m^3]} |
dt | Time step size \mathrm{[s]} |
|
protectedinherited |
Current time-interval in sub-time-stepping routine.
|
protectedinherited |
number of faces were flux was restricted
|
protectedinherited |
Threshold for sub-time-stepping routine.
|
protected |
|
protectedinherited |
indicating if we are in an estimate (false) or real impet (true) step.
|
protectedinherited |
|
protectedinherited |
Minimal limit for the boundary permeability.
|
staticprotected |
gives kind of pressure used ( 0 = p_w , 1 = p_n , 2 = p_{global} )
Specifies if the MPFA is used on hanging nodes
|
protected |
|
protectedinherited |
Enables regulation of permeability in the direction of a Dirichlet Boundary Condition.
|
protectedinherited |
Restriction of flux on new pressure field if direction reverses from the pressure equation.
|
protectedinherited |
|
protectedinherited |
|
protectedinherited |
Stores data for sub-time-stepping.
|
protectedinherited |
private vector of transported primary variables
|
protectedinherited |