MFEM
v4.2.0
Finite element discretization library
|
Transient incompressible Navier Stokes solver in a split scheme formulation. More...
#include <navier_solver.hpp>
Public Member Functions | |
NavierSolver (ParMesh *mesh, int order, double kin_vis) | |
Initialize data structures, set FE space order and kinematic viscosity. More... | |
void | Setup (double dt) |
Initialize forms, solvers and preconditioners. More... | |
void | Step (double &time, double dt, int cur_step) |
Compute solution at the next time step t+dt. More... | |
ParGridFunction * | GetCurrentVelocity () |
Return a pointer to the current velocity ParGridFunction. More... | |
ParGridFunction * | GetCurrentPressure () |
Return a pointer to the current pressure ParGridFunction. More... | |
void | AddVelDirichletBC (VectorCoefficient *coeff, Array< int > &attr) |
Add a Dirichlet boundary condition to the velocity field. More... | |
void | AddVelDirichletBC (VecFuncT *f, Array< int > &attr) |
void | AddPresDirichletBC (Coefficient *coeff, Array< int > &attr) |
Add a Dirichlet boundary condition to the pressure field. More... | |
void | AddPresDirichletBC (ScalarFuncT *f, Array< int > &attr) |
void | AddAccelTerm (VectorCoefficient *coeff, Array< int > &attr) |
Add an acceleration term to the RHS of the equation. More... | |
void | AddAccelTerm (VecFuncT *f, Array< int > &attr) |
void | EnablePA (bool pa) |
Enable partial assembly for every operator. More... | |
void | EnableNI (bool ni) |
void | PrintTimingData () |
Print timing summary of the solving routine. More... | |
~NavierSolver () | |
void | ComputeCurl2D (ParGridFunction &u, ParGridFunction &cu, bool assume_scalar=false) |
Compute \(\nabla \times \nabla \times u\) for \(u \in (H^1)^2\). More... | |
void | ComputeCurl3D (ParGridFunction &u, ParGridFunction &cu) |
Compute \(\nabla \times \nabla \times u\) for \(u \in (H^1)^3\). More... | |
void | Orthogonalize (Vector &v) |
Remove mean from a Vector. More... | |
void | MeanZero (ParGridFunction &v) |
Remove the mean from a ParGridFunction. More... | |
double | ComputeCFL (ParGridFunction &u, double dt) |
Compute CFL. More... | |
Protected Member Functions | |
void | PrintInfo () |
Print informations about the Navier version. More... | |
void | SetTimeIntegrationCoefficients (int step) |
Update the EXTk/BDF time integration coefficient. More... | |
void | EliminateRHS (Operator &A, ConstrainedOperator &constrainedA, const Array< int > &ess_tdof_list, Vector &x, Vector &b, Vector &X, Vector &B, int copy_interior=0) |
Eliminate essential BCs in an Operator and apply to RHS. More... | |
Transient incompressible Navier Stokes solver in a split scheme formulation.
This implementation of a transient incompressible Navier Stokes solver uses the non-dimensionalized formulation. The coupled momentum and incompressibilty equations are decoupled using the split scheme described in [1]. This leads to three solving steps.
The numerical solver setup for each step are as follows.
\(M_v^{-1}\) is solved using CG with Jacobi as preconditioner.
\(S_p^{-1}\) is solved using CG with AMG applied to the low order refined (LOR) assembled pressure Poisson matrix. To avoid assembling a matrix for preconditioning, one can use p-MG as an alternative (NYI).
\((M_v - \partial t K_v)^{-1}\) due to the CFL condition we expect the time step to be small. Therefore this is solved using CG with Jacobi as preconditioner. For large time steps a preconditioner like AMG or p-MG should be used (NYI).
Statements marked with NYI mean this feature is planned but Not Yet Implemented.
A detailed description is available in [1] section 4.2. The algorithm is originated from [2].
[1] Michael Franco, Jean-Sylvain Camier, Julian Andrej, Will Pazner (2020) High-order matrix-free incompressible flow solvers with GPU acceleration and low-order refined preconditioners (https://arxiv.org/abs/1910.03032)
[2] A. G. Tomboulides, J. C. Y. Lee & S. A. Orszag (1997) Numerical Simulation of Low Mach Number Reactive Flows
Definition at line 142 of file navier_solver.hpp.
NavierSolver::NavierSolver | ( | ParMesh * | mesh, |
int | order, | ||
double | kin_vis | ||
) |
Initialize data structures, set FE space order and kinematic viscosity.
The ParMesh mesh can be a linear or curved parallel mesh. The order of the finite element spaces is this algorithm is of equal order \((P_N)^d P_N\) for velocity and pressure respectively. This means the pressure is in discretized in the same space (just scalar instead of a vector space) as the velocity.
Kinematic viscosity (dimensionless) is set using kin_vis and automatically converted to the Reynolds number. If you want to set the Reynolds number directly, you can provide the inverse.
Definition at line 29 of file navier_solver.cpp.
NavierSolver::~NavierSolver | ( | ) |
Definition at line 1050 of file navier_solver.cpp.
void NavierSolver::AddAccelTerm | ( | VectorCoefficient * | coeff, |
Array< int > & | attr | ||
) |
Add an acceleration term to the RHS of the equation.
The VecFuncT f is evaluated at the current time t and extrapolated together with the nonlinear parts of the Navier Stokes equation.
Definition at line 943 of file navier_solver.cpp.
Definition at line 961 of file navier_solver.cpp.
void NavierSolver::AddPresDirichletBC | ( | Coefficient * | coeff, |
Array< int > & | attr | ||
) |
Add a Dirichlet boundary condition to the pressure field.
Definition at line 910 of file navier_solver.cpp.
void NavierSolver::AddPresDirichletBC | ( | ScalarFuncT * | f, |
Array< int > & | attr | ||
) |
Definition at line 938 of file navier_solver.cpp.
void NavierSolver::AddVelDirichletBC | ( | VectorCoefficient * | coeff, |
Array< int > & | attr | ||
) |
Add a Dirichlet boundary condition to the velocity field.
Definition at line 877 of file navier_solver.cpp.
Definition at line 905 of file navier_solver.cpp.
double NavierSolver::ComputeCFL | ( | ParGridFunction & | u, |
double | dt | ||
) |
Compute CFL.
Definition at line 797 of file navier_solver.cpp.
void NavierSolver::ComputeCurl2D | ( | ParGridFunction & | u, |
ParGridFunction & | cu, | ||
bool | assume_scalar = false |
||
) |
Compute \(\nabla \times \nabla \times u\) for \(u \in (H^1)^2\).
Definition at line 696 of file navier_solver.cpp.
void NavierSolver::ComputeCurl3D | ( | ParGridFunction & | u, |
ParGridFunction & | cu | ||
) |
Compute \(\nabla \times \nabla \times u\) for \(u \in (H^1)^3\).
Definition at line 605 of file navier_solver.cpp.
|
protected |
Eliminate essential BCs in an Operator and apply to RHS.
Definition at line 572 of file navier_solver.cpp.
|
inline |
Enable numerical integration rules. This means collocated quadrature at the nodal points.
Definition at line 195 of file navier_solver.hpp.
|
inline |
Enable partial assembly for every operator.
Definition at line 191 of file navier_solver.hpp.
|
inline |
Return a pointer to the current pressure ParGridFunction.
Definition at line 169 of file navier_solver.hpp.
|
inline |
Return a pointer to the current velocity ParGridFunction.
Definition at line 166 of file navier_solver.hpp.
void NavierSolver::MeanZero | ( | ParGridFunction & | v | ) |
Remove the mean from a ParGridFunction.
Modify the ParGridFunction v by subtracting its mean using \( v = v - \int_\Omega \frac{v}{vol(\Omega)} dx \).
Definition at line 550 of file navier_solver.cpp.
void NavierSolver::Orthogonalize | ( | Vector & | v | ) |
Remove mean from a Vector.
Modify the Vector v by subtracting its mean using \(v = v - \frac{\sum_i^N v_i}{N} \)
Definition at line 592 of file navier_solver.cpp.
|
protected |
Print informations about the Navier version.
Definition at line 1035 of file navier_solver.cpp.
void NavierSolver::PrintTimingData | ( | ) |
Print timing summary of the solving routine.
The summary shows the timing in seconds in the first row of
The second row shows a proportion of a column relative to the whole time step.
Definition at line 1000 of file navier_solver.cpp.
|
protected |
Update the EXTk/BDF time integration coefficient.
Depending on which time step the computation is in, the EXTk/BDF time integration coefficients have to be set accordingly. This allows bootstrapping with a BDF scheme of order 1 and increasing the order each following time step, up to order 3.
Definition at line 966 of file navier_solver.cpp.
void NavierSolver::Setup | ( | double | dt | ) |
Initialize forms, solvers and preconditioners.
Definition at line 95 of file navier_solver.cpp.
void NavierSolver::Step | ( | double & | time, |
double | dt, | ||
int | cur_step | ||
) |
Compute solution at the next time step t+dt.
Definition at line 296 of file navier_solver.cpp.
|
protected |
Definition at line 379 of file navier_solver.hpp.
|
protected |
Definition at line 380 of file navier_solver.hpp.
|
protected |
Definition at line 381 of file navier_solver.hpp.
|
protected |
Definition at line 370 of file navier_solver.hpp.
|
protected |
Definition at line 375 of file navier_solver.hpp.
|
protected |
Definition at line 376 of file navier_solver.hpp.
|
protected |
Definition at line 377 of file navier_solver.hpp.
|
protected |
Definition at line 378 of file navier_solver.hpp.
|
protected |
Definition at line 372 of file navier_solver.hpp.
|
protected |
Definition at line 351 of file navier_solver.hpp.
|
protected |
Definition at line 351 of file navier_solver.hpp.
|
protected |
Definition at line 332 of file navier_solver.hpp.
|
protected |
Definition at line 306 of file navier_solver.hpp.
|
protected |
Enable/disable debug output.
Definition at line 268 of file navier_solver.hpp.
|
protected |
Definition at line 316 of file navier_solver.hpp.
|
protected |
Definition at line 346 of file navier_solver.hpp.
|
protected |
Definition at line 346 of file navier_solver.hpp.
|
protected |
Definition at line 346 of file navier_solver.hpp.
|
protected |
Definition at line 349 of file navier_solver.hpp.
|
protected |
Definition at line 314 of file navier_solver.hpp.
|
protected |
Definition at line 351 of file navier_solver.hpp.
|
protected |
Definition at line 312 of file navier_solver.hpp.
|
protected |
Definition at line 333 of file navier_solver.hpp.
|
protected |
Definition at line 349 of file navier_solver.hpp.
|
protected |
Definition at line 318 of file navier_solver.hpp.
|
protected |
Definition at line 308 of file navier_solver.hpp.
|
protected |
Definition at line 334 of file navier_solver.hpp.
|
protected |
Definition at line 328 of file navier_solver.hpp.
|
protected |
Definition at line 310 of file navier_solver.hpp.
|
protected |
Definition at line 410 of file navier_solver.hpp.
|
protected |
Definition at line 327 of file navier_solver.hpp.
|
protected |
Definition at line 414 of file navier_solver.hpp.
|
protected |
Definition at line 344 of file navier_solver.hpp.
|
protected |
Definition at line 343 of file navier_solver.hpp.
|
protected |
Definition at line 397 of file navier_solver.hpp.
|
protected |
Definition at line 397 of file navier_solver.hpp.
|
protected |
Definition at line 397 of file navier_solver.hpp.
|
protected |
Kinematic viscosity (dimensionless).
Definition at line 286 of file navier_solver.hpp.
|
protected |
Definition at line 346 of file navier_solver.hpp.
|
protected |
Definition at line 351 of file navier_solver.hpp.
|
protected |
Linear form to compute the mass matrix in various subroutines.
Definition at line 321 of file navier_solver.hpp.
|
protected |
Definition at line 330 of file navier_solver.hpp.
|
protected |
Definition at line 302 of file navier_solver.hpp.
|
protected |
Definition at line 408 of file navier_solver.hpp.
|
protected |
Definition at line 412 of file navier_solver.hpp.
|
protected |
Definition at line 337 of file navier_solver.hpp.
|
protected |
Definition at line 336 of file navier_solver.hpp.
|
protected |
Definition at line 300 of file navier_solver.hpp.
|
protected |
Definition at line 325 of file navier_solver.hpp.
|
protected |
Enable/disable numerical integration rules of forms.
Definition at line 277 of file navier_solver.hpp.
|
protected |
Definition at line 346 of file navier_solver.hpp.
|
protected |
Definition at line 346 of file navier_solver.hpp.
|
protected |
Definition at line 346 of file navier_solver.hpp.
|
protected |
Definition at line 322 of file navier_solver.hpp.
|
protected |
The order of the velocity and pressure space.
Definition at line 283 of file navier_solver.hpp.
|
protected |
Enable/disable partial assembly of forms.
Definition at line 274 of file navier_solver.hpp.
|
protected |
Pressure \(H^1\) finite element collection.
Definition at line 292 of file navier_solver.hpp.
|
protected |
Definition at line 404 of file navier_solver.hpp.
|
protected |
Pressure \(H^1\) finite element space.
Definition at line 298 of file navier_solver.hpp.
|
protected |
Definition at line 405 of file navier_solver.hpp.
|
protected |
Definition at line 406 of file navier_solver.hpp.
|
protected |
Definition at line 390 of file navier_solver.hpp.
|
protected |
Definition at line 389 of file navier_solver.hpp.
|
protected |
Definition at line 387 of file navier_solver.hpp.
|
protected |
Definition at line 388 of file navier_solver.hpp.
|
protected |
The parallel mesh.
Definition at line 280 of file navier_solver.hpp.
|
protected |
Definition at line 403 of file navier_solver.hpp.
|
protected |
Definition at line 349 of file navier_solver.hpp.
|
protected |
Definition at line 353 of file navier_solver.hpp.
|
protected |
Definition at line 367 of file navier_solver.hpp.
|
protected |
Definition at line 357 of file navier_solver.hpp.
|
protected |
Definition at line 361 of file navier_solver.hpp.
|
protected |
Definition at line 400 of file navier_solver.hpp.
|
protected |
Definition at line 400 of file navier_solver.hpp.
|
protected |
Definition at line 400 of file navier_solver.hpp.
|
protected |
Definition at line 349 of file navier_solver.hpp.
|
protected |
Definition at line 353 of file navier_solver.hpp.
|
protected |
Definition at line 346 of file navier_solver.hpp.
|
protected |
Definition at line 351 of file navier_solver.hpp.
|
protected |
Definition at line 394 of file navier_solver.hpp.
|
protected |
Definition at line 393 of file navier_solver.hpp.
|
protected |
Definition at line 331 of file navier_solver.hpp.
|
protected |
Definition at line 326 of file navier_solver.hpp.
|
protected |
Definition at line 304 of file navier_solver.hpp.
|
protected |
Definition at line 409 of file navier_solver.hpp.
|
protected |
Definition at line 413 of file navier_solver.hpp.
|
protected |
Definition at line 341 of file navier_solver.hpp.
|
protected |
Definition at line 340 of file navier_solver.hpp.
|
protected |
Definition at line 339 of file navier_solver.hpp.
|
protected |
Definition at line 384 of file navier_solver.hpp.
|
protected |
Definition at line 384 of file navier_solver.hpp.
|
protected |
Definition at line 384 of file navier_solver.hpp.
|
protected |
Definition at line 384 of file navier_solver.hpp.
|
protected |
Definition at line 384 of file navier_solver.hpp.
|
protected |
Definition at line 384 of file navier_solver.hpp.
|
protected |
Definition at line 347 of file navier_solver.hpp.
|
protected |
Definition at line 346 of file navier_solver.hpp.
|
protected |
Definition at line 351 of file navier_solver.hpp.
|
protected |
Definition at line 346 of file navier_solver.hpp.
|
protected |
Definition at line 346 of file navier_solver.hpp.
|
protected |
Definition at line 364 of file navier_solver.hpp.
|
protected |
Definition at line 356 of file navier_solver.hpp.
|
protected |
Definition at line 360 of file navier_solver.hpp.
|
protected |
Enable/disable verbose output.
Definition at line 271 of file navier_solver.hpp.
|
protected |
Velocity \(H^1\) finite element collection.
Definition at line 289 of file navier_solver.hpp.
|
protected |
Velocity \((H^1)^d\) finite element space.
Definition at line 295 of file navier_solver.hpp.
|
protected |
Definition at line 406 of file navier_solver.hpp.
|
protected |
Definition at line 323 of file navier_solver.hpp.