OGS
|
A class to simulate the single phase flow process in porous media described by the governing equation:
\[ \left(\frac{\partial}{\partial p}(\phi \rho) + \rho \beta_s\right) \frac{\partial p}{\partial t} -\nabla \left(\rho\frac{\mathbf K}{\mu}(\nabla p + \rho g \nabla z)\right ) = \rho Q, \]
where
\begin{eqnarray*} &p:& \mbox{pore pressure,}\\ &\phi:& \mbox{porosity,}\\ &\rho:& \mbox{liquid or gas density,}\\ &\beta_s:& \mbox{specific storage,}\\ &{\mathbf K}:& \mbox{permeability,}\\ &\mu:& \mbox{viscosity,}\\ &g:& \mbox{gravitational constant,}\\ &Q:& \mbox{Source/sink term in m}^3/{\text s}.\\ \end{eqnarray*}
This governing equation represents the mass balance.
If the density is assumed constant, for example for a groundwater modelling, the governing equation is scaled with the density, and it becomes volume balanced as:
\[ \left(\frac{1}{\rho}\frac{\partial}{\partial p}(\phi \rho) + \beta_s\right) \frac{\partial p}{\partial t} -\nabla \left(\frac{\mathbf K}{\mu}(\nabla p + \rho g \nabla z)\right ) = Q, \]
An optional input tag equation_balance_type
of this process can be used to select whether to use the volume balanced equation or the mass balanced equation. By default, we assume that volume balanced equation is used.
Be aware that the Neumann condition is
\begin{eqnarray*} & -\frac{\mathbf K}{\mu}(\nabla p + \rho g \nabla z) \cdot \mathbf n = q_v [\text{m/s}]: & \mbox{ for the volume balance equation,}\\ & -\rho\frac{\mathbf K}{\mu}(\nabla p + \rho g \nabla z) \cdot \mathbf n = q_f [\text{kg/m²/s}]: & \mbox{for the mass balance equation,} \end{eqnarray*}
with \( \mathbf n \) the outer normal of the boundary.
Definition at line 81 of file LiquidFlowProcess.h.
#include <LiquidFlowProcess.h>
Public Member Functions | |
LiquidFlowProcess (std::string name, MeshLib::Mesh &mesh, std::unique_ptr< AbstractJacobianAssembler > &&jacobian_assembler, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const ¶meters, unsigned const integration_order, std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > &&process_variables, LiquidFlowData &&process_data, SecondaryVariableCollection &&secondary_variables, std::unique_ptr< ProcessLib::SurfaceFluxData > &&surfaceflux, bool const is_linear) | |
void | computeSecondaryVariableConcrete (double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_prev, int const process_id) override |
bool | isLinear () const override |
Eigen::Vector3d | getFlux (std::size_t const element_id, MathLib::Point3d const &p, double const t, std::vector< GlobalVector * > const &x) const override |
void | postTimestepConcreteProcess (std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, const double t, const double dt, int const process_id) override |
Public Member Functions inherited from ProcessLib::Process | |
Process (std::string name_, MeshLib::Mesh &mesh, std::unique_ptr< AbstractJacobianAssembler > &&jacobian_assembler, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const ¶meters, unsigned const integration_order, std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > &&process_variables, SecondaryVariableCollection &&secondary_variables, const bool use_monolithic_scheme=true) | |
void | preTimestep (std::vector< GlobalVector * > const &x, const double t, const double delta_t, const int process_id) |
Preprocessing before starting assembly for new timestep. | |
void | postTimestep (std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, const double t, const double delta_t, int const process_id) |
Postprocessing after a complete timestep. | |
void | postNonLinearSolver (std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, const double t, double const dt, int const process_id) |
void | preIteration (const unsigned iter, GlobalVector const &x) final |
void | computeSecondaryVariable (double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_prev, int const process_id) |
compute secondary variables for the coupled equations or for output. | |
NumLib::IterationResult | postIteration (GlobalVector const &x) final |
void | initialize (std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media) |
void | setInitialConditions (std::vector< GlobalVector * > &process_solutions, std::vector< GlobalVector * > const &process_solutions_prev, double const t, int const process_id) |
MathLib::MatrixSpecifications | getMatrixSpecifications (const int process_id) const override |
void | updateDeactivatedSubdomains (double const time, const int process_id) |
virtual bool | isMonolithicSchemeUsed () const |
virtual void | extrapolateIntegrationPointValuesToNodes (const double, std::vector< GlobalVector * > const &, std::vector< GlobalVector * > &) |
void | preAssemble (const double t, double const dt, GlobalVector const &x) final |
void | assemble (const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b) final |
void | assembleWithJacobian (const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalVector &b, GlobalMatrix &Jac) final |
void | preOutput (const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id) |
std::vector< NumLib::IndexValueVector< GlobalIndexType > > const * | getKnownSolutions (double const t, GlobalVector const &x, int const process_id) const final |
virtual NumLib::LocalToGlobalIndexMap const & | getDOFTable (const int) const |
MeshLib::Mesh & | getMesh () const |
std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > const & | getProcessVariables () const |
std::vector< std::reference_wrapper< ProcessVariable > > const & | getProcessVariables (const int process_id) const |
std::vector< std::size_t > const & | getActiveElementIDs () const |
SecondaryVariableCollection const & | getSecondaryVariables () const |
std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > const & | getIntegrationPointWriters () const |
virtual void | solveReactionEquation (std::vector< GlobalVector * > &, std::vector< GlobalVector * > const &, double const, double const, NumLib::EquationSystem &, int const) |
bool | requiresNormalization () const override |
Public Member Functions inherited from ProcessLib::SubmeshAssemblySupport | |
virtual std::vector< std::vector< std::string > > | initializeAssemblyOnSubmeshes (std::vector< std::reference_wrapper< MeshLib::Mesh > > const &meshes) |
virtual | ~SubmeshAssemblySupport ()=default |
Private Member Functions | |
void | initializeConcreteProcess (NumLib::LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh, unsigned const integration_order) override |
Process specific initialization called by initialize(). | |
void | assembleConcreteProcess (const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b) override |
void | assembleWithJacobianConcreteProcess (const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalVector &b, GlobalMatrix &Jac) override |
Private Attributes | |
LiquidFlowData | _process_data |
std::vector< std::unique_ptr< LiquidFlowLocalAssemblerInterface > > | _local_assemblers |
std::unique_ptr< ProcessLib::SurfaceFluxData > | _surfaceflux |
MeshLib::PropertyVector< double > * | _hydraulic_flow = nullptr |
bool | _is_linear = false |
ProcessLib::LiquidFlow::LiquidFlowProcess::LiquidFlowProcess | ( | std::string | name, |
MeshLib::Mesh & | mesh, | ||
std::unique_ptr< AbstractJacobianAssembler > && | jacobian_assembler, | ||
std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const & | parameters, | ||
unsigned const | integration_order, | ||
std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > && | process_variables, | ||
LiquidFlowData && | process_data, | ||
SecondaryVariableCollection && | secondary_variables, | ||
std::unique_ptr< ProcessLib::SurfaceFluxData > && | surfaceflux, | ||
bool const | is_linear ) |
Definition at line 29 of file LiquidFlowProcess.cpp.
References _hydraulic_flow, DBUG(), MeshLib::getOrCreateMeshProperty(), and MeshLib::Node.
|
overrideprivatevirtual |
Implements ProcessLib::Process.
Definition at line 71 of file LiquidFlowProcess.cpp.
References ProcessLib::Process::_global_assembler, _hydraulic_flow, _local_assemblers, ProcessLib::Process::_local_to_global_index_map, ProcessLib::VectorMatrixAssembler::assemble(), ProcessLib::computeResiduum(), DBUG(), NumLib::SerialExecutor::executeSelectedMemberDereferenced(), MathLib::finalizeMatrixAssembly(), MathLib::finalizeVectorAssembly(), and ProcessLib::Process::getActiveElementIDs().
|
overrideprivatevirtual |
Implements ProcessLib::Process.
Definition at line 97 of file LiquidFlowProcess.cpp.
References ProcessLib::Process::_global_assembler, _local_assemblers, ProcessLib::Process::_local_to_global_index_map, ProcessLib::VectorMatrixAssembler::assembleWithJacobian(), DBUG(), NumLib::SerialExecutor::executeSelectedMemberDereferenced(), and ProcessLib::Process::getActiveElementIDs().
|
overridevirtual |
Reimplemented from ProcessLib::Process.
Definition at line 114 of file LiquidFlowProcess.cpp.
References _local_assemblers, ProcessLib::LocalAssemblerInterface::computeSecondaryVariable(), DBUG(), NumLib::SerialExecutor::executeSelectedMemberOnDereferenced(), and ProcessLib::Process::getActiveElementIDs().
|
overridevirtual |
Reimplemented from ProcessLib::Process.
Definition at line 130 of file LiquidFlowProcess.cpp.
References _local_assemblers, ProcessLib::Process::_local_to_global_index_map, and NumLib::getRowColumnIndices().
|
overrideprivatevirtual |
Process specific initialization called by initialize().
Implements ProcessLib::Process.
Definition at line 53 of file LiquidFlowProcess.cpp.
References _local_assemblers, _process_data, ProcessLib::Process::_secondary_variables, ProcessLib::SecondaryVariableCollection::addSecondaryVariable(), ProcessLib::createLocalAssemblers(), MeshLib::Mesh::getElements(), ProcessLib::Process::getExtrapolator(), ProcessLib::LiquidFlow::LiquidFlowLocalAssemblerInterface::getIntPtDarcyVelocity(), MeshLib::Mesh::isAxiallySymmetric(), ProcessLib::makeExtrapolator(), and ProcessLib::LiquidFlow::LiquidFlowData::mesh_space_dimension.
|
inlineoverride |
|
overridevirtual |
Reimplemented from ProcessLib::Process.
Definition at line 147 of file LiquidFlowProcess.cpp.
References ProcessLib::Process::_integration_order, ProcessLib::Process::_mesh, _surfaceflux, and ProcessLib::Process::getActiveElementIDs().
|
private |
Definition at line 137 of file LiquidFlowProcess.h.
Referenced by LiquidFlowProcess(), and assembleConcreteProcess().
|
private |
Definition at line 138 of file LiquidFlowProcess.h.
Referenced by isLinear().
|
private |
Definition at line 134 of file LiquidFlowProcess.h.
Referenced by assembleConcreteProcess(), assembleWithJacobianConcreteProcess(), computeSecondaryVariableConcrete(), getFlux(), and initializeConcreteProcess().
|
private |
Definition at line 131 of file LiquidFlowProcess.h.
Referenced by initializeConcreteProcess().
|
private |
Definition at line 136 of file LiquidFlowProcess.h.
Referenced by postTimestepConcreteProcess().