Computational Fluid Dynamics
Welcome to the Computational Fluid Dynamics(CFD) toolbox. This module explains how to use the Laminar Flow interface to model and simulate fluid mechanics for laminar, incompressible fluids.
| The engineering community often uses the term CFD, computational fluid dynamics, to refer to the numerical simulation of fluids. | 
1. Features
- 
2D and 3D
 - 
Stokes flows
 - 
Laminar Incompressible flows
 - 
Steady and unsteady simulations
 - 
BDF time schemes up to order 4
 - 
Moving domain support using Arbitrary Lagrangian Eulerian (ALE) formulation
 - 
Support high order geometry including in context of moving domain
 - 
Stabilization pressure and advection dominated using Galerking Least Square
 - 
Boundary conbditions : no-slip, slip(symmetry), inflow(not necessarily aligned with an axis), pressure, outflow
 
2. CFD Toolbox
2.1. Models
The CFD Toolbox supports both the incompressible Navier-Stokes and the Stokes equations.
The fluid mechanics model (Navier-Stokes or Stokes) can be selected in json file:
"Models": { "equations":"Navier-Stokes" }
2.2. Materials
| Name | Symbol | Shape | Description | 
|---|---|---|---|
density  | 
rho  | 
scalar  | 
density  | 
dynamic-viscosity  | 
mu  | 
scalar  | 
dynamic viscosity  | 
turbulent-dynamic-viscosity  | 
mu_t  | 
scalar  | 
turbulent dynamic viscosity  | 
consistency-index  | 
mu_k  | 
scalar  | 
consistency index  | 
power-law-index  | 
mu_power_law_n  | 
scalar  | 
power law index  | 
viscosity-min  | 
mu_min  | 
scalar  | 
|
viscosity-max  | 
mu_max  | 
scalar  | 
|
viscosity-zero-shear  | 
mu_0  | 
scalar  | 
|
viscosity-infinite-shear  | 
mu_inf  | 
scalar  | 
|
carreau-law-lambda  | 
mu_carreau_law_lambda  | 
scalar  | 
|
carreau-law-n  | 
mu_carreau_law_n  | 
scalar  | 
|
carreau-yasuda-law-lambda  | 
mu_carreau_yasuda_law_lambda  | 
scalar  | 
|
carreau-yasuda-law-n  | 
mu_carreau_yasuda_law_n  | 
scalar  | 
|
carreau-yasuda-law-a  | 
mu_carreau_yasuda_law_a  | 
scalar  | 
2.3. Fields and symbols expressions
| Name | Description | Shape | 
|---|---|---|
velocity  | 
the velocity of fluid  | 
vectorial  | 
pressure  | 
the pressure  | 
scalar  | 
| Symbol | Expression | Description | 
|---|---|---|
fluid_U_0  | 
\(u_0\)  | 
evaluate the component X of fluid velocity  | 
fluid_U_1  | 
\(u_1\)  | 
evaluate the component Y of fluid velocity  | 
fluid_U_2  | 
\(u_2\)  | 
evaluate the component Z of fluid velocity  | 
fluid_U_magnitude  | 
\(\lVert \boldsymbol{u} \rVert = \sqrt{\boldsymbol{u} \cdot \boldsymbol{u}}\)  | 
evaluate the magnitude of fluid velocity  | 
fluid_curl_U  | 
\(\nabla \wedge \boldsymbol{u}\)  | 
evaluate the curl of fluid velocity  | 
fluid_curl_U_magnitude  | 
\(\lVert \nabla \wedge \boldsymbol{u} \rVert\)  | 
evaluate the magnitude of curl of fluid velocity  | 
fluid_div_U  | 
\(\nabla \cdot \boldsymbol{u}\)  | 
evaluate the div of fluid velocity  | 
The next step is to define the fluid material by setting its properties namely the density \(\rho_f\) and viscosity \(\mu_f\). In next table, we find the correspondance between the mathematical names and the json names.
| Parameter | Symbol | 
|---|---|
\(\mu_f\)  | 
  | 
\(\rho_f\)  | 
  | 
A Materials section is introduced in json file in order to configure the fluid properties. For each mesh marker, we can define the material properties associated.
"Materials":
{
    "<name>"
    {
        "markers":"[marker1,marker2]",
        "rho":"1.0e3",
        "mu":"1.0"
    }
}
2.3.1. Generalised Newtonian fluid
The non Newtonian properties are defined in cfg file in fluid section.
The viscosity law is activated by:
| option | values | 
|---|---|
viscosity.law  | 
newtonian, power_law, walburn-schneck_law, carreau_law, carreau-yasuda_law  | 
Then, each model are configured with the options reported in the following table:
| Viscosity law | options | unit | 
|---|---|---|
power_law  | 
power_law.k power_law.n  | 
dimensionless dimensionless  | 
walburn-schneck_law  | 
hematocrit TPMA walburn-schneck_law.C1 walburn-schneck_law.C2 walburn-schneck_law.C3 walburn-schneck_law.C4  | 
Percentage g/l dimensionless dimensionless dimensionless l/g  | 
carreau_law  | 
viscosity.zero_shear viscosity.infinite_shear carreau_law.lambda carreau_law.n  | 
\(kg.m^{-1}.s^{-1}\) dimensionless dimensionless  | 
carreau-yasuda_law  | 
viscosity.zero_shear viscosity.infinite_shear carreau-yasuda_law.lambda carreau-yasuda_law.n carreau-yasuda_law.a  | 
\(kg/(m \times s)\) \(kg/(m \times s)\) dimensionless dimensionless dimensionless  | 
2.4. Boundary Conditions
We start by a listing of boundary conditions supported in fluid mechanics model.
2.4.1. Dirichlet on velocity
A Dirichlet condition on velocity field reads:
or only a component of vector \(\boldsymbol{u}_f =(u_f^1,u_f^2 ,u_f^3 )\)
Several methods are available to enforce the boundary condition:
- 
elimination
 - 
Nitsche
 - 
Lagrange multiplier
 
2.4.2. Dirichlet on pressure
2.4.3. Neumann
| Name | Expression | 
|---|---|
Neumann_scalar  | 
\(\boldsymbol{\sigma}_{f} \boldsymbol{n} = g \ \boldsymbol{n} \)  | 
Neumann_vectorial  | 
\(\boldsymbol{\sigma}_{f} \boldsymbol{n} = \boldsymbol{g} \)  | 
Neumann_tensor2  | 
\(\boldsymbol{\sigma}_{f} \boldsymbol{n} = g \ \boldsymbol{n}\)  | 
2.4.5. Inlet
The boundary condition at inlets allow to define a velocity profile on a set of marked faces \(\Gamma_{\mathrm{inlet}}\) in fluid mesh:
The function \(g\) is computed from flow velocity profiles:
- Constant profile
 
- Parabolic profile
 
where \(\beta\) is a constant determined by adding a constraint to the inflow:
- velocity_max
 - 
\(\max( g ) = \alpha \)
 - flow_rate
 - 
\(\int_\Gamma ( g \ \boldsymbol{n} ) \cdot \boldsymbol{n} = \alpha\)
 
| Option | Value | Default value | Description | 
|---|---|---|---|
shape  | 
  | 
select a shape profile for inflow  | 
|
constraint  | 
  | 
give a constraint wich controle velocity  | 
|
expr  | 
string  | 
symbolic expression of constraint value  | 
2.4.6. Outlet flow
| Option | Value | Default value | Description | 
|---|---|---|---|
model  | 
free,windkessel  | 
free  | 
select an outlet modeling  | 
Windkessel model
We use a 3-element Windkessel model for modeling an outflow boundary condition. We define \(P_l\) a pressure and \(Q_l\) the flow rate. The outflow model is discribed by the following system of differential equations:
Coefficients \(R_{p,l}\) and \(R_{d,l}\) represent respectively the proximal and distal resistance. The constant \(C_{d,l}\) is the capacitance of blood vessel. The unknowns \(P_l\) and \(\pi_l\) are called proximal pressure and distal pressure. Then we define the coupling between this outflow model and the fluid model by these two relationships:
| Option | Value | Description | 
|---|---|---|
windkessel_coupling  | 
explicit, implicit  | 
coupling type with the Navier-Stokes equation  | 
windkessel_Rd  | 
real  | 
distal resistance  | 
windkessel_Rp  | 
real  | 
proximal resistance  | 
windkessel_Cd  | 
real  | 
capacitance  | 
2.4.7. Implementation of boundary conditions in json
Boundary conditions are set in the json files in the category BoundaryConditions.
Then <field> and <bc_type> are chosen from type of boundary condition.
The parameter <marker> corresponds to mesh marker where the boundary condition is applied.
Finally, we define some specific options inside a marker.
"BoundaryConditions":
{
    "<field>":
    {
        "<bc_type>":
        {
            "<marker>":
            {
                "<option1>":"<value1>",
                "<option2>":"<value2>",
                // ...
            }
        }
    }
}
2.4.8. Options summary
| Field | Name | Option | Entity | 
|---|---|---|---|
velocity  | 
Dirichlet  | 
expr type number alemesh_bc  | 
faces, edges, points  | 
velocity_x velocity_y velocity_z  | 
Dirichlet  | 
expr type number alemesh_bc  | 
faces, edges, points  | 
velocity  | 
Neumann_scalar  | 
expr number alemesh_bc  | 
faces  | 
velocity  | 
Neumann_vectorial  | 
expr number alemesh_bc  | 
faces  | 
velocity  | 
Neumann_tensor2  | 
expr number alemesh_bc  | 
faces  | 
velocity  | 
slip  | 
alemesh_bc  | 
faces  | 
pressure  | 
Dirichlet  | 
expr number alemesh_bc  | 
faces  | 
fluid  | 
outlet  | 
number alemesh_bc model windkessel_coupling windkessel_Rd windkessel_Rp windkessel_Cd  | 
faces  | 
fluid  | 
inlet  | 
expr shape constraint number alemesh_bc  | 
faces  | 
2.5. Body forces
Body forces are also defined in the fluid section of BoundaryConditions in  the json file.
"BoundaryConditions":
{
    "fluid":{
        "VolumicForces":
        {
            "<marker>":
            {
                "expr":"{0,0,-gravityCst*7850}:gravityCst"
            }
        }
    }
}
| The marker corresponds to mesh elements marked with this tag. If the marker is an empty string, it corresponds to all elements of the mesh. | 
2.6. Post Processing
"PostProcess":
{
    "Exports":
    {
        "fields":["field1","field2",...]
    },
    "Measures":
    {
        "<measure type>":
        {
            "label":
            {
                "<range type>":"value",
                "fields":["field1","field3"]
            }
        }
    }
}
2.6.1. Exports for vizualisation
The fields allowed to be exported in the fields section are:
- 
velocity
 - 
pressure
 - 
displacement
 - 
vorticity
 - 
stress or normal-stress
 - 
wall-shear-stress
 - 
density
 - 
viscosity
 - 
pid
 - 
alemesh
 
2.6.2. Measures
- 
Points
 - 
Force
 - 
FlowRate
 - 
Pressure
 - 
VelocityDivergence
 
The following fluid variables are available
Name  | 
Description  | 
  | 
magnitude of the velocity  | 
  | 
x component of the velocity  | 
  | 
y component of the velocity  | 
  | 
z component of the velocity  | 
  | 
pressure  | 
You can use these expressions in Statistics
Points
In order to evaluate velocity or pressure at specific points and save the results in .csv file, the user must define:
- 
"<tag>" representing this data in the .csv file
 - 
the coordinate of point
 - 
the fields evaluated ("pressure" or "velocity")
 
"Points":
{
  "<tag>":
  {
    "coord":"{0.6,0.2,0}",
    "fields":"pressure"
  },
 "<tag>":
  {
    "coord":"{0.15,0.2,0}",
    "fields":"velocity"
  }
}
Flow rate
The flow rate can be evaluated and save on .csv file. The user must define:
- 
"<tag>" representing this data in the .csv file
 - 
"<face_marker>" representing the name of marked face
 - 
the fluid direction ("interior_normal" or "exterior_normal") of the flow rate.
 
"FlowRate":
{
    "<tag>":
    {
        "markers":"<face_marker>",
        "direction":"interior_normal"
    },
    "<tag>":
    {
        "markers":"<face_marker>",
        "direction":"exterior_normal"
    }
}
2.6.3. Export user functions
A function defined by a symbolic expression can be represented as a finite element field thanks to nodal projection. This function can be exported.
"Functions":
{
    "toto":{ "expr":"x*y:x:y"},
    "toto2":{ "expr":"0.5*ubar*x*y:x:y:ubar"},
    "totoV":{ "expr":"{2*x,y}:x:y"}
},
"PostProcess":
{
   "Exports":
   {
       "fields":["velocity","pressure","pid","totoV","toto","toto2"]
   }
}
2.7. Stabilization methods
2.7.1. GLS family
Galerkin leat-Square (GLS) stabilization methods can be activated from the cfg file by adding stabilization-gls=1 in the fluid prefix.
Others options available are enumerated in the next table and must be given with the prefix fluid.stabilization-gls.
| Option | Value | Default value | Description | 
|---|---|---|---|
type  | 
  | 
  | 
type of stabilization  | 
parameter.method  | 
  | 
  | 
method used to compute the stabilization parameter  | 
parameter.hsize.method  | 
  | 
  | 
method used for evalute an element mesh size  | 
parameter.eigenvalue.penal-lambdaK  | 
real  | 
0.  | 
add a mass matrix scaled by this factor in the eigen value problem for the stabilization parameter  | 
convection-diffusion.location.expressions  | 
string  | 
if given, the stabilization is apply only on mesh location which verify   | 
2.8. Run simulation
The computational fluid dynamics applications available are
- 
2D CFD toolbox :
feelpp_toolbox_fluid_2d - 
3D CFD toolbox :
feelpp_toolbox_fluid_3d 
Here is an example of execution of the 2D CFD toolbox on 4 processors using the configuration script <myfile.cfg>
mpirun -np 4 feelpp_toolbox_fluid_2d --config-file=<myfile.cfg>