m |
|||
(49 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | |||
− | + | =Abstract= | |
− | + | This work explores the use of stabilized finite element formulations for the incompressible Navier-Stokes equations to simulate turbulent flow problems. Turbulence is a challenging problem due to its complex and dynamic nature and its simulation if further complicated by the fact that it involves fluid motions at vastly different length and time scales, requiring fine meshes and long simulation times. A solution to this issue is turbulence modeling, in which only the large scale part of the solution is retained and the effect of smaller turbulent motions is represented by a model, which is generally dissipative in nature. | |
− | + | In the context of finite element simulations for fluids, a second problem is the apparition of numerical instabilities. These can be avoided by the use of stabilized formulations, in which the problem is modified to ensure that it has a stable solution. Since stabilization methods typically introduce numerical dissipation, the relation between ''numerical'' and ''physical'' dissipation plays a crucial role in the accuracy of turbulent flow simulations. We investigate this issue by studying the behavior of stabilized finite element formulations based on the Variational Multiscale framework and on Finite Calculus, analyzing the results they provide for well-known turbulent problems, with the final goal of obtaining a method that both ensures numerical stability and introduces physically correct turbulent dissipation. | |
− | + | Given that, even with the use of turbulence models, turbulent flow problems require significant computational resources, we also focused on programming and parallel implementation aspects of finite element codes, and in particular in ensuring that our solver can perform efficiently on distributed memory architectures and high-performance computing clusters. | |
− | + | Finally, we have developed an adaptive mesh refinement technique to improve the quality of unstructured tetrahedral meshes, again with the goal of enabling the simulation of large turbulent flow problems. This technique combines an error estimator based on Variational Multiscale principles with a simple refinement procedure designed to work in a distributed memory context and we have applied it to the simulation of both turbulent and non-Newtonian flow problems. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
=1 Introduction= | =1 Introduction= | ||
Line 41: | Line 24: | ||
Turbulent flows can be characterized by the Reynolds number <math>\hbox{Re}</math>, a dimensionless parameter indicative of the balance between inertial and viscous forces in the problem, | Turbulent flows can be characterized by the Reynolds number <math>\hbox{Re}</math>, a dimensionless parameter indicative of the balance between inertial and viscous forces in the problem, | ||
− | <span id="eq-1"></span> | + | <span id="eq-1.1"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\hbox{Re} = \frac{\rho \, U L}{\mu } </math> | | style="text-align: center;" | <math>\hbox{Re} = \frac{\rho \, U L}{\mu } </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | (1) | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (1.1) |
|} | |} | ||
where <math display="inline">\rho </math> is the fluid's density and <math display="inline">\mu </math> its dynamic viscosity and <math display="inline">U</math> is a characteristic velocity of the flow. The Kolmogorov length scale can be related to the largest motions of the flow by means of the Reynolds number <span id='citeF-2'></span>[[#cite-2|[2]]] as | where <math display="inline">\rho </math> is the fluid's density and <math display="inline">\mu </math> its dynamic viscosity and <math display="inline">U</math> is a characteristic velocity of the flow. The Kolmogorov length scale can be related to the largest motions of the flow by means of the Reynolds number <span id='citeF-2'></span>[[#cite-2|[2]]] as | ||
− | <span id="eq-2"></span> | + | <span id="eq-1.2"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\frac{L}{\eta } = \hbox{Re}^{\frac{3}{4}} </math> | | style="text-align: center;" | <math>\frac{L}{\eta } = \hbox{Re}^{\frac{3}{4}} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | (2) | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (1.2) |
|} | |} | ||
Line 81: | Line 64: | ||
For turbulent flows in particular, the interaction between turbulence models and stabilization terms is an active area of research. While they have clearly different origins and motivations (turbulence models are typically motivated using physical arguments, while stabilization methods are purely numerical in nature), both types of methods have a dissipative effect on the solution, which has raised some questions regarding their interaction or the possibility of using a unified formulation to provide both stability and turbulence modeling. This subject has been studied for example for Streamline-Upwind Petrov-Galerkin (SUPG) stabilization <span id='citeF-11'></span><span id='citeF-12'></span>[[#cite-11|[11,12]]], Finite Calculus (FIC) based formulations <span id='citeF-13'></span><span id='citeF-14'></span>[[#cite-13|[13,14]]] and stabilization techniques within the Variational Multiscale (VMS) framework. | For turbulent flows in particular, the interaction between turbulence models and stabilization terms is an active area of research. While they have clearly different origins and motivations (turbulence models are typically motivated using physical arguments, while stabilization methods are purely numerical in nature), both types of methods have a dissipative effect on the solution, which has raised some questions regarding their interaction or the possibility of using a unified formulation to provide both stability and turbulence modeling. This subject has been studied for example for Streamline-Upwind Petrov-Galerkin (SUPG) stabilization <span id='citeF-11'></span><span id='citeF-12'></span>[[#cite-11|[11,12]]], Finite Calculus (FIC) based formulations <span id='citeF-13'></span><span id='citeF-14'></span>[[#cite-13|[13,14]]] and stabilization techniques within the Variational Multiscale (VMS) framework. | ||
− | In the case of VMS formulations, the stabilized problem is motivated by a separation of scales, differentiating a large scale part of the solution, that can be represented by the finite element mesh, from a small scale part, which remains unresolved, by means of a projection of the solution onto the finite element mesh <span id='citeF-15'></span><span id='citeF-16'></span>[[#cite-15|[15,16]]]. This concept has intriguing parallels with the spatial filtering introduced in LES methods and can be understood as a mesh-induced filtering. This has motivated multiple investigations studying the use VMS formulations in turbulence modeling [ | + | In the case of VMS formulations, the stabilized problem is motivated by a separation of scales, differentiating a large scale part of the solution, that can be represented by the finite element mesh, from a small scale part, which remains unresolved, by means of a projection of the solution onto the finite element mesh <span id='citeF-15'></span><span id='citeF-16'></span>[[#cite-15|[15,16]]]. This concept has intriguing parallels with the spatial filtering introduced in LES methods and can be understood as a mesh-induced filtering. This has motivated multiple investigations studying the use VMS formulations in turbulence modeling <span id='citeF-17'></span><span id='citeF-18'></span><span id='citeF-19'></span><span id='citeF-20'></span><span id='citeF-21'></span><span id='citeF-22'></span><span id='citeF-23'></span><span id='citeF-24'></span><span id='citeF-25'></span><span id='citeF-26'></span><span id='citeF-27'></span>[[#cite-17|[17,18,19,20,21,22,23,24,25,26,27]]], analyzing their relationship both from the theoretical point of view and through its application to the simulation of turbulent flows of interest. |
==1.2 Objectives and methodology== | ==1.2 Objectives and methodology== | ||
Line 93: | Line 76: | ||
A related topic in relation to the calculation of large problems is the use of adaptive mesh refinement techniques to simplify the mesh generation procedure and reduce the overall number of elements required to perform the simulation. We have developed a technique based on a simple refinement technique that can work in a distributed memory environment, which has been implemented to work in combination with the fluid solver. During the course of the present work we also found the opportunity to apply these refinement techniques to non-Newtonian flow problems. The results of our investigation in this area will also be presented. | A related topic in relation to the calculation of large problems is the use of adaptive mesh refinement techniques to simplify the mesh generation procedure and reduce the overall number of elements required to perform the simulation. We have developed a technique based on a simple refinement technique that can work in a distributed memory environment, which has been implemented to work in combination with the fluid solver. During the course of the present work we also found the opportunity to apply these refinement techniques to non-Newtonian flow problems. The results of our investigation in this area will also be presented. | ||
− | The methods presented in this document have been implemented within the open source Kratos Multiphysics finite element framework <span id='citeF- | + | The methods presented in this document have been implemented within the open source Kratos Multiphysics finite element framework <span id='citeF-28'></span><span id='citeF-29'></span>[[#cite-28|[28,29]]], which is based on C++ and Python and has parallel calculation capabilities, some of which have been developed or expanded as part of the present work. This implementation has been used to simulate all the examples considered and generate the presented results. |
==1.3 Outline of this document== | ==1.3 Outline of this document== | ||
Line 113: | Line 96: | ||
Variational multiscale (VMS) methods <span id='citeF-15'></span><span id='citeF-16'></span>[[#cite-15|[15,16]]] provide a theoretical framework for the design of stabilized finite element formulations based on the separation of the solution into resolved and unresolved parts, which is achieved through the definition of large scale and small scale solution spaces. The projection of the original equations onto the large scale space gives an equivalent problem that depends on the small scale variables, while the projection of the original equations onto the small scale space is used to motivate a model for the effect of the small scale variables, which are not solved, to the large scale solution. | Variational multiscale (VMS) methods <span id='citeF-15'></span><span id='citeF-16'></span>[[#cite-15|[15,16]]] provide a theoretical framework for the design of stabilized finite element formulations based on the separation of the solution into resolved and unresolved parts, which is achieved through the definition of large scale and small scale solution spaces. The projection of the original equations onto the large scale space gives an equivalent problem that depends on the small scale variables, while the projection of the original equations onto the small scale space is used to motivate a model for the effect of the small scale variables, which are not solved, to the large scale solution. | ||
− | This methodology has interesting parallels with LES turbulence models, which use a spatial filter to introduce a separation between the resolved and unresolved parts of the solution. This fact has motivated research into the relationship between VMS stabilized formulations and LES methods, and in particular on the possible use of VMS methods as turbulence models. In the present chapter we review some current trends in VMS formulations, including the derivation of algebraic and orthogonal models for the small scales, and the arguments that have been used to relate them to turbulence modeling. We also direct our attention to dynamic subscale models <span id='citeF- | + | This methodology has interesting parallels with LES turbulence models, which use a spatial filter to introduce a separation between the resolved and unresolved parts of the solution. This fact has motivated research into the relationship between VMS stabilized formulations and LES methods, and in particular on the possible use of VMS methods as turbulence models. In the present chapter we review some current trends in VMS formulations, including the derivation of algebraic and orthogonal models for the small scales, and the arguments that have been used to relate them to turbulence modeling. We also direct our attention to dynamic subscale models <span id='citeF-30'></span><span id='citeF-20'></span>[[#cite-30|[30,20]]], which have been shown to provide good results in turbulent flow simulations without requiring the use of an explicit turbulence model <span id='citeF-25'></span><span id='citeF-31'></span><span id='citeF-27'></span>[[#cite-25|[25,31,27]]]. |
− | In spite of the success of the method in the mentioned tests, some aspects of the behavior of VMS methods as turbulence models are not completely understood. In particular, the solution of the problem has a degree of dependency on the precise definition of the stabilization parameters (see for example <span id='citeF- | + | In spite of the success of the method in the mentioned tests, some aspects of the behavior of VMS methods as turbulence models are not completely understood. In particular, the solution of the problem has a degree of dependency on the precise definition of the stabilization parameters (see for example <span id='citeF-31'></span>[[#cite-31|[31]]]) and on using or neglecting the pressure small scale <span id='citeF-27'></span>[[#cite-27|[27]]]. We investigate this issue through the analysis of the results of turbulent channel flow simulations. Additionally, we propose a new model for the pressure small scale, which we found to provide more accurate results in our simulations. |
The chapter is organized as follows: in the next pages we review the state of the art for the formulations of interest, introducing the Galerkin weak form of the incompressible Navier-Stokes equations Section [[#2.2 Variational form of the Navier-Stokes equations|2.2]] and using it Section [[#2.3 Variational multiscale stabilization|2.3]] to obtain the complete stabilized equations for the different variants that will be considered in this work. We continue by presenting the arguments that have been used to justify their use as a turbulence model in Section [[#2.4 VMS methods and Large Eddy Simulation|2.4]]. In Section [[#2.5 Discrete problem|2.5]] we present the finite element solver that we have implemented based on the described VMS formulations. In Section [[#2.6 A new model for the pressure subscale|2.6]] we present our proposal for a new model of pressure small scale and in Section [[#2.7 Application to the turbulent channel flow|2.7]] we use both this and standard VMS methods to simulate a turbulent channel flow test case, analyzing the solution in terms of different measured statistics of the flow and their comparison with reference DNS data. Finally, we present our conclusions in Section [[#2.8 Concluding remarks|2.8]]. | The chapter is organized as follows: in the next pages we review the state of the art for the formulations of interest, introducing the Galerkin weak form of the incompressible Navier-Stokes equations Section [[#2.2 Variational form of the Navier-Stokes equations|2.2]] and using it Section [[#2.3 Variational multiscale stabilization|2.3]] to obtain the complete stabilized equations for the different variants that will be considered in this work. We continue by presenting the arguments that have been used to justify their use as a turbulence model in Section [[#2.4 VMS methods and Large Eddy Simulation|2.4]]. In Section [[#2.5 Discrete problem|2.5]] we present the finite element solver that we have implemented based on the described VMS formulations. In Section [[#2.6 A new model for the pressure subscale|2.6]] we present our proposal for a new model of pressure small scale and in Section [[#2.7 Application to the turbulent channel flow|2.7]] we use both this and standard VMS methods to simulate a turbulent channel flow test case, analyzing the solution in terms of different measured statistics of the flow and their comparison with reference DNS data. Finally, we present our conclusions in Section [[#2.8 Concluding remarks|2.8]]. | ||
Line 125: | Line 108: | ||
The incompressible Navier-Stokes equations state the balance of linear momentum and mass in a fluid domain <math display="inline">\Omega </math>, given by | The incompressible Navier-Stokes equations state the balance of linear momentum and mass in a fluid domain <math display="inline">\Omega </math>, given by | ||
− | <span id="eq-3"></span> | + | <span id="eq-2.3"></span> |
− | <span id="eq-4"></span> | + | <span id="eq-2.4"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\rho \, \partial _t u + \rho \, u\cdot \nabla u- \nabla \cdot \boldsymbol{\sigma }= \boldsymbol{f} \hbox{ in }\Omega \times \left[0,T\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.3) | |
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | (3) | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \nabla \cdot u= 0 \hbox{ in }\Omega \times \left[0,T\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.4) | |
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | (4) | + | |
|} | |} | ||
|} | |} | ||
Line 148: | Line 125: | ||
where <math display="inline">u</math> is the fluid velocity, <math display="inline">\rho </math> its density, <math display="inline">\boldsymbol{\sigma }</math> represents the stress tensor and <math display="inline">\boldsymbol{f}</math> the external forces acting on the domain. | where <math display="inline">u</math> is the fluid velocity, <math display="inline">\rho </math> its density, <math display="inline">\boldsymbol{\sigma }</math> represents the stress tensor and <math display="inline">\boldsymbol{f}</math> the external forces acting on the domain. | ||
− | The problem described by Eqs. [[#eq-3|3]] and [[#eq-4|4]] must be completed with suitable initial and boundary conditions. We denote the domain boundary as <math display="inline">\partial \Omega </math> and introduce its partition into Dirichlet (<math display="inline">\Gamma _D</math>) and Neumann (<math display="inline">\Gamma _N</math>) parts, verifying <math display="inline">\partial \Omega = \Gamma _D \cup \Gamma _N</math> and <math display="inline">\Gamma _D \cap \Gamma _N = \emptyset </math>. The initial and boundary conditions for the problem can be expressed as: | + | The problem described by Eqs. [[#eq-2.3|2.3]] and [[#eq-2.4|2.4]] must be completed with suitable initial and boundary conditions. We denote the domain boundary as <math display="inline">\partial \Omega </math> and introduce its partition into Dirichlet (<math display="inline">\Gamma _D</math>) and Neumann (<math display="inline">\Gamma _N</math>) parts, verifying <math display="inline">\partial \Omega = \Gamma _D \cup \Gamma _N</math> and <math display="inline">\Gamma _D \cap \Gamma _N = \emptyset </math>. The initial and boundary conditions for the problem can be expressed as: |
− | <span id="eq-5"></span> | + | <span id="eq-2.5"></span> |
− | <span id="eq-6"></span> | + | <span id="eq-2.6"></span> |
− | <span id="eq-7"></span> | + | <span id="eq-2.7"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>u= u_0 \hbox{ in }\Omega , \, t = 0 </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.5) | |
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | (5) | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> u= u_D \hbox{ in }\Gamma _D \times \left[0,T\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.6) | |
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | (6) | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{\sigma }\cdot \boldsymbol{n} = \boldsymbol{t} \hbox{ in }\Gamma _N \times \left[0,T\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.7) | |
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | (7) | + | |
|} | |} | ||
|} | |} | ||
− | where <math display="inline">u_0</math> is the initial velocity field, <math display="inline">u_D</math> represents the imposed velocity on the Dirichlet boundary, <math display="inline">\boldsymbol{n}</math> the outer normal vector and <math display="inline">\boldsymbol{t}</math> the imposed traction acting along the Neumann boundary. Note that the initial velocity <math display="inline">u_0</math> must be chosen to be divergence free to ensure that Eq. [[#eq-4|4]] is verified at all times. | + | where <math display="inline">u_0</math> is the initial velocity field, <math display="inline">u_D</math> represents the imposed velocity on the Dirichlet boundary, <math display="inline">\boldsymbol{n}</math> the outer normal vector and <math display="inline">\boldsymbol{t}</math> the imposed traction acting along the Neumann boundary. Note that the initial velocity <math display="inline">u_0</math> must be chosen to be divergence free to ensure that Eq. [[#eq-2.4|2.4]] is verified at all times. |
For Newtonian fluids, the stress tensor <math display="inline">\boldsymbol{\sigma }</math> can be related to the fluid velocity <math display="inline">u</math> and pressure <math display="inline">p</math> using the constitutive relation | For Newtonian fluids, the stress tensor <math display="inline">\boldsymbol{\sigma }</math> can be related to the fluid velocity <math display="inline">u</math> and pressure <math display="inline">p</math> using the constitutive relation | ||
− | <span id="eq-8"></span> | + | <span id="eq-2.8"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{\sigma }= - p \, \boldsymbol{I} + 2 \mu \left(\nabla ^s u- \frac{1}{3} \, \left(\nabla \cdot u\right)\boldsymbol{I} \right) </math> | | style="text-align: center;" | <math>\boldsymbol{\sigma }= - p \, \boldsymbol{I} + 2 \mu \left(\nabla ^s u- \frac{1}{3} \, \left(\nabla \cdot u\right)\boldsymbol{I} \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | (8) | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.8) |
|} | |} | ||
where <math display="inline">\boldsymbol{I}</math> is the second order identity tensor, <math display="inline">\mu </math> the fluid's viscosity and <math display="inline">\nabla ^s u</math> the symmetric gradient of velocity, defined as | where <math display="inline">\boldsymbol{I}</math> is the second order identity tensor, <math display="inline">\mu </math> the fluid's viscosity and <math display="inline">\nabla ^s u</math> the symmetric gradient of velocity, defined as | ||
− | <span id="eq-9"></span> | + | <span id="eq-2.9"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\nabla ^s u= \frac{1}{2} \left(\nabla u+ \left(\nabla u\right)^T \right) </math> | | style="text-align: center;" | <math>\nabla ^s u= \frac{1}{2} \left(\nabla u+ \left(\nabla u\right)^T \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | (9) | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.9) |
|} | |} | ||
− | To obtain a finite element formulation for the Navier-Stokes equations we need to rewrite them in weak form. We multiply Eq. [[#eq-3|3]] by a velocity test function <math display="inline">\boldsymbol{w}</math>, defined to be zero on the Dirichlet boundary <math display="inline">\Gamma _D</math>, and Eq. [[#eq-4|4]] by a pressure test function <math display="inline">q</math>. Integrating the resulting expressions over the fluid domain we obtain | + | To obtain a finite element formulation for the Navier-Stokes equations we need to rewrite them in weak form. We multiply Eq. [[#eq-2.3|2.3]] by a velocity test function <math display="inline">\boldsymbol{w}</math>, defined to be zero on the Dirichlet boundary <math display="inline">\Gamma _D</math>, and Eq. [[#eq-2.4|2.4]] by a pressure test function <math display="inline">q</math>. Integrating the resulting expressions over the fluid domain we obtain |
− | <span id="eq-10"></span> | + | <span id="eq-2.10"></span> |
− | <span id="eq-11"></span> | + | <span id="eq-2.11"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\int _\Omega \boldsymbol{w}\cdot \left(\rho \, \partial _t u + \rho \, u\cdot \nabla u- \nabla \cdot \boldsymbol{\sigma }\right)\, \hbox{d}\Omega = \int _\Omega \boldsymbol{w}\cdot \boldsymbol{f} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.10) | |
− | | style="width: 5px;text-align: right;" | (10) | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega q \, \nabla \cdot u\, \hbox{d}\Omega = 0 </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.11) | |
− | | style="width: 5px;text-align: right;" | (11) | + | |
|} | |} | ||
|} | |} | ||
− | The Neumann boundary condition can be introduced in the formulation by using the product rule on the stress term in Eq. [[#eq-10|10]] and expressing the resulting divergence as a boundary integral, which allows us to write | + | The Neumann boundary condition can be introduced in the formulation by using the product rule on the stress term in Eq. [[#eq-2.10|2.10]] and expressing the resulting divergence as a boundary integral, which allows us to write |
− | <span id="eq-12"></span> | + | <span id="eq-2.12"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>- \int _\Omega \boldsymbol{w}\, \nabla \cdot \boldsymbol{\sigma }\, \hbox{d}\Omega = \int _\Omega \nabla \boldsymbol{w}: \boldsymbol{\sigma }\, \hbox{d}\Omega - \int _\Omega \nabla \cdot \left(\boldsymbol{w}\cdot \boldsymbol{\sigma }\right)\, \hbox{d}\Omega </math> | | style="text-align: center;" | <math>- \int _\Omega \boldsymbol{w}\, \nabla \cdot \boldsymbol{\sigma }\, \hbox{d}\Omega = \int _\Omega \nabla \boldsymbol{w}: \boldsymbol{\sigma }\, \hbox{d}\Omega - \int _\Omega \nabla \cdot \left(\boldsymbol{w}\cdot \boldsymbol{\sigma }\right)\, \hbox{d}\Omega </math> | ||
|- | |- | ||
− | | style="text-align: center;" | <math> = \int _\Omega \nabla \boldsymbol{w}: \boldsymbol{\sigma }\, \hbox{d}\Omega + \int _{\partial \Omega } \boldsymbol{w}\cdot \boldsymbol{\sigma }\cdot \boldsymbol{n} \, \hbox{d}\ | + | | style="text-align: center;" | <math> = \int _\Omega \nabla \boldsymbol{w}: \boldsymbol{\sigma }\, \hbox{d}\Omega + \int _{\partial \Omega } \boldsymbol{w}\cdot \boldsymbol{\sigma }\cdot \boldsymbol{n} \, \hbox{d}\Gamma = \int _\Omega \nabla \boldsymbol{w}: \boldsymbol{\sigma }\, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}\cdot \boldsymbol{t} \, \hbox{d}\Gamma </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | (12) | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.12) |
|} | |} | ||
− | Substituting Eq. [[#eq-12|12]] into Eq. [[#eq-10|10]] and introducing the definition of the stress tensor in Eq. [[#eq-8|8]] we obtain | + | Substituting Eq. [[#eq-2.12|2.12]] into Eq. [[#eq-2.10|2.10]] and introducing the definition of the stress tensor in Eq. [[#eq-2.8|2.8]] we obtain |
− | <span id="eq- | + | <span id="eq-2.13"></span> |
− | <span id="eq- | + | <span id="eq-2.14"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\int _\Omega \boldsymbol{w}\cdot \left(\rho \, \partial _t u + \rho \, u\cdot \nabla u\right)\, \hbox{d}\Omega + \int _\Omega \nabla ^s \boldsymbol{w}: \, 2 \mu \left(\nabla ^s u- \frac{1}{3} \left(\nabla \cdot u\right)\right)\, \hbox{d}\Omega </math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> - \int _\Omega \nabla \cdot \boldsymbol{w}\, p \, \hbox{d}\Omega = \int _\Omega \boldsymbol{w}\cdot \boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}\cdot \boldsymbol{t} \, \hbox{d}\Gamma </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.13) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega q \, \nabla \cdot u\, \hbox{d}\Omega = 0 </math> |
− | | <math>\int _\Omega q \, \nabla \cdot u\, \hbox{d}\Omega = 0 </math> | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.14) |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | Eqs. [[#eq- | + | Eqs. [[#eq-2.13|2.13]] and [[#eq-2.14|2.14]], together with the initial and Dirichlet boundary conditions, allow us to state the weak form of the problem. In addition, they also impose regularity requirements on the solution, test functions and problem data, as it must be ensured that all the integrals that appear in the equations remain bounded. This is only briefly discussed here, directing the reader to more specific literature on this topic for a rigorous formulation (see for example <span id='citeF-32'></span><span id='citeF-33'></span>[[#cite-32|[32,33]]]). In general, for any two given functions <math display="inline">f,g</math> we want to ensure that |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\int _\Omega f g \, \hbox{d}\Omega < \infty </math> | | style="text-align: center;" | <math>\int _\Omega f g \, \hbox{d}\Omega < \infty </math> | ||
Line 279: | Line 241: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\left\Vert f \right\Vert _{\Omega } = \left(\int _\Omega f^2 \, \hbox{d}\Omega \right)^\frac{1}{2} </math> | + | | style="text-align: center;" | <math>\left\Vert f \right\Vert _{L^2(\Omega)} = \left(\int _\Omega f^2 \, \hbox{d}\Omega \right)^\frac{1}{2} </math> |
|} | |} | ||
|} | |} | ||
Line 287: | Line 249: | ||
and functions with bounded <math display="inline">L^2</math> norm are said to be square-integrable. The space of functions that are square-integrable in <math display="inline">\Omega </math> is denoted as <math display="inline">L^2\left(\Omega \right)</math>. | and functions with bounded <math display="inline">L^2</math> norm are said to be square-integrable. The space of functions that are square-integrable in <math display="inline">\Omega </math> is denoted as <math display="inline">L^2\left(\Omega \right)</math>. | ||
− | Although no proof is given here, it can be shown that, for any given time instant <math display="inline">t</math>, it is sufficient to require that both the momentum test function <math display="inline">\boldsymbol{w}</math>, the velocity solution <math display="inline">u</math> and their first order derivatives belong to <math display="inline">L^2(\Omega )</math>. The space of functions verifying this property is a Hilbert space commonly denoted as <math display="inline">H^1(\Omega )</math> in functional analysis. For the mass conservation test function <math display="inline">q</math> and the pressure solution <math display="inline">p</math>, it is enough to require them to be square-integrable, as their spatial derivatives do not appear in Eqs. [[#eq- | + | Although no proof is given here, it can be shown that, for any given time instant <math display="inline">t</math>, it is sufficient to require that both the momentum test function <math display="inline">\boldsymbol{w}</math>, the velocity solution <math display="inline">u</math> and their first order derivatives belong to <math display="inline">L^2(\Omega )</math>. The space of functions verifying this property is a Hilbert space commonly denoted as <math display="inline">H^1(\Omega )</math> in functional analysis. For the mass conservation test function <math display="inline">q</math> and the pressure solution <math display="inline">p</math>, it is enough to require them to be square-integrable, as their spatial derivatives do not appear in Eqs. [[#eq-2.13|2.13]] and [[#eq-2.14|2.14]]. |
Considering that <math display="inline">u</math> must verify the Dirichlet boundary condition when evaluated in the Dirichlet boundary <math display="inline">\Gamma _D</math> and <math display="inline">\boldsymbol{w}</math> is zero in <math display="inline">\Gamma _D</math> by definition, the solutions (for any fixed instant in time) and test functions must be contained in the spaces of functions given by | Considering that <math display="inline">u</math> must verify the Dirichlet boundary condition when evaluated in the Dirichlet boundary <math display="inline">\Gamma _D</math> and <math display="inline">\boldsymbol{w}</math> is zero in <math display="inline">\Gamma _D</math> by definition, the solutions (for any fixed instant in time) and test functions must be contained in the spaces of functions given by | ||
Line 294: | Line 256: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>u\in H^1_D = \left\lbrace \left.u\in H^1(\Omega ) \, \right\vert \, u= u_D \hbox{ in } \Gamma _D \right\rbrace </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{w}\in H^1_0 = \left\lbrace \left.\boldsymbol{w}\in H^1(\Omega ) \, \right\vert \, \boldsymbol{w}= \boldsymbol{0} \hbox{ in } \Gamma _D \right\rbrace </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> p,q \in L^2(\Omega ) </math> |
− | + | ||
|} | |} | ||
|} | |} | ||
− | Likewise, the external forces <math display="inline">\boldsymbol{f}</math> must be such that the domain integral in the right hand side of Eq. [[#eq- | + | Likewise, the external forces <math display="inline">\boldsymbol{f}</math> must be such that the domain integral in the right hand side of Eq. [[#eq-2.13|2.13]] is well defined. Given that <math display="inline">\boldsymbol{w}\in H^1(\Omega )</math>, this is equivalent to requiring the forces to belong to the dual of that space, denoted as <math display="inline">H^{-1}(\Omega )</math>. There is a similar requirement on the traction <math display="inline">\boldsymbol{t}</math>, as it has to be integrable when multiplied by the test function <math display="inline">\boldsymbol{w}</math> restricted to the Neumann boundary, but it will not be formally stated here. |
− | Finally, to make sure that the dynamic problem is well-posed it is sufficient to require that <math display="inline">\left\Vert u \right\ | + | Finally, to make sure that the dynamic problem is well-posed it is sufficient to require that <math display="inline">\left\Vert u \right\Vert_{L^2(\Omega) }</math> and <math display="inline">\left\Vert \partial u_i / \partial x_j \right\Vert_{L^2(\Omega) }</math> square-integrable along the time interval of the problem. This is denoted as <math display="inline">u\in L^2\left(0,T,H^{1}_D(\Omega )\right)</math>. In the case of the pressure it is enough to enforce that the <math display="inline">L^2</math> norm is square-integrable in time, that is, <math display="inline">p \in L^2\left(0,T,L^{2}(\Omega )\right)</math>. |
===2.2.2 Conservation properties=== | ===2.2.2 Conservation properties=== | ||
− | Before we introduce the variational form of the problem, there is an important remark to be made about the convective term in the momentum equation Eq. [[#eq-3|3]]. As long as the velocity field is strongly (point-wise) divergence-free, the following three expressions are identical: | + | Before we introduce the variational form of the problem, there is an important remark to be made about the convective term in the momentum equation Eq. [[#eq-2.3|2.3]]. As long as the velocity field is strongly (point-wise) divergence-free, the following three expressions are identical: |
− | <span id="eq- | + | <span id="eq-2.15"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>u\cdot \nabla u= \nabla \cdot \left(u\otimes u\right)= \frac{1}{2} \, u\cdot \nabla u+ \frac{1}{2} \, \nabla \cdot \left(u\otimes u\right) </math> | | style="text-align: center;" | <math>u\cdot \nabla u= \nabla \cdot \left(u\otimes u\right)= \frac{1}{2} \, u\cdot \nabla u+ \frac{1}{2} \, \nabla \cdot \left(u\otimes u\right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.15) |
|} | |} | ||
or, in variational form, | or, in variational form, | ||
− | <span id="eq- | + | <span id="eq-2.16"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\int _\Omega \boldsymbol{w}\cdot \left(u\cdot \nabla u\right)\, \hbox{d}\Omega = </math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> - \int _\Omega \nabla \boldsymbol{w}: \left(u\otimes u\right)\, \hbox{d}\Omega + \int _{\Gamma _N} \left(\boldsymbol{w}\cdot u\right)\left(u\cdot \boldsymbol{n} \right)\, \hbox{d}\Gamma = </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.16) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \frac{1}{2}\int _\Omega \boldsymbol{w}\cdot \left(u\cdot \nabla u\right)\, \hbox{d}\Omega - \frac{1}{2} \int _\Omega \nabla \boldsymbol{w}: \left(u\otimes u\right)\, \hbox{d}\Omega + \frac{1}{2} \int _{\Gamma _N} \left(\boldsymbol{w}\cdot u\right)\left(u\cdot \boldsymbol{n} \right)\, \hbox{d}\Gamma </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.17) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | The three expressions in Eq. [[#eq- | + | The three expressions in Eq. [[#eq-2.15|2.15]] are respectively known as ''non-conservative'', ''conservative'' and ''skew-symmetric'' forms of the convective term. However, in practice, the expressions in Eq. [[#eq-2.16|2.16]] are not equivalent for the discrete problem, as the velocity solution is only divergence-free in a weak (integral) sense. In fact, as shown in <span id='citeF-34'></span>[[#cite-34|[34]]], each of them gives rise to a variational problem with different conservation properties. While the continuous Navier-Stokes equations enforce the balance of linear and angular momentum, as well as kinetic energy, none of the discrete variants ensures conservation of the three quantities at the same time. According to the analysis in the same reference, the variational form resulting from each expression conserves the quantities listed in Table [[#table-1|1]]. |
− | {| class="wikitable" style="text-align: center; margin: 1em auto;" | + | {| class="floating_tableSCP wikitable" style="text-align: center; margin: 1em auto;min-width:50%;" |
− | |+ <span id='table-1'></span>Table. 1 Conserved quantities in the discrete Navier-Stokes equations depending on the expression of the convective term, according to <span id='citeF- | + | |+ style="font-size: 75%;" |<span id='table-1'></span>Table. 1 Conserved quantities in the discrete Navier-Stokes equations depending on the expression of the convective term, according to <span id='citeF-34'></span>[[#cite-34|[34]]]. |
|- | |- | ||
| style="border-right: 2px solid;" | Convective term | | style="border-right: 2px solid;" | Convective term | ||
Line 358: | Line 313: | ||
| style="border-left: 2px solid;border-right: 2px solid;" | Angular mom. | | style="border-left: 2px solid;border-right: 2px solid;" | Angular mom. | ||
| style="border-left: 2px solid;" | Kinetic energy | | style="border-left: 2px solid;" | Kinetic energy | ||
− | |- | + | |- style="border-top: 2px solid;" |
| style="border-right: 2px solid;" | Non-conservative | | style="border-right: 2px solid;" | Non-conservative | ||
| style="border-left: 2px solid;border-right: 2px solid;" | For equal <math>u</math>-<math>p</math> interpolations | | style="border-left: 2px solid;border-right: 2px solid;" | For equal <math>u</math>-<math>p</math> interpolations | ||
Line 383: | Line 338: | ||
''Find <math>u\in L^2\left(0,T,H^{1}_D(\Omega )\right)</math>, <math>p \in L^2\left(0,T,L^{2}(\Omega )\right)</math> such that, <math>\forall \boldsymbol{w}\in H^{1}_0(\Omega ), \forall q \in L^2(\Omega )</math>,'' | ''Find <math>u\in L^2\left(0,T,H^{1}_D(\Omega )\right)</math>, <math>p \in L^2\left(0,T,L^{2}(\Omega )\right)</math> such that, <math>\forall \boldsymbol{w}\in H^{1}_0(\Omega ), \forall q \in L^2(\Omega )</math>,'' | ||
− | <span id="eq- | + | <span id="eq-2.18"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\int _\Omega \boldsymbol{w}\cdot \left(\rho \, \partial _t u + \rho \frac{1}{2} u\cdot \nabla u\right)\, \hbox{d}\Omega - \int _\Omega \nabla \boldsymbol{w}: \rho \frac{1}{2} \left(u\otimes u\right)\, \hbox{d}\Omega \qquad \qquad \qquad \qquad </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> + \int _\Omega \nabla ^s \boldsymbol{w}: \, 2 \mu \left(\nabla ^s u- \frac{1}{3} \left(\nabla \cdot u\right)\right)\, \hbox{d}\Omega - \int _\Omega \nabla \cdot \boldsymbol{w}\, p \, \hbox{d}\Omega = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega \boldsymbol{w}\cdot \boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}\cdot \left(\boldsymbol{t} + \rho \frac{1}{2} \left(u\cdot \boldsymbol{n} \right)u\right)\, \hbox{d}\Gamma </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega q \, \nabla \cdot u\, \hbox{d}\Omega = 0 </math> |
− | + | ||
|} | |} | ||
|} | |} | ||
Line 405: | Line 356: | ||
Unfortunately, this problem is not straightforward to solve using finite elements, as its discrete version is not numerically stable. In fact, to ensure that that problem of finding a pair <math display="inline">u,p</math> that satisfies the above weak form for all suitable choices of <math display="inline">\boldsymbol{w},q</math> has a stable solution, the discrete spaces in which the solution is sought must verify the ''inf-sup'' or Ladyzhenskaya-Babuska-Brezzi (LBB) condition, given by | Unfortunately, this problem is not straightforward to solve using finite elements, as its discrete version is not numerically stable. In fact, to ensure that that problem of finding a pair <math display="inline">u,p</math> that satisfies the above weak form for all suitable choices of <math display="inline">\boldsymbol{w},q</math> has a stable solution, the discrete spaces in which the solution is sought must verify the ''inf-sup'' or Ladyzhenskaya-Babuska-Brezzi (LBB) condition, given by | ||
− | <span id="eq- | + | <span id="eq-2.18"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\inf _{q \neq 0 \; q \in Q} \sup _{\boldsymbol{w}\neq \boldsymbol{0} \; \boldsymbol{w}\in V} \frac{\int _\Omega q \nabla \cdot \boldsymbol{w}\, \hbox{d}\Omega }{\left\Vert q \right\ | + | | style="text-align: center;" | <math>\inf _{q \neq 0 \; q \in Q} \sup _{\boldsymbol{w}\neq \boldsymbol{0} \; \boldsymbol{w}\in V} \frac{\int _\Omega q \nabla \cdot \boldsymbol{w}\, \hbox{d}\Omega }{\left\Vert q \right\Vert_{Q } \left\Vert \boldsymbol{w} \right\Vert_{V }} \geq C </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.18) |
|} | |} | ||
− | where <math display="inline">V</math> and <math display="inline">Q</math> are spaces containing the velocity and pressure solutions, respectively, and <math display="inline">C</math> is a positive constant. In practice, satisfaction of the LBB condition implies the use of a higher order interpolation for velocity than for pressure, as is done for example in Taylor-Hood elements <span id='citeF- | + | where <math display="inline">V</math> and <math display="inline">Q</math> are spaces containing the velocity and pressure solutions, respectively, and <math display="inline">C</math> is a positive constant. In practice, satisfaction of the LBB condition implies the use of a higher order interpolation for velocity than for pressure, as is done for example in Taylor-Hood elements <span id='citeF-35'></span>[[#cite-35|[35]]]. |
Numerical instabilities in the discrete solution of the Navier-Stokes may also appear in convection-dominated flows, that is, when the convective term is large in relation to the viscous term. In turbulent flows, this issue can be understood from a physical point of view by noting that viscous dissipation occurs predominantly due to high velocity gradients at small scales. If the finite element mesh is coarse, these gradients cannot be reproduced and dissipation is underestimated, which leads to energy accumulation on the larger scales and the eventual loss of convergence of the solution. | Numerical instabilities in the discrete solution of the Navier-Stokes may also appear in convection-dominated flows, that is, when the convective term is large in relation to the viscous term. In turbulent flows, this issue can be understood from a physical point of view by noting that viscous dissipation occurs predominantly due to high velocity gradients at small scales. If the finite element mesh is coarse, these gradients cannot be reproduced and dissipation is underestimated, which leads to energy accumulation on the larger scales and the eventual loss of convergence of the solution. | ||
− | Both instabilities can be ''cured'' by the use of a stabilized formulation, which involves obtaining a modified weak form not restricted by the inf-sup condition of Eq. [[#eq- | + | Both instabilities can be ''cured'' by the use of a stabilized formulation, which involves obtaining a modified weak form not restricted by the inf-sup condition of Eq. [[#eq-2.18|2.18]]. This has the advantage of allowing the use of equal order interpolations for velocity and pressure. Two classical stabilized formulations for the Navier-Stokes equations are known as Streamline-Upwind Petrov-Galerkin (SUPG) <span id='citeF-36'></span>[[#cite-36|[36]]] and Galerkin-Least Squares (GLS) <span id='citeF-37'></span>[[#cite-37|[37]]]. Other alternatives are methods within the VMS framework, which are the main subject of the present chapter, and the Finite Calculus (FIC) approach, presented in Chapter [[#3 A Finite Calculus stabilized finite element formulation for turbulent flows|3]]. |
==2.3 Variational multiscale stabilization== | ==2.3 Variational multiscale stabilization== | ||
Line 426: | Line 377: | ||
===2.3.1 Scale separation=== | ===2.3.1 Scale separation=== | ||
− | The Variational Multiscale (VMS) method, introduced in <span id='citeF-15'></span><span id='citeF- | + | The Variational Multiscale (VMS) method, introduced in <span id='citeF-15'></span><span id='citeF-38'></span><span id='citeF-16'></span>[[#cite-15|[15,38,16]]] is a theoretical framework for the development of stabilized finite element methods that has been used extensively during the last two decades in finite element formulations for fluid problems. The basic premise of this method is the separation of the problem variables into large scale <math display="inline">\left(\cdot \right)_h</math> and small scale, or subscale, values <math display="inline">\left(\cdot \right)_s</math>, which in our case corresponds to |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>u= u_h+ u_s\quad p = p_h+ p_s</math> |
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{w}= \boldsymbol{w}_h+ \boldsymbol{w}_s\quad q = q_h+ q_s </math> |
− | + | ||
|} | |} | ||
|} | |} | ||
Line 443: | Line 392: | ||
The <math display="inline">\left(\cdot \right)_h</math> notation chosen to represent the large scales should be understood as a reference to the finite element mesh size <math display="inline">h</math>. In practice, scale separation is closely related to the spatial discretization used to solve the problem. This is shown graphically in Figure [[#img-1|1]], where the solution along a line is represented. The large scales correspond to the part of the solution that can be described using the finite element interpolation, while the small scales represent fine features of the solution that cannot be reproduced due to the limitations of the discrete interpolation. | The <math display="inline">\left(\cdot \right)_h</math> notation chosen to represent the large scales should be understood as a reference to the finite element mesh size <math display="inline">h</math>. In practice, scale separation is closely related to the spatial discretization used to solve the problem. This is shown graphically in Figure [[#img-1|1]], where the solution along a line is represented. The large scales correspond to the part of the solution that can be described using the finite element interpolation, while the small scales represent fine features of the solution that cannot be reproduced due to the limitations of the discrete interpolation. | ||
+ | <div id='img-1a'></div> | ||
+ | <div id='img-1b'></div> | ||
+ | <div id='img-1c'></div> | ||
+ | <div id='img-1d'></div> | ||
+ | <div id='img-1e'></div> | ||
<div id='img-1'></div> | <div id='img-1'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-vms_domain_continuous.png|106px|Continuous domain.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-vms_domain_discrete.png|105px|Discrete domain.]] |
+ | |[[Image:Cotela_2016-vms_solution_continuous.png|270px|Continuous solution.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Continuous domain. | ||
+ | | (b) Discrete domain. | ||
+ | | (c) Continuous solution. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-vms_solution_large.png|270px|Large scale solution.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-vms_solution_small.png|270px|Small scale solution.]] |
− | |- | + | |- style="text-align: center; font-size: 75%;" |
− | + | | (d) Large scale solution. | |
+ | | (e) Small scale solution. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | colspan="3" | '''Figure 1:''' Scale separation. |
|} | |} | ||
Line 462: | Line 422: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>u_h\in W_h \subset W \equiv L^2\left(0,T,H^{1}_D(\Omega )\right)\qquad p_h\in Q_h \subset Q \equiv L^2\left(0,T,L^{2}(\Omega )\right) </math> | | style="text-align: center;" | <math>u_h\in W_h \subset W \equiv L^2\left(0,T,H^{1}_D(\Omega )\right)\qquad p_h\in Q_h \subset Q \equiv L^2\left(0,T,L^{2}(\Omega )\right) </math> | ||
Line 475: | Line 435: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\mathcal{B}\left(\boldsymbol{w},\boldsymbol{a},u\right) = \int _\Omega \boldsymbol{w}\cdot \left(\rho \, \partial _t u + \rho \frac{1}{2} \boldsymbol{a} \cdot \nabla u\right)\, \hbox{d}\Omega - \int _\Omega \nabla \boldsymbol{w}: \rho \frac{1}{2} \left(\boldsymbol{a} \otimes u\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> + \int _\Omega \nabla ^s \boldsymbol{w}: \, 2 \mu \left(\nabla ^s u- \frac{1}{3} \left(\nabla \cdot u\right)\right)\, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}\cdot \rho \frac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)u\, \hbox{d}\Gamma </math> |
− | | <math>+ \int _\Omega \nabla ^s \boldsymbol{w}: \, 2 \mu \left(\nabla ^s u- \frac{1}{3} \left(\nabla \cdot u\right)\right)\, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}\cdot \rho \frac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)u\, \hbox{d}\ | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \mathcal{D}\left(\boldsymbol{w},p\right) = \int _\Omega \nabla \cdot \boldsymbol{w}\, p \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \mathcal{L}\left(\boldsymbol{w}\right) = \int _\Omega \boldsymbol{w}\cdot \boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}\cdot \boldsymbol{t} \, \hbox{d}\Gamma </math> |
− | + | ||
|} | |} | ||
|} | |} | ||
Line 493: | Line 449: | ||
Note that we have modified the convective terms in <math display="inline">\mathcal{B}\left(\boldsymbol{w},\boldsymbol{a},u\right)</math> to introduce a convection velocity <math display="inline">\boldsymbol{a}</math>. This notation is introduced for convenience, as it will allow us to introduce a linearized version of the operator later. Using the compact notation, the weak form of the problem can be expressed as | Note that we have modified the convective terms in <math display="inline">\mathcal{B}\left(\boldsymbol{w},\boldsymbol{a},u\right)</math> to introduce a convection velocity <math display="inline">\boldsymbol{a}</math>. This notation is introduced for convenience, as it will allow us to introduce a linearized version of the operator later. Using the compact notation, the weak form of the problem can be expressed as | ||
− | <span id="eq- | + | <span id="eq-2.19"></span> |
− | <span id="eq- | + | <span id="eq-2.20"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\mathcal{B}\left(\boldsymbol{w},\boldsymbol{a},u\right) - \mathcal{D}\left(\boldsymbol{w},p\right) = \mathcal{L}\left(\boldsymbol{w}\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.19) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \mathcal{D}\left(u,q\right) = 0 </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.20) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | We introduce the scale separation of the problem variables in Eqs. [[#eq- | + | We introduce the scale separation of the problem variables in Eqs. [[#eq-2.19|2.19]] and [[#eq-2.20|2.20]]. Testing against large scale functions, we can write |
− | <span id="eq- | + | <span id="eq-2.21"></span> |
− | <span id="eq- | + | <span id="eq-2.22"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\mathcal{B}\left(\boldsymbol{w}_h,\boldsymbol{a},u_h+u_s\right) - \mathcal{D}\left(\boldsymbol{w}_h,p_h+p_s\right) = \mathcal{L}\left(\boldsymbol{w}_h\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.21) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \mathcal{D}\left(u_h+u_s,q_h\right) = 0 </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.22) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 531: | Line 483: | ||
If the small scale test functions are used instead, the following expression is obtained | If the small scale test functions are used instead, the following expression is obtained | ||
− | <span id="eq- | + | <span id="eq-2.23"></span> |
− | <span id="eq- | + | <span id="eq-2.24"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\mathcal{B}\left(\boldsymbol{w}_s,\boldsymbol{a},u_h+u_s\right) - \mathcal{D}\left(\boldsymbol{w}_s,p_h+p_s\right) = \mathcal{L}\left(\boldsymbol{w}_s\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.23) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \mathcal{D}\left(u_h+u_s,q_s\right) = 0 </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.24) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | The large scale problem given by Eqs. [[#eq- | + | The large scale problem given by Eqs. [[#eq-2.21|2.21]] and [[#eq-2.22|2.22]] represents the finite element approximation of the original problem, now containing terms that describe the effect of the unresolved scales on the large scale solution. These additional terms cannot be evaluated in practice, as the small scale variables are not known. VMS methods are based on the definition of a model for the small scale variables, which is motivated by the small scale problem of Eqs. [[#eq-2.23|2.23]] and [[#eq-2.24|2.24]]. This model can then be introduced in the large scale equations, closing the problem. |
− | Before we apply this procedure to our problem, it is convenient to operate on Eqs. [[#eq- | + | Before we apply this procedure to our problem, it is convenient to operate on Eqs. [[#eq-2.21|2.21]] and [[#eq-2.22|2.22]] to eliminate all spatial derivatives of small scale functions, obtaining an expression that depends on <math display="inline">u_s</math> and <math display="inline">p_s</math>, which will be modeled, but not on their gradients, which will remain unknown. We start by separating the terms involving the large and small scale parts of the solution |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\mathcal{B}\left(\boldsymbol{w}_h,\boldsymbol{a},u_h\right) - \mathcal{D}\left(\boldsymbol{w}_h,p_h\right) + \mathcal{B}\left(\boldsymbol{w}_h,\boldsymbol{a},u_s\right) - \mathcal{D}\left(\boldsymbol{w}_h,p_s\right) = \mathcal{L}\left(\boldsymbol{w}_h\right) </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \mathcal{D}\left(u_h,q_h\right) + \mathcal{D}\left(u_s,q_h\right) = 0 </math> |
− | + | ||
|} | |} | ||
|} | |} | ||
Line 567: | Line 515: | ||
Integrating by parts within each element in the mesh, differential operators acting on <math display="inline">u_s</math> and <math display="inline">p_s</math> are moved to the test functions. To do so, we introduce the notation of <math display="inline">\Omega ^e</math> to refer to the part of the problem domain corresponding to element <math display="inline">e</math> and <math display="inline">\Gamma ^e</math> to denote its boundary. | Integrating by parts within each element in the mesh, differential operators acting on <math display="inline">u_s</math> and <math display="inline">p_s</math> are moved to the test functions. To do so, we introduce the notation of <math display="inline">\Omega ^e</math> to refer to the part of the problem domain corresponding to element <math display="inline">e</math> and <math display="inline">\Gamma ^e</math> to denote its boundary. | ||
− | <span id="eq- | + | <span id="eq-2.27"></span> |
− | <span id="eq- | + | <span id="eq-2.28"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\mathcal{B}\left(\boldsymbol{w}_h,\boldsymbol{a},u_h\right) - \mathcal{D}\left(\boldsymbol{w}_h,p_h\right) + \int _\Omega \boldsymbol{w}_h\, \rho \partial _t u_s\, \hbox{d}\Omega </math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> - \sum _e \int _{\Omega ^e} \rho \left(\boldsymbol{a} \cdot \nabla \boldsymbol{w}_h\right)\cdot u_s\, \hbox{d}\Omega + \sum _e \int _{\Gamma ^e} \boldsymbol{w}\cdot \rho \frac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)u_s\, \hbox{d}\Gamma </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.25) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> - \sum _e \int _{\Omega ^e} 2 \mu \nabla \cdot \left(\nabla ^s \boldsymbol{w}_h- \frac{1}{3} \left(\nabla \cdot \boldsymbol{w}_h\right)\right)\, u_s\, \hbox{d}\Omega - \int _{\Omega } \nabla \cdot \boldsymbol{w}_h\, p_s\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.26) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> + \sum _e \int _{\Gamma ^e} 2\mu \boldsymbol{w}_h\cdot \left(\nabla ^s u_s\cdot \boldsymbol{n} - \frac{1}{3} \left(\nabla \cdot u_s\right)\boldsymbol{n} \right)\, \hbox{d}\Gamma = \mathcal{L}\left(\boldsymbol{w}_h\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.27) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \mathcal{D}\left(u_h,q_h\right) = \sum _e \int _{\Omega ^e} \nabla q_h\, u_s\, \hbox{d}\Omega - \sum _e \int _{\Gamma ^e} q_hu_s\cdot \boldsymbol{n} \, \hbox{d}\Gamma </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.28) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | In the present work, the boundary integrals appearing in Eqs. [[#eq- | + | In the present work, the boundary integrals appearing in Eqs. [[#eq-2.27|2.27]] and [[#eq-2.28|2.28]] will be neglected. This is common in VMS formulations, and can be understood as assuming that the small scale unknowns vanish on element boundaries. |
In the following we express this element-by-element integration using the notation | In the following we express this element-by-element integration using the notation | ||
Line 603: | Line 545: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\sum _e \int _{\Omega ^e} \, \hbox{d}\Omega = \int _{{\Sigma \, \Omega ^e}} \, \hbox{d}\Omega </math> | | style="text-align: center;" | <math>\sum _e \int _{\Omega ^e} \, \hbox{d}\Omega = \int _{{\Sigma \, \Omega ^e}} \, \hbox{d}\Omega </math> | ||
Line 611: | Line 553: | ||
===2.3.2 Small scale equation=== | ===2.3.2 Small scale equation=== | ||
− | Now the question is to define a model for <math display="inline">u_s</math> and <math display="inline">p_s</math> that can be used to evaluate the domain integrals in Eqs. [[#eq- | + | Now the question is to define a model for <math display="inline">u_s</math> and <math display="inline">p_s</math> that can be used to evaluate the domain integrals in Eqs. [[#eq-2.27|2.27]] and [[#eq-2.28|2.28]]. To do this, we start from the small scale problem, given by Eqs. [[#eq-2.23|2.23]] and [[#eq-2.24|2.24]], which can be developed to read |
− | <span id="eq- | + | <span id="eq-2.30"></span> |
− | <span id="eq- | + | <span id="eq-2.31"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\int _\Omega \boldsymbol{w}_s\cdot \rho \left(\partial _t u_h + \partial _t u_s + \frac{1}{2} \, \boldsymbol{a} \cdot \nabla \left(u_h+ u_s\right)\right)\, \hbox{d}\Omega - \int _\Omega \nabla \boldsymbol{w}_s: \rho \frac{1}{2} \left(\boldsymbol{a} \otimes \left(u_h+ u_s\right)\right)\, \hbox{d}\Omega </math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> + \int _\Omega \nabla ^s \boldsymbol{w}_s: \, 2 \mu \left(\nabla ^s \left(u_h+ u_s\right)- \frac{1}{3} \nabla \cdot \left(u_h+ u_s\right)\boldsymbol{I} \right)\, \hbox{d}\Omega - \int _\Omega \nabla \cdot \boldsymbol{w}_s\, \left(p_h+ p_s\right)\, \hbox{d}\Omega = </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.29) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega \boldsymbol{w}_s\cdot \boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}_s\cdot \left(\boldsymbol{t} + \rho \frac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)\left(u_h+ u_s\right)\right)\, \hbox{d}\Gamma </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.30) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega q_s\, \nabla \cdot \left(u_h+ u_s\right)\, \hbox{d}\Omega = 0 </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.31) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 640: | Line 577: | ||
Again, it is convenient to use integration by parts element-by-element on some of the terms in the momentum equation, obtaining the expression | Again, it is convenient to use integration by parts element-by-element on some of the terms in the momentum equation, obtaining the expression | ||
− | <span id="eq- | + | <span id="eq-2.32"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _{\Sigma \, \Omega ^e}\boldsymbol{w}_s\cdot \rho \left(\partial _t u_h + \partial _t u_s + \frac{1}{2}\, \boldsymbol{a} \cdot \nabla \left(u_h+ u_s\right)+ \frac{1}{2}\, \nabla \cdot \left(\boldsymbol{a} \otimes \left(u_h+ u_s\right)\right)\right)\, \hbox{d}\Omega </math> | + | | style="text-align: center;" | <math>\int _{\Sigma \, \Omega ^e}\boldsymbol{w}_s\cdot \rho \left(\partial _t u_h + \partial _t u_s + \frac{1}{2}\, \boldsymbol{a} \cdot \nabla \left(u_h+ u_s\right)+ \frac{1}{2}\, \nabla \cdot \left(\boldsymbol{a} \otimes \left(u_h+ u_s\right)\right)\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _{\Sigma \, \Omega ^e}\boldsymbol{w}_s\nabla \cdot \left(\left(p_h+ p_s\right)\boldsymbol{I} - 2 \mu \left(\nabla ^s \left(u_h+ u_s\right)- \frac{1}{3} \nabla \cdot \left(u_h+ u_s\right)\boldsymbol{I} \right)\right)\, \hbox{d}\Omega </math> | + | | style="text-align: center;" | <math> + \int _{\Sigma \, \Omega ^e}\boldsymbol{w}_s\nabla \cdot \left(\left(p_h+ p_s\right)\boldsymbol{I} - 2 \mu \left(\nabla ^s \left(u_h+ u_s\right)- \frac{1}{3} \nabla \cdot \left(u_h+ u_s\right)\boldsymbol{I} \right)\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \sum _e \int _{\Gamma ^e} \boldsymbol{w}_s\left(\left(p_h+ p_s\right)\cdot \boldsymbol{n} + 2 \mu \left(\nabla ^s \left(u_h+ u_s\right)- \frac{1}{3} \nabla \cdot \left(u_h+ u_s\right)\right)\cdot \boldsymbol{n} \right)\, \hbox{d}\ | + | | style="text-align: center;" | <math> + \sum _e \int _{\Gamma ^e} \boldsymbol{w}_s\left(\left(p_h+ p_s\right)\cdot \boldsymbol{n} + 2 \mu \left(\nabla ^s \left(u_h+ u_s\right)- \frac{1}{3} \nabla \cdot \left(u_h+ u_s\right)\right)\cdot \boldsymbol{n} \right)\, \hbox{d}\Gamma _e</math> |
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _{\Gamma _N} \boldsymbol{w}_s\cdot \rho \frac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)\left(u_h+ u_s\right)\, \hbox{d}\Omega - \sum _e \int _{\Gamma ^e} \boldsymbol{w}_s\cdot \rho \frac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)\left(u_h+ u_s\right)\, \hbox{d}\ | + | | style="text-align: center;" | <math> + \int _{\Gamma _N} \boldsymbol{w}_s\cdot \rho \frac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)\left(u_h+ u_s\right)\, \hbox{d}\Omega - \sum _e \int _{\Gamma ^e} \boldsymbol{w}_s\cdot \rho \frac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)\left(u_h+ u_s\right)\, \hbox{d}\Gamma = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \int _\Omega \boldsymbol{w}_s\cdot \boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}_s\cdot \boldsymbol{t} \, \hbox{d}\ | + | | style="text-align: center;" | <math> \int _\Omega \boldsymbol{w}_s\cdot \boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}_s\cdot \boldsymbol{t} \, \hbox{d}\Gamma </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.32) |
|} | |} | ||
− | Note that the elemental boundary integrals in Eq. [[#eq- | + | Note that the elemental boundary integrals in Eq. [[#eq-2.32|2.32]] vanish over internal boundaries because they involve either the exact traction or the exact velocity over the boundary, which are both continuous. Similarly, they cancel out with the corresponding traction in the Neumann boundary. As a result, all boundary terms in Eq. [[#eq-2.32|2.32]] can be eliminated in the following. |
− | Rearranging terms in Eqs. [[#eq- | + | Rearranging terms in Eqs. [[#eq-2.32|2.32]] and [[#eq-2.31|2.31]] to separate large and small scale unknowns we can write |
− | <span id="eq- | + | <span id="eq-2.35"></span> |
− | <span id="eq- | + | <span id="eq-2.36"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\int _{\Sigma \, \Omega ^e}\boldsymbol{w}_s\cdot \rho \left(\partial _t u_s + \frac{1}{2}\, \boldsymbol{a} \cdot \nabla u_s+ \frac{1}{2}\, \nabla \cdot \left(\boldsymbol{a} \otimes u_s\right)\right)\, \hbox{d}\Omega \quad \quad </math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _{\Sigma \, \Omega ^e}\boldsymbol{w}_s\cdot \left(\nabla p_s- 2\mu \nabla \cdot \left(\nabla ^s u_s- \frac{1}{3} \left(\nabla \cdot u_s\right)\boldsymbol{I} \right)\right)\, \hbox{d}\Omega = </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.33) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega \boldsymbol{w}_s\cdot \boldsymbol{f} \, \hbox{d}\Omega - \int _{\Sigma \, \Omega ^e}\boldsymbol{w}_s\cdot \rho \left(\partial _t u_h + \frac{1}{2}\, \boldsymbol{a} \cdot \nabla u_h+ \frac{1}{2}\, \nabla \cdot \left(\boldsymbol{a} \otimes u_h\right)\right)\, \hbox{d}\Omega \quad \quad </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.34) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> - \int _{\Sigma \, \Omega ^e}\boldsymbol{w}_s\cdot \left(\nabla p_h- 2\mu \nabla \cdot \left(\nabla ^s u_h- \frac{1}{3} \left(\nabla \cdot u_h\right)\boldsymbol{I} \right)\right)\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.35) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega q_s\, \nabla \cdot u_s\, \hbox{d}\Omega = - \int _\Omega q_s\, \nabla \cdot u_h\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.36) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | Eqs. [[#eq- | + | Eqs. [[#eq-2.35|2.35]] and [[#eq-2.36|2.36]] can be understood as the <math display="inline">L^2</math> projection onto the space of small scales <math display="inline">W_s \times Q_s</math> of a differential equation, in the same sense as Eqs. [[#eq-2.10|2.10]] and [[#eq-2.11|2.11]] represent the <math display="inline">L^2</math> projection onto <math display="inline">W \times Q</math> of the Navier-Stokes equations. Moreover, observing the right hand side terms of Eq. [[#eq-2.35|2.35]], we can see that it represents the projection of the strong-form linear momentum equation applied to the large scale part of the solution <math display="inline">u_h</math>,<math display="inline">p_h</math>. The same can be said about the right hand side of Eq. [[#eq-2.35|2.35]], which corresponds to the mass conservation equation applied to the large scale velocity. |
− | Denoting the projection onto the small scale spaces <math display="inline">W_s</math>, <math display="inline">Q_s</math> with <math display="inline">\Pi _{V_s}\left(\cdot \right)</math> and <math display="inline">\Pi _{Q_s}\left(\cdot \right)</math>, respectively, Eqs. [[#eq- | + | Denoting the projection onto the small scale spaces <math display="inline">W_s</math>, <math display="inline">Q_s</math> with <math display="inline">\Pi _{V_s}\left(\cdot \right)</math> and <math display="inline">\Pi _{Q_s}\left(\cdot \right)</math>, respectively, Eqs. [[#eq-2.35|2.35]] and [[#eq-2.36|2.36]] equation can be stated as |
− | <span id="eq- | + | <span id="eq-2.39"></span> |
− | <span id="eq- | + | <span id="eq-2.40"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\Pi _{V_s}\left( \rho \partial _t u_s + \rho \frac{1}{2}\, \boldsymbol{a} \cdot \nabla u_s+ \rho \frac{1}{2}\, \nabla \cdot \left(\boldsymbol{a} \otimes u_s\right)\right. </math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \left.+ \nabla p_s- 2\mu \nabla \cdot \left(\nabla ^s u_s- \frac{1}{3} \left(\nabla \cdot u_s\right)\boldsymbol{I} \right)\right) = </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.37) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \Pi _{V_s}\left( \boldsymbol{f} - \rho \partial _t u_h - \rho \frac{1}{2}\, \boldsymbol{a} \cdot \nabla u_h- \rho \frac{1}{2}\, \nabla \cdot \left(\boldsymbol{a} \otimes u_h\right)\right. </math> |
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.38) |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \left.- \nabla p_s+ 2\mu \nabla \cdot \left(\nabla ^s u_h- \frac{1}{3} \left(\nabla \cdot u_h\right)\boldsymbol{I} \right)\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.39) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \Pi _{Q_s}\left( \nabla \cdot u_s\right) = \Pi _{Q_s}\left( - \nabla \cdot u_h\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.40) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | Since Eqs. [[#eq- | + | Since Eqs. [[#eq-2.39|2.39]] and [[#eq-2.40|2.40]] must hold for all admissible small-scale test functions <math display="inline">\boldsymbol{w}_s</math> and <math display="inline">q_s</math>, they are equivalent to imposing that the small scale variables <math display="inline">u_s</math>, <math display="inline">p_s</math> verify the following problem in each element <math display="inline">\Omega ^e</math>: |
− | <span id="eq- | + | <span id="eq-2.41"></span> |
− | <span id="eq- | + | <span id="eq-2.42"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\rho \partial _t u_s + \rho \frac{1}{2}\, \boldsymbol{a} \cdot \nabla u_s+ \rho \frac{1}{2}\, \nabla \cdot \left(\boldsymbol{a} \otimes u_s\right)+ \nabla p_s </math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> - 2\mu \nabla \cdot \left(\nabla ^s u_s- \frac{1}{3} \left(\nabla \cdot u_s\right)\boldsymbol{I} \right)= {\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h \; \hbox{ in} \; \Omega ^e\times \left[0,T\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.41) | |
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \nabla \cdot u_s= {R^c \left(u_h\right)}- \delta _h \; \hbox{ in} \; \Omega ^e \times \left[0,T\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.42) | |
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 757: | Line 671: | ||
where <math display="inline">{\boldsymbol{R}^m\left(u_h, p_h\right)}</math> and <math display="inline">{R^c \left(u_h\right)}</math> represent the residual form of the Navier-Stokes equations applied to the large scale variables | where <math display="inline">{\boldsymbol{R}^m\left(u_h, p_h\right)}</math> and <math display="inline">{R^c \left(u_h\right)}</math> represent the residual form of the Navier-Stokes equations applied to the large scale variables | ||
− | <span id="eq- | + | <span id="eq-2.43"></span> |
− | <span id="eq- | + | <span id="eq-2.44"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>{\boldsymbol{R}^m\left(u_h, p_h\right)}= \boldsymbol{f} - \rho \partial _t u_h - \rho \frac{1}{2}\, \boldsymbol{a} \cdot \nabla u_h- \rho \frac{1}{2}\, \nabla \cdot \left(\boldsymbol{a} \otimes u_h\right)- \nabla p_h</math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> + 2\mu \nabla \cdot \left(\nabla ^s u_h- \frac{1}{3} \left(\nabla \cdot u_h\right)\boldsymbol{I} \right) </math> |
− | | <math>+ 2\mu \nabla \cdot \left(\nabla ^s u_h- \frac{1}{3} \left(\nabla \cdot u_h\right)\boldsymbol{I} \right) </math> | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.43) |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> {R^c \left(u_h\right)}= - \nabla \cdot u_h </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.44) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | and <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> are chosen to enforce that right hand sides of Eqs. [[#eq- | + | and <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> are chosen to enforce that right hand sides of Eqs. [[#eq-2.41|2.41]] and [[#eq-2.42|2.42]] belong to the corresponding small scale space. |
− | As mentioned in the previous pages, the small scale spaces are infinite-dimensional and have to be approximated before the problem given by Eqs. [[#eq- | + | As mentioned in the previous pages, the small scale spaces are infinite-dimensional and have to be approximated before the problem given by Eqs. [[#eq-2.41|2.41]] and [[#eq-2.42|2.42]] can be solved. In practice, the definition of an approximate small scale space corresponds to a choice of projectors <math display="inline">\Pi _{V_s}\left(\cdot \right)</math> and <math display="inline">\Pi _{Q_s}\left(\cdot \right)</math>. The most straightforward possibility is to use the entire residual (without projecting to a particular space), which corresponds to considering operators <math display="inline">\Pi _{V_s}\left(\cdot \right)</math>, <math display="inline">\Pi _{Q_s}\left(\cdot \right)</math> equal to the identity function or, equivalently, <math display="inline">\boldsymbol{\xi }_h = \boldsymbol{0}</math> and <math display="inline">\delta _h = 0</math>. This formulation gives rise to the algebraic sub-grid scale (ASGS) method <span id='citeF-39'></span>[[#cite-39|[39]]]. |
− | Another well-known choice consists in taking a small scale space that is orthogonal to the large scale space. If <math display="inline">\Pi _{V_h}\left(\cdot \right)</math> and <math display="inline">\Pi _{Q_h}\left(\cdot \right)</math> are the <math display="inline">L^2</math> projection onto the large scale spaces <math display="inline">W_h</math> and <math display="inline">Q_h</math> respectively, then the projections in Eqs. [[#eq- | + | Another well-known choice consists in taking a small scale space that is orthogonal to the large scale space. If <math display="inline">\Pi _{V_h}\left(\cdot \right)</math> and <math display="inline">\Pi _{Q_h}\left(\cdot \right)</math> are the <math display="inline">L^2</math> projection onto the large scale spaces <math display="inline">W_h</math> and <math display="inline">Q_h</math> respectively, then the projections in Eqs. [[#eq-2.39|2.39]] and [[#eq-2.40|2.40]] are defined as <math display="inline">\Pi _{V_s}\left(\cdot \right) \approx \Pi _{V_h}^\perp \left(\cdot \right)</math>, <math display="inline">\Pi _{Q_s}\left(\cdot \right) \approx \Pi _{Q_h}^\perp \left(\cdot \right)</math>. In this case, <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> are chosen to subtract from the equation the part of the residuals that belongs to the finite element space, that is, |
− | <span id="eq- | + | <span id="eq-2.45"></span> |
− | <span id="eq- | + | <span id="eq-2.46"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{\xi }_h = \Pi _{V_h}\left( {\boldsymbol{R}^m\left(u_h, p_h\right)}\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.45) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \delta _h = \Pi _{Q_h}\left( {R^c \left(u_h\right)}\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.46) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | This choice leads to the orthogonal sub-scale (OSS) method, presented in <span id='citeF- | + | This choice leads to the orthogonal sub-scale (OSS) method, presented in <span id='citeF-40'></span><span id='citeF-30'></span>[[#cite-40|[40,30]]]. |
Note that, due to their definition, <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> belong to the space of finite element functions and can be constructed from their values on mesh nodes using standard finite element interpolation functions. | Note that, due to their definition, <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> belong to the space of finite element functions and can be constructed from their values on mesh nodes using standard finite element interpolation functions. | ||
Line 807: | Line 715: | ||
A second important remark is that the calculation of <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> requires knowledge of the finite element solutions <math display="inline">u_h</math>, <math display="inline">p_h</math> and, as a result, it is coupled to the solution of the stabilized Navier-Stokes equations. In principle, this would double the number of nodal degrees of freedom of the problem. However, in practice, given that the Navier-Stokes problem is non-linear and has to be solved iteratively anyway, the projection problem can be implemented in an staggered way, updating the projections after each non-linear Navier-Stokes iteration. | A second important remark is that the calculation of <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> requires knowledge of the finite element solutions <math display="inline">u_h</math>, <math display="inline">p_h</math> and, as a result, it is coupled to the solution of the stabilized Navier-Stokes equations. In principle, this would double the number of nodal degrees of freedom of the problem. However, in practice, given that the Navier-Stokes problem is non-linear and has to be solved iteratively anyway, the projection problem can be implemented in an staggered way, updating the projections after each non-linear Navier-Stokes iteration. | ||
− | The problem for the small scales, given by Eqs. [[#eq- | + | The problem for the small scales, given by Eqs. [[#eq-2.41|2.41]] and [[#eq-2.42|2.42]], is not usually solved. Instead, it is approximated by an expression of the form |
− | <span id="eq- | + | <span id="eq-2.47"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\rho \partial u_s+ \frac{1}{\boldsymbol{\tau }_u} \, u_s\approx {\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h \qquad \frac{1}{\tau _p} p_s\approx {R^c \left(u_h\right)}- \delta _h </math> | | style="text-align: center;" | <math>\rho \partial u_s+ \frac{1}{\boldsymbol{\tau }_u} \, u_s\approx {\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h \qquad \frac{1}{\tau _p} p_s\approx {R^c \left(u_h\right)}- \delta _h </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.47) |
|} | |} | ||
where second order tensor <math display="inline">\boldsymbol{\tau }_u</math> and the scalar <math display="inline">\tau _p</math>, known as stabilization parameters, are algorithmic quantities that have to be defined to complete the method. | where second order tensor <math display="inline">\boldsymbol{\tau }_u</math> and the scalar <math display="inline">\tau _p</math>, known as stabilization parameters, are algorithmic quantities that have to be defined to complete the method. | ||
− | A motivation for this expression can be found in <span id='citeF- | + | A motivation for this expression can be found in <span id='citeF-30'></span>[[#cite-30|[30]]], where the parameters in Eq. [[#eq-2.47|2.47]] are designed to ensure that the <math display="inline">L^2</math> norm of the modeled subscale variables is the same as that of the exact small scale values. A different justification, based on the approximation of the Green's function of the small scale problem, is provided in <span id='citeF-16'></span><span id='citeF-21'></span>[[#cite-16|[16,21]]]. |
===2.3.3 Quasi-static small scale models=== | ===2.3.3 Quasi-static small scale models=== | ||
− | While Eq. [[#eq- | + | While Eq. [[#eq-2.47|2.47]] represents the complete small scale model derived from the dynamic Navier-Stokes equations, many VMS formulations that can be found in the literature (see for example <span id='citeF-39'></span><span id='citeF-41'></span><span id='citeF-21'></span>[[#cite-39|[39,41,21]]]) neglect the time variation of the velocity small scale model and define the small scales as |
− | <span id="eq- | + | <span id="eq-2.48"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>u_s\approx \boldsymbol{\tau }_u \left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi _h} \right)\qquad p_s\approx \tau _p \left({R^c \left(u_h\right)}- \delta _h \right) </math> | | style="text-align: center;" | <math>u_s\approx \boldsymbol{\tau }_u \left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi _h} \right)\qquad p_s\approx \tau _p \left({R^c \left(u_h\right)}- \delta _h \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.48) |
|} | |} | ||
− | This choice corresponds to the assumption that the velocity small scales adapt automatically to the large scale residual. Following the nomenclature of <span id='citeF- | + | This choice corresponds to the assumption that the velocity small scales adapt automatically to the large scale residual. Following the nomenclature of <span id='citeF-39'></span>[[#cite-39|[39]]], we refer to models based on Eq. [[#eq-2.48|2.48]] as ''quasi-static subscales'', as opposed to ''dynamic subscale'' models, based on Eq. [[#eq-2.47|2.47]]. |
− | To complete the formulation, a definition for the stabilization parameters is needed. We follow the approach of <span id='citeF- | + | To complete the formulation, a definition for the stabilization parameters is needed. We follow the approach of <span id='citeF-39'></span>[[#cite-39|[39]]], where the velocity stabilization parameter is taken to be a diagonal matrix <math display="inline">\boldsymbol{\tau }_u = \tau _u \boldsymbol{I}</math> and |
− | <span id="eq- | + | <span id="eq-2.49"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\tau _u = \left(\frac{c_1 \mu }{h^2} + \frac{c_2 \rho \left\Vert \boldsymbol{a} \right\Vert }{h} \right)^{-1} </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.49) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \tau _p = \frac{h^2}{c_1 \tau _u} = \mu + \frac{c_2 \left\Vert \boldsymbol{a} \right\Vert h}{c_1} </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.50) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | where <math display="inline">h</math> is a characteristic length of the element and <math display="inline">c_1</math>, <math display="inline">c_2</math> are constants, which, for linear finite elements, are usually defined as <math display="inline">c_1 = 4</math>, <math display="inline">c_2 = 2</math> (this is the case for example in <span id='citeF- | + | where <math display="inline">h</math> is a characteristic length of the element and <math display="inline">c_1</math>, <math display="inline">c_2</math> are constants, which, for linear finite elements, are usually defined as <math display="inline">c_1 = 4</math>, <math display="inline">c_2 = 2</math> (this is the case for example in <span id='citeF-42'></span>[[#cite-42|[42]]] or <span id='citeF-34'></span>[[#cite-34|[34]]]). However, the studies presented in <span id='citeF-31'></span>[[#cite-31|[31]]] for a turbulent channel flow in the low Mach number regime suggest that the choice of values for these parameters can have an impact on the solution. Based on the results presented in that reference and in <span id='citeF-27'></span>[[#cite-27|[27]]], we have adopted <math display="inline">c_1 = 8</math>, <math display="inline">c_2 = 2</math> for our tests. |
− | As pointed out in <span id='citeF-20'></span>[[#cite-20|[20]]], the use of quasi-static subscales leaves open the possibility of instabilities appearing for small time steps once the problem is discretized in time. The same instability is studied in <span id='citeF- | + | As pointed out in <span id='citeF-20'></span>[[#cite-20|[20]]], the use of quasi-static subscales leaves open the possibility of instabilities appearing for small time steps once the problem is discretized in time. The same instability is studied in <span id='citeF-43'></span>[[#cite-43|[43]]] for the Stokes problem, where it is shown that it can be neutralized if the stabilization parameter satisfies the condition |
− | <span id="eq- | + | <span id="eq-2.51"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\delta t \geq C \tau _u </math> | | style="text-align: center;" | <math>\delta t \geq C \tau _u </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.51) |
|} | |} | ||
where <math display="inline">\delta t</math> is the time step and <math display="inline">C</math> is a constant. To avoid this instability, the stabilization parameter <math display="inline">\tau _u</math> can be replaced by the modified expression | where <math display="inline">\delta t</math> is the time step and <math display="inline">C</math> is a constant. To avoid this instability, the stabilization parameter <math display="inline">\tau _u</math> can be replaced by the modified expression | ||
− | <span id="eq- | + | <span id="eq-2.52"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\tau _t = \left(\frac{\rho }{\delta t} + \frac{c_1 \mu }{h^2} + \frac{c_2 \rho \left\Vert \boldsymbol{a} \right\Vert }{h} \right)^{-1} </math> | | style="text-align: center;" | <math>\tau _t = \left(\frac{\rho }{\delta t} + \frac{c_1 \mu }{h^2} + \frac{c_2 \rho \left\Vert \boldsymbol{a} \right\Vert }{h} \right)^{-1} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.52) |
|} | |} | ||
Line 891: | Line 797: | ||
===2.3.4 Dynamic small-scale models=== | ===2.3.4 Dynamic small-scale models=== | ||
− | If, instead of the quasi-static model of Eq. [[#eq- | + | If, instead of the quasi-static model of Eq. [[#eq-2.48|2.48]], we use the dynamic model of [[#eq-2.47|2.47]], the time evolution of the velocity small scale <math display="inline">u_s</math> has to be taken into account. This was achieved in <span id='citeF-30'></span><span id='citeF-20'></span>[[#cite-30|[30,20]]] by introducing a time discretization for the small scale acceleration, resulting in the time-discrete small scale model |
− | <span id="eq- | + | <span id="eq-2.53"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\rho \, \frac{u_s^{n+\theta } - u_s^{n}}{\delta t} + \frac{1}{\tau _u} u_s^{n+\theta } = \left.\left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h \right)\right|_{n+\theta } </math> | | style="text-align: center;" | <math>\rho \, \frac{u_s^{n+\theta } - u_s^{n}}{\delta t} + \frac{1}{\tau _u} u_s^{n+\theta } = \left.\left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h \right)\right|_{n+\theta } </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.53) |
|} | |} | ||
Taking <math display="inline">\theta = 1</math>, which corresponds to a backward Euler time scheme, we can write a closed expression for the small scale velocity, given by | Taking <math display="inline">\theta = 1</math>, which corresponds to a backward Euler time scheme, we can write a closed expression for the small scale velocity, given by | ||
− | <span id="eq- | + | <span id="eq-2.54"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\left(\frac{\rho }{\delta t} + \frac{1}{\tau _u} \right)u_s^{n+1} = \left.\left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h \right)\right|_{n+1} + \frac{\rho }{\delta t}u_s^n </math> | | style="text-align: center;" | <math>\left(\frac{\rho }{\delta t} + \frac{1}{\tau _u} \right)u_s^{n+1} = \left.\left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h \right)\right|_{n+1} + \frac{\rho }{\delta t}u_s^n </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.54) |
|} | |} | ||
− | As remarked in <span id='citeF-20'></span>[[#cite-20|[20]]], the effective stabilization parameter in Eq. [[#eq- | + | As remarked in <span id='citeF-20'></span>[[#cite-20|[20]]], the effective stabilization parameter in Eq. [[#eq-2.54|2.54]] is |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\left( \frac{\rho }{\delta t} + \frac{1}{\tau _u} \right)^{-1} = \left(\frac{\rho }{\delta t} + \frac{c_1 \mu }{h^2} + \frac{c_2 \rho \left\Vert \boldsymbol{a} \right\Vert }{h} \right)^{-1} </math> | | style="text-align: center;" | <math>\left( \frac{\rho }{\delta t} + \frac{1}{\tau _u} \right)^{-1} = \left(\frac{\rho }{\delta t} + \frac{c_1 \mu }{h^2} + \frac{c_2 \rho \left\Vert \boldsymbol{a} \right\Vert }{h} \right)^{-1} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.55) |
|} | |} | ||
− | which is precisely the expression introduced as <math display="inline">\tau _t</math> in Eq. [[#eq- | + | which is precisely the expression introduced as <math display="inline">\tau _t</math> in Eq. [[#eq-2.52|2.52]] and prevents the apparition of instabilities due to small time steps. However, unlike in quasi-static approximations, when the problem has a stationary solution, the dependency on the time step is eliminated as, in that case, <math display="inline">u_s^{n+1} = u_s^{n}</math> and the quasi-static model of Eq. [[#eq-2.48|2.48]] is recovered. |
− | From the point of view of its implementation, the main difference between the quasi-static model of Eq. [[#eq- | + | From the point of view of its implementation, the main difference between the quasi-static model of Eq. [[#eq-2.48|2.48]] and Eq. [[#eq-2.54|2.54]] is that the latter introduces the old value of the velocity small scale <math display="inline">u_s^n</math> in the model. This means that <math display="inline">u_s</math> has to be tracked in time. In practice, this implies evaluating and storing historical values for <math display="inline">u_s</math> on the integration points of the finite element mesh. |
===2.3.5 Complete equations=== | ===2.3.5 Complete equations=== | ||
− | Once the small scale model is defined, it can be introduced in the large scale equations, given by Eqs. [[#eq- | + | Once the small scale model is defined, it can be introduced in the large scale equations, given by Eqs. [[#eq-2.27|2.27]] and [[#eq-2.28|2.28]]. The most general formulation that can be obtained from the material presented in the previous section is given by |
'''Momentum equation''' | '''Momentum equation''' | ||
− | <span id="eq- | + | <span id="eq-2.56"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math>\int _\Omega \boldsymbol{w}_h\cdot \rho \left(\partial _t u_h + \frac{1}{2} \, \boldsymbol{a} \cdot \nabla u_h \right)\, \hbox{d}\Omega - \int _\Omega \nabla \boldsymbol{w}_h: \rho \frac{1}{2} \left(\boldsymbol{a} \otimes u_h\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> - | + | | style="text-align: center;" | <math> - \int _\Omega \nabla \cdot \boldsymbol{w}_h\, p_h\, \hbox{d}\Omega + \int _\Omega \nabla ^s \boldsymbol{w}_h: \, 2 \mu \left(\nabla ^s u_h- \frac{1}{3} \left(\nabla \cdot u_h\right)\boldsymbol{I} \right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + | + | | style="text-align: center;" | <math> + \int _\Omega \boldsymbol{w}_h\cdot \rho \partial _t u_s \, \hbox{d}\Omega - \int _{{\Sigma \, \Omega ^e}} \rho \left(\boldsymbol{a} \cdot \nabla \boldsymbol{w}_h\right)\tau _t \left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h + \frac{\rho }{\delta t}u_s^n \right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> - | + | | style="text-align: center;" | <math> - \int _{\Omega } \nabla \cdot \boldsymbol{w}_h\tau _p \left({R^c \left(u_h\right)}- \delta _h \right)\, \hbox{d}\Omega = \int _\Omega \boldsymbol{w}_h\boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}_h\left(\boldsymbol{t} - \rho \frac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)u_h\right)\, \hbox{d}\Gamma </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.56) |
|} | |} | ||
'''Mass conservation''' | '''Mass conservation''' | ||
− | <span id="eq- | + | <span id="eq-2.57"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\int _\Omega q_h\nabla \cdot u_h\, \hbox{d}\Omega = \int _{\Sigma \, \Omega ^e}\nabla q_h\, \tau _t \left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h + \frac{\rho }{\delta t}u_s^n \right)\, \hbox{d}\Omega </math> | | style="text-align: center;" | <math>\int _\Omega q_h\nabla \cdot u_h\, \hbox{d}\Omega = \int _{\Sigma \, \Omega ^e}\nabla q_h\, \tau _t \left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h + \frac{\rho }{\delta t}u_s^n \right)\, \hbox{d}\Omega </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.57) |
|} | |} | ||
− | The first two rows of Eq. [[#eq- | + | The first two rows of Eq. [[#eq-2.56|2.56]], in combination with its right hand side, constitute the standard Galerkin discretization of the momentum equation. The terms in the third row model the effect of the velocity small scale fluctuations and the velocity small scale itself, respectively, on the large scale equations, while the first term in the last row of Eq. [[#eq-2.56|2.56]] represents the effect of pressure small scales. |
− | Analogously, the left hand side of Eq. [[#eq- | + | Analogously, the left hand side of Eq. [[#eq-2.57|2.57]] represents the Galerkin weak form of the incompressibility equation, while its right hand side models the effect of the small scales in mass conservation. |
− | While Eqs. [[#eq- | + | While Eqs. [[#eq-2.56|2.56]] and [[#eq-2.57|2.57]] represent a general VMS formulation, they can be particularized to recover several well-known stabilized methods: |
− | + | D-ASGS Dynamic algebraic sub-grid scales <span id='citeF-20'></span>[[#cite-20|[20]]]. The algebraic approximation to the small scales is characterized by using an identity projector to define the small scale space, which implies that the projection terms <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> are zero. | |
− | + | zero. | |
− | + | ||
− | + | Q-ASGS Quasi-static algebraic sub-grid scales <span id='citeF-39'></span>[[#cite-39|[39]]]. A quasi-static approximation to the small scales can be recovered by neglecting all terms involving either the small scale acceleration <math display="inline">\partial _t u_s</math> or the old small-scale velocities <math display="inline">u_s^n</math> and replacing <math display="inline">\tau _t</math> by the static stabilization parameter <math display="inline">\tau _u</math>. Additionally, as the small scales are algebraic, projection terms <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> are also zero. | |
+ | |||
+ | D-OSS Dynamic orthogonal subgrid-scales <span id='citeF-30'></span><span id='citeF-20'></span>[[#cite-30|[30,20]]]. If the small scale space is assumed to be orthogonal to the large scale space, the integral involving <math display="inline">\boldsymbol{w}_h</math> and <math display="inline">\partial _t u_s</math> is zero, as it corresponds to the <math display="inline">L^2</math> product of two terms belonging to orthogonal spaces. | ||
+ | |||
+ | Q-OSS Quasi-static orthogonal subgrid-scales <span id='citeF-30'></span>[[#cite-30|[30]]] can be recovered from the original expression by neglecting all terms involving <math display="inline">\partial _t u_s</math> or <math display="inline">u_s^n</math> and replacing <math display="inline">\tau _t</math> by <math display="inline">\tau _u</math>. | ||
For OSS formulations, the projections <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> are defined as the <math display="inline">L^2</math> projections of the momentum and mass residuals, respectively, onto the finite element mesh. Applying this definition, they can be obtained as the solution of the projection problem | For OSS formulations, the projections <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> are defined as the <math display="inline">L^2</math> projections of the momentum and mass residuals, respectively, onto the finite element mesh. Applying this definition, they can be obtained as the solution of the projection problem | ||
− | <span id="eq- | + | <span id="eq-2.59"></span> |
− | <span id="eq- | + | <span id="eq-2.60"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\int _\Omega \boldsymbol{w}_h\cdot \boldsymbol{\xi }_h \, \hbox{d}\Omega = \int _\Omega \boldsymbol{w}_h\cdot {\boldsymbol{R}^m\left(u_h, p_h\right)}\, \hbox{d}\Omega </math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> = \int _\Omega \boldsymbol{w}_h\left(\boldsymbol{f} - \rho \partial _t u_h - \rho \frac{1}{2}\, \boldsymbol{a} \cdot \nabla u_h- \rho \frac{1}{2}\, \nabla \cdot \left(\boldsymbol{a} \otimes u_h\right)\right)\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.58) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> + \int _\Omega \boldsymbol{w}_h\left(2\mu \nabla \cdot \left(\nabla ^s u_h- \frac{1}{3} \left(\nabla \cdot u_h\right)\boldsymbol{I} \right)- \nabla p_h\right)\, \hbox{d}\Omega </math> |
− | | <math>+ \int _\Omega \boldsymbol{w}_h\left(2\mu \nabla \cdot \left(\nabla ^s u_h- \frac{1}{3} \left(\nabla \cdot u_h\right)\boldsymbol{I} \right)- \nabla p_h\right)\, \hbox{d}\Omega </math> | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.59) |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega q_h\delta _h \, \hbox{d}\Omega = \int _\Omega q_h{R^c \left(u_h\right)}\, \hbox{d}\Omega = - \int _\Omega q_h\nabla \cdot u_h\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.60) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 1,019: | Line 920: | ||
The concept of scale separation introduced by VMS formulations has some parallels with Large Eddy Simulation (LES) methods for the simulation of turbulent flows. LES turbulence models are also based on separating large and small motions in the flow, but in the LES approach this is is typically achieved through the introduction a filtering operation <span id='citeF-2'></span>[[#cite-2|[2]]], defined as | The concept of scale separation introduced by VMS formulations has some parallels with Large Eddy Simulation (LES) methods for the simulation of turbulent flows. LES turbulence models are also based on separating large and small motions in the flow, but in the LES approach this is is typically achieved through the introduction a filtering operation <span id='citeF-2'></span>[[#cite-2|[2]]], defined as | ||
− | <span id="eq- | + | <span id="eq-2.61"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\overline{\boldsymbol{u}}\left(\boldsymbol{x},t\right)= \int _{-\Delta /2}^{\Delta /2} \int _{-\Delta /2}^{\Delta /2} \int _{-\Delta /2}^{\Delta /2} G\left(\boldsymbol{x}-\boldsymbol{\chi }\right)u\left(\boldsymbol{\chi },t\right)\, \hbox{d}\ | + | | style="text-align: center;" | <math>\overline{\boldsymbol{u}}\left(\boldsymbol{x},t\right)= \int _{-\Delta /2}^{\Delta /2} \int _{-\Delta /2}^{\Delta /2} \int _{-\Delta /2}^{\Delta /2} G\left(\boldsymbol{x}-\boldsymbol{\chi }\right)u\left(\boldsymbol{\chi },t\right)\, \hbox{d}\boldsymbol \chi </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.61) |
|} | |} | ||
where <math display="inline">G\left(\boldsymbol{x}-\boldsymbol{\chi }\right)</math> is a filter function defined on the interval <math display="inline">\left[-\Delta /2,\Delta /2\right]</math> and <math display="inline">\Delta </math> is known as the filter width. | where <math display="inline">G\left(\boldsymbol{x}-\boldsymbol{\chi }\right)</math> is a filter function defined on the interval <math display="inline">\left[-\Delta /2,\Delta /2\right]</math> and <math display="inline">\Delta </math> is known as the filter width. | ||
− | Applying a filter function to Eqs. [[#eq-3|3]] and [[#eq-4|4]] allows us to write the filtered Navier-Stokes equations, given by | + | Applying a filter function to Eqs. [[#eq-2.3|2.3]] and [[#eq-2.4|2.4]] allows us to write the filtered Navier-Stokes equations, given by |
− | <span id="eq- | + | <span id="eq-2.62"></span> |
− | <span id="eq- | + | <span id="eq-2.63"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\rho \, \partial _t \overline{u} + \rho \nabla \cdot \left(\overline{u}\otimes \overline{u}\right)- \rho \nabla \cdot \boldsymbol{\tau }^R- \nabla \cdot \left(2 \mu \nabla ^s \overline{u}\right)+ \nabla \overline{p} = \overline{\boldsymbol{f}} \hbox{ in }\Omega \times \left[0,T\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.62) | |
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \nabla \cdot \overline{u}= 0 \hbox{ in }\Omega \times \left[0,T\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.63) | |
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 1,057: | Line 952: | ||
where we have used the conservative form of the convective term and <math display="inline">\boldsymbol{\tau }^R</math> is the subgrid stress tensor, defined as | where we have used the conservative form of the convective term and <math display="inline">\boldsymbol{\tau }^R</math> is the subgrid stress tensor, defined as | ||
− | <span id="eq- | + | <span id="eq-2.64"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{\tau }^R= \overline{u\otimes u} - \overline{u}\otimes \overline{u} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.64) |
|} | |} | ||
− | The subgrid stress tensor represents the effect of the small scale motions on the large scale part of the solution and and is an unknown, since the quantity <math display="inline">\overline{u\otimes u}</math> cannot be obtained from the filtered velocity <math display="inline">\overline{u}</math>. This means that Eqs. [[#eq- | + | The subgrid stress tensor represents the effect of the small scale motions on the large scale part of the solution and and is an unknown, since the quantity <math display="inline">\overline{u\otimes u}</math> cannot be obtained from the filtered velocity <math display="inline">\overline{u}</math>. This means that Eqs. [[#eq-2.62|2.62]] and [[#eq-2.63|2.63]] do not represent a closed expression. However, if the filter width is chosen small enough that the filtered-out small scale motions can be assumed to lie in the inertial subrange, Kolmogorov's hypotheses <span id='citeF-3'></span><span id='citeF-4'></span>[[#cite-3|[3,4]]] tell us that they have an isotropic, universal (problem-independent) behavior. LES methods use this approach to motivate a model for <math display="inline">\boldsymbol{\tau }^R</math> and justify its introduction in the filtered equations, closing the formulation. |
Introducing the subgrid velocity <math display="inline">\tilde{u}= u- \overline{u}</math>, the subgrid stress tensor <math display="inline">\boldsymbol{\tau }^R</math> can be rewritten using the Leonard decomposition as | Introducing the subgrid velocity <math display="inline">\tilde{u}= u- \overline{u}</math>, the subgrid stress tensor <math display="inline">\boldsymbol{\tau }^R</math> can be rewritten using the Leonard decomposition as | ||
− | <span id="eq- | + | <span id="eq-2.65"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{\tau }^R= \boldsymbol{L} + \boldsymbol{C} + \boldsymbol{R} </math> | | style="text-align: center;" | <math>\boldsymbol{\tau }^R= \boldsymbol{L} + \boldsymbol{C} + \boldsymbol{R} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.65) |
|} | |} | ||
where each of the individual terms is defined as: | where each of the individual terms is defined as: | ||
− | <span id="eq- | + | <span id="eq-2.66"></span> |
− | <span id="eq- | + | <span id="eq-2.67"></span> |
− | <span id="eq- | + | <span id="eq-2.68"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{L} = \overline{ u\otimes u} - \overline{u}\otimes \overline{u} \hbox{ Leonard stress} </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.66) | |
− | + | ||
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{C} = \overline{ \tilde{u}\otimes u} + \overline{u\otimes \tilde{u}} \hbox{ Cross stress} </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.67) | |
− | + | ||
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{R} = \overline{ \tilde{u}\otimes \tilde{u}} \hbox{ Reynolds stress} </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.68) | |
− | + | ||
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | The different terms in Eqs. [[#eq- | + | The different terms in Eqs. [[#eq-2.66|2.66]]–[[#eq-2.68|2.68]] represent subgrid stresses due to the interaction between resolved motions (Leonard stresses), to the interaction between large and unresolved motions (cross stresses) and to the effect of completely unresolved motions (Reynolds stresses). |
− | Like filtering in LES methods, scale separation in VMS formulations introduces a clear division between the resolved and unresolved parts of the solution, which in this case is achieved through the <math display="inline">L^2</math> projection to the finite element mesh. This projection to the mesh was introduced in writing the large scale equation, given by Eqs. [[#eq- | + | Like filtering in LES methods, scale separation in VMS formulations introduces a clear division between the resolved and unresolved parts of the solution, which in this case is achieved through the <math display="inline">L^2</math> projection to the finite element mesh. This projection to the mesh was introduced in writing the large scale equation, given by Eqs. [[#eq-2.21|2.21]] and [[#eq-2.22|2.22]], which is rewritten using the conservative form of the convective term to be consistent with the LES expression above, obtaining |
− | <span id="eq- | + | <span id="eq-2.69"></span> |
− | <span id="eq- | + | <span id="eq-2.70"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\int _\Omega \boldsymbol{w}_h\cdot \rho \left(\partial _t u_h+ \partial _t u_s\right)\, \hbox{d}\Omega - \int _\Omega \rho \nabla \boldsymbol{w}_h: \left(u_h+ u_s\right)\otimes \left(u_h+ u_s\right) \, \hbox{d}\Omega </math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> + \int _\Omega \nabla ^s \boldsymbol{w}_h: 2 \mu \nabla ^s \left(u_h+ u_s\right)\, \hbox{d}\Omega - \int _\Omega \nabla \cdot \boldsymbol{w}_h\left(p_h+ p_s\right)\, \hbox{d}\Omega = \int _\Omega \boldsymbol{w}_h\cdot \boldsymbol{f} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.69) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega q_h\nabla \cdot \left(u_h+ u_s\right)\, \hbox{d}\Omega = 0 </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.70) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 1,143: | Line 1,022: | ||
where boundary terms and terms related to the trace of the viscous stresses have been omitted for clarity and the full velocity <math display="inline">u_h+u_s</math> has been used for both arguments of the convective term. | where boundary terms and terms related to the trace of the viscous stresses have been omitted for clarity and the full velocity <math display="inline">u_h+u_s</math> has been used for both arguments of the convective term. | ||
− | An analogy can be established between Eqs. [[#eq- | + | An analogy can be established between Eqs. [[#eq-2.62|2.62]] and [[#eq-2.63|2.63]], which represent the filtered Navier-Stokes equations and Eqs. [[#eq-2.69|2.69]] and [[#eq-2.70|2.70]], which expresses the projection of the Navier-Stokes equations to the finite element mesh. This was analyzed in <span id='citeF-17'></span><span id='citeF-20'></span>[[#cite-17|[17,20]]], where it is remarked that the convective term in Eq. [[#eq-2.69|2.69]] can be expanded as |
− | <span id="eq- | + | <span id="eq-2.71"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math>\int _\Omega \rho \nabla \boldsymbol{w}_h: \left(u_h+ u_s\right)\otimes \left(u_h+ u_s\right)\, \hbox{d}\Omega = \int _\Omega \rho \nabla \boldsymbol{w}_h: u_h \otimes u_h\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> + \int _\Omega \rho \nabla \boldsymbol{w}_h: u_s \otimes u_h\, \hbox{d}\Omega + \int _\Omega \rho \nabla \boldsymbol{w}_h: u_h \otimes u_s\, \hbox{d}\Omega + \int _\Omega \rho \nabla \boldsymbol{w}_h: u_s \otimes u_s\, \hbox{d}\Omega </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.71) |
|} | |} | ||
− | The last three terms in Eq. [[#eq- | + | The last three terms in Eq. [[#eq-2.71|2.71]] can be understood as a variational version of the LES subgrid stress tensor <math display="inline">\boldsymbol{\tau }^R</math>. Ignoring the density, they can be rearranged as |
− | <span id="eq- | + | <span id="eq-2.72"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math>\int _\Omega \nabla \boldsymbol{w}_h: u_s \otimes u_h\, \hbox{d}\Omega + \int _\Omega \nabla \boldsymbol{w}_h: u_h \otimes u_s\, \hbox{d}\Omega + \int _\Omega \nabla \boldsymbol{w}_h: u_s \otimes u_s\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> {} = \int _\Omega \nabla \boldsymbol{w}_h: \left(u_h+ u_s\right)\otimes \left(u_h+ u_s\right)\, \hbox{d}\Omega - \int _\Omega \nabla \boldsymbol{w}_h: u_h \otimes u_h\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> {} = \int _\Omega \nabla \boldsymbol{w}_h: \boldsymbol{\tau }^R_{VMS}\, \hbox{d}\Omega </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.72) |
|} | |} | ||
Line 1,184: | Line 1,058: | ||
Furthermore, <math display="inline">\boldsymbol{\tau }^R_{VMS}</math> can be decomposed into Cross and Reynolds terms as: | Furthermore, <math display="inline">\boldsymbol{\tau }^R_{VMS}</math> can be decomposed into Cross and Reynolds terms as: | ||
− | <span id="eq- | + | <span id="eq-2.73"></span> |
− | <span id="eq- | + | <span id="eq-2.74"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\int _\Omega \nabla \boldsymbol{w}_h: u_s \otimes u_h\, \hbox{d}\Omega + \int _\Omega \nabla \boldsymbol{w}_h: u_h \otimes u_s\, \hbox{d}\Omega \hbox{ Cross stress} </math> |
− | | <math>\int _\Omega \nabla \boldsymbol{w}_h: u_s \otimes u_h\, \hbox{d}\Omega + \int _\Omega \nabla \boldsymbol{w}_h: u_h \otimes u_s\, \hbox{d}\Omega | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.73) |
− | + | ||
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega \nabla \boldsymbol{w}_h: u_s \otimes u_s\, \hbox{d}\Omega \hbox{ Reynolds stress} </math> |
− | | <math>\int _\Omega \nabla \boldsymbol{w}_h: u_s \otimes u_s\, \hbox{d}\Omega | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.74) |
− | + | ||
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 1,209: | Line 1,075: | ||
while an analogue of the Leonard stress, representing the contribution of the resolved velocities <math display="inline">u_h</math> to the unresolved stresses, appears in the corresponding small scale equation | while an analogue of the Leonard stress, representing the contribution of the resolved velocities <math display="inline">u_h</math> to the unresolved stresses, appears in the corresponding small scale equation | ||
− | <span id="eq- | + | <span id="eq-2.75"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math>\int _\Omega \nabla \boldsymbol{w}_h: u_h \otimes u_h\, \hbox{d}\Omega - \int _\Omega \nabla \boldsymbol{w}: u_h \otimes u_h\, \hbox{d}\Omega = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> - \int _\Omega \nabla \boldsymbol{w}_s: u_h \otimes u_h\, \hbox{d}\Omega \hbox{ Leonard stress} </math> |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.75) |
|} | |} | ||
− | Assuming that the grid size is small enough for the unresolved scales to be in the inertial subrange, we can observe that scale separation and projection to the finite element mesh play a similar role to that of filtering in classical LES methods. It is worth mentioning that the concept of mesh-induced filtering has also been explored by the LES community, where it is known as ''implicit filtering''. This is the basis of the Monotone Integrated Large-Eddy Simulation (MILES) approach of Boris ''et al.'' <span id='citeF- | + | Assuming that the grid size is small enough for the unresolved scales to be in the inertial subrange, we can observe that scale separation and projection to the finite element mesh play a similar role to that of filtering in classical LES methods. It is worth mentioning that the concept of mesh-induced filtering has also been explored by the LES community, where it is known as ''implicit filtering''. This is the basis of the Monotone Integrated Large-Eddy Simulation (MILES) approach of Boris ''et al.'' <span id='citeF-44'></span>[[#cite-44|[44]]], where the authors propose not using an explicit model for the subgrid stresses and relying instead on a specially designed numerical method to introduce the correct dissipation for a given mesh resolution. |
− | A different approach to VMS-based LES, which will only be mentioned here, is based on a three–level scale separation (see for example <span id='citeF- | + | A different approach to VMS-based LES, which will only be mentioned here, is based on a three–level scale separation (see for example <span id='citeF-41'></span><span id='citeF-45'></span>[[#cite-41|[41,45]]] or the review of <span id='citeF-19'></span>[[#cite-19|[19]]]). In such approaches, the small scales are in turn divided into ''resolved'' and ''unresolved'' small scales. The presence of two levels of small scales can be used to either introduce explicit LES model terms to represent the effect of the unresolved small scales on the problem or to calibrate the amount of dissipation that is introduced using the variational equivalent of the Germano identity <span id='citeF-46'></span><span id='citeF-47'></span>[[#cite-46|[46,47]]]. |
===2.4.1 The VMS kinetic energy balance=== | ===2.4.1 The VMS kinetic energy balance=== | ||
− | Given that the derivation of VMS formulations is based exclusively in numerical and mathematical arguments, the physical behavior of VMS methods, in terms of reproducing the expected dissipation rates when the small scales are on the inertial subrange, has to be verified. This topic has been studied in <span id='citeF-17'></span><span id='citeF-18'></span>[[#cite-17|[17,18]]] for the formulation that we are calling Q-ASGS and in <span id='citeF- | + | Given that the derivation of VMS formulations is based exclusively in numerical and mathematical arguments, the physical behavior of VMS methods, in terms of reproducing the expected dissipation rates when the small scales are on the inertial subrange, has to be verified. This topic has been studied in <span id='citeF-17'></span><span id='citeF-18'></span>[[#cite-17|[17,18]]] for the formulation that we are calling Q-ASGS and in <span id='citeF-25'></span><span id='citeF-26'></span>[[#cite-25|[25,26]]] for OSS-based methods. |
− | An energy balance for the original Navier-Stokes problem can be obtained by taking <math display="inline">\boldsymbol{w}=u</math> in the Galerkin weak form of the momentum equation, given by Eq. [[#eq- | + | An energy balance for the original Navier-Stokes problem can be obtained by taking <math display="inline">\boldsymbol{w}=u</math> in the Galerkin weak form of the momentum equation, given by Eq. [[#eq-2.13|2.13]], which produces |
− | <span id="eq- | + | <span id="eq-2.76"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _\Omega u\cdot \rho \partial _t u \, \hbox{d}\Omega + \int _\Omega u\cdot \big(\rho \, u\cdot \nabla | + | | style="text-align: center;" | <math>\int _\Omega u\cdot \rho \partial _t u \, \hbox{d}\Omega + \int _\Omega u\cdot \big(\rho \, u\cdot \nabla u \big)\, \hbox{d}\Omega + \int _\Omega 2 \mu \nabla ^s u: \nabla ^s u\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> - \int _\Omega \nabla \cdot up \, \hbox{d}\Omega = \int _\Omega u\cdot \boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}\cdot \boldsymbol{t} \, \hbox{d}\Gamma </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.76) |
|} | |} | ||
− | We are interested in obtaining a balance for the kinetic energy, <math display="inline">E = \rho u\cdot u/ 2</math>. Using the fact that the full velocity is incompressible and the equality <math display="inline">u \, \partial u/\partial x = 1/2\, \partial u^2/\partial x</math>, Eq. [[#eq- | + | We are interested in obtaining a balance for the kinetic energy, <math display="inline">E = \rho u\cdot u/ 2</math>. Using the fact that the full velocity is incompressible and the equality <math display="inline">u \, \partial u/\partial x = 1/2\, \partial u^2/\partial x</math>, Eq. [[#eq-2.76|2.76]] can be expressed as |
− | <span id="eq- | + | <span id="eq-2.77"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\underbrace{\int _\Omega \partial _t E \, \hbox{d}\Omega }_{I} + \underbrace{\int _\Omega u\cdot \nabla E \, \hbox{d}\Omega }_{II} = \underbrace{\int _\Omega u\cdot \boldsymbol{f} \, \hbox{d}\Omega }_{III} + \underbrace{\int _{\Gamma _N} u\cdot \boldsymbol{t} \, \hbox{d}\ | + | | style="text-align: center;" | <math>\underbrace{\int _\Omega \partial _t E \, \hbox{d}\Omega }_{I} + \underbrace{\int _\Omega u\cdot \nabla E \, \hbox{d}\Omega }_{II} = \underbrace{\int _\Omega u\cdot \boldsymbol{f} \, \hbox{d}\Omega }_{III} + \underbrace{\int _{\Gamma _N} u\cdot \boldsymbol{t} \, \hbox{d}\Gamma }_{IV} - \underbrace{\int _\Omega 2 \mu \nabla ^s u: \nabla ^s u\, \hbox{d}\Omega }_{V} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.77) |
|} | |} | ||
− | Eq. [[#eq- | + | Eq. [[#eq-2.77|2.77]] expresses the balance of total kinetic energy <math display="inline">E</math> in the domain, and the individual terms represent energy storage (<math display="inline">I</math>) and convection (<math display="inline">II</math>), the power exerted by external forces (<math display="inline">III</math>) and boundary tensions (<math display="inline">IV</math>) and finally viscous dissipation (<math display="inline">V</math>). |
− | We can obtain an equivalent expression for the kinetic energy contained in the large scale motions, <math display="inline">E_h = \rho u_h\cdot u_h/ 2</math>, by taking <math display="inline">\boldsymbol{w}_h= u_h</math> in Eq. [[#eq- | + | We can obtain an equivalent expression for the kinetic energy contained in the large scale motions, <math display="inline">E_h = \rho u_h\cdot u_h/ 2</math>, by taking <math display="inline">\boldsymbol{w}_h= u_h</math> in Eq. [[#eq-2.69|2.69]], <math display="inline">q_h= p_h</math> in Eq. [[#eq-2.70|2.70]] and adding the two equations, obtaining: |
− | <span id="eq- | + | <span id="eq-2.78"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _\Omega u_h\cdot \rho \left(\partial _t u_h+ \partial _t u_s\right)\, \hbox{d}\Omega + \int _\Omega u_h\cdot \rho \nabla \cdot \left(\left(u_h+ u_s\right)\otimes \left(u_h+ u_s\right)\right)\, \hbox{d}\Omega </math> | + | | style="text-align: center;" | <math>\int _\Omega u_h\cdot \rho \left(\partial _t u_h+ \partial _t u_s\right)\, \hbox{d}\Omega + \int _\Omega u_h\cdot \rho \nabla \cdot \left(\left(u_h+ u_s\right)\otimes \left(u_h+ u_s\right)\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
| style="text-align: center;" | <math> + \int _\Omega \nabla ^s u_h: 2 \mu \nabla ^s \left(u_h+ u_s\right)\, \hbox{d}\Omega - \int _\Omega \nabla \cdot u_h\left(p_h+ p_s\right)\, \hbox{d}\Omega </math> | | style="text-align: center;" | <math> + \int _\Omega \nabla ^s u_h: 2 \mu \nabla ^s \left(u_h+ u_s\right)\, \hbox{d}\Omega - \int _\Omega \nabla \cdot u_h\left(p_h+ p_s\right)\, \hbox{d}\Omega </math> | ||
− | |||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _\Omega p_h\nabla \cdot \left(u_h+ u_s\right)\, \hbox{d}\Omega = \int _\Omega | + | | style="text-align: center;" | <math> + \int _\Omega p_h\nabla \cdot \left(u_h+ u_s\right)\, \hbox{d}\Omega = \int _\Omega u_h\cdot \boldsymbol{f} \, \hbox{d}\Omega </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.78) |
|} | |} | ||
− | Note that in Eq. [[#eq- | + | Note that in Eq. [[#eq-2.78|2.78]], and for the remainder of this section, we neglected all boundary integrals to simplify the discussion. This is equivalent to considering a problem with homogeneous Dirichlet boundary conditions. |
− | It is convenient to integrate some of the terms in Eq. [[#eq- | + | It is convenient to integrate some of the terms in Eq. [[#eq-2.78|2.78]] by parts and rearrange the convective term as follows: |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _\Omega u_h\cdot \rho \nabla \cdot \left(\left(u_h+ u_s\right)\otimes \left(u_h+ u_s\right)\right)\, \hbox{d}\Omega | + | | style="text-align: center;" | <math>\int _\Omega u_h\cdot \rho \nabla \cdot \left(\left(u_h+ u_s\right)\otimes \left(u_h+ u_s\right)\right)\, \hbox{d}\Omega = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> = \int _\Omega u_h\cdot \rho \nabla \cdot \left(\left(u_h+ u_s\right)\otimes u_h\right)\, \hbox{d}\Omega | + | | style="text-align: center;" | <math> = \int _\Omega u_h\cdot \rho \nabla \cdot \left(\left(u_h+ u_s\right)\otimes u_h\right)\, \hbox{d}\Omega + \int _\Omega u_h\cdot \rho \nabla \cdot \left(\left(u_h+ u_s\right)\otimes u_s\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> = \int _\Omega u_h\cdot \rho \left(u_h+ u_s\right)\cdot \nabla u_h\, \hbox{d}\Omega | + | | style="text-align: center;" | <math> = \int _\Omega u_h\cdot \rho \left(u_h+ u_s\right)\cdot \nabla u_h\, \hbox{d}\Omega - \int _\Omega \rho \nabla u_h: \left(u_h+ u_s\right)\otimes u_s\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> = \int _\Omega \left(u_h+ u_s\right)\cdot \nabla E_h \, \hbox{d}\Omega | + | | style="text-align: center;" | <math> = \int _\Omega \left(u_h+ u_s\right)\cdot \nabla E_h \, \hbox{d}\Omega - \int _\Omega u_s\rho \left(u_h+ u_s\right)\cdot \nabla u_h\, \hbox{d}\Omega </math> |
− | + | ||
|} | |} | ||
|} | |} | ||
Line 1,312: | Line 1,164: | ||
where we have used the fact that the exact velocity <math display="inline">u_h+ u_s</math> is divergence free. | where we have used the fact that the exact velocity <math display="inline">u_h+ u_s</math> is divergence free. | ||
− | With this, Eq. [[#eq- | + | With this, Eq. [[#eq-2.78|2.78]] can be restated as |
− | <span id="eq- | + | <span id="eq-2.79"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\underbrace{\int _\Omega \partial _t E_h \, \hbox{d}\Omega }_{I} + \underbrace{\int _\Omega u\cdot \nabla E_h \, \hbox{d}\Omega }_{II} = \underbrace{\int _\Omega u_h\cdot \boldsymbol{f} \, \hbox{d}\Omega }_{III} - \underbrace{\int _\Omega 2 \mu \nabla ^s u_h: \nabla ^s u_h\, \hbox{d}\Omega }_{IV} + \underbrace{\int _\Omega p_s\nabla \cdot u_h\, \hbox{d}\Omega }_{V} </math> | | style="text-align: center;" | <math>\underbrace{\int _\Omega \partial _t E_h \, \hbox{d}\Omega }_{I} + \underbrace{\int _\Omega u\cdot \nabla E_h \, \hbox{d}\Omega }_{II} = \underbrace{\int _\Omega u_h\cdot \boldsymbol{f} \, \hbox{d}\Omega }_{III} - \underbrace{\int _\Omega 2 \mu \nabla ^s u_h: \nabla ^s u_h\, \hbox{d}\Omega }_{IV} + \underbrace{\int _\Omega p_s\nabla \cdot u_h\, \hbox{d}\Omega }_{V} </math> | ||
Line 1,324: | Line 1,176: | ||
| style="text-align: center;" | <math> \underbrace{- \int _\Omega u_h\cdot \rho \partial _t u_s\, \hbox{d}\Omega + \int _\Omega u_s\cdot \left(\rho u\cdot \nabla u_h+ \nabla p_h+ \nabla \cdot \left(2\mu \nabla ^s u_h\right)\right)\, \hbox{d}\Omega }_{VI} </math> | | style="text-align: center;" | <math> \underbrace{- \int _\Omega u_h\cdot \rho \partial _t u_s\, \hbox{d}\Omega + \int _\Omega u_s\cdot \left(\rho u\cdot \nabla u_h+ \nabla p_h+ \nabla \cdot \left(2\mu \nabla ^s u_h\right)\right)\, \hbox{d}\Omega }_{VI} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.79) |
|} | |} | ||
− | Analogously to the complete energy balance, Eq. [[#eq- | + | Analogously to the complete energy balance, Eq. [[#eq-2.79|2.79]] can be understood as a balance for the kinetic energy associated to large scale motions. Terms <math display="inline">I</math> and <math display="inline">II</math> represent the storage and convection of large scale kinetic energy, while term <math display="inline">III</math> represents the power exerted by the external forces on large scale motions. Term <math display="inline">IV</math> is the viscous dissipation associated to the large scale motions, which can be assumed to be negligible for high Reynolds numbers. The remaining terms represent the transfer of energy between large scale and residual motions, playing an analogous role to production terms in the filtered Navier-Stokes equations. |
− | Finally, we define the residual kinetic energy as <math display="inline">k_r = E - E_h</math>. A balance statement for <math display="inline">k_r</math> can be obtained by subtracting Eq. [[#eq- | + | Finally, we define the residual kinetic energy as <math display="inline">k_r = E - E_h</math>. A balance statement for <math display="inline">k_r</math> can be obtained by subtracting Eq. [[#eq-2.79|2.79]] from Eq. [[#eq-2.77|2.77]], which results in |
− | <span id="eq- | + | <span id="eq-2.80"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\underbrace{\int _\Omega \partial _t k_r \, \hbox{d}\Omega }_{I} + \underbrace{\int _\Omega u\cdot \nabla k_r \, \hbox{d}\Omega }_{II} = \underbrace{\int _\Omega u_s\cdot \boldsymbol{f} \, \hbox{d}\Omega }_{III} </math> | | style="text-align: center;" | <math>\underbrace{\int _\Omega \partial _t k_r \, \hbox{d}\Omega }_{I} + \underbrace{\int _\Omega u\cdot \nabla k_r \, \hbox{d}\Omega }_{II} = \underbrace{\int _\Omega u_s\cdot \boldsymbol{f} \, \hbox{d}\Omega }_{III} </math> | ||
Line 1,343: | Line 1,195: | ||
| style="text-align: center;" | <math> \underbrace{+ \int _\Omega u_h\cdot \rho \partial _t u_s\, \hbox{d}\Omega - \int _\Omega u_s\cdot \left(\rho u\cdot \nabla u_h+ \nabla p_h+ \nabla \cdot \left(2\mu \nabla ^s u_h\right)\right)\, \hbox{d}\Omega }_{VII} </math> | | style="text-align: center;" | <math> \underbrace{+ \int _\Omega u_h\cdot \rho \partial _t u_s\, \hbox{d}\Omega - \int _\Omega u_s\cdot \left(\rho u\cdot \nabla u_h+ \nabla p_h+ \nabla \cdot \left(2\mu \nabla ^s u_h\right)\right)\, \hbox{d}\Omega }_{VII} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.80) |
|} | |} | ||
− | In Eq. [[#eq- | + | In Eq. [[#eq-2.80|2.80]], terms <math display="inline">I</math> and <math display="inline">II</math> represent the storage and convection of residual kinetic energy, while term <math display="inline">III</math> represents the power exerted by the external forces on small scale (high wavenumber) motions. The next two terms represent the difference between the total viscous dissipation (<math display="inline">IV</math>) and the large scale viscous dissipation (<math display="inline">V</math>), which was already accounted for in the large scale energy balance of Eq. [[#eq-2.79|2.79]]. Again, we remark that, in practice, term <math display="inline">V</math> is expected to be negligible in comparison to term <math display="inline">IV</math>, since viscous dissipation occurs predominantly for motions in the range of the Kolmogorov length scale, while <math display="inline">u_h</math> will contain only motions on a much larger scale <math display="inline">h</math>, lying on the inertial subrange. Finally, terms <math display="inline">VI</math> and <math display="inline">VII</math> represent the production of residual energy due to the pressure and velocity small scales, respectively, and are exactly the same (but now with opposite sign) as the production terms in Eq. [[#eq-2.79|2.79]]. |
Terms <math display="inline">VI</math> and <math display="inline">VII</math> can be modified by noting that, since <math display="inline">p_s\in Q_s</math> and <math display="inline">u_s\in V_s</math>, | Terms <math display="inline">VI</math> and <math display="inline">VII</math> can be modified by noting that, since <math display="inline">p_s\in Q_s</math> and <math display="inline">u_s\in V_s</math>, | ||
− | <span id="eq- | + | <span id="eq-2.81"></span> |
− | <span id="eq- | + | <span id="eq-2.82"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\int _\Omega p_s\nabla \cdot u_h\, \hbox{d}\Omega = \int _\Omega p_s\Pi _{Q_s} \left(\nabla \cdot u_h\right)\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.81) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega u_s\cdot \left(\rho u\cdot \nabla u_h+ \nabla p_h+ \nabla \cdot \left(2\mu \nabla ^s u_h\right)\right)\, \hbox{d}\Omega = </math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega u_s\cdot \Pi _{V_s} \big(\rho u\cdot \nabla u_h+ \nabla p_h+ \nabla \cdot \left(2\mu \nabla ^s u_h\right)\big)\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.82) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | The last step to obtain the residual kinetic energy balance is to introduce the small scale models for velocity and pressure in Eqs. [[#eq- | + | The last step to obtain the residual kinetic energy balance is to introduce the small scale models for velocity and pressure in Eqs. [[#eq-2.81|2.81]] and [[#eq-2.82|2.82]]. Noting that <math display="inline">\left(2\mu \nabla ^s u_h\right)</math> represents the large scale viscous dissipation and will be negligible for high Reynolds numbers, we can write |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math>\int _\Omega u_s\cdot \Pi _{V_s}\left(\rho u\cdot \nabla u_h+ \nabla p_h\right)\, \hbox{d}\Omega + \int _\Omega p_s\Pi _{Q_s}\left(\nabla \cdot u_h\right)\, \hbox{d}\Omega = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> \underbrace{ \int _\Omega \tau _u \Pi _{V_s}\left(\boldsymbol{f} \right)\cdot \Pi _{V_s}\left(\rho u\cdot \nabla u_h+ \nabla p_h\right)\, \hbox{d}\Omega }_{I} -\underbrace{ \int _\Omega \tau _u \big\vert \Pi _{V_s}\left(\rho u\cdot \nabla u_h+ \nabla p_h\right)\big\vert^2 \, \hbox{d}\Omega }_{II} </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> {} + \underbrace{ \int _\Omega \tau _u \rho \partial _t u_s\cdot \Pi _{V_s}\left(\rho u\cdot \nabla u_h+ \nabla p_h\right)\, \hbox{d}\Omega }_{III} - \underbrace{ \int _\Omega \tau _p \big\vert \Pi _{Q_s}\left(\nabla \cdot u_h\right) \big\vert^2 \, \hbox{d}\Omega }_{IV} </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.83) |
|} | |} | ||
− | It is clear that terms <math display="inline">II</math> and <math display="inline">IV</math>, since the stabilization parameters <math display="inline">\tau _u</math> and <math display="inline">\tau _p</math> were defined as strictly positive. They play the role of energy sinks in the large scale energy balance of Eq. [[#eq- | + | It is clear that terms <math display="inline">II</math> and <math display="inline">IV</math>, since the stabilization parameters <math display="inline">\tau _u</math> and <math display="inline">\tau _p</math> were defined as strictly positive. They play the role of energy sinks in the large scale energy balance of Eq. [[#eq-2.79|2.79]], while acting as sources on the residual energy equation Eq. [[#eq-2.80|2.80]]. Term <math display="inline">I</math> is problem dependent but, if an OSS small scale model is used, it will vanish unless the external forces have a high-frequency (small scale) component. Finally, term <math display="inline">III</math> only exists for dynamic small scale models. This fact was used in <span id='citeF-25'></span>[[#cite-25|[25]]] to justify that OSS formulations can account for backscatter (energy transfer from the small scales to the large ones) if a dynamic small scale model is used. |
− | Starting from a similar reasoning, Guasch and Codina <span id='citeF- | + | Starting from a similar reasoning, Guasch and Codina <span id='citeF-26'></span>[[#cite-26|[26]]] use statistical and scaling arguments to show that OSS formulations extract energy from the large scale equations at the correct rate, provided that some constraints on the behavior of stabilization parameters are respected. |
− | As a final remark on this topic, we compare the large scale energy balance to the filtered energy balance used in filter-based LES formulations. If the kinetic energy associated to the filtered velocity field is defined as <math display="inline">\overline{E} = \rho \overline{u} \cdot \overline{u} / 2</math>, the balance for <math display="inline">\overline{E}</math> can be obtained by multiplying the filtered linear momentum equation Eq. [[#eq- | + | As a final remark on this topic, we compare the large scale energy balance to the filtered energy balance used in filter-based LES formulations. If the kinetic energy associated to the filtered velocity field is defined as <math display="inline">\overline{E} = \rho \overline{u} \cdot \overline{u} / 2</math>, the balance for <math display="inline">\overline{E}</math> can be obtained by multiplying the filtered linear momentum equation Eq. [[#eq-2.62|2.62]] by <math display="inline">\overline{u}</math> and integrating over the fluid domain (see <span id='citeF-2'></span>[[#cite-2|[2]]]), resulting in |
− | <span id="eq- | + | <span id="eq-2.84"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\int _\Omega \partial _t \overline{E} \, \hbox{d}\Omega + \int _\Omega \overline{u} \cdot \nabla \overline{E} \, \hbox{d}\Omega = \int _\Omega \overline{u}\cdot \overline{\boldsymbol{f}} \, \hbox{d}\Omega - \int _\Omega 2 \mu \nabla ^s \overline{u}: \nabla ^s \overline{u}\, \hbox{d}\Omega + \int _\Omega \nabla ^s \overline{u}: \boldsymbol{\tau }^R\, \hbox{d}\Omega </math> | | style="text-align: center;" | <math>\int _\Omega \partial _t \overline{E} \, \hbox{d}\Omega + \int _\Omega \overline{u} \cdot \nabla \overline{E} \, \hbox{d}\Omega = \int _\Omega \overline{u}\cdot \overline{\boldsymbol{f}} \, \hbox{d}\Omega - \int _\Omega 2 \mu \nabla ^s \overline{u}: \nabla ^s \overline{u}\, \hbox{d}\Omega + \int _\Omega \nabla ^s \overline{u}: \boldsymbol{\tau }^R\, \hbox{d}\Omega </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.84) |
|} | |} | ||
where boundary fluxes have been omitted. | where boundary fluxes have been omitted. | ||
− | We can introduce the definition of the VMS subgrid stress tensor <math display="inline">\boldsymbol{\tau }^R_{VMS}</math> in Eq. [[#eq- | + | We can introduce the definition of the VMS subgrid stress tensor <math display="inline">\boldsymbol{\tau }^R_{VMS}</math> in Eq. [[#eq-2.78|2.78]], obtaining |
− | <span id="eq- | + | <span id="eq-2.85"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _\Omega u_h\cdot \rho \left(\partial _t u_h+ \partial _t u_s\right)\, \hbox{d}\Omega + \int _\Omega \rho u_h\nabla \cdot \left(u_h\otimes u_h\right)\, \hbox{d}\Omega \qquad \qquad </math> | + | | style="text-align: center;" | <math>\int _\Omega u_h\cdot \rho \left(\partial _t u_h+ \partial _t u_s\right)\, \hbox{d}\Omega + \int _\Omega \rho u_h\nabla \cdot \left(u_h\otimes u_h\right)\, \hbox{d}\Omega \qquad \qquad </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> - \int _\Omega \rho \nabla u_h: \boldsymbol{\tau }^R_{VMS}\, \hbox{d}\Omega + \int _\Omega \nabla ^s u_h: 2 \mu \nabla ^s \left(u_h+ u_s\right)\, \hbox{d}\Omega \qquad </math> | + | | style="text-align: center;" | <math> - \int _\Omega \rho \nabla u_h: \boldsymbol{\tau }^R_{VMS}\, \hbox{d}\Omega + \int _\Omega \nabla ^s u_h: 2 \mu \nabla ^s \left(u_h+ u_s\right)\, \hbox{d}\Omega \qquad </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> - \int _\Omega \nabla \cdot u_h\left(p_h+ p_s\right)+ \int _\Omega p_h\nabla \cdot \left(u_h+ u_s\right) | + | | style="text-align: center;" | <math> - \int _\Omega \nabla \cdot u_h\left(p_h+ p_s\right)+ \int _\Omega p_h\nabla \cdot \left(u_h+ u_s\right)= \int _\Omega u_h\cdot \boldsymbol{f} \, \hbox{d}\Omega </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.85) |
|} | |} | ||
− | where the conservative form of the convective term has been used. Rearranging some terms, Eq. [[#eq- | + | where the conservative form of the convective term has been used. Rearranging some terms, Eq. [[#eq-2.85|2.85]] can be rewritten as |
− | <span id="eq- | + | <span id="eq-2.86"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\underbrace{\int _\Omega \partial _t E_h \, \hbox{d}\Omega }_{I} + \underbrace{\int _\Omega u_h\cdot \nabla E_h \, \hbox{d}\Omega }_{II} = \underbrace{\int _\Omega u_h\cdot \boldsymbol{f} \, \hbox{d}\Omega }_{III} - \underbrace{\int _\Omega 2 \mu \nabla ^s u_h: \nabla ^s u_h\, \hbox{d}\Omega }_{IV} + \underbrace{\int _\Omega p_s\nabla \cdot u_h\, \hbox{d}\Omega }_{V} </math> | | style="text-align: center;" | <math>\underbrace{\int _\Omega \partial _t E_h \, \hbox{d}\Omega }_{I} + \underbrace{\int _\Omega u_h\cdot \nabla E_h \, \hbox{d}\Omega }_{II} = \underbrace{\int _\Omega u_h\cdot \boldsymbol{f} \, \hbox{d}\Omega }_{III} - \underbrace{\int _\Omega 2 \mu \nabla ^s u_h: \nabla ^s u_h\, \hbox{d}\Omega }_{IV} + \underbrace{\int _\Omega p_s\nabla \cdot u_h\, \hbox{d}\Omega }_{V} </math> | ||
Line 1,441: | Line 1,283: | ||
| style="text-align: center;" | <math> \underbrace{- \int _\Omega u_h\cdot \rho \partial _t u_s\, \hbox{d}\Omega - \int _\Omega u_s\cdot \left(\nabla p_h- \nabla \cdot \left(2\mu \nabla ^s u_h\right)\right)\, \hbox{d}\Omega }_{VI} + \underbrace{\int _\Omega \rho \nabla ^s u_h: \boldsymbol{\tau }^R_{VMS}\, \hbox{d}\Omega }_{VII} </math> | | style="text-align: center;" | <math> \underbrace{- \int _\Omega u_h\cdot \rho \partial _t u_s\, \hbox{d}\Omega - \int _\Omega u_s\cdot \left(\nabla p_h- \nabla \cdot \left(2\mu \nabla ^s u_h\right)\right)\, \hbox{d}\Omega }_{VI} + \underbrace{\int _\Omega \rho \nabla ^s u_h: \boldsymbol{\tau }^R_{VMS}\, \hbox{d}\Omega }_{VII} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.86) |
|} | |} | ||
− | where we have used the fact that <math display="inline">\boldsymbol{\tau }^R_{VMS}</math> is a symmetric tensor to write <math display="inline">\nabla u_h: \boldsymbol{\tau }^R_{VMS}= \nabla ^s u_h: \boldsymbol{\tau }^R_{VMS}</math>. Terms <math display="inline">I</math> to <math display="inline">VI</math> have an analogous interpretation to their counterparts in Eq. [[#eq- | + | where we have used the fact that <math display="inline">\boldsymbol{\tau }^R_{VMS}</math> is a symmetric tensor to write <math display="inline">\nabla u_h: \boldsymbol{\tau }^R_{VMS}= \nabla ^s u_h: \boldsymbol{\tau }^R_{VMS}</math>. Terms <math display="inline">I</math> to <math display="inline">VI</math> have an analogous interpretation to their counterparts in Eq. [[#eq-2.79|2.79]], but here we have obtained an additional term, <math display="inline">VII</math>, which explicitly represents the contribution of the residual subgrid stresses in the energy transfer. Comparing Eq. [[#eq-2.86|2.86]] to Eq. [[#eq-2.84|2.84]], we see that both LES and VMS approaches extract energy from the large scale problem through subgrid stresses, but that the variational approach gives rise to two additional energy transfer mechanisms, represented by terms <math display="inline">V</math> and <math display="inline">VI</math>, compared to filter-based LES. |
==2.5 Discrete problem== | ==2.5 Discrete problem== | ||
Line 1,450: | Line 1,292: | ||
To obtain a finite element solver based on the VMS formulation introduced in Section [[#2.3 Variational multiscale stabilization|2.3]] we need to discretize the simulation domain, both in space and in time, and linearize the problem to obtain a system of equations that can be inverted using a linear solver. We start by introducing a finite element partition <math display="inline">\Omega _h</math> for the problem domain <math display="inline">\Omega </math>. Given the discrete domain <math display="inline">\Omega _h</math>, the large scale interpolation spaces <math display="inline">V_h</math> and <math display="inline">Q_h</math> can be identified with the standard finite element interpolation functions and the large scale part of the solution, <math display="inline">u_h</math> and <math display="inline">p_h</math>, can be represented using a finite element interpolation as | To obtain a finite element solver based on the VMS formulation introduced in Section [[#2.3 Variational multiscale stabilization|2.3]] we need to discretize the simulation domain, both in space and in time, and linearize the problem to obtain a system of equations that can be inverted using a linear solver. We start by introducing a finite element partition <math display="inline">\Omega _h</math> for the problem domain <math display="inline">\Omega </math>. Given the discrete domain <math display="inline">\Omega _h</math>, the large scale interpolation spaces <math display="inline">V_h</math> and <math display="inline">Q_h</math> can be identified with the standard finite element interpolation functions and the large scale part of the solution, <math display="inline">u_h</math> and <math display="inline">p_h</math>, can be represented using a finite element interpolation as | ||
− | <span id="eq- | + | <span id="eq-2.87"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>u_h= \sum _a^{n_n} \boldsymbol{N}_{a} \left(\boldsymbol{x}\right)\boldsymbol{u}_a \qquad p_h= \sum _a^{n_n} N_{a}\left(\boldsymbol{x}\right)p_a </math> | | style="text-align: center;" | <math>u_h= \sum _a^{n_n} \boldsymbol{N}_{a} \left(\boldsymbol{x}\right)\boldsymbol{u}_a \qquad p_h= \sum _a^{n_n} N_{a}\left(\boldsymbol{x}\right)p_a </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.87) |
|} | |} | ||
Line 1,466: | Line 1,308: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{N}_{a} = \begin{bmatrix}N_{a} & 0 & 0 \\ 0 & N_{a} & 0 \\ 0 & 0 & N_{a} \end{bmatrix} </math> | | style="text-align: center;" | <math>\boldsymbol{N}_{a} = \begin{bmatrix}N_{a} & 0 & 0 \\ 0 & N_{a} & 0 \\ 0 & 0 & N_{a} \end{bmatrix} </math> | ||
Line 1,474: | Line 1,316: | ||
Additionally, we introduce the following notation for the gradient and divergence of the finite element shape functions, which will be used to write the discrete form of the differential operators involved in the problem | Additionally, we introduce the following notation for the gradient and divergence of the finite element shape functions, which will be used to write the discrete form of the differential operators involved in the problem | ||
− | <span id="eq- | + | <span id="eq-2.88"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\left(\nabla N_{a} \right)^T = \begin{bmatrix}\dfrac{\partial N_a}{\partial x} & \dfrac{\partial N_a}{\partial y} & \dfrac{\partial N_a}{\partial z} \end{bmatrix} \qquad \nabla \cdot \boldsymbol{N}_{a} = \begin{bmatrix}\dfrac{\partial N_a}{\partial x} & \dfrac{\partial N_a}{\partial y} & \dfrac{\partial N_a}{\partial z} \end{bmatrix} </math> | | style="text-align: center;" | <math>\left(\nabla N_{a} \right)^T = \begin{bmatrix}\dfrac{\partial N_a}{\partial x} & \dfrac{\partial N_a}{\partial y} & \dfrac{\partial N_a}{\partial z} \end{bmatrix} \qquad \nabla \cdot \boldsymbol{N}_{a} = \begin{bmatrix}\dfrac{\partial N_a}{\partial x} & \dfrac{\partial N_a}{\partial y} & \dfrac{\partial N_a}{\partial z} \end{bmatrix} </math> | ||
Line 1,484: | Line 1,326: | ||
| style="text-align: center;" | <math> \left(\nabla \boldsymbol{N}_{a} \right)^T = \left[\begin{array}{ccccccccc}\dfrac{\partial N_a}{\partial x} & 0 & 0 & \dfrac{\partial N_a}{\partial x} & 0 & 0 & \dfrac{\partial N_a}{\partial x} & 0 & 0 \\[1.1em] 0 & \dfrac{\partial N_a}{\partial y} & 0 & 0 & \dfrac{\partial N_a}{\partial y} & 0 & 0 & \dfrac{\partial N_a}{\partial y} & 0 \\[1.1em] 0 & 0 & \dfrac{\partial N_a}{\partial z} & 0 & 0 & \dfrac{\partial N_a}{\partial z} & 0 & 0 & \dfrac{\partial N_a}{\partial z} \end{array} \right] </math> | | style="text-align: center;" | <math> \left(\nabla \boldsymbol{N}_{a} \right)^T = \left[\begin{array}{ccccccccc}\dfrac{\partial N_a}{\partial x} & 0 & 0 & \dfrac{\partial N_a}{\partial x} & 0 & 0 & \dfrac{\partial N_a}{\partial x} & 0 & 0 \\[1.1em] 0 & \dfrac{\partial N_a}{\partial y} & 0 & 0 & \dfrac{\partial N_a}{\partial y} & 0 & 0 & \dfrac{\partial N_a}{\partial y} & 0 \\[1.1em] 0 & 0 & \dfrac{\partial N_a}{\partial z} & 0 & 0 & \dfrac{\partial N_a}{\partial z} & 0 & 0 & \dfrac{\partial N_a}{\partial z} \end{array} \right] </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.88) |
|} | |} | ||
We also introduce the following operator to describe convection | We also introduce the following operator to describe convection | ||
− | <span id="eq- | + | <span id="eq-2.89"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} = \begin{bmatrix}\boldsymbol{a} \cdot \nabla N_a & 0 & 0 \\ 0 & \boldsymbol{a} \cdot \nabla N_a & 0 \\ 0 & 0 & \boldsymbol{a} \cdot \nabla N_a \end{bmatrix} </math> | | style="text-align: center;" | <math>\boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} = \begin{bmatrix}\boldsymbol{a} \cdot \nabla N_a & 0 & 0 \\ 0 & \boldsymbol{a} \cdot \nabla N_a & 0 \\ 0 & 0 & \boldsymbol{a} \cdot \nabla N_a \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.89) |
|} | |} | ||
Line 1,505: | Line 1,347: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{B}_a^T = \begin{bmatrix}\dfrac{\partial N_a}{\partial x} & 0 & 0 & \dfrac{\partial N_a}{\partial y} & 0 & \dfrac{\partial N_a}{\partial z} \\[1.1em] 0 & \dfrac{\partial N_a}{\partial y} & 0 & \dfrac{\partial N_a}{\partial x} & \dfrac{\partial N_a}{\partial z} & 0 \\[1.1em] 0 & 0 & \dfrac{\partial N_a}{\partial z} & 0 & \dfrac{\partial N_a}{\partial y} & \dfrac{\partial N_a}{\partial x} \end{bmatrix} </math> | | style="text-align: center;" | <math>\boldsymbol{B}_a^T = \begin{bmatrix}\dfrac{\partial N_a}{\partial x} & 0 & 0 & \dfrac{\partial N_a}{\partial y} & 0 & \dfrac{\partial N_a}{\partial z} \\[1.1em] 0 & \dfrac{\partial N_a}{\partial y} & 0 & \dfrac{\partial N_a}{\partial x} & \dfrac{\partial N_a}{\partial z} & 0 \\[1.1em] 0 & 0 & \dfrac{\partial N_a}{\partial z} & 0 & \dfrac{\partial N_a}{\partial y} & \dfrac{\partial N_a}{\partial x} \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.90) |
|} | |} | ||
Additionally, we define <math display="inline">\boldsymbol{U}</math>, <math display="inline">\boldsymbol{\dot{U}}</math> and <math display="inline">\boldsymbol{P}</math> as the vectors of nodal values of large scale velocity <math display="inline">u_h</math>, acceleration <math display="inline">\partial _t u_h</math> and pressure <math display="inline">p_h</math>, respectively. | Additionally, we define <math display="inline">\boldsymbol{U}</math>, <math display="inline">\boldsymbol{\dot{U}}</math> and <math display="inline">\boldsymbol{P}</math> as the vectors of nodal values of large scale velocity <math display="inline">u_h</math>, acceleration <math display="inline">\partial _t u_h</math> and pressure <math display="inline">p_h</math>, respectively. | ||
− | We introduce the finite element discretization of Eq. [[#eq- | + | We introduce the finite element discretization of Eq. [[#eq-2.87|2.87]] in the variational formulation given by Eqs. [[#eq-2.56|2.56]] and [[#eq-2.57|2.57]] to obtain the matrix form of the problem. We will analyze the resulting expression for each of the variants we are considering in turn. |
− | Note that in the present work we use linear finite elements, which can not be used to write second derivatives of the variables or test functions. As a result, terms involving <math display="inline">\nabla \cdot \nabla ^s \boldsymbol{w}_h</math> in Eq. [[#eq- | + | Note that in the present work we use linear finite elements, which can not be used to write second derivatives of the variables or test functions. As a result, terms involving <math display="inline">\nabla \cdot \nabla ^s \boldsymbol{w}_h</math> in Eq. [[#eq-2.56|2.56]] or the strong-form viscous term that appears in the residual <math display="inline">{\boldsymbol{R}^m\left(u_h, p_h\right)}</math> introduced in Eq. [[#eq-2.43|2.43]] will be neglected in the discrete form. It must be remarked that all terms lost in this way are related to viscous stresses, which should be small in turbulent flow problems. |
===2.5.1 Quasi-static ASGS formulation=== | ===2.5.1 Quasi-static ASGS formulation=== | ||
Line 1,522: | Line 1,364: | ||
The quasi-static ASGS formulation is in some sense the ''classical'' VMS formulation for the Navier-Stokes equations. It is also relatively simple, as it does not involve dynamic terms or projections, so we will present it first. | The quasi-static ASGS formulation is in some sense the ''classical'' VMS formulation for the Navier-Stokes equations. It is also relatively simple, as it does not involve dynamic terms or projections, so we will present it first. | ||
− | Starting from Eqs. [[#eq- | + | Starting from Eqs. [[#eq-2.56|2.56]] and [[#eq-2.57|2.57]], we can neglect all terms involving the projections <math display="inline">\boldsymbol{\xi }_h</math> or <math display="inline">\delta _h</math>. As the small scales are described using Eq. [[#eq-2.48|2.48]], terms involving <math display="inline">u_s^n</math> or <math display="inline">\partial _t u_s</math> in these equations can be ignored and the momentum stabilization parameter is <math display="inline">\tau _u</math>, given by Eq. [[#eq-2.49|2.49]]. After these simplifications, we introduce the finite element interpolation of Eq. [[#eq-2.87|2.87]] to describe the problem variables <math display="inline">u_h</math>, <math display="inline">p_h</math>. Testing against each nodal basis function in turn we obtain a system of equations that can be expressed in matrix form as |
− | <span id="eq- | + | <span id="eq-2.91"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\big[ \boldsymbol{M} + \boldsymbol{S}_{m}\left(\tau _u,\boldsymbol{a}\right) \big]\boldsymbol{\dot{U}} | + | | style="text-align: center;" | <math>\big[ \boldsymbol{M} + \boldsymbol{S}_{m}\left(\tau _u,\boldsymbol{a}\right) \big]\boldsymbol{\dot{U}} + \big[ \boldsymbol{C}\left(\boldsymbol{a}\right) + \boldsymbol{K} + \boldsymbol{S}_{u}\left(\tau _u,\boldsymbol{a}\right) + \boldsymbol{H}_{u}\left(\tau _p\right) \big]\boldsymbol{U} </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> + \big[ \boldsymbol{G} + \boldsymbol{S}_{p}\left(\tau _u,\boldsymbol{a}\right) \big]\boldsymbol{P} = \boldsymbol{F} + \boldsymbol{T} + \boldsymbol{S}_{f}\left(\tau _u,\boldsymbol{a}\right) </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.91) |
|} | |} | ||
− | <span id="eq- | + | <span id="eq-2.92"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{Q}_{m}\left(\tau _u\right) \boldsymbol{\dot{U}} + \big[ \boldsymbol{D} + \boldsymbol{Q}_{u}\left(\tau _u,\boldsymbol{a}\right) \big]\boldsymbol{U} + \boldsymbol{Q}_{p}\left(\tau _u\right) \boldsymbol{P} = \boldsymbol{Q}_{f}\left(\tau _u\right) </math> | | style="text-align: center;" | <math>\boldsymbol{Q}_{m}\left(\tau _u\right) \boldsymbol{\dot{U}} + \big[ \boldsymbol{D} + \boldsymbol{Q}_{u}\left(\tau _u,\boldsymbol{a}\right) \big]\boldsymbol{U} + \boldsymbol{Q}_{p}\left(\tau _u\right) \boldsymbol{P} = \boldsymbol{Q}_{f}\left(\tau _u\right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.92) |
|} | |} | ||
− | Again, we have used a generic convection velocity <math display="inline">\boldsymbol{a}</math> in all terms that have a non-linear dependence of velocity. Doing so, we leave open the possibility of using either the full velocity <math display="inline">\boldsymbol{a} = u_h+ u_s</math> or the only large scale part <math display="inline">\boldsymbol{a} = u_h</math>. Note that, for linear finite elements, the latter choice is equivalent to the Galerkin-Least Squares (GLS) method <span id='citeF- | + | Again, we have used a generic convection velocity <math display="inline">\boldsymbol{a}</math> in all terms that have a non-linear dependence of velocity. Doing so, we leave open the possibility of using either the full velocity <math display="inline">\boldsymbol{a} = u_h+ u_s</math> or the only large scale part <math display="inline">\boldsymbol{a} = u_h</math>. Note that, for linear finite elements, the latter choice is equivalent to the Galerkin-Least Squares (GLS) method <span id='citeF-37'></span>[[#cite-37|[37]]]. |
− | The different matrices in Eqs. [[#eq- | + | The different matrices in Eqs. [[#eq-2.91|2.91]] and [[#eq-2.92|2.92]] represent the discrete version of the operators in Eqs. [[#eq-2.56|2.56]] and [[#eq-2.57|2.57]] and can be built from the assembly of elemental contributions. In general, matrix <math display="inline">\boldsymbol{A}</math> is constructed by the finite element assembly of elemental matrices of the form <math display="inline">\boldsymbol{A}^e</math>. For a finite element with <math display="inline">N</math> nodes, <math display="inline">\boldsymbol{A}^e</math> can be defined using <math display="inline">N \times N</math> blocks <math display="inline">\boldsymbol{A}^e_{ab}</math>, where <math display="inline">a</math> and <math display="inline">b</math> are local node indices. Using this notation, the standard Galerkin terms in the variational form of the problem give rise to the following elemental matrices |
− | <span id="eq- | + | <span id="eq-2.93"></span> |
− | <span id="eq- | + | <span id="eq-2.96"></span> |
− | <span id="eq- | + | <span id="eq-2.98"></span> |
− | <span id="eq- | + | <span id="eq-2.100"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{M} ^e_{ab} = \int _{\Omega _e} \rho \boldsymbol{N}_a^T \boldsymbol{N}_b \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.93) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{C}\left(\boldsymbol{a}\right) ^e_{ab} = \int _{\Omega _e} \rho \dfrac{1}{2} \left(\boldsymbol{N}_{a}^T \, \boldsymbol{a} \cdot \nabla \boldsymbol{N}_{b} - \left(\boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} \right)^T \boldsymbol{N}_{b} \right)\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.94) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> {} + \int _{\Gamma _N} \boldsymbol{N}_{a}^T \, \rho \dfrac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)\boldsymbol{N}_{b} \, \hbox{d}\Gamma </math> |
− | | <math>{} + \int _{\Gamma _N} \boldsymbol{N}_{a}^T \, \rho \dfrac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)\boldsymbol{N}_{b} \, \hbox{d}\ | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.95) |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{K} ^e_{ab} = \int _{\Omega _e} \boldsymbol{B}_a^T \boldsymbol{C}_\mu \boldsymbol{B}_b \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.96) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{G} ^e_{ab} = - \int _{\Omega _e} \left(\nabla \cdot \boldsymbol{N}_{a} \right)^T N_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.97) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{D} ^e_{ab} = \int _{\Omega _e} N_{a} \, \nabla \cdot \boldsymbol{N}_{b} \, \hbox{d}\Omega = - \big(\boldsymbol{G}^e_{ba} \big)^T </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.98) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{F} ^e_{a} = \int _{\Omega _e} \boldsymbol{N}_{a}^T \boldsymbol{f} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.99) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{T} ^e_{a} = \int _{\Gamma _N} \boldsymbol{N}_{a}^T \boldsymbol{t} \, \hbox{d}\Gamma </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.100) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | When defining the viscous matrix <math display="inline"> \boldsymbol{K} ^e_{ab}</math> in Eq. [[#eq- | + | When defining the viscous matrix <math display="inline"> \boldsymbol{K} ^e_{ab}</math> in Eq. [[#eq-2.96|2.96]] we introduced the constitutive matrix <math display="inline">\boldsymbol{C}_{\mu }</math>, which is given by |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{C}_{\mu } = \begin{bmatrix}4\mu /3 & -2\mu /3 & -2\mu /3 & 0 & 0 & 0 \\ -2\mu /3 & 4\mu /3 & -2\mu /3 & 0 & 0 & 0 \\ -2\mu /3 & -2\mu /3 & 4\mu /3 & 0 & 0 & 0 \\ 0 & 0 & 0 & \mu & 0 & 0 \\ 0 & 0 & 0 & 0 & \mu & 0 \\ 0 & 0 & 0 & 0 & 0 & \mu \end{bmatrix} </math> | | style="text-align: center;" | <math>\boldsymbol{C}_{\mu } = \begin{bmatrix}4\mu /3 & -2\mu /3 & -2\mu /3 & 0 & 0 & 0 \\ -2\mu /3 & 4\mu /3 & -2\mu /3 & 0 & 0 & 0 \\ -2\mu /3 & -2\mu /3 & 4\mu /3 & 0 & 0 & 0 \\ 0 & 0 & 0 & \mu & 0 & 0 \\ 0 & 0 & 0 & 0 & \mu & 0 \\ 0 & 0 & 0 & 0 & 0 & \mu \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.101) |
|} | |} | ||
In the same way, the stabilization terms in the Q-ASGS give rise to additional elemental matrices, expressed here as | In the same way, the stabilization terms in the Q-ASGS give rise to additional elemental matrices, expressed here as | ||
− | <span id="eq- | + | <span id="eq-2.110"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{S}_{m}\left(\tau _u,\boldsymbol{a}\right)^e_{ab} = \int _{\Omega _e} \left(\rho \, \boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} \right)^T \tau _u \, \boldsymbol{N}_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.102) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{S}_{u}\left(\tau _u,\boldsymbol{a}\right)^e_{ab} = \int _{\Omega _e} \left(\rho \, \boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} \right)^T \tau _u \, \rho \, \boldsymbol{a} \cdot \nabla \boldsymbol{N}_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.103) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{S}_{p}\left(\tau _u,\boldsymbol{a}\right)^e_{ab} = \int _{\Omega _e} \left(\rho \, \boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} \right)^T \tau _u \, \nabla N_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.104) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{S}_{f}\left(\tau _u,\boldsymbol{a}\right) ^e_{ab} = \int _{\Omega _e} \left(\rho \, \boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} \right)^T \tau _u \, \boldsymbol{f} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.105) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{Q}_{m}\left(\tau _u\right)_{ab}^e = \int _\Omega \left(\nabla \boldsymbol{N}_{a} \right)^T \tau _u \, \boldsymbol{N}_b \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.106) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{Q}_{u}\left(\tau _u,\boldsymbol{a}\right)^e_{ab} = \int _{\Omega _e} \left(\nabla \boldsymbol{N}_{a} \right)^T \tau _u \, \rho \, \boldsymbol{a} \cdot \nabla \boldsymbol{N}_{b} \, \hbox{d}\Omega = \big( \boldsymbol{S}_{p}\left(\tau _u,\boldsymbol{a}\right)^e_{ba} \big)^T </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.107) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{Q}_{p}\left(\tau _u\right)_{ab}^e = \int _{\Omega _e} \left(\nabla \boldsymbol{N}_{a} \right)^T \tau _u \, \nabla \boldsymbol{N}_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.108) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{Q}_{f}\left(\tau _u\right)_{ab}^e = \int _{\Omega _e} \left(\nabla \boldsymbol{N}_{a} \right)^T \tau _u \, \boldsymbol{f} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.109) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{H}_{u}\left(\tau _p\right)^e_{ab} = \int _{\Omega _e} \left(\nabla \cdot \boldsymbol{N}_{a} \right)^T \tau _p \, \nabla \cdot \boldsymbol{N}_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.110) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 1,659: | Line 1,482: | ||
The next variant to be presented is the quasi-static OSS formulation. Compared to the Q-ASGS formulation, OSS is characterized by the inclusion of the projections <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math>, which make the small scale variables orthogonal to the large scale unknowns and should reduce the overall amount of numerical diffusion introduced in the problem. As in the previous case, we leave open the possibility of using either <math display="inline">\boldsymbol{a} = u_h+u_s</math> or <math display="inline">\boldsymbol{a} = u</math> for convection and the corresponding stabilization terms. The matrix form of the Q-OSS formulation can be expressed as | The next variant to be presented is the quasi-static OSS formulation. Compared to the Q-ASGS formulation, OSS is characterized by the inclusion of the projections <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math>, which make the small scale variables orthogonal to the large scale unknowns and should reduce the overall amount of numerical diffusion introduced in the problem. As in the previous case, we leave open the possibility of using either <math display="inline">\boldsymbol{a} = u_h+u_s</math> or <math display="inline">\boldsymbol{a} = u</math> for convection and the corresponding stabilization terms. The matrix form of the Q-OSS formulation can be expressed as | ||
− | <span id="eq- | + | <span id="eq-2.111"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\big[ | + | | style="text-align: center;" | <math>\big[ \boldsymbol{M} + \boldsymbol{S}_{m}\left(\tau _u,\boldsymbol{a}\right) \big]\boldsymbol{\dot{U}} + \big[ \boldsymbol{C}\left(\boldsymbol{a}\right) + \boldsymbol{K} + \boldsymbol{S}_{u}\left(\tau _u,\boldsymbol{a}\right) + \boldsymbol{H}_{u}\left(\tau _p\right) \big]\boldsymbol{U} </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> + \big[ \boldsymbol{G} + \boldsymbol{S}_{p}\left(\tau _u,\boldsymbol{a}\right) \big]\boldsymbol{P} = \boldsymbol{F} + \boldsymbol{T} + \boldsymbol{S}_{f}\left(\tau _u,\boldsymbol{a}\right) - \boldsymbol{S}_{\Pi }\left(\tau _u,\boldsymbol{a}\right) - \boldsymbol{H}_{\Pi }\left(\tau _u\right) </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.111) |
|} | |} | ||
− | <span id="eq- | + | <span id="eq-2.112"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{Q}_{m}\left(\tau _u\right) \boldsymbol{\dot{U}} + \big[ \boldsymbol{D} + \boldsymbol{Q}_{u}\left(\tau _u,\boldsymbol{a}\right) \big]\boldsymbol{U} + \boldsymbol{Q}_{p}\left(\tau _u\right) \boldsymbol{P} = \boldsymbol{Q}_{f}\left(\tau _u\right) - \boldsymbol{Q}_{\Pi }\left(\tau _u\right) </math> | | style="text-align: center;" | <math>\boldsymbol{Q}_{m}\left(\tau _u\right) \boldsymbol{\dot{U}} + \big[ \boldsymbol{D} + \boldsymbol{Q}_{u}\left(\tau _u,\boldsymbol{a}\right) \big]\boldsymbol{U} + \boldsymbol{Q}_{p}\left(\tau _u\right) \boldsymbol{P} = \boldsymbol{Q}_{f}\left(\tau _u\right) - \boldsymbol{Q}_{\Pi }\left(\tau _u\right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.112) |
|} | |} | ||
Line 1,690: | Line 1,511: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{S}_{\Pi }\left(\tau _u,\boldsymbol{a}\right)^e_{a} = \int _{\Omega _e} \left(\rho \boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} \right)^T \cdot \tau _u \, \boldsymbol{\xi }_h \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.113) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{Q}_{\Pi }\left(\tau _u\right)^e_{a} = \int _{\Omega _e} \left(\nabla N_{a} \right)^T \cdot \tau _u \, \boldsymbol{\xi }_h \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.114) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{H}_{\Pi }\left(\tau _p\right)^e_{a} = \int _{\Omega _e} \left(\nabla \cdot \boldsymbol{N}_{a} \right)^T \tau _p \, \boldsymbol{\delta }_h \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.115) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | The calculation of the projections involves the solution of an additional problem, given by Eqs. [[#eq- | + | The calculation of the projections involves the solution of an additional problem, given by Eqs. [[#eq-2.59|2.59]] and [[#eq-2.60|2.60]], which can be expressed in discrete form as |
− | <span id="eq- | + | <span id="eq-2.116"></span> |
− | <span id="eq- | + | <span id="eq-2.117"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{M}_{\xi } \boldsymbol{\Xi }= \boldsymbol{R}_\xi </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.116) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{M}_{\delta } \boldsymbol{\Delta }= \boldsymbol{R}_\delta </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.117) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 1,727: | Line 1,543: | ||
where <math display="inline">\boldsymbol{\Xi }</math> and <math display="inline">\boldsymbol{\Delta }</math> represent the vectors of nodal values of <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> respectively and the remaining matrices and vectors are given by | where <math display="inline">\boldsymbol{\Xi }</math> and <math display="inline">\boldsymbol{\Delta }</math> represent the vectors of nodal values of <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\delta _h</math> respectively and the remaining matrices and vectors are given by | ||
− | <span id="eq- | + | <span id="eq-2.118"></span> |
− | <span id="eq- | + | <span id="eq-2.119"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{M}_{\xi \,ab}^e = \int _{\Omega _e} \boldsymbol{N}_{a}^T \, \boldsymbol{N}_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.118) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{M}_{\delta \,ab}^e = \int _{\Omega _e} N_{a} \, N_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.119) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{R}_{\xi \,a}^e = \int _{\Omega _e} \boldsymbol{N}_{a}^T \cdot {\boldsymbol{R}^m\left(u_h, p_h\right)}\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.120) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{R}_{\delta \,ab}^e = \int _{\Omega _e} N_{a} \, {R^c \left(u_h\right)}\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.121) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | Eqs. [[#eq- | + | Eqs. [[#eq-2.116|2.116]] and [[#eq-2.117|2.117]] represent an additional problem, coupled to Eqs [[#eq-2.111|2.111]] and [[#eq-2.112|2.112]], which effectively doubles the number of nodal unknowns in the problem. However, since the system matrices for the projection problem, defined by Eqs. [[#eq-2.118|2.118]] and [[#eq-2.119|2.119]], are effectively mass matrices, they can be replaced by the corresponding diagonal mass matrix, which allows us to obtain an approximate projection while avoiding the solution of an additional system. |
− | Note that the matrices <math display="inline"> \boldsymbol{S}_{m}\left(\tau _u,\boldsymbol{a}\right)</math> and <math display="inline"> \boldsymbol{Q}_{m}\left(\tau _u\right)</math> that appear in Eqs. [[#eq- | + | Note that the matrices <math display="inline"> \boldsymbol{S}_{m}\left(\tau _u,\boldsymbol{a}\right)</math> and <math display="inline"> \boldsymbol{Q}_{m}\left(\tau _u\right)</math> that appear in Eqs. [[#eq-2.111|2.111]] and [[#eq-2.112|2.112]] are not strictly necessary in OSS based formulations, since they involve the acceleration term that appears in the residual <math display="inline">{\boldsymbol{R}^m\left(u_h, p_h\right)}</math>. As noted in <span id='citeF-39'></span>[[#cite-39|[39]]], the acceleration of the large scale lies in the large scale space <math display="inline">V_h</math> and therefore its projection should be itself. As a result, we could neglect both these terms if we also not take into account <math display="inline">\partial _t u_h</math> when evaluating the residual that appears in the projection right hand side vector <math display="inline">\boldsymbol{R}_{\xi }</math>. However, as the projection is only calculated approximately using a diagonal mass matrix, we have found it convenient to take these terms into account to improve stability. |
===2.5.3 Dynamic ASGS formulation=== | ===2.5.3 Dynamic ASGS formulation=== | ||
− | When we use a dynamic approximation for the subscales we have keep track and update the small scale values at each integration point of the mesh. The dynamic small scale velocities are defined by the local problem given by Eq. [[#eq- | + | When we use a dynamic approximation for the subscales we have keep track and update the small scale values at each integration point of the mesh. The dynamic small scale velocities are defined by the local problem given by Eq. [[#eq-2.47|2.47]], which was discretized in time using a Backward Euler time scheme to produce Eq. [[#eq-2.53|2.53]]. Eq. [[#eq-2.53|2.53]] provides an expression for <math display="inline">u_s^{n+1}</math> in terms of the residual and the old subscale value <math display="inline">u_s^n</math>. The same Backward Euler scheme can also be used to obtain the following time-discrete expression for the small scale acceleration <math display="inline">\partial _t u_s</math> that appears in the variational form of the problem: |
− | <span id="eq- | + | <span id="eq-2.122"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\partial _t u_s\approx \frac{u_s^{n+1} - u_s^{n}}{\delta t} = \frac{\tau _t}{\delta t} \left({\boldsymbol{R}^m\left(u_h, p_h\right)}\big|_{n+1} - \boldsymbol{\xi }_h \right) + \rho \frac{\tau _t}{\delta t^2} u_s^n - \frac{1}{\delta t} u_s^n </math> | | style="text-align: center;" | <math>\partial _t u_s\approx \frac{u_s^{n+1} - u_s^{n}}{\delta t} = \frac{\tau _t}{\delta t} \left({\boldsymbol{R}^m\left(u_h, p_h\right)}\big|_{n+1} - \boldsymbol{\xi }_h \right) + \rho \frac{\tau _t}{\delta t^2} u_s^n - \frac{1}{\delta t} u_s^n </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.122) |
|} | |} | ||
− | Introducing Eq. [[#eq- | + | Introducing Eq. [[#eq-2.122|2.122]] in Eqs. [[#eq-2.56|2.56]], we obtain a modified momentum equation with time-discrete small scales, given by |
− | <span id="eq- | + | <span id="eq-2.123"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math>\int _\Omega \boldsymbol{w}_h\cdot \rho \left(\partial _t u_h + \frac{1}{2} \, \boldsymbol{a} \cdot \nabla u_h \right)\, \hbox{d}\Omega - \int _\Omega \nabla \boldsymbol{w}_h: \rho \frac{1}{2} \left(\boldsymbol{a} \otimes u_h\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> - \int _\Omega \nabla \cdot \boldsymbol{w}_h\, p_h\, \hbox{d}\Omega + \int _\Omega \nabla ^s \boldsymbol{w}_h: \, 2 \mu \left(\nabla ^s u_h- \frac{1}{3} \left(\nabla \cdot u_h\right)\boldsymbol{I} \right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> + \int _{{\Sigma \, \Omega ^e}} \rho \boldsymbol{w}_h\cdot \left(\frac{\tau _t}{\delta t} \left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h \right)+ \rho \frac{\tau _t}{\delta t^2} u_s^n \right)\, \hbox{d}\Omega - \int _{\Omega } \nabla \cdot \boldsymbol{w}_h\tau _p \left({R^c \left(u_h\right)}- \delta _h \right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> - \int _{{\Sigma \, \Omega ^e}} \rho \left(\boldsymbol{a} \cdot \nabla \boldsymbol{w}_h\right)\tau _t \left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h + \frac{\rho }{\delta t}u_s^n \right)\, \hbox{d}\Omega = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> \int _\Omega \boldsymbol{w}_h\boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}_h\left(\boldsymbol{t} - \rho \frac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)u_h\right)\, \hbox{d}\Gamma + \int _{{\Sigma \, \Omega ^e}} \rho \boldsymbol{w}_h\frac{1}{\delta t} u_s^n \, \hbox{d}\Omega </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.123) |
|} | |} | ||
− | where the first term in the third row and the last term on the right hand side appear from the time discretization of the small scale acceleration. Note that all terms without an <math display="inline">n</math> index are evaluated at the current time step. Although they play no role in ASGS stabilization, we have included the projections <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\boldsymbol{\delta }_h</math> both in Eq. [[#eq- | + | where the first term in the third row and the last term on the right hand side appear from the time discretization of the small scale acceleration. Note that all terms without an <math display="inline">n</math> index are evaluated at the current time step. Although they play no role in ASGS stabilization, we have included the projections <math display="inline">\boldsymbol{\xi }_h</math> and <math display="inline">\boldsymbol{\delta }_h</math> both in Eq. [[#eq-2.122|2.122]] and in Eq. [[#eq-2.123|2.123]], since the same expressions will be used as a starting point for the dynamic OSS method. |
The matrix form of the D-ASGS formulation can be written as | The matrix form of the D-ASGS formulation can be written as | ||
− | <span id="eq- | + | <span id="eq-2.124"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math>\big[ \boldsymbol{M} + \boldsymbol{\hat{S}}_{m}\left(\tau _t,u_h+u_s\right) \big]\boldsymbol{\dot{U}} + \big[ \boldsymbol{C}\left(+\right) \boldsymbol{K} + \boldsymbol{\hat{S}}_{u}\left(\tau _t,u_h+u_s\right) + \boldsymbol{H}_{u}\left(\tau _p\right) \big]\boldsymbol{U} </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> {}+ \big[ \boldsymbol{G} + \boldsymbol{\hat{S}}_{p}\left(\tau _t,u_h+u_s\right) \big]\boldsymbol{P} = {} \boldsymbol{F} + \boldsymbol{T} + \boldsymbol{\hat{S}}_{f}\left(\tau _t,u_h+u_s\right) + \boldsymbol{S}_{d}\left(\tau _t,u_s^n\right) - \boldsymbol{\hat{S}}_{d}\left(\tau _t\right){u_s^n} </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.124) |
|} | |} | ||
− | <span id="eq- | + | <span id="eq-2.125"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{Q}_{m}\left(\tau _t\right) \boldsymbol{\dot{U}} + \big[ \boldsymbol{D} + \boldsymbol{Q}_{u}\left(\tau _t,u_h+u_s\right) + \boldsymbol{Q}_{d}\left(\tau _t,u_s^n\right) \big]\boldsymbol{U} + \boldsymbol{Q}_{p}\left(\tau _t\right) \boldsymbol{P} = \boldsymbol{Q}_{f}\left(\tau _t\right) </math> | | style="text-align: center;" | <math>\boldsymbol{Q}_{m}\left(\tau _t\right) \boldsymbol{\dot{U}} + \big[ \boldsymbol{D} + \boldsymbol{Q}_{u}\left(\tau _t,u_h+u_s\right) + \boldsymbol{Q}_{d}\left(\tau _t,u_s^n\right) \big]\boldsymbol{U} + \boldsymbol{Q}_{p}\left(\tau _t\right) \boldsymbol{P} = \boldsymbol{Q}_{f}\left(\tau _t\right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.125) |
|} | |} | ||
where we have introduced three new terms on the right hand side involving the old subscale velocity, defined as | where we have introduced three new terms on the right hand side involving the old subscale velocity, defined as | ||
− | <span id="eq- | + | <span id="eq-2.127"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{S}_{d}\left(\tau _t,u_s^n\right)^e_{a} = \int _{\Omega _e} \left(\rho \, \boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} \right)^T \cdot \rho \frac{\tau _t}{\delta t} \, u_s^n \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.126) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{\hat{S}}_{d}\left(\tau _t\right){u_s^n}^e_{a} = \int _{\Omega _e} \rho \, \left(\boldsymbol{N}_{a} \right)^T \cdot \rho \frac{\tau _t}{\delta t^2} \, u_s^n \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.127) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{Q}_{d}\left(\tau _t,u_s^n\right)^e_{a} = \int _{\Omega _e} \left(\nabla \boldsymbol{N}_{a} \right)^T \cdot \rho \frac{\tau _t}{\delta t} \, u_s^n \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.128) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | The terms that arise from the residual in the expression for the small scale acceleration, Eq. [[#eq- | + | The terms that arise from the residual in the expression for the small scale acceleration, Eq. [[#eq-2.122|2.122]], have been grouped with the corresponding terms in the small scale velocity model, resulting in the following modified stabilization matrices: |
− | <span id="eq- | + | <span id="eq-2.129"></span> |
− | <span id="eq- | + | <span id="eq-2.132"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{\hat{S}}_{m}\left(\tau _t,\boldsymbol{a}\right)^e_{ab} = \int _{\Omega _e} \rho \, \left(\boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} - \frac{1}{\delta t} \boldsymbol{N}_{a} \right)^T \tau _t \, \boldsymbol{N}_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.129) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{\hat{S}}_{u}\left(\tau _t,\boldsymbol{a}\right)^e_{ab} = \int _{\Omega _e} \rho \, \left(\boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} - \frac{1}{\delta t} \boldsymbol{N}_{a} \right)^T \tau _t \, \rho \, \boldsymbol{a} \cdot \nabla \boldsymbol{N}_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.130) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{\hat{S}}_{p}\left(\tau _t,\boldsymbol{a}\right)^e_{ab} = \int _{\Omega _e} \rho \, \left(\boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} - \frac{1}{\delta t} \boldsymbol{N}_{a} \right)^T \tau _t \, \nabla N_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.131) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{\hat{S}}_{f}\left(\tau _t,\boldsymbol{a}\right) ^e_{ab} = \int _{\Omega _e} \rho \, \left(\boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} - \frac{1}{\delta t} \boldsymbol{N}_{a} \right)^T \tau _t \, \boldsymbol{f} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.132) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 1,882: | Line 1,680: | ||
Finally, we consider the discrete form of the dynamic OSS formulation. Here, contrary to what happened for the D-ASGS formulation, the integral involving <math display="inline">\boldsymbol{w}_h</math> and <math display="inline">\partial _t u_s</math> can be eliminated ''a priori'', since it corresponds to the <math display="inline">L^2</math> inner product of two terms that belong to orthogonal subspaces. This results in the following matrix formulation: | Finally, we consider the discrete form of the dynamic OSS formulation. Here, contrary to what happened for the D-ASGS formulation, the integral involving <math display="inline">\boldsymbol{w}_h</math> and <math display="inline">\partial _t u_s</math> can be eliminated ''a priori'', since it corresponds to the <math display="inline">L^2</math> inner product of two terms that belong to orthogonal subspaces. This results in the following matrix formulation: | ||
− | <span id="eq- | + | <span id="eq-2.133"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\big[ | + | | style="text-align: center;" | <math>\big[ \boldsymbol{M} + \boldsymbol{S}_{m}\left(\tau _t,u_h+u_s\right) \big]\boldsymbol{\dot{U}} + \big[ \boldsymbol{C}\left(+\right) \boldsymbol{K} + \boldsymbol{S}_{u}\left(\tau _t,u_h+u_s\right) + \boldsymbol{H}_{u}\left(\tau _p\right) \big]\boldsymbol{U} </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> + \big[ \boldsymbol{G} + \boldsymbol{S}_{p}\left(\tau _t,u_h+u_s\right) \big]\boldsymbol{P} = {} </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> \boldsymbol{F} + \boldsymbol{T} + \boldsymbol{S}_{f}\left(\tau _t,u_h+u_s\right) + \boldsymbol{S}_{d}\left(\tau _t,u_s^n\right) - \boldsymbol{S}_{\Pi }\left(\tau _t,u_h+u_s\right) - \boldsymbol{H}_{\Pi }\left(\tau _p\right) </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.133) |
|} | |} | ||
− | <span id="eq- | + | <span id="eq-2.134"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\boldsymbol{Q}_{m}\left(\tau _t\right) \boldsymbol{\dot{U}} + \big[ \boldsymbol{D} + \boldsymbol{Q}_{u}\left(\tau _t,u_h+u_s\right) \big]\boldsymbol{U} + </math> | + | | style="text-align: center;" | <math>\boldsymbol{Q}_{m}\left(\tau _t\right) \boldsymbol{\dot{U}} + \big[ \boldsymbol{D} + \boldsymbol{Q}_{u}\left(\tau _t,u_h+u_s\right) \big]\boldsymbol{U} + </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{Q}_{p}\left(\tau _t\right) \boldsymbol{P} = {} | + | | style="text-align: center;" | <math> \boldsymbol{Q}_{p}\left(\tau _t\right) \boldsymbol{P} = {} \boldsymbol{Q}_{f}\left(\tau _t\right) + \boldsymbol{Q}_{d}\left(\tau _t,u_s^n\right) - \boldsymbol{Q}_{\Pi }\left(\tau _t\right) </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.134) |
|} | |} | ||
where all involved elemental matrices have already been defined in the previous sections. | where all involved elemental matrices have already been defined in the previous sections. | ||
− | Note that, as presented for the Q-OSS method, the projections can be solved using a diagonal mass matrix to avoid the solution of an additional system. In this case, there is also the possibility of re-introducing in Eq. [[#eq- | + | Note that, as presented for the Q-OSS method, the projections can be solved using a diagonal mass matrix to avoid the solution of an additional system. In this case, there is also the possibility of re-introducing in Eq. [[#eq-2.133|2.133]] and [[#eq-2.134|2.134]] all terms neglected using an orthogonality argument. To do so, we can replace <math display="inline"> \boldsymbol{S}_{m}\left(\tau _t,u_h+u_s\right)</math>, <math display="inline"> \boldsymbol{S}_{u}\left(\tau _t,u_h+u_s\right)</math>, <math display="inline"> \boldsymbol{S}_{p}\left(\tau _t,u_h+u_s\right)</math> and <math display="inline"> \boldsymbol{S}_{d}\left(\tau _t,u_s^n\right)</math> by their D-ASGS variants, given by Eqs. [[#eq-2.129|2.129]]–[[#eq-2.132|2.132]], and subtracting <math display="inline"> \boldsymbol{\hat{S}}_{d}\left(\tau _t\right){u_s^n}</math>, given by Eq. [[#eq-2.127|2.127]], from the right hand side of Eq. [[#eq-2.133|2.133]]. |
===2.5.5 Time integration=== | ===2.5.5 Time integration=== | ||
Line 1,923: | Line 1,716: | ||
Regardless of the VMS variant used, once the problem has been discretized in space we obtain an equivalent matrix problem written in terms of the vectors of nodal velocities <math display="inline">\boldsymbol{U}</math>, pressures <math display="inline">\boldsymbol{P}</math> and accelerations <math display="inline">\boldsymbol{\dot{U}}</math> that can be expressed in general form as | Regardless of the VMS variant used, once the problem has been discretized in space we obtain an equivalent matrix problem written in terms of the vectors of nodal velocities <math display="inline">\boldsymbol{U}</math>, pressures <math display="inline">\boldsymbol{P}</math> and accelerations <math display="inline">\boldsymbol{\dot{U}}</math> that can be expressed in general form as | ||
− | <span id="eq- | + | <span id="eq-2.135"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}} \\ \boldsymbol{0} \end{bmatrix} + \boldsymbol{\tilde{C}} \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} = \boldsymbol{\tilde{F}} </math> | | style="text-align: center;" | <math>\boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}} \\ \boldsymbol{0} \end{bmatrix} + \boldsymbol{\tilde{C}} \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} = \boldsymbol{\tilde{F}} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.135) |
|} | |} | ||
− | We need to introduce a time discretization to write the accelerations in terms the velocities. For this we use the Bossak time integration method (see <span id='citeF- | + | We need to introduce a time discretization to write the accelerations in terms the velocities. For this we use the Bossak time integration method (see <span id='citeF-48'></span>[[#cite-48|[48]]]), which can be described as a member of the generalized-<math display="inline">\alpha </math> Newmark family of methods with second order accuracy in time. The basic expression of the Newmark method, which is commonly used in solid mechanics problem and written in terms of displacements <math display="inline">d</math>, velocities <math display="inline">u</math> and accelerations <math display="inline">\dot{u}</math>, is |
− | <span id="eq- | + | <span id="eq-2.136"></span> |
− | <span id="eq- | + | <span id="eq-2.137"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>d^{n+1} = d^n + \Delta t \, u^n + \frac{\Delta t^2}{2} \left[\left(1-2\beta _N\right)\dot{u}^n + 2 \beta _N \right] </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.136) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> u^{n+1} = u^n + \Delta t \left[\left(1-\gamma _N \right)\dot{u}^n + \gamma _N \dot{u}^{n+1} \right] </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.137) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | where <math display="inline">\beta _N</math> and <math display="inline">\gamma _N</math> are constant parameters. In fluid dynamics it is convenient to rewrite Eq. [[#eq- | + | where <math display="inline">\beta _N</math> and <math display="inline">\gamma _N</math> are constant parameters. In fluid dynamics it is convenient to rewrite Eq. [[#eq-2.136|2.136]] and [[#eq-2.137|2.137]] in terms of velocities, as these are the main variables of the problem, resulting in |
− | <span id="eq- | + | <span id="eq-2.138"></span> |
− | <span id="eq- | + | <span id="eq-2.139"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\dot{u}_{n+1} = \frac{1}{\gamma _N \Delta t} \left(u^{n+1} - u^{n} \right)- \left(\frac{1}{\gamma _N} - 1 \right)\dot{u}^{n} </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.138) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> d^{n+1} = d^n + \Delta t \left(1- \frac{\beta _N}{\gamma _N} \right)u^{n} + \Delta t^2 \frac{\gamma _N - 2\beta _N}{2\gamma _N} \dot{u}^{n} + \frac{\beta _N \Delta t}{\gamma _N} u^{n+1} </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.139) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | Note that for the velocity based formulation, the displacements only appear in the equation for the new displacements, Eq. [[#eq- | + | Note that for the velocity based formulation, the displacements only appear in the equation for the new displacements, Eq. [[#eq-2.139|2.139]]. As a result, both the displacements and the equation to obtain them can be omitted from the problem if we are not interested in their values. |
The Bossak method is a generalization of the Newmark method based on introducing a relaxation factor on the acceleration of the system | The Bossak method is a generalization of the Newmark method based on introducing a relaxation factor on the acceleration of the system | ||
− | <span id="eq- | + | <span id="eq-2.140"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\left(1-\alpha _B\right)\boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}}^{n+1} \\ \boldsymbol{0} \end{bmatrix} + \alpha _B \boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}}^{n} \\ \boldsymbol{0} \end{bmatrix} + \boldsymbol{\tilde{C}} \begin{bmatrix}\boldsymbol{U}^{n+1} \\ \boldsymbol{P}^{n+1} \end{bmatrix} = \boldsymbol{\tilde{F}} </math> | | style="text-align: center;" | <math>\left(1-\alpha _B\right)\boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}}^{n+1} \\ \boldsymbol{0} \end{bmatrix} + \alpha _B \boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}}^{n} \\ \boldsymbol{0} \end{bmatrix} + \boldsymbol{\tilde{C}} \begin{bmatrix}\boldsymbol{U}^{n+1} \\ \boldsymbol{P}^{n+1} \end{bmatrix} = \boldsymbol{\tilde{F}} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.140) |
|} | |} | ||
− | In the Bossak scheme, Eq. [[#eq- | + | In the Bossak scheme, Eq. [[#eq-2.138|2.138]] is used to discretize in time Eq. [[#eq-2.140|2.140]], obtaining a system that depends exclusively on velocities, pressures and their spatial gradients. After rearranging some terms, this yields the following time-discrete problem |
− | <span id="eq- | + | <span id="eq-2.141"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\left(\frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} \right) \begin{bmatrix}\boldsymbol{U}^{n+1} \\ \boldsymbol{P}^{n+1} \end{bmatrix} =</math> | + | | style="text-align: center;" | <math>\left(\frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} \right) \begin{bmatrix}\boldsymbol{U}^{n+1} \\ \boldsymbol{P}^{n+1} \end{bmatrix} = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{\tilde{F}} - \frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} | + | | style="text-align: center;" | <math> \boldsymbol{\tilde{F}} - \frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{U}^{n} \\ \boldsymbol{0} \end{bmatrix} + \left\lbrace \left(1-\alpha _B \right)\left(\frac{1}{\gamma _N} - 1 \right)+ \alpha _B \right\rbrace \boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}}^{n} \\ \boldsymbol{0} \end{bmatrix} </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.141) |
|} | |} | ||
Line 2,009: | Line 1,796: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\gamma _N = \frac{1}{2} - \alpha _B \qquad \beta _N = \frac{\left(1-\alpha _B\right)^2}{4} </math> | | style="text-align: center;" | <math>\gamma _N = \frac{1}{2} - \alpha _B \qquad \beta _N = \frac{\left(1-\alpha _B\right)^2}{4} </math> | ||
Line 2,017: | Line 1,804: | ||
===2.5.6 Linearization of the large scale problem=== | ===2.5.6 Linearization of the large scale problem=== | ||
− | The system described in Eq. [[#eq- | + | The system described in Eq. [[#eq-2.141|2.141]] is non-linear due to the fact that the convective operator, the stabilization parameters, multiple stabilization matrices and the projections all depend on the current value of velocity. We define the residual of the problem at time step <math display="inline">n+1</math> after <math display="inline">i</math> non-linear iterations as |
− | <span id="eq- | + | <span id="eq-2.142"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i},\boldsymbol{P}^{n+1,\,i} \right)= \boldsymbol{\tilde{F}} - \frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} | + | | style="text-align: center;" | <math>\boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i},\boldsymbol{P}^{n+1,\,i} \right)= \boldsymbol{\tilde{F}} - \frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{U}^{n} \\ \boldsymbol{0} \end{bmatrix} + </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \left\lbrace \left(1-\alpha _B \right)\left(\frac{1}{\gamma _N} - 1 \right)+ \alpha _B \right\rbrace \boldsymbol{\tilde{M}} | + | | style="text-align: center;" | <math> \left\lbrace \left(1-\alpha _B \right)\left(\frac{1}{\gamma _N} - 1 \right)+ \alpha _B \right\rbrace \boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}}^{n} \\ \boldsymbol{0} \end{bmatrix} - \left(\frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} \right) \begin{bmatrix}\boldsymbol{U}^{n+1,\,i} \\ \boldsymbol{P}^{n+1,\,i} \end{bmatrix} </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.142) |
|} | |} | ||
− | The problem now consists in finding <math display="inline">\boldsymbol{U}^{n+1,\,i+1}</math>, <math display="inline">\boldsymbol{P}^{n+1,\,i+1}</math> such that <math display="inline">\boldsymbol{R}^{n+1,\,i+1} = \boldsymbol{0}</math>. Denoting the increment between two successive iterations with <math display="inline">\boldsymbol{\delta U}^i = \boldsymbol{U}^{n+1,\,i+1} - \boldsymbol{U}^{n+1,\,i}</math>, we use a first order Taylor decomposition to write the zero of Eq. [[#eq- | + | The problem now consists in finding <math display="inline">\boldsymbol{U}^{n+1,\,i+1}</math>, <math display="inline">\boldsymbol{P}^{n+1,\,i+1}</math> such that <math display="inline">\boldsymbol{R}^{n+1,\,i+1} = \boldsymbol{0}</math>. Denoting the increment between two successive iterations with <math display="inline">\boldsymbol{\delta U}^i = \boldsymbol{U}^{n+1,\,i+1} - \boldsymbol{U}^{n+1,\,i}</math>, we use a first order Taylor decomposition to write the zero of Eq. [[#eq-2.142|2.142]] as |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i+1},\boldsymbol{P}^{n+1,\,i+1} \right)= \boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i},\boldsymbol{P}^{n+1,\,i} \right)+ \dfrac{\partial \boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i+1},\boldsymbol{P}^{n+1,\,i+1} \right)}{\partial \left(\boldsymbol{\delta U}^i,\boldsymbol{\delta P}^i\right)} \begin{bmatrix}\boldsymbol{\delta U}^i \\ \boldsymbol{\delta P}^i \end{bmatrix} = 0 </math> | | style="text-align: center;" | <math>\boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i+1},\boldsymbol{P}^{n+1,\,i+1} \right)= \boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i},\boldsymbol{P}^{n+1,\,i} \right)+ \dfrac{\partial \boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i+1},\boldsymbol{P}^{n+1,\,i+1} \right)}{\partial \left(\boldsymbol{\delta U}^i,\boldsymbol{\delta P}^i\right)} \begin{bmatrix}\boldsymbol{\delta U}^i \\ \boldsymbol{\delta P}^i \end{bmatrix} = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.143) |
|} | |} | ||
Line 2,051: | Line 1,836: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\left. \dfrac{\partial \boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i+1},\boldsymbol{P}^{n+1,\,i+1}\right)}{\partial \left(\boldsymbol{\delta U^i},\boldsymbol{\delta P^i}\right)} \right|_i \approx \frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} </math> | + | | style="text-align: center;" | <math>\left.\dfrac{\partial \boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i+1},\boldsymbol{P}^{n+1,\,i+1}\right)}{\partial \left(\boldsymbol{\delta U^i},\boldsymbol{\delta P^i}\right)} \right|_i \approx \frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.144) |
|} | |} | ||
which means that the linear system of equations that is assembled and solved at each iteration is | which means that the linear system of equations that is assembled and solved at each iteration is | ||
− | <span id="eq- | + | <span id="eq-2.145"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>- \left(\frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} \right) \begin{bmatrix}\boldsymbol{\delta U}^i \\ \boldsymbol{\delta P}^i \end{bmatrix} = \boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i},\boldsymbol{P}^{n+1,\,i} \right) </math> | | style="text-align: center;" | <math>- \left(\frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} \right) \begin{bmatrix}\boldsymbol{\delta U}^i \\ \boldsymbol{\delta P}^i \end{bmatrix} = \boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i},\boldsymbol{P}^{n+1,\,i} \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.145) |
|} | |} | ||
− | The problem given by Eq. [[#eq- | + | The problem given by Eq. [[#eq-2.145|2.145]] is solved iteratively until the increments of the system variables <math display="inline">\boldsymbol{\delta U}^i</math> and <math display="inline">\boldsymbol{\delta P}^i</math> or the residual vector <math display="inline">\boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i},\boldsymbol{P}^{n+1,\,i} \right)</math> are smaller than a predefined tolerance. |
===2.5.7 Tracking of dynamic subscales=== | ===2.5.7 Tracking of dynamic subscales=== | ||
− | The dynamic small scale problem was discretized in time as Eq. [[#eq- | + | The dynamic small scale problem was discretized in time as Eq. [[#eq-2.54|2.54]]. Using the full velocity, which is divergence-free, as the convective velocity, and neglecting the viscous stress term, since we are restricting ourselves to linear finite elements, we expand the residual <math display="inline">{\boldsymbol{R}^m\left(u_h, p_h\right)}</math> that appears in Eq. [[#eq-2.54|2.54]] to obtain the following expression for the small scale velocity: |
− | <span id="eq- | + | <span id="eq-2.146"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\frac{1}{\tau _t} u_s^{n+1} = \boldsymbol{f} - \rho \left(\partial _t u_h^{n+1} - \left(u_h^{n+1} + u_s^{n+1} \right)\cdot \nabla u_h^{n+1}\right)- \nabla p_h^{n+1} - \boldsymbol{\xi }_h^{n+1} + \frac{\rho }{\partial t} u_s^n </math> | | style="text-align: center;" | <math>\frac{1}{\tau _t} u_s^{n+1} = \boldsymbol{f} - \rho \left(\partial _t u_h^{n+1} - \left(u_h^{n+1} + u_s^{n+1} \right)\cdot \nabla u_h^{n+1}\right)- \nabla p_h^{n+1} - \boldsymbol{\xi }_h^{n+1} + \frac{\rho }{\partial t} u_s^n </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.146) |
|} | |} | ||
− | Eq. [[#eq- | + | Eq. [[#eq-2.146|2.146]] is non-linear, since <math display="inline">\tau _t</math> and <math display="inline">\boldsymbol{\xi }_h</math> both depend on <math display="inline">u_s^{n+1}</math> when using <math display="inline">\boldsymbol{a} = u_h+ u_s</math>. Moreover, it is coupled to the large scale problem through its dependence to <math display="inline">u_h^{n+1}</math> and <math display="inline">p_h^{n+1}</math>. Similarly, under these assumptions, all terms that depend on <math display="inline">\tau _t</math> or the convection velocity in the large scale problem require a value for <math display="inline">u_s^{n+1}</math> to be computed. |
− | To update the value of the small scale velocity we follow the procedure presented in <span id='citeF- | + | To update the value of the small scale velocity we follow the procedure presented in <span id='citeF-49'></span><span id='citeF-31'></span>[[#cite-49|[49,31]]]. Given known values of the large scale variables, <math display="inline">u_h^{n+1}</math> and <math display="inline">p_h^{n+1}</math>, we define a target function |
− | <span id="eq- | + | <span id="eq-2.147"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\boldsymbol{g}\left(u_s^{n+1,\,k} \right)= | + | | style="text-align: center;" | <math>\boldsymbol{g}\left(u_s^{n+1,\,k} \right)= \boldsymbol{f} - \rho \left(\partial _t u_h^{n+1} - u_h^{n+1} \cdot \nabla u_h^{n+1}\right)- \nabla p_h^{n+1} </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> {}- \boldsymbol{\xi }_h^{n+1} + \frac{\rho }{\partial t} u_s^n - \frac{1}{\tau _t^{k}} u_s^{n+1,\,k} - \rho \, u_s^{n+1,\,k} \cdot \nabla u_h^{n+1} </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.147) |
|} | |} | ||
− | where we use <math display="inline">\tau _t^k</math> to denote <math display="inline">\tau _t</math> computed using <math display="inline">\boldsymbol{a} = u_h^{n+1} + u_s^{n+1,\,k}</math> in Eq. [[#eq- | + | where we use <math display="inline">\tau _t^k</math> to denote <math display="inline">\tau _t</math> computed using <math display="inline">\boldsymbol{a} = u_h^{n+1} + u_s^{n+1,\,k}</math> in Eq. [[#eq-2.52|2.52]]. We use Newton-Raphson iterations to find a zero of <math display="inline">\boldsymbol{g}\left(u_s^{n+1} \right)</math>, resulting in |
− | <span id="eq- | + | <span id="eq-2.148"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>-\frac{\partial \boldsymbol{g}\left(u_s^{n+1,\,k} \right)}{\partial u_s^{n+1,\,k}} \left(u_s^{n+1,\,k+1} - u_s^{n+1,\,k} \right)= \boldsymbol{g}\left(u_s^{n+1,\,k} \right) </math> | | style="text-align: center;" | <math>-\frac{\partial \boldsymbol{g}\left(u_s^{n+1,\,k} \right)}{\partial u_s^{n+1,\,k}} \left(u_s^{n+1,\,k+1} - u_s^{n+1,\,k} \right)= \boldsymbol{g}\left(u_s^{n+1,\,k} \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.148) |
|} | |} | ||
− | The tangent matrix in Eq. [[#eq- | + | The tangent matrix in Eq. [[#eq-2.148|2.148]] is computed neglecting the dependence of <math display="inline">\tau _t</math> on <math display="inline">u_s^{n+1,\,k}</math>, resulting in: |
− | <span id="eq- | + | <span id="eq-2.149"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>-\frac{\partial \boldsymbol{g}\left(u_s^{n+1,\,k} \right)}{\partial u_s^{n+1,\,k}} \approx \frac{1}{\tau _t} \, \boldsymbol{I} + \left(\nabla u_h^{n+1} \right)^T </math> | | style="text-align: center;" | <math>-\frac{\partial \boldsymbol{g}\left(u_s^{n+1,\,k} \right)}{\partial u_s^{n+1,\,k}} \approx \frac{1}{\tau _t} \, \boldsymbol{I} + \left(\nabla u_h^{n+1} \right)^T </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.149) |
|} | |} | ||
− | With this we can obtain new values for <math display="inline">u_s^{n+1}</math> by iteratively solving Eq. [[#eq- | + | With this we can obtain new values for <math display="inline">u_s^{n+1}</math> by iteratively solving Eq. [[#eq-2.148|2.148]] on each integration point. These can be used to evaluate the values of the convective velocity and <math display="inline">\tau _t</math> in the next iteration of the large scale problem. Similarly, once the large scale problem is converged and we advance to the next time step, Eq. [[#eq-2.148|2.148]] is solved once more to obtain the historical values for the small scale. |
− | Note that, for OSS formulations, <math display="inline">\boldsymbol{\xi }_h^{n+1}</math> also depends on the value of <math display="inline">u_s^{n+1,\,k}</math>, as it represents the <math display="inline">L^2</math> projection of <math display="inline">{\boldsymbol{R}^m\left(u_h, p_h\right)}</math>. However, this dependence is ignored in the procedure outlined in this section. Taking it into account would imply solving the (global) projection problem, given by Eqs. [[#eq- | + | Note that, for OSS formulations, <math display="inline">\boldsymbol{\xi }_h^{n+1}</math> also depends on the value of <math display="inline">u_s^{n+1,\,k}</math>, as it represents the <math display="inline">L^2</math> projection of <math display="inline">{\boldsymbol{R}^m\left(u_h, p_h\right)}</math>. However, this dependence is ignored in the procedure outlined in this section. Taking it into account would imply solving the (global) projection problem, given by Eqs. [[#eq-2.116|2.116]] and [[#eq-2.117|2.117]], every time a new <math display="inline">u_s^{n+1,\,k}</math> is obtained. |
===2.5.8 Finite element solution algorithm=== | ===2.5.8 Finite element solution algorithm=== | ||
− | As a summary of the formulation described in this section, we present the full solution procedure for the method as Algorithm [[# | + | As a summary of the formulation described in this section, we present the full solution procedure for the method as Algorithm [[#algorithm-1|1]], including the calculation of nodal projections and tracking of dynamic small scales. For variants where they are not necessary, the corresponding step in the algorithm can be skipped. |
− | |||
− | <math>n</math> in <math>\left[0,N\right]</math> Set <math display="inline">n = n+1</math>, <math display="inline">t = t + \Delta t</math> Set <math display="inline">u_h^{n+1,\,} = u_s^n</math>, <math display="inline">p_h^{n+1,\,} = p_s^n</math> <math>\left\Vert \boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i},\boldsymbol{P}^{n+1,\,i}\right) \right\ | + | {| style="margin: 1em auto;border: 1px solid darkgray;" |
+ | |- | ||
+ | | | ||
+ | :'''for''' <math>n</math> in <math>\left[0,N\right]</math> '''do''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : Set <math display="inline">n = n+1</math>, <math display="inline">t = t + \Delta t</math> Set <math display="inline">u_h^{n+1,\,0} = u_s^n</math>, <math display="inline">p_h^{n+1,\,0} = p_s^n</math> '''while''' <math>\left\Vert \boldsymbol{R}\left(\boldsymbol{U}^{n+1,\,i},\boldsymbol{P}^{n+1,\,i}\right) \right\Vert_{ } \leq \hbox{tolerance}</math> '''do''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : Set <math display="inline">i = i+1</math> '''for''' each integration point '''do''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : Given <math display="inline">u_h^{n+1,\,i}</math>, <math display="inline">p_h^{n+1,\,i}</math>, obtain <math display="inline">u_s^{n+1,\,i}</math> by iteratively solving Eq. [[#eq-2.148|2.148]]. Assemble and solve the global system of Eq. [[#eq-2.145|2.145]] for <math display="inline">\boldsymbol{\delta U^i}</math>, <math display="inline">\boldsymbol{\delta P^i}</math>. Update <math display="inline">u_h^{n+1,\,i}</math>, <math display="inline">p_h^{n+1,\,i}</math>. Use Eqs. [[#eq-2.116|2.116]] and [[#eq-2.117|2.117]] to find new projections <math display="inline">\boldsymbol{\xi }_h^{n+1,\,i}</math>, <math display="inline">\delta _h^{n+1,\,i}</math>. Calculate the large scale acceleration <math display="inline">\partial _t u_h^{n+1}</math> according to Eq. [[#eq-2.138|2.138]]. '''for''' each integration point '''do''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : Solve Eq. [[#eq-2.148|2.148]] to obtain historical values for the small scale <math display="inline">u_s^{n+1}</math>. | ||
+ | |||
+ | |||
+ | |- | ||
+ | | style="text-align: center; font-size: 75%;"| | ||
+ | <span id='algorithm-1'></span>'''Algorithm. 1''' VMS incompressible flow solver. | ||
+ | |} | ||
This procedure was implemented within the Kratos Multiphysics finite element framework and used to compute all numerical test cases presented in this chapter. | This procedure was implemented within the Kratos Multiphysics finite element framework and used to compute all numerical test cases presented in this chapter. | ||
Line 2,149: | Line 1,952: | ||
==2.6 A new model for the pressure subscale== | ==2.6 A new model for the pressure subscale== | ||
− | As described in the previous pages, the VMS formulation provides a stabilized method for the simulation of the Navier-Stokes equations that can be understood as a turbulence model, as justified in Section [[#2.4 VMS methods and Large Eddy Simulation|2.4]]. However, its application in numerical simulations shows that the results have a strong dependency on the choice of the stabilization parameters. This is observed both in our own results and in the literature (see for example <span id='citeF- | + | As described in the previous pages, the VMS formulation provides a stabilized method for the simulation of the Navier-Stokes equations that can be understood as a turbulence model, as justified in Section [[#2.4 VMS methods and Large Eddy Simulation|2.4]]. However, its application in numerical simulations shows that the results have a strong dependency on the choice of the stabilization parameters. This is observed both in our own results and in the literature (see for example <span id='citeF-31'></span><span id='citeF-27'></span>[[#cite-31|[31,27]]], which use basically the same formulation we have described), where it can be observed that the obtained mean velocity profile in the turbulent channel flow changes depending on the precise definition of <math display="inline">\tau _u</math> and on whether the pressure small scale is considered or taken to be zero. In particular, the results in <span id='citeF-27'></span>[[#cite-27|[27]]] suggest that the optimal choice is problem-dependent, since some test cases provide a better fit to the reference data when the pressure small scale is kept, while in other cases neglecting it yields better results. |
All this suggests that the current design for the stabilization parameters does not capture the correct behavior for at least some turbulent flow problems. To further investigate this issue, we study an alternate design for the pressure subscale. We start by motivating the design for the stabilization parameters we have been using up to this point and follow by presenting an alternative. | All this suggests that the current design for the stabilization parameters does not capture the correct behavior for at least some turbulent flow problems. To further investigate this issue, we study an alternate design for the pressure subscale. We start by motivating the design for the stabilization parameters we have been using up to this point and follow by presenting an alternative. | ||
Line 2,155: | Line 1,958: | ||
===2.6.1 On the design of the stabilization parameters=== | ===2.6.1 On the design of the stabilization parameters=== | ||
− | Recall that the small scale model is motivated by the small scale problem, given by Eqs. [[#eq- | + | Recall that the small scale model is motivated by the small scale problem, given by Eqs. [[#eq-2.41|2.41]] and [[#eq-2.42|2.42]], repeated here in simplified form as |
− | <span id="eq- | + | <span id="eq-2.150"></span> |
− | <span id="eq- | + | <span id="eq-2.151"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\rho \partial _t u_s + \rho \, \boldsymbol{a} \cdot \nabla u_s - 2\mu \nabla \cdot \nabla ^s u_s+ \nabla p_s= {\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h \; \hbox{ in} \; \Omega ^e\times \left[0,T\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.150) | |
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \nabla \cdot u_s= {R^c \left(u_h\right)}- \delta _h \; \hbox{ in} \; \Omega ^e \times \left[0,T\right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.151) | |
− | + | ||
− | + | ||
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | where we have written the convective term in non-conservative form and neglected the trace of <math display="inline">\nabla ^su_s</math>. The motivation for the stabilization parameters used up to now, <math display="inline">\tau _u</math> (or <math display="inline">\tau _t</math>) and <math display="inline">\tau _p</math>, is given in <span id='citeF- | + | where we have written the convective term in non-conservative form and neglected the trace of <math display="inline">\nabla ^su_s</math>. The motivation for the stabilization parameters used up to now, <math display="inline">\tau _u</math> (or <math display="inline">\tau _t</math>) and <math display="inline">\tau _p</math>, is given in <span id='citeF-30'></span>[[#cite-30|[30]]], where the response of Eqs. [[#eq-2.150|2.150]] and [[#eq-2.151|2.151]] to high wave number excitations (which we are most interested in, since the small scales represent highly fluctuating motions) is analysed. In such circumstances, it is observed that |
− | <span id="eq- | + | <span id="eq-2.152"></span> |
− | <span id="eq- | + | <span id="eq-2.153"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\rho \, \boldsymbol{a} \cdot \nabla u_s - 2\mu \nabla \cdot \nabla ^s u_s\sim u_s\left[\left(c_1 \frac{\mu }{h^2} \right)^2 + \left(c_2 \frac{\rho \left\Vert \boldsymbol{a} \right\Vert_{ }}{h} \right)^2 \right]^{1/2} </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.152) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \left\Vert \nabla p_s \right\Vert_{ } \sim p_s\, \frac{1}{h} \qquad \nabla \cdot u_s\sim \frac{1}{h}\left\Vert u_s \right\Vert_{ } </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.153) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | The design for <math display="inline">\tau _u</math> given in Eq. [[#eq- | + | The design for <math display="inline">\tau _u</math> given in Eq. [[#eq-2.49|2.49]] can be justified by noting that <math display="inline">1/\tau _u</math> has the same limit behavior as the term in Eq. [[#eq-2.152|2.152]] when either the convective or the viscous terms are significantly larger than the other. The justification for <math display="inline">\tau _p</math> is given by introducing Eq. [[#eq-2.152|2.152]] in the static version of Eq. [[#eq-2.150|2.150]] and taking the divergence. Assuming that <math display="inline">{\boldsymbol{R}^m\left(u_h, p_h\right)}</math> and <math display="inline">\boldsymbol{a}</math> are divergence-free, we obtain |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\left[\left(c_1 \frac{\mu }{h^2} \right)^2 + \left(c_2 \frac{\rho \left\Vert \boldsymbol{a} \right\ | + | | style="text-align: center;" | <math>\left[\left(c_1 \frac{\mu }{h^2} \right)^2 + \left(c_2 \frac{\rho \left\Vert \boldsymbol{a} \right\Vert_{ }}{h} \right)^2 \right]^{1/2} \nabla \cdot u_s+ \nabla \cdot \nabla p_s= 0 </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.154) |
|} | |} | ||
or, equivalently, | or, equivalently, | ||
− | <span id="eq- | + | <span id="eq-2.155"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\frac{1}{\tau _u} \nabla \cdot u_s+ \nabla \cdot \nabla p_s= 0 </math> | | style="text-align: center;" | <math>\frac{1}{\tau _u} \nabla \cdot u_s+ \nabla \cdot \nabla p_s= 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.155) |
|} | |} | ||
− | The analysis in <span id='citeF- | + | The analysis in <span id='citeF-30'></span>[[#cite-30|[30]]] also shows that the pressure Laplacian in Eq. [[#eq-2.155|2.155]] behaves as <math display="inline">-1/h^2</math>, resulting in |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\frac{1}{\tau _u} \nabla \cdot u_s- \frac{c_1}{h^2} p_s= 0 </math> | | style="text-align: center;" | <math>\frac{1}{\tau _u} \nabla \cdot u_s- \frac{c_1}{h^2} p_s= 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.156) |
|} | |} | ||
− | where the algorithmic constant <math display="inline">c_1</math> is adopted by analogy with the viscous term in Eq. [[#eq- | + | where the algorithmic constant <math display="inline">c_1</math> is adopted by analogy with the viscous term in Eq. [[#eq-2.152|2.152]]. From this expression, and using Eq. [[#eq-2.151|2.151]] the usual formulation for the pressure subscale is recovered |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\frac{1}{\tau _p} p_s\approx \nabla \cdot u_s= {R^c \left(u_h\right)}- \delta _h \qquad \tau _p = \frac{h^2}{c_1 \tau _u} = \mu + \frac{c_2 \left\Vert \boldsymbol{a} \right\ | + | | style="text-align: center;" | <math>\frac{1}{\tau _p} p_s\approx \nabla \cdot u_s= {R^c \left(u_h\right)}- \delta _h \qquad \tau _p = \frac{h^2}{c_1 \tau _u} = \mu + \frac{c_2 \left\Vert \boldsymbol{a} \right\Vert_{ } h}{c_1} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.157) |
|} | |} | ||
− | Finally, we introduce the scaling argument of Eq. [[#eq- | + | Finally, we introduce the scaling argument of Eq. [[#eq-2.152|2.152]] back to Eq. [[#eq-2.150|2.150]] and obtain |
− | <span id="eq- | + | <span id="eq-2.158"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\rho \partial _t u_s + \frac{1}{\tau _u} u_s+ \nabla p_s= {\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h </math> | | style="text-align: center;" | <math>\rho \partial _t u_s + \frac{1}{\tau _u} u_s+ \nabla p_s= {\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.158) |
|} | |} | ||
− | The small scale model we have been using up to this point, given by Eq. [[#eq- | + | The small scale model we have been using up to this point, given by Eq. [[#eq-2.47|2.47]], is then recovered by neglecting <math display="inline">\nabla p_s</math>, which effectively uncouples the small scale velocity and pressure models. |
===2.6.2 Alternative design for the pressure subscale=== | ===2.6.2 Alternative design for the pressure subscale=== | ||
− | As an alternative, we propose a formulation which keeps the pressure gradient <math display="inline">\nabla p_s</math> in Eq. [[#eq- | + | As an alternative, we propose a formulation which keeps the pressure gradient <math display="inline">\nabla p_s</math> in Eq. [[#eq-2.150|2.150]] and uses it to introduce the pressure subscale. We start by analyzing how keeping the small scale pressure gradient modifies the large scale problem. Retaining <math display="inline">\nabla p_s</math> means that Eq. [[#eq-2.158|2.158]] can be rewritten as |
− | <span id="eq- | + | <span id="eq-2.159"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\rho \partial _t u_s + \frac{1}{\tau _u} u_s = {\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h - \nabla p_s </math> | | style="text-align: center;" | <math>\rho \partial _t u_s + \frac{1}{\tau _u} u_s = {\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h - \nabla p_s </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.159) |
|} | |} | ||
hence the corresponding time-discrete small scale velocity model is | hence the corresponding time-discrete small scale velocity model is | ||
− | <span id="eq- | + | <span id="eq-2.160"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\frac{1}{\tau _t} u_s^{n+1} = \left.{\boldsymbol{R}^m\left(u_h, p_h\right)}\right|_{n+1} - \boldsymbol{\xi }_h^{n+1} - \nabla p_s^{n+1} + \frac{1}{\delta t} u_s^n </math> | | style="text-align: center;" | <math>\frac{1}{\tau _t} u_s^{n+1} = \left.{\boldsymbol{R}^m\left(u_h, p_h\right)}\right|_{n+1} - \boldsymbol{\xi }_h^{n+1} - \nabla p_s^{n+1} + \frac{1}{\delta t} u_s^n </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.160) |
|} | |} | ||
− | Introducing Eq. [[#eq- | + | Introducing Eq. [[#eq-2.160|2.160]] as our small scale model in Eqs. [[#eq-2.56|2.56]] and [[#eq-2.57|2.57]] we can obtain the full problem corresponding to this formulation. The resulting formulation, particularized for the quasi-static subscale case to reduce the number of terms involved, can be expressed as |
− | <span id="eq- | + | <span id="eq-2.161"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math>\int _\Omega \boldsymbol{w}_h\cdot \rho \left(\partial _t u_h + \frac{1}{2} \, \boldsymbol{a} \cdot \nabla u_h \right)\, \hbox{d}\Omega - \int _\Omega \nabla \boldsymbol{w}_h: \rho \frac{1}{2} \left(\boldsymbol{a} \otimes u_h\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> + \int _\Omega \nabla ^s \boldsymbol{w}_h: \, 2 \mu \left(\nabla ^s u_h- \frac{1}{3} \left(\nabla \cdot u_h\right)\boldsymbol{I} \right)\, \hbox{d}\Omega - \int _{\Omega } \nabla \cdot \boldsymbol{w}_hp_s\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> - \underline{\int _{{\Sigma \, \Omega ^e}} \rho \left(\boldsymbol{a} \cdot \nabla \boldsymbol{w}_h\right)\tau _u \left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h - \nabla p_s\right)} \, \hbox{d}\Omega - \int _\Omega \nabla \cdot \boldsymbol{w}_h\, p_h\, \hbox{d}\Omega = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> \int _\Omega \boldsymbol{w}_h\boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}_h\left(\boldsymbol{t} - \rho \frac{1}{2} \left(\boldsymbol{a} \cdot \boldsymbol{n} \right)u_h\right)\, \hbox{d}\Gamma </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.161) |
|} | |} | ||
− | <span id="eq- | + | <span id="eq-2.162"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _\Omega q_h\nabla \cdot u_h\, \hbox{d}\Omega = \underline{\int _{\Sigma \, \Omega ^e}\nabla q_h\, \tau _u \left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h - \nabla p_s\right)\, \hbox{d}\Omega } | + | | style="text-align: center;" | <math>\int _\Omega q_h\nabla \cdot u_h\, \hbox{d}\Omega = \underline{\int _{\Sigma \, \Omega ^e}\nabla q_h\, \tau _u \left({\boldsymbol{R}^m\left(u_h, p_h\right)}- \boldsymbol{\xi }_h - \nabla p_s\right)\, \hbox{d}\Omega } </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.162) |
|} | |} | ||
where the terms including contributions from <math display="inline">\nabla p_s</math> have been underlined. Note that the same reasoning could be applied to dynamic subscale formulations. | where the terms including contributions from <math display="inline">\nabla p_s</math> have been underlined. Note that the same reasoning could be applied to dynamic subscale formulations. | ||
− | If we could define an approximate space for <math display="inline">p_s</math> and discretize Eqs. [[#eq- | + | If we could define an approximate space for <math display="inline">p_s</math> and discretize Eqs. [[#eq-2.161|2.161]] and [[#eq-2.162|2.162]], we would be able to write a matrix problem of the type |
− | <span id="eq- | + | <span id="eq-2.163"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\left[\begin{array}{cc}\boldsymbol{A}_{uu} & \boldsymbol{A}_{up} \\ \boldsymbol{A}_{pu} & \boldsymbol{A}_{pp} \end{array} \right] \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} + \begin{bmatrix}\boldsymbol{E}_{u}\left(\tau _u, \boldsymbol{a}, \nabla p_s \right)\\ \boldsymbol{E}_{p}\left(\tau _u, \nabla p_s\right) \end{bmatrix} = \begin{bmatrix}\boldsymbol{B}_{u} \\ \boldsymbol{B}_{p} \end{bmatrix} </math> | | style="text-align: center;" | <math>\left[\begin{array}{cc}\boldsymbol{A}_{uu} & \boldsymbol{A}_{up} \\ \boldsymbol{A}_{pu} & \boldsymbol{A}_{pp} \end{array} \right] \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} + \begin{bmatrix}\boldsymbol{E}_{u}\left(\tau _u, \boldsymbol{a}, \nabla p_s \right)\\ \boldsymbol{E}_{p}\left(\tau _u, \nabla p_s\right) \end{bmatrix} = \begin{bmatrix}\boldsymbol{B}_{u} \\ \boldsymbol{B}_{p} \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.163) |
|} | |} | ||
− | where matrix <math display="inline">\boldsymbol{A}</math> and vector <math display="inline">\boldsymbol{B}</math> represent the matrix problem resulting from either Eqs. [[#eq- | + | where matrix <math display="inline">\boldsymbol{A}</math> and vector <math display="inline">\boldsymbol{B}</math> represent the matrix problem resulting from either Eqs. [[#eq-2.91|2.91]] and [[#eq-2.92|2.92]] for the Q-ASGS formulation or Eqs. [[#eq-2.111|2.111]] and [[#eq-2.112|2.112]] for the Q-OSS formulation, <math display="inline">\boldsymbol{U}</math> and <math display="inline">\boldsymbol{P}</math> are the (large scale) vectors of nodal unknowns and <math display="inline">\boldsymbol{E}</math> results from the contribution of <math display="inline">\nabla p_s</math> to the underlined terms in Eqs. [[#eq-2.161|2.161]] and [[#eq-2.162|2.162]]. Its precise definition, if <math display="inline">\nabla p_s</math> was known at the integration points of each element, would be given by |
− | <span id="eq- | + | <span id="eq-2.164"></span> |
− | <span id="eq- | + | <span id="eq-2.165"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{E}_{u}\left(\tau _u, \boldsymbol{a}, \nabla p_s\right)^e_{ab} = \int _{\Omega _e} \rho \left(\boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} \right)^T \cdot \tau _u \, \nabla p_s\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.164) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{E}_{p}\left(\tau _u, \nabla p_s\right)^e_{ab} = \int _{\Omega _e} \nabla N_{a} \tau _u \, \nabla p_s\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.165) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 2,362: | Line 2,151: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>u_h= \boldsymbol{\omega }+ \nabla \phi </math> | | style="text-align: center;" | <math>u_h= \boldsymbol{\omega }+ \nabla \phi </math> | ||
Line 2,372: | Line 2,161: | ||
Taking the divergence of <math display="inline">u_h</math> and integrating over the element's domain, we write | Taking the divergence of <math display="inline">u_h</math> and integrating over the element's domain, we write | ||
− | <span id="eq- | + | <span id="eq-2.166"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\int _{\Omega _e} q_s\nabla \cdot u_h\, \hbox{d}\Omega = \int _{\Omega _e} q_s\nabla \cdot \nabla p_s\, \hbox{d}\Omega </math> | | style="text-align: center;" | <math>\int _{\Omega _e} q_s\nabla \cdot u_h\, \hbox{d}\Omega = \int _{\Omega _e} q_s\nabla \cdot \nabla p_s\, \hbox{d}\Omega </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.166) |
|} | |} | ||
− | Integrating by parts both sides of Eq. [[#eq- | + | Integrating by parts both sides of Eq. [[#eq-2.166|2.166]] we obtain |
− | <span id="eq- | + | <span id="eq-2.167"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>- \int _{\Omega _e} \nabla q_s\cdot u_h\, \hbox{d}\Omega = -\int _{\Omega _e} \nabla q_s\nabla p_s\, \hbox{d}\Omega </math> | | style="text-align: center;" | <math>- \int _{\Omega _e} \nabla q_s\cdot u_h\, \hbox{d}\Omega = -\int _{\Omega _e} \nabla q_s\nabla p_s\, \hbox{d}\Omega </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.167) |
|} | |} | ||
− | Eq. [[#eq- | + | Eq. [[#eq-2.167|2.167]] can not be evaluated in practice, since the exact small scale space is infinite-dimensional, but can be estimated using an approximate small scale space. Our proposal is to assume that the the space for the small scale pressure can be approximated by the discontinous version of the large scale space, that is, functions that are linear within each element and discontinuous across element boundaries. The fact that our interpolation functions are discontinuous across element boundaries allows us to write a local problem on each element, given by the discrete form of Eq. [[#eq-2.167|2.167]]. Denoting with <math display="inline">\hat{N}_a</math> the small scale shape function for node <math display="inline">a</math>, we can write |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{\hat{D}}^e \boldsymbol{U} + \boldsymbol{\hat{L}}^e \boldsymbol{P}_s = \boldsymbol{0} </math> | | style="text-align: center;" | <math>\boldsymbol{\hat{D}}^e \boldsymbol{U} + \boldsymbol{\hat{L}}^e \boldsymbol{P}_s = \boldsymbol{0} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.168) |
|} | |} | ||
Line 2,413: | Line 2,202: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{\hat{D}}^e_{ab} = \int _{\Omega _e} \hat{N}_{a} \, \nabla \cdot \boldsymbol{N}_{b} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.169) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{\hat{L}}^e_{ab} = \int _{\Omega _e} \nabla \hat{N}_a \, \nabla \hat{N}_b \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.170) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | Note that, for the shape functions we are proposing, on a given element, <math display="inline">\boldsymbol{\hat{D}}^e</math> is equivalent to the elemental discrete divergence matrix <math display="inline"> \boldsymbol{D} ^e</math> of the large scale problem, given by Eq. [[#eq- | + | Note that, for the shape functions we are proposing, on a given element, <math display="inline">\boldsymbol{\hat{D}}^e</math> is equivalent to the elemental discrete divergence matrix <math display="inline"> \boldsymbol{D} ^e</math> of the large scale problem, given by Eq. [[#eq-2.98|2.98]]. |
Matrix <math display="inline">\boldsymbol{\hat{L}}^e</math> represents the discrete form of a Laplacian problem and can be explicitly inverted on each element if additional restrictions are imposed on the variable <math display="inline">p_s</math>. In our tests, we have imposed that <math display="inline">p_s</math> is zero on average over the element, which allows us to write | Matrix <math display="inline">\boldsymbol{\hat{L}}^e</math> represents the discrete form of a Laplacian problem and can be explicitly inverted on each element if additional restrictions are imposed on the variable <math display="inline">p_s</math>. In our tests, we have imposed that <math display="inline">p_s</math> is zero on average over the element, which allows us to write | ||
− | <span id="eq- | + | <span id="eq-2.171"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{P}_s = \left(\boldsymbol{\hat{L}}^e \right)^{-1} \boldsymbol{\hat{D}}^e \boldsymbol{U} </math> | | style="text-align: center;" | <math>\boldsymbol{P}_s = \left(\boldsymbol{\hat{L}}^e \right)^{-1} \boldsymbol{\hat{D}}^e \boldsymbol{U} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.171) |
|} | |} | ||
− | Going back to the enhanced matrix problem of Eq. [[#eq- | + | Going back to the enhanced matrix problem of Eq. [[#eq-2.163|2.163]], the small scale shape functions can be used to rewrite the additional terms <math display="inline">\boldsymbol{E}_{u}</math> and <math display="inline">\boldsymbol{E}_{p}</math> in terms of the nodal <math display="inline">P_s</math> vector |
− | <span id="eq- | + | <span id="eq-2.172"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\left[\begin{array}{cc}\boldsymbol{A}_{uu} & \boldsymbol{A}_{up} \\ \boldsymbol{A}_{pu} & \boldsymbol{A}_{pp} \end{array} \right] \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} + \begin{bmatrix}\boldsymbol{\hat{E}}_{u}\left(\tau _u, \boldsymbol{a} \right)\\ \boldsymbol{\hat{E}}_{p}\left(\tau _u \right) \end{bmatrix} \begin{bmatrix}\boldsymbol{P}_s \end{bmatrix} = \begin{bmatrix}\boldsymbol{B}_{u} \\ \boldsymbol{B}_{p} \end{bmatrix} </math> | | style="text-align: center;" | <math>\left[\begin{array}{cc}\boldsymbol{A}_{uu} & \boldsymbol{A}_{up} \\ \boldsymbol{A}_{pu} & \boldsymbol{A}_{pp} \end{array} \right] \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} + \begin{bmatrix}\boldsymbol{\hat{E}}_{u}\left(\tau _u, \boldsymbol{a} \right)\\ \boldsymbol{\hat{E}}_{p}\left(\tau _u \right) \end{bmatrix} \begin{bmatrix}\boldsymbol{P}_s \end{bmatrix} = \begin{bmatrix}\boldsymbol{B}_{u} \\ \boldsymbol{B}_{p} \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.172) |
|} | |} | ||
Line 2,458: | Line 2,245: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{\hat{E}}_{u}\left(\tau _u, \boldsymbol{a}, \nabla p_s\right)^e_{ab} = \int _{\Omega _e} \rho \left(\boldsymbol{a} \cdot \nabla \boldsymbol{N}_{a} \right)^T \cdot \tau _u \, \hat{N}_b \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.173) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{\hat{E}}_{p}\left(\tau _u, \nabla p_s\right)^e_{ab} = \int _{\Omega _e} \nabla N_{a} \tau _u \, \hat{N}_b \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.174) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | Finally, we substitute Eq. [[#eq- | + | Finally, we substitute Eq. [[#eq-2.171|2.171]] in Eq. [[#eq-2.172|2.172]], eliminating the additional variables from the problem algebraically |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\left[\begin{array}{cc}\boldsymbol{A}_{uu} + \boldsymbol{\hat{E}}_{u}\left(\tau _u, \boldsymbol{a} \right)\left(\boldsymbol{\hat{L}}^e \right)^{-1} \boldsymbol{\hat{D}}^e & \boldsymbol{A}_{up} \\ \boldsymbol{A}_{pu}+ \boldsymbol{\hat{E}}_{p}\left(\tau _u, \boldsymbol{a} \right)\left(\boldsymbol{\hat{L}}^e \right)^{-1} \boldsymbol{\hat{D}}^e & \boldsymbol{A}_{pp} \end{array} \right] \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} = \begin{bmatrix}\boldsymbol{B}_{u} \\ \boldsymbol{B}_{p} \end{bmatrix} </math> | | style="text-align: center;" | <math>\left[\begin{array}{cc}\boldsymbol{A}_{uu} + \boldsymbol{\hat{E}}_{u}\left(\tau _u, \boldsymbol{a} \right)\left(\boldsymbol{\hat{L}}^e \right)^{-1} \boldsymbol{\hat{D}}^e & \boldsymbol{A}_{up} \\ \boldsymbol{A}_{pu}+ \boldsymbol{\hat{E}}_{p}\left(\tau _u, \boldsymbol{a} \right)\left(\boldsymbol{\hat{L}}^e \right)^{-1} \boldsymbol{\hat{D}}^e & \boldsymbol{A}_{pp} \end{array} \right] \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} = \begin{bmatrix}\boldsymbol{B}_{u} \\ \boldsymbol{B}_{p} \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.175) |
|} | |} | ||
− | To complete the formulation we would need to define a model for <math display="inline">p_s</math> (as opposed to its gradient), which also appears in Eq. [[#eq- | + | To complete the formulation we would need to define a model for <math display="inline">p_s</math> (as opposed to its gradient), which also appears in Eq. [[#eq-2.161|2.161]]. However, since we imposed that <math display="inline">p_s</math> is zero on average in each element to ensure that <math display="inline">\boldsymbol{\hat{L}}^e</math> can be inverted and we are using linear shape elements (which means that <math display="inline">\nabla \cdot \boldsymbol{N}_{a}</math> is constant within each element), it can be verified that, for the proposed formulation, |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\int _{\Omega _e} \nabla \cdot \boldsymbol{w}_hp_s\, \hbox{d}\Omega = c_e \int _{\Omega _e} p_s\, \hbox{d}\Omega = 0 </math> | | style="text-align: center;" | <math>\int _{\Omega _e} \nabla \cdot \boldsymbol{w}_hp_s\, \hbox{d}\Omega = c_e \int _{\Omega _e} p_s\, \hbox{d}\Omega = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.176) |
|} | |} | ||
Line 2,498: | Line 2,283: | ||
==2.7 Application to the turbulent channel flow== | ==2.7 Application to the turbulent channel flow== | ||
− | The turbulent channel flow is a classical benchmark for LES formulations, in which a fluid circulates between two parallel walls. In the turbulent regime, the flow is characterized by a transfer of energy from the central regions to the zones close to the wall, achieved through turbulent motions, where it is dissipated through viscous friction. This problem represents a challenge for turbulence models in general and LES methods in particular and is well studied in the literature <span id='citeF- | + | The turbulent channel flow is a classical benchmark for LES formulations, in which a fluid circulates between two parallel walls. In the turbulent regime, the flow is characterized by a transfer of energy from the central regions to the zones close to the wall, achieved through turbulent motions, where it is dissipated through viscous friction. This problem represents a challenge for turbulence models in general and LES methods in particular and is well studied in the literature <span id='citeF-50'></span><span id='citeF-2'></span>[[#cite-50|[50,2]]]. For moderate Reynolds numbers, it is also within reach of direct numerical simulation (DNS), which means that simulations representing all scales of the flow are available in the literature. In particular, we will use data from the simulations of Moser ''et al.'' <span id='citeF-51'></span>[[#cite-51|[51]]] to validate our results. Note that, while this particular problem could be simulated using DNS, we are not interested in fully resolving all scales of the flow, since we want to study the behavior of the formulation ''as a LES method''. |
− | There is abundant literature validating VMS (and other) formulations on this particular benchmark, which was simulated using dynamic subscales in <span id='citeF- | + | There is abundant literature validating VMS (and other) formulations on this particular benchmark, which was simulated using dynamic subscales in <span id='citeF-27'></span>[[#cite-27|[27]]], and in <span id='citeF-31'></span>[[#cite-31|[31]]] for the low Mach number regime; with and without explicit LES (Smagorinsky) modelling terms in <span id='citeF-45'></span>[[#cite-45|[45]]], using VMS methods in combination with isogeometric finite element formulations <span id='citeF-21'></span><span id='citeF-23'></span>[[#cite-21|[21,23]]] and using SUPG stabilization by itself <span id='citeF-12'></span>[[#cite-12|[12]]] or in combination with the Smagorinsky model <span id='citeF-11'></span>[[#cite-11|[11]]]. As a result, this example allows us to validate our implementation and test our new approach for the pressure subscale. However, we also note that all previous studies, as far as we know, have used linear hexahedra or higher order interpolations. In contrast with previous studies, we want to use this example to compare the results obtained with tetrahedral and hexahedral elements since, while hexahedra provide a richer interpolation, tetrahedra are in many cases the only practical choice to discretize complex geometries, and we want to quantify the impact of using tetrahedral interpolation on the solution. |
− | The simulation consists in modeling the flow between two parallel flat plates that are separated a distance <math display="inline">2\delta </math>. The flow is driven by a pressure gradient applied on the streamwise direction, <math display="inline">\hbox{d} P / \hbox{d} x</math>, which is balanced by the friction produced by the wall, <math display="inline">\tau _w</math>. The wall friction is conventionally expressed as <math display="inline">\tau _w = \rho u_\tau ^2</math>, where <math display="inline">u_\tau </math> is defined as the friction velocity. Given that the forces acting on the problem must be in equilibrium, the pressure gradient and the wall friction are related by the following expressions (see <span id='citeF- | + | The simulation consists in modeling the flow between two parallel flat plates that are separated a distance <math display="inline">2\delta </math>. The flow is driven by a pressure gradient applied on the streamwise direction, <math display="inline">\hbox{d} P / \hbox{d} x</math>, which is balanced by the friction produced by the wall, <math display="inline">\tau _w</math>. The wall friction is conventionally expressed as <math display="inline">\tau _w = \rho u_\tau ^2</math>, where <math display="inline">u_\tau </math> is defined as the friction velocity. Given that the forces acting on the problem must be in equilibrium, the pressure gradient and the wall friction are related by the following expressions (see <span id='citeF-50'></span>[[#cite-50|[50]]] for example): |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\tau _w = -\delta \frac{\hbox{d} P }{\hbox{d}x} = \rho u_\tau ^2 \quad \hbox{or} \quad u_\tau = \left(- \frac{\delta }{\rho } \frac{\hbox{d}P}{\hbox{d}x} \right)^{\frac{1}{2}} </math> | | style="text-align: center;" | <math>\tau _w = -\delta \frac{\hbox{d} P }{\hbox{d}x} = \rho u_\tau ^2 \quad \hbox{or} \quad u_\tau = \left(- \frac{\delta }{\rho } \frac{\hbox{d}P}{\hbox{d}x} \right)^{\frac{1}{2}} </math> | ||
Line 2,518: | Line 2,303: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\hbox{Re}_\tau = \frac{ u_\tau \delta }{\nu } </math> | | style="text-align: center;" | <math>\hbox{Re}_\tau = \frac{ u_\tau \delta }{\nu } </math> | ||
Line 2,531: | Line 2,316: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\rho = 1 \, Kg/m^3 \quad \nu = 1.472\times 10^{-4} \, m^2/s \quad \delta = 1 \, m \quad \frac{\hbox{d}P}{\hbox{d}x} = -3.372040 \times 10^{-3} \, N/m^2 </math> | | style="text-align: center;" | <math>\rho = 1 \, Kg/m^3 \quad \nu = 1.472\times 10^{-4} \, m^2/s \quad \delta = 1 \, m \quad \frac{\hbox{d}P}{\hbox{d}x} = -3.372040 \times 10^{-3} \, N/m^2 </math> | ||
Line 2,537: | Line 2,322: | ||
|} | |} | ||
− | The problem domain is restricted to <math display="inline">\left[0,2\pi \right]\times \left[-\delta ,\delta \right]\times \left[0,2 \pi / 3\right]</math> in the stream-wise, wall-normal and cross-stream directions respectively, which corresponds to the domain used in <span id='citeF- | + | The problem domain is restricted to <math display="inline">\left[0,2\pi \right]\times \left[-\delta ,\delta \right]\times \left[0,2 \pi / 3\right]</math> in the stream-wise, wall-normal and cross-stream directions respectively, which corresponds to the domain used in <span id='citeF-21'></span>[[#cite-21|[21]]]. Zero Dirichlet conditions are applied on the solid walls and periodic boundary conditions are used for the remaining sides. |
===2.7.1 Effect of the simulation mesh=== | ===2.7.1 Effect of the simulation mesh=== | ||
Line 2,546: | Line 2,331: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>y^i = \delta \, \dfrac{\hbox{tanh}\left(w \left(\dfrac{2 i}{n_{el}} - 1 \right)\right)}{\hbox{tanh}\left(w \right)} \qquad i \in \left[0 , n_{y} \right] </math> | | style="text-align: center;" | <math>y^i = \delta \, \dfrac{\hbox{tanh}\left(w \left(\dfrac{2 i}{n_{el}} - 1 \right)\right)}{\hbox{tanh}\left(w \right)} \qquad i \in \left[0 , n_{y} \right] </math> | ||
Line 2,554: | Line 2,339: | ||
where <math display="inline">n_y</math> is the number of divisions on the <math display="inline">y</math> direction and <math display="inline">y^i \in \left[-\delta , \delta \right]</math>. The weight <math display="inline">w</math> is chosen as <math display="inline">w=2.432</math> for <math display="inline">n_{y} = 64</math> and <math display="inline">w=2.927</math> for <math display="inline">n_{y} = 32</math> so that the first node has a dimensionless distance to the wall <math display="inline">y+=y u_\tau / \nu = 1</math>. | where <math display="inline">n_y</math> is the number of divisions on the <math display="inline">y</math> direction and <math display="inline">y^i \in \left[-\delta , \delta \right]</math>. The weight <math display="inline">w</math> is chosen as <math display="inline">w=2.432</math> for <math display="inline">n_{y} = 64</math> and <math display="inline">w=2.927</math> for <math display="inline">n_{y} = 32</math> so that the first node has a dimensionless distance to the wall <math display="inline">y+=y u_\tau / \nu = 1</math>. | ||
− | The flow is simulated using a time step of <math display="inline">\Delta t = 0.02 \, s</math>, starting from the average flow profile plus a random disturbance and let to evolve until a statistically steady regime is obtained. Discarding this initial transient phase, statistics are recorded on the integration points of the mesh using the method described in Chapter [[#4 Parallel implementation|4]]. Since the problem is statistically homogeneous, statistics can be obtained by ensemble-averaging data on planes corresponding to the same wall distance. This averaging of spatial and time data is known as Reynolds averaging in the context of turbulence modeling. We denote the (Reynolds) average value of a quantity <math display="inline">u</math> as <math display="inline"> \left\langle u \right\rangle </math> and the fluctuation as <math display="inline"> u^{\prime } = u - \left\langle u \right\rangle </math>. A snapshot of the obtained instantaneous streamwise velocity and the distribution of the elements close to the wall can be observed in Fig. [[#img-2|2]] for a tetrahedral mesh and in Fig. [[#img-3|3]] for a hexahedral mesh. | + | The flow is simulated using a time step of <math display="inline">\Delta t = 0.02 \, s</math>, starting from the average flow profile plus a random disturbance and let to evolve until a statistically steady regime is obtained. Discarding this initial transient phase, statistics are recorded on the integration points of the mesh using the method described in Chapter [[#4 Parallel implementation|4]]. Since the problem is statistically homogeneous, statistics can be obtained by ensemble-averaging data on planes corresponding to the same wall distance. This averaging of spatial and time data is known as Reynolds averaging in the context of turbulence modeling. We denote the (Reynolds) average value of a quantity <math display="inline">u</math> as <math display="inline"> \left\langle u \right\rangle</math> and the fluctuation as <math display="inline"> u^{\prime } = u - \left\langle u \right\rangle</math>. A snapshot of the obtained instantaneous streamwise velocity and the distribution of the elements close to the wall can be observed in Fig. [[#img-2|2]] for a tetrahedral mesh and in Fig. [[#img-3|3]] for a hexahedral mesh. |
<div id='img-2a'></div> | <div id='img-2a'></div> | ||
+ | <div id='img-2b'></div> | ||
<div id='img-2'></div> | <div id='img-2'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-gls_ps_64_t_velocity.png|198px|Instantaneous streamwise velocity.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-gls_ps_64_t_mesh.png|163px|Detail of the mesh.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Instantaneous streamwise velocity. | ||
+ | | (b) Detail of the mesh. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 2:''' Channel flow – Solution and mesh for the <math>6\times 64^3</math> tetrahedra simulation. | | colspan="2" | '''Figure 2:''' Channel flow – Solution and mesh for the <math>6\times 64^3</math> tetrahedra simulation. | ||
Line 2,567: | Line 2,356: | ||
<div id='img-3a'></div> | <div id='img-3a'></div> | ||
+ | <div id='img-3b'></div> | ||
<div id='img-3'></div> | <div id='img-3'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-gls_ps_64_h_velocity.png|198px|Instantaneous streamwise velocity.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-gls_ps_64_h_mesh.png|163px|Detail of the mesh.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Instantaneous streamwise velocity. | ||
+ | | (b) Detail of the mesh. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 3:''' Channel flow – Solution and mesh for the <math>64^3</math> hexahedra simulation. | | colspan="2" | '''Figure 3:''' Channel flow – Solution and mesh for the <math>64^3</math> hexahedra simulation. | ||
|} | |} | ||
− | We have measured both average velocities and velocity correlations, all of which can be compared to the DNS data of <span id='citeF- | + | We have measured both average velocities and velocity correlations, all of which can be compared to the DNS data of <span id='citeF-51'></span>[[#cite-51|[51]]]. Note that the velocity fluctuation correlations can be identified with the turbulence kinetic energy, defined as |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>k = \dfrac{1}{2} \left( \left\langle u^{\prime } u^{\prime } \right\rangle | + | | style="text-align: center;" | <math>k = \dfrac{1}{2} \left( \left\langle u^{\prime } u^{\prime } \right\rangle + \left\langle v^{\prime } v^{\prime } \right\rangle + \left\langle w^{\prime } w^{\prime } \right\rangle \right) </math> |
|} | |} | ||
|} | |} | ||
Line 2,589: | Line 2,382: | ||
The first set of results has been obtained using the Q-ASGS formulation and the different meshes. The obtained average is compared to the reference data in Fig. [[#img-4|4]], while the velocity variances are presented in Fig. [[#img-5|5]]. Note that the results are expressed in terms of the dimensionless distance to the wall <math display="inline">y+= \left(\delta - \left|y \right|\right)u_\tau / \nu </math>, which is the common practice for this problem. In this notation, <math display="inline">y+=0</math> corresponds to the wall, while the channel center line is close to <math display="inline">y+ = 400</math>. | The first set of results has been obtained using the Q-ASGS formulation and the different meshes. The obtained average is compared to the reference data in Fig. [[#img-4|4]], while the velocity variances are presented in Fig. [[#img-5|5]]. Note that the results are expressed in terms of the dimensionless distance to the wall <math display="inline">y+= \left(\delta - \left|y \right|\right)u_\tau / \nu </math>, which is the common practice for this problem. In this notation, <math display="inline">y+=0</math> corresponds to the wall, while the channel center line is close to <math display="inline">y+ = 400</math>. | ||
+ | <div id='img-4a'></div> | ||
<div id='img-4'></div> | <div id='img-4'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_all_meshes_u_means.png|337px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="1" | '''Figure 4:''' Channel flow – average stream-wise velocity profile obtained for the Q-ASGS formulation, using different meshes. | | colspan="1" | '''Figure 4:''' Channel flow – average stream-wise velocity profile obtained for the Q-ASGS formulation, using different meshes. | ||
|} | |} | ||
+ | <div id='img-5a'></div> | ||
+ | <div id='img-5b'></div> | ||
+ | <div id='img-5c'></div> | ||
+ | <div id='img-5d'></div> | ||
<div id='img-5'></div> | <div id='img-5'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_all_meshes_k_means.png|216px|Turbulence kinetic energy.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_all_meshes_uu_means.png|216px|Stream-wise velocity fluctuations $\av{\fl u \fl u}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Turbulence kinetic energy. | ||
+ | | (b) Stream-wise velocity fluctuations <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_all_meshes_vv_means.png|216px|Wall-normal velocity fluctuations $\av{\fl v \fl v}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_all_meshes_ww_means.png|216px|Cross-stream velocity fluctuations $\av{\fl w \fl w}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (c) Wall-normal velocity fluctuations <math display="inline"> \left\langle v^{\prime } v^{\prime } \right\rangle</math>. | ||
+ | | (d) Cross-stream velocity fluctuations <math display="inline"> \left\langle w^{\prime } w^{\prime } \right\rangle</math>. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 5:''' Channel flow – velocity variances obtained for the Q-ASGS formulation, using different meshes. | | colspan="2" | '''Figure 5:''' Channel flow – velocity variances obtained for the Q-ASGS formulation, using different meshes. | ||
Line 2,615: | Line 2,421: | ||
===2.7.2 Influence of the small scale model=== | ===2.7.2 Influence of the small scale model=== | ||
− | The next set of tests is designed to evaluate the effect of the small scale model on the solution. We have chosen the <math display="inline">32^3</math> hexahedra mesh and used it to simulate the same case using the different models presented in Section [[#2.3 Variational multiscale stabilization|2.3]]. Based on the results presented in <span id='citeF- | + | The next set of tests is designed to evaluate the effect of the small scale model on the solution. We have chosen the <math display="inline">32^3</math> hexahedra mesh and used it to simulate the same case using the different models presented in Section [[#2.3 Variational multiscale stabilization|2.3]]. Based on the results presented in <span id='citeF-27'></span>[[#cite-27|[27]]], we have chosen to neglect the pressure small scale for this set of tests, which corresponds to setting <math display="inline">\tau _p = 0</math>, as this was found to result in a better fit to DNS data in that reference. Note that the quasi-static results presented were calculated using only the large scale part of the solution in the convection term, while the full velocity <math display="inline">u_h+u_s</math> was used for dynamic models. |
The average stream-wise velocity profiles for this set of tests are presented Fig. [[#img-6|6]], while the measured velocity variances are shown in Fig. [[#img-7|7]]. The results are in general comparable to those obtained for the same mesh in the previous set of tests and, while the qualitative behavior of the solution is properly captured, the average velocity is slightly overpredicted. | The average stream-wise velocity profiles for this set of tests are presented Fig. [[#img-6|6]], while the measured velocity variances are shown in Fig. [[#img-7|7]]. The results are in general comparable to those obtained for the same mesh in the previous set of tests and, while the qualitative behavior of the solution is properly captured, the average velocity is slightly overpredicted. | ||
+ | <div id='img-6a'></div> | ||
<div id='img-6'></div> | <div id='img-6'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-hexa_32_notau_all_models_u_means.png|310px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="1" | '''Figure 6:''' Channel flow – average stream-wise velocity profile obtained on the <math>32^3</math> hexahedra mesh using different small scale models. | | colspan="1" | '''Figure 6:''' Channel flow – average stream-wise velocity profile obtained on the <math>32^3</math> hexahedra mesh using different small scale models. | ||
Line 2,629: | Line 2,438: | ||
From the obtained results, we can see that the choice of small scale model has an impact on the solution. However, we see that, in our case, the result that produces a closer approximation to the DNS stream-wise velocity profile is the Q-ASGS model, which is the most simplified one from the theoretical point of view. | From the obtained results, we can see that the choice of small scale model has an impact on the solution. However, we see that, in our case, the result that produces a closer approximation to the DNS stream-wise velocity profile is the Q-ASGS model, which is the most simplified one from the theoretical point of view. | ||
+ | <div id='img-7a'></div> | ||
+ | <div id='img-7b'></div> | ||
+ | <div id='img-7c'></div> | ||
+ | <div id='img-7d'></div> | ||
<div id='img-7'></div> | <div id='img-7'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-hexa_32_notau_all_models_k_means.png|216px|Turbulence kinetic energy.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-hexa_32_notau_all_models_uu_means.png|216px|Stream-wise velocity fluctuations $\av{\fl u \fl u}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Turbulence kinetic energy. | ||
+ | | (b) Stream-wise velocity fluctuations <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-hexa_32_notau_all_models_vv_means.png|216px|Wall-normal velocity fluctuations $\av{\fl v \fl v}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-hexa_32_notau_all_models_ww_means.png|216px|Cross-stream velocity fluctuations $\av{\fl w \fl w}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (c) Wall-normal velocity fluctuations <math display="inline"> \left\langle v^{\prime } v^{\prime } \right\rangle</math>. | ||
+ | | (d) Cross-stream velocity fluctuations <math display="inline"> \left\langle w^{\prime } w^{\prime } \right\rangle</math>. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 7:''' Channel flow – velocity variances obtained for the Q-ASGS formulation, using different meshes. | | colspan="2" | '''Figure 7:''' Channel flow – velocity variances obtained for the Q-ASGS formulation, using different meshes. | ||
Line 2,645: | Line 2,464: | ||
===2.7.3 Turbulence kinetic energy balance=== | ===2.7.3 Turbulence kinetic energy balance=== | ||
− | To obtain a deeper understanding of the results we measured the turbulence kinetic energy balance for the problem. A balance statement for the turbulence kinetic energy can be obtained using a procedure analogous to what presented in Section [[#2.4 VMS methods and Large Eddy Simulation|2.4]] for the residual energy <math display="inline">k_r</math>, using Reynolds averaging in place of filtering. Only the final expression is presented here, but the interested reader is directed to <span id='citeF- | + | To obtain a deeper understanding of the results we measured the turbulence kinetic energy balance for the problem. A balance statement for the turbulence kinetic energy can be obtained using a procedure analogous to what presented in Section [[#2.4 VMS methods and Large Eddy Simulation|2.4]] for the residual energy <math display="inline">k_r</math>, using Reynolds averaging in place of filtering. Only the final expression is presented here, but the interested reader is directed to <span id='citeF-52'></span><span id='citeF-2'></span>[[#cite-52|[52,2]]] for detailed proof. |
− | <span id="eq- | + | <span id="eq-2.177"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\underbrace{ \partial _t k + \left\langle u_j \right\rangle \frac{\partial k}{\partial x_j} }_{I} = - \underbrace{ \left\langle u_i^{\prime } u_j^{\prime } \right\rangle \frac{\partial \left\langle u_i \right\rangle }{\partial x_j } }_{II} - \underbrace{ \frac{ \left\langle u_j^{\prime } k \right\rangle }{\partial x_j} }_{III} - \underbrace{ \frac{1}{\rho } \frac{\partial \left\langle u_i^{\prime } p^{\prime } \right\rangle}{\partial x_i} }_{IV} + \underbrace{ \nu \frac{\partial ^2 k}{\partial x_j^2} }_{V} - \underbrace{ \nu \left\langle \frac{\partial u_i^{\prime } }{\partial{x_j}} \frac{\partial u_i^{\prime } }{\partial{x_j}} \right\rangle }_{VI} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.177) |
|} | |} | ||
Line 2,671: | Line 2,490: | ||
</ol> | </ol> | ||
− | For the turbulent channel flow, we have that the average velocity is exclusively in the streamwise (<math display="inline">x</math>) direction and that the flow is homogeneous in the streamwise and cross-stream directions. As a result, all terms involving either <math display="inline"> \left\langle v \right\rangle </math>, <math display="inline"> \left\langle w \right\rangle </math> or spatial derivatives along the <math display="inline">x</math> or <math display="inline">z</math> directions can be can be neglected from Eq. [[#eq- | + | For the turbulent channel flow, we have that the average velocity is exclusively in the streamwise (<math display="inline">x</math>) direction and that the flow is homogeneous in the streamwise and cross-stream directions. As a result, all terms involving either <math display="inline"> \left\langle v \right\rangle</math>, <math display="inline"> \left\langle w \right\rangle</math> or spatial derivatives along the <math display="inline">x</math> or <math display="inline">z</math> directions can be can be neglected from Eq. [[#eq-2.177|2.177]], resulting in the simplified expression |
− | <span id="eq- | + | <span id="eq-2.178"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\underbrace{ \partial _t k }_{I} = - \underbrace{ \left\langle u^{\prime } v^{\prime } \right\rangle \frac{\partial \left\langle u \right\rangle }{\partial y } }_{II} - \underbrace{ \frac{ \left\langle v^{\prime } k \right\rangle }{\partial y} }_{III} - \underbrace{ \frac{1}{\rho } \frac{\partial \left\langle v^{\prime } p^{\prime } \right\rangle}{\partial y} }_{IV} + \underbrace{ \nu \frac{\partial ^2 k}{\partial y^2} }_{V} - \underbrace{ \nu \left\langle \frac{\partial u_i^{\prime } }{\partial{y}} \frac{\partial u_i^{\prime } }{\partial{y}} \right\rangle }_{VI} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (2.178) |
|} | |} | ||
− | where the numbered terms have the same interpretation as the corresponding term in Eq. [[#eq- | + | where the numbered terms have the same interpretation as the corresponding term in Eq. [[#eq-2.177|2.177]]. Note that, once a statistically steady state has been reached, the storage term in Eq. [[#eq-2.178|2.178]] will also be zero, as in equilibrium the power introduced in the system by the external pressure gradient is exactly balanced by wall friction. |
− | The different terms in Eq. [[#eq- | + | The different terms in Eq. [[#eq-2.178|2.178]] have been measured in the course of the simulations presented in the previous pages and are presented in graphical form in Figs. [[#img-8|8]] to [[#img-17|17]], again compared to DNS measurements from <span id='citeF-51'></span>[[#cite-51|[51]]]. Note that in this case we are only presenting the part of the solution closer to the wall, <math display="inline">y+ \in \left[0,200\right]</math>, as energy transfer phenomena are mostly localized close to the wall for this problem. |
− | The values for term <math display="inline">II</math> in Eq. [[#eq- | + | The values for term <math display="inline">II</math> in Eq. [[#eq-2.178|2.178]], turbulence kinetic energy production, are plotted in Fig. [[#img-8|8]] for the different meshes and in Fig. [[#img-9|9]] for the different small scale models. The production term measures the generation of small scale motions due to the shear of the average flow and, for this example, is expected to be positive throughout the domain, reaching a peak close to the wall, near <math display="inline">y+=10</math>. As an aside, the fact that this term is positive means that there is no backscatter in this problem. |
<div id='img-8a'></div> | <div id='img-8a'></div> | ||
+ | <div id='img-8b'></div> | ||
<div id='img-8'></div> | <div id='img-8'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_tetra_produc.png|194px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_hexa_produc.png|194px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 8:''' Channel flow – turbulence kinetic energy production for the Q-ASGS method. | | colspan="2" | '''Figure 8:''' Channel flow – turbulence kinetic energy production for the Q-ASGS method. | ||
Line 2,701: | Line 2,524: | ||
<div id='img-9a'></div> | <div id='img-9a'></div> | ||
+ | <div id='img-9b'></div> | ||
<div id='img-9'></div> | <div id='img-9'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-static_notau_h32_produc.png|194px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-dynamic_notau_h32_produc.png|194px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 9:''' Channel flow – turbulence kinetic energy production in the <math>32^3</math> hexahedra case for the different small scale models. | | colspan="2" | '''Figure 9:''' Channel flow – turbulence kinetic energy production in the <math>32^3</math> hexahedra case for the different small scale models. | ||
|} | |} | ||
− | We observe that our results are in qualitative agreement with DNS data, but tend to predict a peak in production at larger <math display="inline">y+</math> (farther from the wall) than expected. This is most marked for the coarser tetrahedral mesh in Fig. | + | We observe that our results are in qualitative agreement with DNS data, but tend to predict a peak in production at larger <math display="inline">y+</math> (farther from the wall) than expected. This is most marked for the coarser tetrahedral mesh in Fig. [[#img-8a|8a]], while hexahedral meshes predict the peak closer to the expected position in general. It is worth noting that the curves obtained from our simulation have a jagged appearance when compared to DNS data. This is due to the choice of linear interpolation functions, which means that the simulated velocity gradient is constant within each finite element. This will also happen in any other results involving spatial gradients of finite element variables. |
− | In terms of the different small scale models tested, we see that the dynamic models in Fig. [[#img- | + | In terms of the different small scale models tested, we see that the dynamic models in Fig. [[#img-9b|9b]] provide a better match to DNS data than the quasi-static models in Fig. [[#img-9a|9a]], suggesting that dynamic models do in fact provide a better description of turbulent phenomena compared to the simpler quasi-static models. |
− | As a final remark, note that the <math display="inline">32^3</math> hexahedra, Q-ASGS curve in Fig. [[#img- | + | As a final remark, note that the <math display="inline">32^3</math> hexahedra, Q-ASGS curve in Fig. [[#img-8b|8b]] does not coincide with the Q-ASGS curve in Fig. [[#img-9a|9a]]. The difference between the two curves is due to the pressure small scale, which was considered in the first case and neglected in the latter. It is interesting to observe that retaining it results in a better prediction of the production term, despite the fact that we saw in the previous pages that neglecting the pressure small scale results in a closer approximation of the average stream-wise velocity. |
− | Term <math display="inline">III</math> of Eq. [[#eq- | + | Term <math display="inline">III</math> of Eq. [[#eq-2.178|2.178]], which corresponds to turbulent diffusion, is presented in Fig. [[#img-10|10]] for the different meshes. Turbulent diffusion is expected to transfer energy from the intermediate region of the channel towards the wall, which means that it will act as a source of turbulence kinetic energy (positive values) close to the wall and as a drain (negative values) at large <math display="inline">y+</math>. We see that our results follow the expected distribution of values, closer when using hexahedral meshes. However, it is interesting to note that the positive peak, near <math display="inline">y+=10</math>, is underestimated in the finer simulations. |
<div id='img-10a'></div> | <div id='img-10a'></div> | ||
+ | <div id='img-10b'></div> | ||
<div id='img-10'></div> | <div id='img-10'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_tetra_t-diff.png|194px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_hexa_t-diff.png|194px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 10:''' Channel flow – turbulent diffusion for the Q-ASGS method. | | colspan="2" | '''Figure 10:''' Channel flow – turbulent diffusion for the Q-ASGS method. | ||
Line 2,729: | Line 2,560: | ||
<div id='img-11a'></div> | <div id='img-11a'></div> | ||
+ | <div id='img-11b'></div> | ||
<div id='img-11'></div> | <div id='img-11'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-static_notau_h32_t-diff.png|194px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-dynamic_notau_h32_t-diff.png|194px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 11:''' Channel flow – turbulent diffusion in the <math>32^3</math> hexahedra case for the different small scale models. | | colspan="2" | '''Figure 11:''' Channel flow – turbulent diffusion in the <math>32^3</math> hexahedra case for the different small scale models. | ||
|} | |} | ||
− | The measured turbulent diffusion for the different small scale models is presented in Fig. [[#img-11|11]] and shows the same type of dependence on the model that we observed for the production term. Again, dynamic subscales provide a better approximation to DNS data than quasi-static ones and, comparing Fig. [[#img- | + | The measured turbulent diffusion for the different small scale models is presented in Fig. [[#img-11|11]] and shows the same type of dependence on the model that we observed for the production term. Again, dynamic subscales provide a better approximation to DNS data than quasi-static ones and, comparing Fig. [[#img-10b|10b]] to Fig. [[#img-11a|11a]], using the pressure small scale in the Q-ASGS case provides a closer match than neglecting it. |
− | Turning our attention to term <math display="inline">IV</math>, which represents pressure diffusion, we provide the results corresponding to different meshes in Fig. [[#img-12|12]] and to the different small scale models in Fig. [[#img-13|13]]. This term corresponds to the relation between local pressure and velocity fluctuations and it has a qualitative behavior that is similar to that of turbulent diffusion, transporting energy closer to the wall, but a smaller magnitude in general. As in the previous term, we can observe that the obtained results tend to underestimate sharp peaks. However, in this case, we detect an unexpected behavior close to the wall for the finest hexahedral mesh, as can be seen in Fig. [[#img- | + | Turning our attention to term <math display="inline">IV</math>, which represents pressure diffusion, we provide the results corresponding to different meshes in Fig. [[#img-12|12]] and to the different small scale models in Fig. [[#img-13|13]]. This term corresponds to the relation between local pressure and velocity fluctuations and it has a qualitative behavior that is similar to that of turbulent diffusion, transporting energy closer to the wall, but a smaller magnitude in general. As in the previous term, we can observe that the obtained results tend to underestimate sharp peaks. However, in this case, we detect an unexpected behavior close to the wall for the finest hexahedral mesh, as can be seen in Fig. [[#img-12b|12b]], where the <math display="inline">64^3</math> hexahedra curve shows a negative peak close to the wall. As a possible interpretation of this result, we note that elements are highly stretched in that region and that we are using an average element size to define our stabilization parameter. This could have unexpected effects on the consistency of the stabilization terms and might be adding some error in our calculations. |
<div id='img-12a'></div> | <div id='img-12a'></div> | ||
+ | <div id='img-12b'></div> | ||
<div id='img-12'></div> | <div id='img-12'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_tetra_p-diff.png|194px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_hexa_p-diff.png|194px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 12:''' Channel flow – pressure diffusion for the Q-ASGS method. | | colspan="2" | '''Figure 12:''' Channel flow – pressure diffusion for the Q-ASGS method. | ||
Line 2,753: | Line 2,592: | ||
<div id='img-13a'></div> | <div id='img-13a'></div> | ||
+ | <div id='img-13b'></div> | ||
<div id='img-13'></div> | <div id='img-13'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-static_notau_h32_p-diff.png|194px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-dynamic_notau_h32_p-diff.png|194px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 13:''' Channel flow – pressure diffusion in the <math>32^3</math> hexahedra case for the different small scale models. | | colspan="2" | '''Figure 13:''' Channel flow – pressure diffusion in the <math>32^3</math> hexahedra case for the different small scale models. | ||
Line 2,765: | Line 2,608: | ||
<div id='img-14a'></div> | <div id='img-14a'></div> | ||
+ | <div id='img-14b'></div> | ||
<div id='img-14'></div> | <div id='img-14'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_tetra_v-diff.png|194px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_hexa_v-diff.png|194px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 14:''' Channel flow – viscous diffusion for the Q-ASGS method. | | colspan="2" | '''Figure 14:''' Channel flow – viscous diffusion for the Q-ASGS method. | ||
Line 2,775: | Line 2,622: | ||
<div id='img-15a'></div> | <div id='img-15a'></div> | ||
+ | <div id='img-15b'></div> | ||
<div id='img-15'></div> | <div id='img-15'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-static_notau_h32_v-diff.png|194px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-dynamic_notau_h32_v-diff.png|194px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 15:''' Channel flow – viscous diffusion in the <math>32^3</math> hexahedra case for the different small scale models. | | colspan="2" | '''Figure 15:''' Channel flow – viscous diffusion in the <math>32^3</math> hexahedra case for the different small scale models. | ||
|} | |} | ||
− | The final term in Eq. [[#eq- | + | The final term in Eq. [[#eq-2.178|2.178]], term <math display="inline">VI</math>, corresponds to viscous dissipation of turbulence kinetic energy. This term should be negative throughout the domain, as viscous dissipation is the only energy sink available in the problem, which can be verified in Fig. [[#img-16|16]] for the different meshes and Fig. [[#img-17|17]] for the different small scale models. |
Viscous dissipation should predominantly occur close to the wall, where the smallest motions are concentrated, and we notice that our results follow this general trend, in agreement with DNS data. However, all our curves indicate a smaller (closer to zero) dissipation for any given distance to the wall, which seems to be generally in line with our interpretation of the average velocity results, indicating that dissipation is generally lower than expected. | Viscous dissipation should predominantly occur close to the wall, where the smallest motions are concentrated, and we notice that our results follow this general trend, in agreement with DNS data. However, all our curves indicate a smaller (closer to zero) dissipation for any given distance to the wall, which seems to be generally in line with our interpretation of the average velocity results, indicating that dissipation is generally lower than expected. | ||
− | In terms of the comparison between the different methods, the results obtained for dissipation are in agreement with the general trend observed for the previous terms. We notice that dynamic models, as shown in Fig. [[#img- | + | In terms of the comparison between the different methods, the results obtained for dissipation are in agreement with the general trend observed for the previous terms. We notice that dynamic models, as shown in Fig. [[#img-17b|17b]], provide results that are slightly closer to DNS measurements than quasi-static models, which in this case is clear in the small step displayed by the different curves close to the wall, and that the Q-ASGS results in Fig. [[#img-16b|16b]], obtained using the pressure subscale, are slightly better than those in Fig [[#img-17a|17a]], obtained by neglecting it. |
<div id='img-16a'></div> | <div id='img-16a'></div> | ||
+ | <div id='img-16b'></div> | ||
<div id='img-16'></div> | <div id='img-16'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_tetra_dissip.png|194px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-gls_tau_hexa_dissip.png|194px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 16:''' Channel flow – turbulence kinetic energy dissipation for the Q-ASGS method. | | colspan="2" | '''Figure 16:''' Channel flow – turbulence kinetic energy dissipation for the Q-ASGS method. | ||
Line 2,801: | Line 2,656: | ||
<div id='img-17a'></div> | <div id='img-17a'></div> | ||
+ | <div id='img-17b'></div> | ||
<div id='img-17'></div> | <div id='img-17'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-static_notau_h32_dissip.png|194px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-dynamic_notau_h32_dissip.png|194px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 17:''' Channel flow – turbulence kinetic energy dissipation in the <math>32^3</math> hexahedra case for the different small scale models. | | colspan="2" | '''Figure 17:''' Channel flow – turbulence kinetic energy dissipation in the <math>32^3</math> hexahedra case for the different small scale models. | ||
|} | |} | ||
+ | <div id='img-18a'></div> | ||
+ | <div id='img-18b'></div> | ||
+ | <div id='img-18c'></div> | ||
+ | <div id='img-18d'></div> | ||
+ | <div id='img-18e'></div> | ||
<div id='img-18'></div> | <div id='img-18'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-ps_gls_tetra_32_u_means.png|310px|Average stream-wise velocity]] |
− | |[[Image: | + | |[[Image:Cotela_2016-ps_gls_tetra_32_k_means.png|216px|Turbulence kinetic energy.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Average stream-wise velocity | ||
+ | | (b) Turbulence kinetic energy. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-ps_gls_tetra_32_uu_means.png|216px|Stream-wise velocity fluctuations $\av{\fl u \fl u}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-ps_gls_tetra_32_vv_means.png|216px|Wall-normal velocity fluctuations $\av{\fl v \fl v}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (c) Stream-wise velocity fluctuations <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math>. | ||
+ | | (d) Wall-normal velocity fluctuations <math display="inline"> \left\langle v^{\prime } v^{\prime } \right\rangle</math>. | ||
|- | |- | ||
− | | colspan="2"|[[Image: | + | | colspan="2"|[[Image:Cotela_2016-ps_gls_tetra_32_ww_means.png|216px|Cross-stream velocity fluctuations $\av{\fl w \fl w}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | (e) Cross-stream velocity fluctuations <math display="inline"> \left\langle w^{\prime } w^{\prime } \right\rangle</math>. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 18:''' Channel flow – stream-wise velocity average and velocity variances obtained using the proposed pressure small scale model and a <math>6 \times 32^3</math> tetrahedra mesh. | | colspan="2" | '''Figure 18:''' Channel flow – stream-wise velocity average and velocity variances obtained using the proposed pressure small scale model and a <math>6 \times 32^3</math> tetrahedra mesh. | ||
Line 2,832: | Line 2,704: | ||
We devoted the present chapter to introduce VMS stabilized formulations for the incompressible Navier-Stokes equations and to expose the arguments that have been used to relate them to LES methods for turbulence modeling. Besides the classical VMS approach, we have discussed dynamic subscale models and the possibility of using the last known value of the complete velocity <math display="inline">u_h^{n+1,i}+u_s^{n+1,i}</math> as the linearized advective velocity on the convective term. These two modifications to the basic formulation allow us to provide a stronger theoretical justification to the use of VMS methods as a type of turbulence modeling, similar to LES but using a projection to the mesh instead of spatial filtering to introduce scale separation. We have implemented a finite element solver based on dynamic subscale formulations and used it to simulate the well-known benchmark of the turbulent channel flow at <math display="inline">\hbox{Re}_\tau = 395</math>. | We devoted the present chapter to introduce VMS stabilized formulations for the incompressible Navier-Stokes equations and to expose the arguments that have been used to relate them to LES methods for turbulence modeling. Besides the classical VMS approach, we have discussed dynamic subscale models and the possibility of using the last known value of the complete velocity <math display="inline">u_h^{n+1,i}+u_s^{n+1,i}</math> as the linearized advective velocity on the convective term. These two modifications to the basic formulation allow us to provide a stronger theoretical justification to the use of VMS methods as a type of turbulence modeling, similar to LES but using a projection to the mesh instead of spatial filtering to introduce scale separation. We have implemented a finite element solver based on dynamic subscale formulations and used it to simulate the well-known benchmark of the turbulent channel flow at <math display="inline">\hbox{Re}_\tau = 395</math>. | ||
− | We have investigated the effect of using either tetrahedral or hexahedral meshes for the simulation and the use of different small scale models. Motivated by results found on the literature, we decided to neglect the pressure subscale in some of the tests, in the hope of obtaining more accurate solutions. While it is true that neglecting the small scale pressure results in a better agreement to DNS data in terms of the average stream-wise velocity in the single direct comparison we have for this (the Q-ASGS model), we have also found that this choice results in a poorer prediction of the turbulence kinetic energy balance. We do not have a definitive answer to this apparent contradiction, but one possible explanation could be that the small scale pressure introduces an unexpected energy transfer mechanism, which we do not detect in our balance, since we are only measuring the (large scale part of) the terms in Eq. [[#eq- | + | We have investigated the effect of using either tetrahedral or hexahedral meshes for the simulation and the use of different small scale models. Motivated by results found on the literature, we decided to neglect the pressure subscale in some of the tests, in the hope of obtaining more accurate solutions. While it is true that neglecting the small scale pressure results in a better agreement to DNS data in terms of the average stream-wise velocity in the single direct comparison we have for this (the Q-ASGS model), we have also found that this choice results in a poorer prediction of the turbulence kinetic energy balance. We do not have a definitive answer to this apparent contradiction, but one possible explanation could be that the small scale pressure introduces an unexpected energy transfer mechanism, which we do not detect in our balance, since we are only measuring the (large scale part of) the terms in Eq. [[#eq-2.178|2.178]]. Obviously, more tests are required before a definitive answer can be provided, and the first step would be repeating the analysis presented in Section [[#2.7 Application to the turbulent channel flow|2.7]] but now without neglecting the pressure subscale and measuring not only the large scale part of the energy balance, but also the contributions of the small scale velocities to the terms in Eq. [[#eq-2.178|2.178]]. |
− | This dependence of the results on the pressure small scale also motivated us to propose a new model for the pressure small scales, which we based on strengthening the enforcement of the incompressibility of the velocity solution via the use of an approximate interpolation space for the small scale pressure. While this new formulation produces improved results when compared to the classical approach on a tetrahedral mesh, we want to remark that the effect of the pressure small scale term seems to be problem-dependent (this can be seen for example in <span id='citeF- | + | This dependence of the results on the pressure small scale also motivated us to propose a new model for the pressure small scales, which we based on strengthening the enforcement of the incompressibility of the velocity solution via the use of an approximate interpolation space for the small scale pressure. While this new formulation produces improved results when compared to the classical approach on a tetrahedral mesh, we want to remark that the effect of the pressure small scale term seems to be problem-dependent (this can be seen for example in <span id='citeF-27'></span>[[#cite-27|[27]]]), which means that this should be understood as the starting point of a wider investigation and not a definitive result. |
− | In the same sense, in proposing the formulation we have made some arbitrary decisions, such as the choice of a discontinuous linear interpolation space or the zero-average condition used to invert the Laplacian in Eq. [[#eq- | + | In the same sense, in proposing the formulation we have made some arbitrary decisions, such as the choice of a discontinuous linear interpolation space or the zero-average condition used to invert the Laplacian in Eq. [[#eq-2.171|2.171]]. These are by no means the only possibilities, and it would be interesting to know the impact of this choice compared to other alternatives. |
=3 A Finite Calculus stabilized finite element formulation for turbulent flows= | =3 A Finite Calculus stabilized finite element formulation for turbulent flows= | ||
Line 2,842: | Line 2,714: | ||
==3.1 Introduction== | ==3.1 Introduction== | ||
− | In the present chapter we introduce a new stabilized finite element formulation for the simulation of incompressible flow problems based on the Finite Calculus (FIC) approach <span id='citeF- | + | In the present chapter we introduce a new stabilized finite element formulation for the simulation of incompressible flow problems based on the Finite Calculus (FIC) approach <span id='citeF-53'></span><span id='citeF-54'></span>[[#cite-53|[53,54]]]. FIC is a general framework for the development of stabilized formulations, based on writing the balance equations of the problem for an arbitrarily small domain, instead of the usual point-wise partial differential equation (PDE). This results in a modified strong-form equation with additional terms that, once the problem is rewritten as a variational equation, have a stabilizing effect on the numerical formulation. |
− | The FIC approach has been applied to incompressible flows at a range of Reynolds numbers in the past <span id='citeF-14'></span><span id='citeF-13'></span><span id='citeF- | + | The FIC approach has been applied to incompressible flows at a range of Reynolds numbers in the past <span id='citeF-14'></span><span id='citeF-13'></span><span id='citeF-55'></span>[[#cite-14|[14,13,55]]], but in the present document we intend to investigate the behavior of the formulation as an alternative to large eddy simulation (LES) in a finite element context, as we did for Variational Multiscale (VMS) based formulations in the previous chapter. |
The main new feature of the FIC formulation presented here, compared to previous approaches, is the addition of a new dissipative term based on the velocity gradients. This term has an effect on the total dissipation introduced by the numerical formulation and will be shown to improve the accuracy of the solution for the turbulent flow examples considered. | The main new feature of the FIC formulation presented here, compared to previous approaches, is the addition of a new dissipative term based on the velocity gradients. This term has an effect on the total dissipation introduced by the numerical formulation and will be shown to improve the accuracy of the solution for the turbulent flow examples considered. | ||
Line 2,852: | Line 2,724: | ||
==3.2 FIC formulation== | ==3.2 FIC formulation== | ||
− | Although our end goal is to apply the FIC formulation to the full Navier-Stokes equations, it is convenient to introduce it first on a simpler problem. We present the first order FIC balance following the approach of <span id='citeF- | + | Although our end goal is to apply the FIC formulation to the full Navier-Stokes equations, it is convenient to introduce it first on a simpler problem. We present the first order FIC balance following the approach of <span id='citeF-56'></span>[[#cite-56|[56]]], by applying it to the <math display="inline">1D</math> advection-diffusion equation. |
<div id='img-19'></div> | <div id='img-19'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_balance.png|126px|Fluxes in a 1D domain.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="1" | '''Figure 19:''' Fluxes in a <math>1D</math> domain. | | colspan="1" | '''Figure 19:''' Fluxes in a <math>1D</math> domain. | ||
Line 2,864: | Line 2,736: | ||
Consider a scalar quantity <math display="inline">\phi </math> advected with a velocity <math display="inline">u</math> through the <math display="inline">1D</math> domain shown in Fig. [[#img-19|19]]. The domain has a total length <math display="inline">L = x_B - x_A</math> and diffusivity coefficient <math display="inline">\kappa </math>. The distribution of <math display="inline">\phi </math> will be the solution of the convection-diffusion equation | Consider a scalar quantity <math display="inline">\phi </math> advected with a velocity <math display="inline">u</math> through the <math display="inline">1D</math> domain shown in Fig. [[#img-19|19]]. The domain has a total length <math display="inline">L = x_B - x_A</math> and diffusivity coefficient <math display="inline">\kappa </math>. The distribution of <math display="inline">\phi </math> will be the solution of the convection-diffusion equation | ||
− | <span id="eq- | + | <span id="eq-3.179"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>- u \frac{\hbox{d} \phi }{\hbox{d} x} + \kappa \frac{\hbox{d}^2 \phi }{\hbox{d} x^2} = 0 \qquad \hbox{in} \, \Omega = \left[x_A,x_B\right] </math> | | style="text-align: center;" | <math>- u \frac{\hbox{d} \phi }{\hbox{d} x} + \kappa \frac{\hbox{d}^2 \phi }{\hbox{d} x^2} = 0 \qquad \hbox{in} \, \Omega = \left[x_A,x_B\right] </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.179) |
|} | |} | ||
Furthermore, we can define the flux passing through a point <math display="inline">P</math> on the domain as | Furthermore, we can define the flux passing through a point <math display="inline">P</math> on the domain as | ||
− | <span id="eq- | + | <span id="eq-3.180"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>q_P = - u \phi + \kappa \frac{\hbox{d} \phi }{\hbox{d} x} </math> | | style="text-align: center;" | <math>q_P = - u \phi + \kappa \frac{\hbox{d} \phi }{\hbox{d} x} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.180) |
|} | |} | ||
Consider the flux through the boundary of the domain. Given that the fluxes <math display="inline">q_A</math>, <math display="inline">q_B</math> entering and exiting it through its extremes must be in equilibrium, we can write | Consider the flux through the boundary of the domain. Given that the fluxes <math display="inline">q_A</math>, <math display="inline">q_B</math> entering and exiting it through its extremes must be in equilibrium, we can write | ||
− | <span id="eq- | + | <span id="eq-3.181"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>q_B - q_A = 0 </math> | | style="text-align: center;" | <math>q_B - q_A = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.181) |
|} | |} | ||
− | The basic premise of the FIC approach is to write Eq. [[#eq- | + | The basic premise of the FIC approach is to write Eq. [[#eq-3.181|3.181]] in terms of the flux through an arbitrary point <math display="inline">C</math> that lies in the interior of the domain. If the fluxes at <math display="inline">A</math> and <math display="inline">B</math> are expressed as a Taylor series expansion of the flux at <math display="inline">C</math>, we can state |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>q_A = q_C + L_A \frac{\hbox{d} q}{\hbox{d} x} + \frac{L_A^2}{2} \frac{\hbox{d}^2 q}{\hbox{d} x} + O\left(L_A^3\right)</math> |
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> q_B = q_C - L_B \frac{\hbox{d} q}{\hbox{d} x} + \frac{L_B^2}{2} \frac{\hbox{d}^2 q}{\hbox{d} x} + O\left(L_A^3\right) </math> |
− | + | ||
|} | |} | ||
|} | |} | ||
− | If we introduce these definitions in Eq. [[#eq- | + | If we introduce these definitions in Eq. [[#eq-3.181|3.181]] we can rearrange the resulting expression to obtain |
− | <span id="eq- | + | <span id="eq-3.182"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\frac{\hbox{d} q}{\hbox{d} x} - \frac{L_B - L_A}{2}\frac{\hbox{d}^2 q}{\hbox{d} x^2} = 0 </math> | | style="text-align: center;" | <math>\frac{\hbox{d} q}{\hbox{d} x} - \frac{L_B - L_A}{2}\frac{\hbox{d}^2 q}{\hbox{d} x^2} = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.182) |
|} | |} | ||
− | where we used that <math display="inline">L_B^2 - L_A^2 = \left(L_B + L_A\right)\left(L_B - L_A \right)</math>. In FIC formulations, the quantity <math display="inline">h = L_B - L_A</math> is defined as the ''characteristic length'' of the problem. Introducing the definition of the flux in Eq. [[#eq- | + | where we used that <math display="inline">L_B^2 - L_A^2 = \left(L_B + L_A\right)\left(L_B - L_A \right)</math>. In FIC formulations, the quantity <math display="inline">h = L_B - L_A</math> is defined as the ''characteristic length'' of the problem. Introducing the definition of the flux in Eq. [[#eq-3.182|3.182]] and neglecting third order derivatives we recover the expression |
− | <span id="eq- | + | <span id="eq-3.183"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>- u \frac{\hbox{d} \phi }{\hbox{d} x} + \left(\kappa + \frac{u h}{2} \right)\frac{\hbox{d}^2 \phi }{\hbox{d} x^2} = 0 </math> | | style="text-align: center;" | <math>- u \frac{\hbox{d} \phi }{\hbox{d} x} + \left(\kappa + \frac{u h}{2} \right)\frac{\hbox{d}^2 \phi }{\hbox{d} x^2} = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.183) |
|} | |} | ||
where we have neglected the spatial variation of <math display="inline">u</math> and <math display="inline">\kappa </math>. | where we have neglected the spatial variation of <math display="inline">u</math> and <math display="inline">\kappa </math>. | ||
− | As the position of point <math display="inline">C</math> in the balance domain of Fig. [[#img-19|19]] is arbitrary, Eq. [[#eq- | + | As the position of point <math display="inline">C</math> in the balance domain of Fig. [[#img-19|19]] is arbitrary, Eq. [[#eq-3.179|3.179]] holds for any point within the analysis domain. Comparing Eq. [[#eq-3.183|3.183]] to the pointwise balance equation Eq. [[#eq-3.179|3.179]], we see that, by enforcing the balance of fluxes on the finite-sized domain <math display="inline">\left[x_A,x_B\right]</math>, we introduce a modified diffusivity, which acts as an additional source of numerical diffusion as long as the characteristic size is chosen such that <math display="inline">uh > 0</math>. This has a stabilizing effect on the resulting finite element formulation. Note that, in contrast to most stabilization frameworks (such as the VMS formulation presented in the previous chapter), the stabilizing terms appear as a result of a modification of the original PDE and not from a manipulation of the variational form. |
The procedure used here to obtain the FIC formulation for the <math display="inline">1D</math> advection-diffusion equation can be extended to other problems and multiple dimensions, and is known in the FIC context as first order FIC balance in space. Defining the residual form of our problem as | The procedure used here to obtain the FIC formulation for the <math display="inline">1D</math> advection-diffusion equation can be extended to other problems and multiple dimensions, and is known in the FIC context as first order FIC balance in space. Defining the residual form of our problem as | ||
− | <span id="eq- | + | <span id="eq-3.184"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>r = - u \frac{\hbox{d} \phi }{\hbox{d} x} + \kappa \frac{\hbox{d}^2 \phi }{\hbox{d} x^2} </math> | | style="text-align: center;" | <math>r = - u \frac{\hbox{d} \phi }{\hbox{d} x} + \kappa \frac{\hbox{d}^2 \phi }{\hbox{d} x^2} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.184) |
|} | |} | ||
− | we can rearrange the terms in Eq. [[#eq- | + | we can rearrange the terms in Eq. [[#eq-3.183|3.183]] as |
− | <span id="eq- | + | <span id="eq-3.185"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>r - \frac{h}{2}\frac{\hbox{d}r}{\hbox{d}x} = 0 </math> | | style="text-align: center;" | <math>r - \frac{h}{2}\frac{\hbox{d}r}{\hbox{d}x} = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.185) |
|} | |} | ||
where we are once more neglecting the spatial variation of <math display="inline">u</math> and <math display="inline">\kappa </math> and all third-order derivatives. | where we are once more neglecting the spatial variation of <math display="inline">u</math> and <math display="inline">\kappa </math> and all third-order derivatives. | ||
− | The same approach can be extended to multiple dimensions <span id='citeF- | + | The same approach can be extended to multiple dimensions <span id='citeF-54'></span>[[#cite-54|[54]]]. The vector form of the FIC equation reads |
− | <span id="eq- | + | <span id="eq-3.186"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{r} - \frac{h_j}{2}\frac{\partial \boldsymbol{r}}{\partial x_j} = 0 \qquad j \in \left\lbrace 1,n_d \right\rbrace </math> | | style="text-align: center;" | <math>\boldsymbol{r} - \frac{h_j}{2}\frac{\partial \boldsymbol{r}}{\partial x_j} = 0 \qquad j \in \left\lbrace 1,n_d \right\rbrace </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.186) |
|} | |} | ||
where <math display="inline">h_j</math> represents the characteristic length in the <math display="inline">j</math>-th coordinate direction. We will use the notation <math display="inline">\boldsymbol{h}</math> to denote the vector of characteristic lengths in the different coordinate directions. | where <math display="inline">h_j</math> represents the characteristic length in the <math display="inline">j</math>-th coordinate direction. We will use the notation <math display="inline">\boldsymbol{h}</math> to denote the vector of characteristic lengths in the different coordinate directions. | ||
− | This procedure can be directly applied to the momentum equation. We will follow a slightly different approach for the mass conservation equation, originally introduced in <span id='citeF- | + | This procedure can be directly applied to the momentum equation. We will follow a slightly different approach for the mass conservation equation, originally introduced in <span id='citeF-57'></span>[[#cite-57|[57]]], which retains higher order terms in the FIC balance to obtain a second order expression. |
==3.3 Stabilized momentum equation== | ==3.3 Stabilized momentum equation== | ||
− | We present first the FIC stabilized form of the momentum equation. This equation was already introduced in the previous pages, but is stated in Eq. [[#eq- | + | We present first the FIC stabilized form of the momentum equation. This equation was already introduced in the previous pages, but is stated in Eq. [[#eq-3.187|3.187]] for reference. Note that, as we did for the VMS formulation in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]], we follow the approach of <span id='citeF-34'></span>[[#cite-34|[34]]] and use the skew-symmetric form of the convective term. |
− | <span id="eq- | + | <span id="eq-3.187"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\rho \, \partial _t u_i + \rho \left(\dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} + \dfrac{1}{2} \frac{\partial }{\partial x_k} \left(u_i u_k \right)\right)- \frac{\partial \sigma _{ij}}{\partial x_j} = f_i \qquad \hbox{in }\Omega \times \left[0,T\right) \quad i \in \left\lbrace 1,n_d \right\rbrace </math> | | style="text-align: center;" | <math>\rho \, \partial _t u_i + \rho \left(\dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} + \dfrac{1}{2} \frac{\partial }{\partial x_k} \left(u_i u_k \right)\right)- \frac{\partial \sigma _{ij}}{\partial x_j} = f_i \qquad \hbox{in }\Omega \times \left[0,T\right) \quad i \in \left\lbrace 1,n_d \right\rbrace </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.187) |
|} | |} | ||
For a Newtonian fluid, the stress tensor <math display="inline">\boldsymbol{\sigma }</math> can be expressed in terms of the rate of strain tensor <math display="inline">\boldsymbol{\varepsilon }</math> as | For a Newtonian fluid, the stress tensor <math display="inline">\boldsymbol{\sigma }</math> can be expressed in terms of the rate of strain tensor <math display="inline">\boldsymbol{\varepsilon }</math> as | ||
− | <span id="eq- | + | <span id="eq-3.188"></span> |
− | <span id="eq- | + | <span id="eq-3.189"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\sigma _{ij} = 2 \mu \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3} \, \delta _{ij} \right)- p \, \delta _{ij} </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.188) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \varepsilon _{ij} = \frac{1}{2} \left(\frac{\partial u_i}{\partial x_j} + \frac{\partial u_j}{\partial x_i} \right) </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.189) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | We can follow the procedure outlined in the previous section to develop FIC-based stabilized form of the momentum equation. We introduce Eq. [[#eq- | + | We can follow the procedure outlined in the previous section to develop FIC-based stabilized form of the momentum equation. We introduce Eq. [[#eq-3.188|3.188]] in Eq. [[#eq-3.187|3.187]] and rewrite it in residual form as |
− | <span id="eq- | + | <span id="eq-3.190"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>r^m_i = \rho \partial _t u_i + \rho \left(\dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} + \dfrac{1}{2}\frac{\partial }{\partial x_k}\left(u_i u_k\right)\right)- 2\mu \frac{\partial }{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3} \delta _{ij} \right)+ \frac{\partial p}{\partial x_i} - f_i </math> | | style="text-align: center;" | <math>r^m_i = \rho \partial _t u_i + \rho \left(\dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} + \dfrac{1}{2}\frac{\partial }{\partial x_k}\left(u_i u_k\right)\right)- 2\mu \frac{\partial }{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3} \delta _{ij} \right)+ \frac{\partial p}{\partial x_i} - f_i </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.190) |
|} | |} | ||
Expressing the balance of linear momentum along each spatial direction <math display="inline">i</math> and following the argument of the previous section we can obtain the FIC balance statement for the momentum equation as | Expressing the balance of linear momentum along each spatial direction <math display="inline">i</math> and following the argument of the previous section we can obtain the FIC balance statement for the momentum equation as | ||
− | <span id="eq- | + | <span id="eq-3.191"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>r^m_i - \frac{h_{j}}{2}\frac{\partial r^m_i}{\partial x_j} = 0 \quad i,j \in \left\lbrace 1,n_d \right\rbrace </math> | | style="text-align: center;" | <math>r^m_i - \frac{h_{j}}{2}\frac{\partial r^m_i}{\partial x_j} = 0 \quad i,j \in \left\lbrace 1,n_d \right\rbrace </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.191) |
|} | |} | ||
− | where <math display="inline">h_{j}</math> represents the length used to write the balance along the <math display="inline">j</math>-th coordinate direction. Note that, in principle, a different vector of characteristic lengths <math display="inline">\boldsymbol{h} = \left\lbrace h_j \right\rbrace </math> can be used in the balance equation for each momentum component <math display="inline">r^m_i</math>. | + | where <math display="inline">h_{j}</math> represents the length used to write the balance along the <math display="inline">j</math>-th coordinate direction. Note that, in principle, a different vector of characteristic lengths <math display="inline">\boldsymbol{h} = \left\lbrace h_j \right\rbrace</math> can be used in the balance equation for each momentum component <math display="inline">r^m_i</math>. |
− | We consider different possibilities to design <math display="inline">\boldsymbol{h}</math>. The first possibility is to define the characteristic lengths based on the finite element size along the streamlines of the flow, which results in a method similar to the SUPG formulation <span id='citeF- | + | We consider different possibilities to design <math display="inline">\boldsymbol{h}</math>. The first possibility is to define the characteristic lengths based on the finite element size along the streamlines of the flow, which results in a method similar to the SUPG formulation <span id='citeF-36'></span>[[#cite-36|[36]]]. A second option is to base the characteristic length on the size of the element along the direction of the gradient of velocity. This acts as a source of additional diffusion, although the resulting formulation is not stable by itself. Finally, we consider the possibility of mixing both approaches by introducing a combination coefficient. Each approach will be presented in succession in the following pages. |
===3.3.1 Streamline diffusion formulation=== | ===3.3.1 Streamline diffusion formulation=== | ||
Line 3,059: | Line 2,927: | ||
Consider a characteristic length vector <math display="inline">\boldsymbol{h}_u</math> aligned on the direction of the flow velocity | Consider a characteristic length vector <math display="inline">\boldsymbol{h}_u</math> aligned on the direction of the flow velocity | ||
− | <span id="eq- | + | <span id="eq-3.192"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\boldsymbol{h_u} = h_u \frac{u}{\left\Vert u \right\ | + | | style="text-align: center;" | <math>\boldsymbol{h_u} = h_u \frac{u}{\left\Vert u \right\Vert_{ } } </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.192) |
|} | |} | ||
− | where <math display="inline">h_u</math> is the projected length of a given element along the direction of flow, defined by the unit vector <math display="inline">u/\left\Vert u \right\ | + | where <math display="inline">h_u</math> is the projected length of a given element along the direction of flow, defined by the unit vector <math display="inline">u/\left\Vert u \right\Vert_{ }</math>. Using this expression, we can rewrite Eq. [[#eq-3.191|3.191]] as |
− | <span id="eq- | + | <span id="eq-3.193"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>r^m_i - \frac{h_u}{2 \left\Vert u \right\ | + | | style="text-align: center;" | <math>r^m_i - \frac{h_u}{2 \left\Vert u \right\Vert_{ } } u_j \frac{\partial r^m_i}{\partial x_j} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.193) |
|} | |} | ||
− | We can use Eq. [[#eq- | + | We can use Eq. [[#eq-3.193|3.193]] as the starting point to write a stabilized formulation for the momentum equation. Multiplying by a test function <math display="inline">w_i</math> and integrating over the fluid domain we obtain |
− | <span id="eq- | + | <span id="eq-3.194"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _\Omega w_i \, r^m_i - w_i \, \frac{h_u}{2\left\Vert u \right\ | + | | style="text-align: center;" | <math>\int _\Omega w_i \, r^m_i - w_i \, \frac{h_u}{2\left\Vert u \right\Vert_{ }} u_k \frac{\partial r^m_i}{\partial x_k} \, \hbox{d}\Omega = 0 </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.194) |
|} | |} | ||
− | It is convenient to integrate by parts the second term in Eq. [[#eq- | + | It is convenient to integrate by parts the second term in Eq. [[#eq-3.194|3.194]]. Note that, as the length <math display="inline">h_u</math> will be defined as a constant quantity on each element, the boundary integral that appears should be understood as an integral over elemental boundaries. |
− | <span id="eq- | + | <span id="eq-3.195"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _\Omega w_i \, r^m_i \, \hbox{d}\Omega + \int _\Omega \frac{h_u}{2\left\Vert u \right\ | + | | style="text-align: center;" | <math>\int _\Omega w_i \, r^m_i \, \hbox{d}\Omega + \int _\Omega \frac{h_u}{2\left\Vert u \right\Vert_{ }} u_k \frac{\partial w_i}{\partial x_k} \, r^m_i \, \hbox{d}\Omega - \sum _{(e)} \int _{\Gamma _e} \frac{h_u}{2\left\Vert u \right\Vert_{ }} w_i \left(u_k n_k \right)r^m_i \, \hbox{d}\Gamma = 0 </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.195) |
|} | |} | ||
− | We have neglected the elemental boundary integrals appearing in Eq. [[#eq- | + | We have neglected the elemental boundary integrals appearing in Eq. [[#eq-3.195|3.195]] in the present work. In practice, this is similar to consider that the small scales vanish over element boundaries on VMS formulations. At this point, we introduce the definition of the residual Eq. [[#eq-3.190|3.190]] and its gradient in Eq. [[#eq-3.195|3.195]]. This gives |
− | <span id="eq- | + | <span id="eq-3.196"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _\Omega w_i \, \rho \left(\partial _t u_i + \dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} \right)\, \hbox{d}\Omega - \int _\Omega \dfrac{1}{2} u_k \frac{\partial w_i}{\partial x_k} \rho u_i \, \, \hbox{d}\Omega </math> | + | | style="text-align: center;" | <math>\int _\Omega w_i \, \rho \left(\partial _t u_i + \dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} \right)\, \hbox{d}\Omega - \int _\Omega \dfrac{1}{2} u_k \frac{\partial w_i}{\partial x_k} \rho u_i \, \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _\Omega 2\mu \, \frac{\partial w_i}{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3}\, \delta _{ij} \right)\, \hbox{d}\Omega - \int _\Omega \frac{\partial w_i}{\partial x_i} \, p \, \, \hbox{d}\Omega </math> | + | | style="text-align: center;" | <math> + \int _\Omega 2\mu \, \frac{\partial w_i}{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3}\, \delta _{ij} \right)\, \hbox{d}\Omega - \int _\Omega \frac{\partial w_i}{\partial x_i} \, p \, \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _\Omega \frac{h_u}{2\left\Vert u \right\ | + | | style="text-align: center;" | <math> + \int _\Omega \frac{h_u}{2\left\Vert u \right\Vert_{ }} u_k \frac{\partial w_i}{\partial x_k} \left(\rho \partial _t u_i + \rho \left(\dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} + \dfrac{1}{2} \frac{\partial }{\partial x_k} \left(u_i u_k \right)\right)\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _\Omega \frac{h_u}{2\left\Vert u \right\ | + | | style="text-align: center;" | <math> + \int _\Omega \frac{h_u}{2\left\Vert u \right\Vert_{ }} u_k \frac{\partial w_i}{\partial x_k} \left(\frac{\partial p}{\partial x_i} - 2\mu \, \frac{\partial }{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3} \, \delta _{ij} \right)- f_i \right)\, \hbox{d}\Omega = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \int _\Omega w_i \, f_i \, \, \hbox{d}\Omega + \int _{\Gamma _N} w_i \, t_i \, \, \hbox{d}\ | + | | style="text-align: center;" | <math> \int _\Omega w_i \, f_i \, \, \hbox{d}\Omega + \int _{\Gamma _N} w_i \, t_i \, \, \hbox{d}\Gamma - \int _{\Gamma _N} \dfrac{1}{2} \rho w_i \left(u_k n_k \right)u_i \, \hbox{d}\Gamma </math> |
− | + | ||
|- | |- | ||
| style="text-align: center;" | | | style="text-align: center;" | | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.196) |
|} | |} | ||
where <math display="inline">t_i</math> represents the <math display="inline">i</math>-th component of the tractions imposed on the Neumann boundary <math display="inline">\Gamma _N</math>. | where <math display="inline">t_i</math> represents the <math display="inline">i</math>-th component of the tractions imposed on the Neumann boundary <math display="inline">\Gamma _N</math>. | ||
− | Although Eq. [[#eq- | + | Although Eq. [[#eq-3.196|3.196]] was developed using a FIC based approach, the final expression is analogous to a SUPG stabilized formulation, with <math display="inline">h_u / 2 \left\Vert u \right\Vert_{ }</math> (which has dimensions of time) playing the role of the SUPG stabilization parameter <math display="inline">\tau </math>. |
===3.3.2 Gradient diffusion formulation=== | ===3.3.2 Gradient diffusion formulation=== | ||
− | An alternate approach to Eq. [[#eq- | + | An alternate approach to Eq. [[#eq-3.192|3.192]] is to measure the characteristic length in the direction of the gradient of the <math display="inline">i</math>-th component of velocity, <math display="inline">\nabla u_i = \partial u_i / \partial x_j</math>, given by |
− | <span id="eq- | + | <span id="eq-3.197"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\boldsymbol{h_{g_i}} = h_{g_i} \frac{\nabla u_i}{\left\Vert \nabla u_i \right\ | + | | style="text-align: center;" | <math>\boldsymbol{h_{g_i}} = h_{g_i} \frac{\nabla u_i}{\left\Vert \nabla u_i \right\Vert_{ }} \qquad \hbox{No sum on ''i''.} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.197) |
|} | |} | ||
which, as before, can be used to write a FIC balance statement for each component of the momentum equation | which, as before, can be used to write a FIC balance statement for each component of the momentum equation | ||
− | <span id="eq- | + | <span id="eq-3.198"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>r^m_i - \frac{h_{g_i}}{2 \left\Vert \nabla u_i \right\ | + | | style="text-align: center;" | <math>r^m_i - \frac{h_{g_i}}{2 \left\Vert \nabla u_i \right\Vert_{ } } \frac{\partial u_i}{\partial x_j} \frac{\partial r^m_i}{\partial x_j} \qquad \hbox{No sum on ''i''.} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.198) |
|} | |} | ||
− | We can obtain a variational form of the FIC momentum balance equation given by Eq. [[#eq- | + | We can obtain a variational form of the FIC momentum balance equation given by Eq. [[#eq-3.198|3.198]] following the same procedure used for the streamline formulation. Multiplying by a test function <math display="inline">w_i</math> and integrating over the fluid domain gives |
− | <span id="eq- | + | <span id="eq-3.199"></span> |
− | <span id="eq- | + | <span id="eq-3.200"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\int _\Omega w_i \left(r^m_i - \frac{h_{g_i}}{2 \left\Vert \nabla u_i \right\Vert_{ } } \frac{\partial u_i}{\partial x_j} \frac{\partial r^m_i}{\partial x_j} \right)\, \hbox{d}\Omega = </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.199) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega w_i \, r^m_i \, \hbox{d}\Omega - \int _\Omega w_i \frac{h_{g_i}}{2 \left\Vert \nabla u_i \right\Vert_{ }} \frac{\partial u_i}{\partial x_j} \frac{\partial r^m_i}{\partial x_j} \, \hbox{d}\Omega = 0 </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.200) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | The first integral in Eq. [[#eq- | + | The first integral in Eq. [[#eq-3.200|3.200]] is identical to the first term of Eq. [[#eq-3.195|3.195]] and can be developed as in the previous section. We direct our attention towards the second term in Eq. [[#eq-3.200|3.200]], which can be integrated by parts as follows |
− | <span id="eq- | + | <span id="eq-3.204"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>- \int _\Omega w_i \frac{h_{g_i}}{2 \left\Vert \nabla u_i \right\Vert_{ }} \frac{\partial u_i}{\partial x_j} \frac{\partial r^m_i}{\partial x_j} \, \hbox{d}\Omega = </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.201) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega \frac{\partial }{\partial x_j} \left(w_i \frac{h_{g_i}}{2 \left\Vert \nabla u_i \right\Vert_{ }} \frac{\partial u_i}{\partial x_j} \right)r^m_i - \int _\Omega \frac{\partial }{\partial x_j} \left(w_i \frac{h_{g_i}}{2 \left\Vert \nabla u_i \right\Vert_{ }} \frac{\partial u_i}{\partial x_j} r^m_i \right)\, \hbox{d}\Omega = </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.202) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega \frac{\partial w_i}{\partial x_j} \frac{h_{g_i}}{2 \left\Vert \nabla u_i \right\Vert_{ }} \frac{\partial u_i}{\partial x_j} \, r^m_i \, \, \hbox{d}\Omega + \int _\Omega w_i \, \frac{\partial }{\partial x_j} \left(\frac{h_{g_i}}{2 \left\Vert \nabla u_i \right\Vert_{ }} \frac{\partial u_i}{\partial x_j} \right)r^m_i \, \hbox{d}\Omega - </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.203) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega \frac{\partial }{\partial x_j} \left(w_i \frac{h_{g_i}}{2 \left\Vert \nabla u_i \right\Vert_{ }} \frac{\partial u_i}{\partial x_j} r^m_i \right)\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.204) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | From the three terms in the last equality of Eq. [[#eq- | + | From the three terms in the last equality of Eq. [[#eq-3.204|3.204]], only the first one will be kept. The second one is neglected as it involves either spatial derivatives of the characteristic length or second derivatives of velocity. The last term can be transformed into a boundary integral using the divergence theorem, and is dropped for the same reasons we neglected the boundary terms in the streamline formulation. Finally, it is convenient to rewrite the remaining term as |
− | <span id="eq- | + | <span id="eq-3.205"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _\Omega \frac{\partial w_i}{\partial x_j} \left(\frac{h_{g_i} r^m_i}{2 \left\Vert \nabla u_i \right\ | + | | style="text-align: center;" | <math>\int _\Omega \frac{\partial w_i}{\partial x_j} \left(\frac{h_{g_i} r^m_i}{2 \left\Vert \nabla u_i \right\Vert_{ }} \delta _{ik} \right)\frac{\partial u_k}{\partial x_j} \, \hbox{d}\Omega </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.205) |
|} | |} | ||
− | If we choose the characteristic length such that <math display="inline">h_{g_i} r^m_i > 0</math>, Eq. [[#eq- | + | If we choose the characteristic length such that <math display="inline">h_{g_i} r^m_i > 0</math>, Eq. [[#eq-3.205|3.205]] describes the discrete version of a non-isotropic Laplacian, where the diffusivity for each coordinate direction is different. The diffusivity coefficient in this case is proportional to the magnitude of the finite element residual on each coordinate direction and exhibits a similar structure to that of a shock-capturing formulation, such as <span id='citeF-58'></span>[[#cite-58|[58]]]. The numerical diffusion added on each direction is defined by the tensor <math display="inline">D^g_{ij}</math>: |
− | <span id="eq- | + | <span id="eq-3.206"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>D^g_{ij} = \frac{h_{g_i} r^m_i}{2 \left\Vert \nabla u_i \right\ | + | | style="text-align: center;" | <math>D^g_{ij} = \frac{h_{g_i} r^m_i}{2 \left\Vert \nabla u_i \right\Vert_{ }} \delta _{ij} \qquad \hbox{No sum on ''i''} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.206) |
|} | |} | ||
− | Going back to Eq. [[#eq- | + | Going back to Eq. [[#eq-3.200|3.200]], the weak form for the gradient diffusion formulation reads |
− | <span id="eq- | + | <span id="eq-3.207"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\int _\Omega w_i \, r^m_i \, \, \hbox{d}\Omega + \int _\Omega \frac{\partial w_i}{\partial x_j} D^g_{ik} \frac{\partial u_k}{\partial x_j} \, \hbox{d}\Omega = 0 </math> | | style="text-align: center;" | <math>\int _\Omega w_i \, r^m_i \, \, \hbox{d}\Omega + \int _\Omega \frac{\partial w_i}{\partial x_j} D^g_{ik} \frac{\partial u_k}{\partial x_j} \, \hbox{d}\Omega = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.207) |
|} | |} | ||
− | It must be noted that the formulation of Eq. [[#eq- | + | It must be noted that the formulation of Eq. [[#eq-3.207|3.207]] by itself is not sufficient to stabilize convection-dominated flows in general. Therefore, we consider the possibility of combining the present approach with the streamline-based characteristic length. |
===3.3.3 Combined Approach=== | ===3.3.3 Combined Approach=== | ||
Line 3,259: | Line 3,116: | ||
As a last possibility, we consider a combined approach including both the stabilizing terms of the streamline-diffusion formulation and the additional diffusion of the gradient formulation. The FIC expression for this case reads | As a last possibility, we consider a combined approach including both the stabilizing terms of the streamline-diffusion formulation and the additional diffusion of the gradient formulation. The FIC expression for this case reads | ||
− | <span id="eq- | + | <span id="eq-3.208"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>r^m_i - \beta \frac{h_u}{2 \left\Vert u \right\ | + | | style="text-align: center;" | <math>r^m_i - \beta \frac{h_u}{2 \left\Vert u \right\Vert_{ } } u_j \frac{\partial r^m_i}{\partial x_j} - \left(1-\beta \right)\frac{h_{g_i}}{2 \left\Vert \nabla u_i \right\Vert_{ } } \frac{\partial u_i}{\partial x_k} \frac{\partial r^m_i}{\partial x_k} \qquad \hbox{No sum on ''i''.} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.208) |
|} | |} | ||
where <math display="inline">\beta \in \left[0,1 \right]</math> is a combination parameter. | where <math display="inline">\beta \in \left[0,1 \right]</math> is a combination parameter. | ||
− | The development of the combined formulation follows the steps of each of its components as shown in the previous pages. Therefore, only the final expression for the weak form, obtained by combining Eq. [[#eq- | + | The development of the combined formulation follows the steps of each of its components as shown in the previous pages. Therefore, only the final expression for the weak form, obtained by combining Eq. [[#eq-3.196|3.196]] and Eq. [[#eq-3.207|3.207]], is given here: |
− | <span id="eq- | + | <span id="eq-3.209"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _\Omega w_i \, \rho \left(\partial _t u_i + \dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} \right)\, \hbox{d}\Omega - \int _\Omega \dfrac{1}{2} u_k \frac{\partial w_i}{\partial x_k} \rho u_i \, \, \hbox{d}\Omega </math> | + | | style="text-align: center;" | <math>\int _\Omega w_i \, \rho \left(\partial _t u_i + \dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} \right)\, \hbox{d}\Omega - \int _\Omega \dfrac{1}{2} u_k \frac{\partial w_i}{\partial x_k} \rho u_i \, \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _\Omega 2\mu \, \frac{\partial w_i}{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3}\, \delta _{ij} \right)\, \hbox{d}\Omega - \int _\Omega \frac{\partial w_i}{\partial x_i} \, p \, \, \hbox{d}\Omega </math> | + | | style="text-align: center;" | <math> + \int _\Omega 2\mu \, \frac{\partial w_i}{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3}\, \delta _{ij} \right)\, \hbox{d}\Omega - \int _\Omega \frac{\partial w_i}{\partial x_i} \, p \, \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _\Omega \beta \frac{h_u}{2\left\Vert u \right\ | + | | style="text-align: center;" | <math> + \int _\Omega \beta \frac{h_u}{2\left\Vert u \right\Vert_{ }} u_k \frac{\partial w_i}{\partial x_k} \left(\rho \partial _t u_i + \rho \left(\dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} + \dfrac{1}{2} \frac{\partial }{\partial x_k} \left(u_i u_k \right)\right)\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _\Omega \beta \frac{h_u}{2\left\Vert u \right\ | + | | style="text-align: center;" | <math> + \int _\Omega \beta \frac{h_u}{2\left\Vert u \right\Vert_{ }} u_k \frac{\partial w_i}{\partial x_k} \left(\frac{\partial p}{\partial x_i} - 2\mu \, \frac{\partial }{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3} \, \delta _{ij} \right)- f_i \right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _\Omega \frac{\partial w_i}{\partial x_j} \left(1-\beta \right)D^g_{ik} \frac{\partial u_k}{\partial x_j} \, \hbox{d}\Omega | + | | style="text-align: center;" | <math> + \int _\Omega \frac{\partial w_i}{\partial x_j} \left(1-\beta \right)D^g_{ik} \frac{\partial u_k}{\partial x_j} \, \hbox{d}\Omega = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \int _\Omega w_i \, f_i \, \, \hbox{d}\Omega + \int _{\Gamma _N} w_i \, t_i \, \, \hbox{d}\ | + | | style="text-align: center;" | <math> \int _\Omega w_i \, f_i \, \, \hbox{d}\Omega + \int _{\Gamma _N} w_i \, t_i \, \, \hbox{d}\Gamma - \int _{\Gamma _N} \dfrac{1}{2} \rho w_i \left(u_k n_k \right)u_i \, \hbox{d}\Gamma </math> |
− | + | ||
|- | |- | ||
| style="text-align: center;" | | | style="text-align: center;" | | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.209) |
|} | |} | ||
− | with <math display="inline">D^g_{ik}</math> given by Eq. [[#eq- | + | with <math display="inline">D^g_{ik}</math> given by Eq. [[#eq-3.206|3.206]]. |
===3.3.4 Definition of the stabilization parameters=== | ===3.3.4 Definition of the stabilization parameters=== | ||
− | Eq. [[#eq- | + | Eq. [[#eq-3.209|3.209]] represents the basic formulation used for the momentum equation in the present chapter. To develop it, we introduced five free parameters (in <math display="inline">3D</math>): the velocity characteristic length <math display="inline">h_u</math>, one gradient characteristic length <math display="inline">h_{g_i}</math> along each coordinate direction <math display="inline">i=\left\lbrace 1,2,3\right\rbrace</math>, and the combination parameter <math display="inline">\beta </math>, which must be defined before the method can be implemented. |
====3.3.4.1 Streamline diffusion characteristic length <math>\mathbf{h_u}</math>==== | ====3.3.4.1 Streamline diffusion characteristic length <math>\mathbf{h_u}</math>==== | ||
Line 3,313: | Line 3,164: | ||
The characteristic length for the streamline diffusion terms is defined from the size of the element in the direction of velocity <math display="inline">u</math>. Defining the unit vector in the direction of velocity as <math display="inline">\boldsymbol{e}_u</math> and representing the element edge joining nodes <math display="inline">a</math> and <math display="inline">b</math> with the vector <math display="inline">\boldsymbol{l}_{ab}</math>, the element length is given by | The characteristic length for the streamline diffusion terms is defined from the size of the element in the direction of velocity <math display="inline">u</math>. Defining the unit vector in the direction of velocity as <math display="inline">\boldsymbol{e}_u</math> and representing the element edge joining nodes <math display="inline">a</math> and <math display="inline">b</math> with the vector <math display="inline">\boldsymbol{l}_{ab}</math>, the element length is given by | ||
− | <span id="eq- | + | <span id="eq-3.210"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>h_u = \max _{\hbox{edges}} \left\lbrace \boldsymbol{e}_u \cdot \boldsymbol{l}_{ab} \right\rbrace \qquad \hbox{with} \quad \boldsymbol{e}_u = \frac{u}{\left\Vert u \right\ | + | | style="text-align: center;" | <math>h_u = \max _{\hbox{edges}} \left\lbrace \boldsymbol{e}_u \cdot \boldsymbol{l}_{ab} \right\rbrace \qquad \hbox{with} \quad \boldsymbol{e}_u = \frac{u}{\left\Vert u \right\Vert_{ }} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.210) |
|} | |} | ||
This is shown graphically for triangles and quadrilaterals in Fig. [[#img-20|20]], but the same procedure can be applied in <math display="inline">3D</math> to define the elemental length using the edges of tetrahedra and hexahedra. <div id='img-20'></div> | This is shown graphically for triangles and quadrilaterals in Fig. [[#img-20|20]], but the same procedure can be applied in <math display="inline">3D</math> to define the elemental length using the edges of tetrahedra and hexahedra. <div id='img-20'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_length_u_tri.png|119px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_length_u_quad.png|125px|Definition of the element lenght h<sub>u</sub> for triangles and quadrilaterals.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 20:''' Definition of the element lenght <math>h_u</math> for triangles and quadrilaterals. | | colspan="2" | '''Figure 20:''' Definition of the element lenght <math>h_u</math> for triangles and quadrilaterals. | ||
|} | |} | ||
− | In practice, Eq. [[#eq- | + | In practice, Eq. [[#eq-3.210|3.210]] is evaluated on the integration points of each element. In the case that velocity is (close to) zero on a given point for a given time step, <math display="inline">\boldsymbol{ e_u}</math> is undefined and this expression can not be used. If this happens, an average element length is used instead. The characteristic length we used in this case will be introduced in Eq. [[#eq-3.222|3.222]] for the stabilization of the mass equation. |
====3.3.4.2 Gradient diffusion characteristic lengths <math>\mathbf{h_{g_i}}</math>==== | ====3.3.4.2 Gradient diffusion characteristic lengths <math>\mathbf{h_{g_i}}</math>==== | ||
− | The characteristic element lengths for the gradient term are defined analogously to Eq. [[#eq- | + | The characteristic element lengths for the gradient term are defined analogously to Eq. [[#eq-3.210|3.210]], but using the gradient of the <math display="inline">i</math>-th component of velocity to define the direction of projection. The characteristic element length to be used for the <math display="inline">i</math>-th coordinate direction is therefore defined as |
− | <span id="eq- | + | <span id="eq-3.211"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>h_{g_i} = \max _{edges} \left\lbrace \boldsymbol{e}_{g_i} \cdot \boldsymbol{l}_{ab} \right\rbrace \qquad \hbox{with} \quad \boldsymbol{e}_{g_i} = \frac{\nabla u_i}{\left\Vert \nabla u_i \right\ | + | | style="text-align: center;" | <math>h_{g_i} = \max _{edges} \left\lbrace \boldsymbol{e}_{g_i} \cdot \boldsymbol{l}_{ab} \right\rbrace \qquad \hbox{with} \quad \boldsymbol{e}_{g_i} = \frac{\nabla u_i}{\left\Vert \nabla u_i \right\Vert_{ }} \qquad \hbox{No sum on ''i''.} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.211) |
|} | |} | ||
====3.3.4.3 Combination parameter <math>\boldsymbol \beta </math>==== | ====3.3.4.3 Combination parameter <math>\boldsymbol \beta </math>==== | ||
− | In principle, the combination parameter <math display="inline">\beta </math> could take any value in the range <math display="inline">\beta \in \left[0,1\right]</math>. The limit case <math display="inline">\beta=1</math> results in the classical FIC formulation for the momentum equation, used for example in <span id='citeF- | + | In principle, the combination parameter <math display="inline">\beta </math> could take any value in the range <math display="inline">\beta \in \left[0,1\right]</math>. The limit case <math display="inline">\beta=1</math> results in the classical FIC formulation for the momentum equation, used for example in <span id='citeF-56'></span>[[#cite-56|[56]]] or <span id='citeF-14'></span>[[#cite-14|[14]]]. This formulation is very close to the SUPG stabilization, but uses the stabilization parameter of Eq. [[#eq-3.194|3.194]], derived from FIC principles. On the other end of the range, <math display="inline">\beta=0</math> implies using the gradient diffusion term exclusively and results in a formulation that is not numerically stable for convection-dominated problems. In the present work, we have found that values of <math display="inline">\beta \geq 0.5</math> are typically needed for the problem to be stable for all flow regimes, while values in the range <math display="inline">0.7 \sim 0.9</math> typically give the best results. |
In addition to defining the value of <math display="inline">\beta </math> as a fixed quantity for the entire simulation, we have also experimented with the possibility of adjusting <math display="inline">\beta </math> dynamically using the local features of the flow. In some simulations we have set a local value for <math display="inline">\beta </math> depending on the directions of velocity and its gradient: | In addition to defining the value of <math display="inline">\beta </math> as a fixed quantity for the entire simulation, we have also experimented with the possibility of adjusting <math display="inline">\beta </math> dynamically using the local features of the flow. In some simulations we have set a local value for <math display="inline">\beta </math> depending on the directions of velocity and its gradient: | ||
− | <span id="eq- | + | <span id="eq-3.212"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\beta _i = \hbox{max} \left\lbrace 1 - \dfrac{u_k \left(\partial u_i / \partial x_k \right)}{\left\Vert u | + | | style="text-align: center;" | <math>\beta _i = \hbox{max} \left\lbrace 1 - \dfrac{u_k \left(\partial u_i / \partial x_k \right)}{\left\Vert u \right\Vert_{ }\left\Vert \nabla u_i \right\Vert_{ }}, \beta _m \right\rbrace \qquad \hbox{No sum on ''i''.} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.212) |
|} | |} | ||
− | where <math display="inline">\beta _m</math> is a minimum value to prevent the loss of stability if the velocity becomes parallel to <math display="inline">\nabla u_i</math> in some point. Note that the value of <math display="inline">\beta </math> that is obtained using Eq. [[#eq- | + | where <math display="inline">\beta _m</math> is a minimum value to prevent the loss of stability if the velocity becomes parallel to <math display="inline">\nabla u_i</math> in some point. Note that the value of <math display="inline">\beta </math> that is obtained using Eq. [[#eq-3.212|3.212]] is different for each coordinate direction <math display="inline">i</math>. This means that, if this expression is used, both the streamline terms and the gradient terms in Eq. [[#eq-3.209|3.209]] are non-isotropic. |
==3.4 Stabilized mass balance equation== | ==3.4 Stabilized mass balance equation== | ||
− | In order to obtain a stabilized formulation for the mass balance equation, the approach used in <span id='citeF- | + | In order to obtain a stabilized formulation for the mass balance equation, the approach used in <span id='citeF-57'></span><span id='citeF-55'></span>[[#cite-57|[57,55]]] will be followed. A similiar approach was also applied in <span id='citeF-59'></span>[[#cite-59|[59]]] for a quasi-incompressible fluid. We introduce the following notation for the mass balance residual: |
− | <span id="eq- | + | <span id="eq-3.213"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>r^c = \frac{\partial u_k}{\partial x_k} = \varepsilon _{kk} </math> | | style="text-align: center;" | <math>r^c = \frac{\partial u_k}{\partial x_k} = \varepsilon _{kk} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.213) |
|} | |} | ||
which can be used to derive the second order FIC balance in space as | which can be used to derive the second order FIC balance in space as | ||
− | <span id="eq- | + | <span id="eq-3.214"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>r^c + \frac{h_j^2}{12}\frac{\partial ^2 r^c}{\partial x_j^2} = \varepsilon _{kk} + \frac{h_j^2}{12} \frac{\partial ^2 \varepsilon _{kk}}{\partial x_j^2} = 0 </math> | | style="text-align: center;" | <math>r^c + \frac{h_j^2}{12}\frac{\partial ^2 r^c}{\partial x_j^2} = \varepsilon _{kk} + \frac{h_j^2}{12} \frac{\partial ^2 \varepsilon _{kk}}{\partial x_j^2} = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.214) |
|} | |} | ||
− | The expression of second order mass balance was originally used to obtain a stabilized formulation for incompressible flows in <span id='citeF- | + | The expression of second order mass balance was originally used to obtain a stabilized formulation for incompressible flows in <span id='citeF-57'></span>[[#cite-57|[57]]], where it was derived by expressing the balance of mass within a rectangular domain. In this reference, it is shown that Eq. [[#eq-3.214|3.214]] can be obtained by writing the velocities along the boundaries of the rectangle as a Taylor series expansion of the velocity on its center and retaining terms up to third order. |
− | Now the problem consists in obtaining an expression for <math display="inline">\partial ^2 \varepsilon _{kk} / \partial x_j^2</math> that is useful for the calculation. To do so, we go back to the momentum balance as stated in Eq. [[#eq- | + | Now the problem consists in obtaining an expression for <math display="inline">\partial ^2 \varepsilon _{kk} / \partial x_j^2</math> that is useful for the calculation. To do so, we go back to the momentum balance as stated in Eq. [[#eq-3.190|3.190]]. Assuming that we are in equilibrium, and therefore <math display="inline">r^m_i = 0</math>, and using the identity |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\frac{\partial }{\partial x_k} \left(u_i u_k \right)= u_k \frac{\partial u_i}{\partial x_k} + u_i \frac{\partial x_k}{\partial x_k} = u_k \frac{\partial u_i}{\partial x_k} + u_i \, \varepsilon _{kk} </math> | | style="text-align: center;" | <math>\frac{\partial }{\partial x_k} \left(u_i u_k \right)= u_k \frac{\partial u_i}{\partial x_k} + u_i \frac{\partial x_k}{\partial x_k} = u_k \frac{\partial u_i}{\partial x_k} + u_i \, \varepsilon _{kk} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.215) |
|} | |} | ||
Line 3,416: | Line 3,267: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\rho \, \partial _t u_i + \rho \, u_k \frac{\partial u_i}{\partial x_k} + \frac{1}{2} \rho \, \varepsilon _{kk} u_i - 2\mu \frac{\partial }{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3} \delta _{ij} \right)+ \frac{\partial p}{\partial x_i} - f_i = 0 </math> | | style="text-align: center;" | <math>\rho \, \partial _t u_i + \rho \, u_k \frac{\partial u_i}{\partial x_k} + \frac{1}{2} \rho \, \varepsilon _{kk} u_i - 2\mu \frac{\partial }{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3} \delta _{ij} \right)+ \frac{\partial p}{\partial x_i} - f_i = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.216) |
|} | |} | ||
Moving all terms involving <math display="inline">\varepsilon _{kk}</math> to the same side of the equality we obtain | Moving all terms involving <math display="inline">\varepsilon _{kk}</math> to the same side of the equality we obtain | ||
− | <span id="eq- | + | <span id="eq-3.217"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>- \frac{\rho \, u_i}{2} \varepsilon _{kk} - \frac{2\mu }{3} \frac{\partial \varepsilon _{kk}}{\partial x_i} = \rho \, \partial _t u_i + \rho \, u_k \frac{\partial u_i}{\partial x_k} - 2\mu \frac{\partial \varepsilon _{ij}}{\partial x_j} + \frac{\partial p}{\partial x_i} - f_i = \hat{r}^m_i </math> | | style="text-align: center;" | <math>- \frac{\rho \, u_i}{2} \varepsilon _{kk} - \frac{2\mu }{3} \frac{\partial \varepsilon _{kk}}{\partial x_i} = \rho \, \partial _t u_i + \rho \, u_k \frac{\partial u_i}{\partial x_k} - 2\mu \frac{\partial \varepsilon _{ij}}{\partial x_j} + \frac{\partial p}{\partial x_i} - f_i = \hat{r}^m_i </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.217) |
|} | |} | ||
− | where we introduced the notation of <math display="inline">\hat{r}^m_i</math> for the right hand side of Eq. [[#eq- | + | where we introduced the notation of <math display="inline">\hat{r}^m_i</math> for the right hand side of Eq. [[#eq-3.217|3.217]] for convenience. At this point it is helpful to write the first order FIC balance for the continuity equation |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\varepsilon _{kk} - \frac{h_i}{2} \frac{\partial \varepsilon _{kk}}{\partial x_i} = 0 </math> | | style="text-align: center;" | <math>\varepsilon _{kk} - \frac{h_i}{2} \frac{\partial \varepsilon _{kk}}{\partial x_i} = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.218) |
|} | |} | ||
− | and use it to express <math display="inline">\varepsilon _{kk}</math> in terms of its derivative in Eq. [[#eq- | + | and use it to express <math display="inline">\varepsilon _{kk}</math> in terms of its derivative in Eq. [[#eq-3.217|3.217]] |
− | <span id="eq- | + | <span id="eq-3.219"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>- \left(\frac{\rho \, u_j h_j}{4} + \frac{2 \mu }{3} \right)\frac{\partial \varepsilon _{kk}}{\partial x_i} = \hat{r}^m_i </math> | | style="text-align: center;" | <math>- \left(\frac{\rho \, u_j h_j}{4} + \frac{2 \mu }{3} \right)\frac{\partial \varepsilon _{kk}}{\partial x_i} = \hat{r}^m_i </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.219) |
|} | |} | ||
− | We can introduce Eq. [[#eq- | + | We can introduce Eq. [[#eq-3.219|3.219]] in Eq. [[#eq-3.214|3.214]] to write |
− | <span id="eq- | + | <span id="eq-3.220"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>r^c + \frac{h_i^2}{12} \frac{\partial }{\partial x_i} \left(\frac{\partial \varepsilon _{kk}}{\partial x_i} \right)= r^c - \frac{h_i^2}{12} \frac{\partial }{\partial x_i} \left(\left(\frac{\rho \, u_j h_j}{4} + \frac{2 \mu }{3} \right)^{-1} \hat{r}^m_i \right)= 0 </math> | | style="text-align: center;" | <math>r^c + \frac{h_i^2}{12} \frac{\partial }{\partial x_i} \left(\frac{\partial \varepsilon _{kk}}{\partial x_i} \right)= r^c - \frac{h_i^2}{12} \frac{\partial }{\partial x_i} \left(\left(\frac{\rho \, u_j h_j}{4} + \frac{2 \mu }{3} \right)^{-1} \hat{r}^m_i \right)= 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.220) |
|} | |} | ||
Neglecting the spatial variation of the product <math display="inline">h_j u_j</math>, we take the coefficient that multiplies <math display="inline">\hat{r}^m_i</math> out of the derivative, obtaining | Neglecting the spatial variation of the product <math display="inline">h_j u_j</math>, we take the coefficient that multiplies <math display="inline">\hat{r}^m_i</math> out of the derivative, obtaining | ||
− | <span id="eq- | + | <span id="eq-3.221"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>r^c - \frac{h_i^2}{12} \left(\frac{\rho \, u_j h_j}{4} + \frac{2 \mu }{3} \right)^{-1} \frac{\partial \hat{r}^m_i}{\partial x_i} = 0 </math> | | style="text-align: center;" | <math>r^c - \frac{h_i^2}{12} \left(\frac{\rho \, u_j h_j}{4} + \frac{2 \mu }{3} \right)^{-1} \frac{\partial \hat{r}^m_i}{\partial x_i} = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.221) |
|} | |} | ||
− | Eq. [[#eq- | + | Eq. [[#eq-3.221|3.221]] expresses the basic FIC mass balance statement used in the present work. We will simplify it slightly by using an average characteristic length as done in <span id='citeF-59'></span>[[#cite-59|[59]]], which allows us to combine the two coefficients in Eq. [[#eq-3.221|3.221]] in a single isotropic stabilization parameter <math display="inline">\tau _c</math> |
− | <span id="eq- | + | <span id="eq-3.222"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\tau _c = \left(\frac{3\rho \left\Vert u \right\ | + | | style="text-align: center;" | <math>\tau _c = \left(\frac{3\rho \left\Vert u \right\Vert_{\Omega }}{h} + \frac{8\mu }{h^2} \right)^{-1} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.222) |
|} | |} | ||
Line 3,504: | Line 3,355: | ||
Using <math display="inline">\tau _c</math> we can write the final FIC balance statement for the incompressibility equation as | Using <math display="inline">\tau _c</math> we can write the final FIC balance statement for the incompressibility equation as | ||
− | <span id="eq- | + | <span id="eq-3.223"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>r^c - \tau _c \frac{\partial \hat{r}^m_i}{\partial x_i} = 0 </math> | | style="text-align: center;" | <math>r^c - \tau _c \frac{\partial \hat{r}^m_i}{\partial x_i} = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.223) |
|} | |} | ||
− | We can multiply Eq. [[#eq- | + | We can multiply Eq. [[#eq-3.223|3.223]] by a test function <math display="inline">q</math> and integrate over the fluid domain <math display="inline">\Omega </math> to obtain the weak form of the equation |
− | <span id="eq- | + | <span id="eq-3.224"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\int _\Omega q \, r^c \, \hbox{d}\Omega - \int _\Omega q \tau _c \frac{\partial }{\partial x_i} \left(\rho \partial _t u_i + \rho u_k \frac{\partial u_i}{\partial x_k} - 2\mu \frac{\partial }{\partial x_j} \varepsilon _{ij} + \frac{\partial p}{\partial x_i} - f_i \right)\, \hbox{d}\Omega = 0 </math> | | style="text-align: center;" | <math>\int _\Omega q \, r^c \, \hbox{d}\Omega - \int _\Omega q \tau _c \frac{\partial }{\partial x_i} \left(\rho \partial _t u_i + \rho u_k \frac{\partial u_i}{\partial x_k} - 2\mu \frac{\partial }{\partial x_j} \varepsilon _{ij} + \frac{\partial p}{\partial x_i} - f_i \right)\, \hbox{d}\Omega = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.224) |
|} | |} | ||
− | It is convenient to integrate by parts the second integral in Eq. [[#eq- | + | It is convenient to integrate by parts the second integral in Eq. [[#eq-3.224|3.224]] to reduce the order of the derivatives involved. As in the momentum equation, the boundary terms resulting from this operation are neglected in the present work, obtaining the expression |
− | <span id="eq- | + | <span id="eq-3.225"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\int _\Omega q \, \frac{\partial u_i}{\partial x_i} \, \hbox{d}\Omega + \int _\Omega \frac{\partial q}{\partial x_i} \tau _c \left(\rho \partial _t u_i + \rho u_k \frac{\partial u_i}{\partial x_k} - 2\mu \frac{\partial }{\partial x_j} \varepsilon _{ij} + \frac{\partial p}{\partial x_i} - f_i \right)\, \hbox{d}\Omega = 0 </math> | | style="text-align: center;" | <math>\int _\Omega q \, \frac{\partial u_i}{\partial x_i} \, \hbox{d}\Omega + \int _\Omega \frac{\partial q}{\partial x_i} \tau _c \left(\rho \partial _t u_i + \rho u_k \frac{\partial u_i}{\partial x_k} - 2\mu \frac{\partial }{\partial x_j} \varepsilon _{ij} + \frac{\partial p}{\partial x_i} - f_i \right)\, \hbox{d}\Omega = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.225) |
|} | |} | ||
− | Eq. [[#eq- | + | Eq. [[#eq-3.225|3.225]] represents a stabilized formulation for the continuity equation, similar to that obtained in GLS formulations <span id='citeF-37'></span>[[#cite-37|[37]]]. Note that the stabilization parameter <math display="inline">\tau _c</math>, defined in Eq. [[#eq-3.222|3.222]], has the same structure as the classical SUPG or GLS characteristic time <math display="inline">\tau </math> and the static version of the parameter <math display="inline">\tau _1</math> used for the VMS formulation in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]]. |
− | In addition to the formulation given by Eq. [[#eq- | + | In addition to the formulation given by Eq. [[#eq-3.225|3.225]], we have also tested a variant involving the projection of <math display="inline">\hat{r}^m_i</math>. Consider the following modified version of Eq. [[#eq-3.223|3.223]] |
− | <span id="eq- | + | <span id="eq-3.226"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\frac{\partial u_i}{\partial x_i} + \tau _c \frac{\partial }{\partial x_i} \left(\hat{r}^m_i - \pi _i \right)= 0 </math> | | style="text-align: center;" | <math>\frac{\partial u_i}{\partial x_i} + \tau _c \frac{\partial }{\partial x_i} \left(\hat{r}^m_i - \pi _i \right)= 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.226) |
|} | |} | ||
where <math display="inline">\boldsymbol{\pi }</math> represents the <math display="inline">L_2</math> projection onto the finite element grid of <math display="inline">\boldsymbol{\hat{r}}^m</math>, that is to say, the solution of | where <math display="inline">\boldsymbol{\pi }</math> represents the <math display="inline">L_2</math> projection onto the finite element grid of <math display="inline">\boldsymbol{\hat{r}}^m</math>, that is to say, the solution of | ||
− | <span id="eq- | + | <span id="eq-3.227"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\int _\Omega w_i \pi _i \, \hbox{d}\Omega = \int _\Omega w_i \hat{r}^m_i \, \hbox{d}\Omega </math> | | style="text-align: center;" | <math>\int _\Omega w_i \pi _i \, \hbox{d}\Omega = \int _\Omega w_i \hat{r}^m_i \, \hbox{d}\Omega </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.227) |
|} | |} | ||
− | This formulation results in the following weak form, again neglecting boundary terms, which substitutes Eq. [[#eq- | + | This formulation results in the following weak form, again neglecting boundary terms, which substitutes Eq. [[#eq-3.225|3.225]]. |
− | <span id="eq- | + | <span id="eq-3.228"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\int _\Omega q \, \frac{\partial u_i}{\partial x_i} \, \hbox{d}\Omega + \int _\Omega \frac{\partial q}{\partial x_i} \tau _c \left(\rho \partial _t u_i + \rho u_k \frac{\partial u_i}{\partial x_k} - 2\mu \frac{\partial }{\partial x_j} \varepsilon _{ij} + \frac{\partial p}{\partial x_i} - f_i + \pi _i\right)\, \hbox{d}\Omega = 0 </math> | | style="text-align: center;" | <math>\int _\Omega q \, \frac{\partial u_i}{\partial x_i} \, \hbox{d}\Omega + \int _\Omega \frac{\partial q}{\partial x_i} \tau _c \left(\rho \partial _t u_i + \rho u_k \frac{\partial u_i}{\partial x_k} - 2\mu \frac{\partial }{\partial x_j} \varepsilon _{ij} + \frac{\partial p}{\partial x_i} - f_i + \pi _i\right)\, \hbox{d}\Omega = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.228) |
|} | |} | ||
− | We will use Eq. [[#eq- | + | We will use Eq. [[#eq-3.228|3.228]] as the reference formulation in the following, with the understanding that any terms involving <math display="inline">\pi _i</math> can be dropped to recover the formulation without projections. |
==3.5 Finite element formulation== | ==3.5 Finite element formulation== | ||
− | Combining the stabilized momentum equation given by Eq. [[#eq- | + | Combining the stabilized momentum equation given by Eq. [[#eq-3.209|3.209]] and that of Eq. [[#eq-3.228|3.228]] for the continuity equation we obtain the complete stabilized weak form of the problem, which we used to develop a finite element formulation. |
− | In the present work we restrict ourselves to linear finite elements, using triangular and quadrilateral elements in <math display="inline">2D</math> or tetrahedra and hexahedra in <math display="inline">3D</math>. This means that all terms involving second derivatives of velocity in Eqs. [[#eq- | + | In the present work we restrict ourselves to linear finite elements, using triangular and quadrilateral elements in <math display="inline">2D</math> or tetrahedra and hexahedra in <math display="inline">3D</math>. This means that all terms involving second derivatives of velocity in Eqs. [[#eq-3.209|3.209]] and [[#eq-3.228|3.228]] will be neglected, as they are identically zero when using our interpolation. The full formulation, without second order terms, is given by |
'''Momentum''' | '''Momentum''' | ||
− | <span id="eq- | + | <span id="eq-3.229"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\int _\Omega w_i \, \rho \left(\partial _t u_i + \dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} \right)\, \hbox{d}\Omega - \int _\Omega \dfrac{1}{2} u_k \frac{\partial w_i}{\partial x_k} \rho u_i \, \, \hbox{d}\Omega </math> | + | | style="text-align: center;" | <math>\int _\Omega w_i \, \rho \left(\partial _t u_i + \dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} \right)\, \hbox{d}\Omega - \int _\Omega \dfrac{1}{2} u_k \frac{\partial w_i}{\partial x_k} \rho u_i \, \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _\Omega 2\mu \, \frac{\partial w_i}{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3}\, \delta _{ij} \right)\, \hbox{d}\Omega - \int _\Omega \frac{\partial w_i}{\partial x_i} \, p \, \, \hbox{d}\Omega </math> | + | | style="text-align: center;" | <math> + \int _\Omega 2\mu \, \frac{\partial w_i}{\partial x_j} \left(\varepsilon _{ij} - \frac{\varepsilon _{kk}}{3}\, \delta _{ij} \right)\, \hbox{d}\Omega - \int _\Omega \frac{\partial w_i}{\partial x_i} \, p \, \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _\Omega \beta \frac{h_u}{2\left\Vert u \right\ | + | | style="text-align: center;" | <math> + \int _\Omega \beta \frac{h_u}{2\left\Vert u \right\Vert_{ }} u_k \frac{\partial w_i}{\partial x_k} \left(\rho \partial _t u_i + \rho \left(\dfrac{1}{2} u_k \frac{\partial u_i}{\partial x_k} + \dfrac{1}{2} \frac{\partial }{\partial x_k} \left(u_i u_k \right)\right)\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> + \int _\Omega \beta \frac{h_u}{2\left\Vert u \right\ | + | | style="text-align: center;" | <math> + \int _\Omega \beta \frac{h_u}{2\left\Vert u \right\Vert_{ }} u_k \frac{\partial w_i}{\partial x_k} \left(\frac{\partial p}{\partial x_i} - f_i \right)\, \hbox{d}\Omega + \int _\Omega \frac{\partial w_i}{\partial x_j} \left(1-\beta \right)D^g_{ik} \frac{\partial u_k}{\partial x_j} \, \hbox{d}\Omega = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \int _\Omega w_i \, f_i \, \, \hbox{d}\Omega + \int _{\Gamma _N} w_i \, t_i \, \, \hbox{d}\ | + | | style="text-align: center;" | <math> \int _\Omega w_i \, f_i \, \, \hbox{d}\Omega + \int _{\Gamma _N} w_i \, t_i \, \, \hbox{d}\Gamma - \int _{\Gamma _N} \dfrac{1}{2} \rho w_i \left(u_k n_k \right)u_i \, \hbox{d}\Gamma </math> |
− | + | ||
|- | |- | ||
| style="text-align: center;" | | | style="text-align: center;" | | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.229) |
|} | |} | ||
'''Mass balance''' | '''Mass balance''' | ||
− | <span id="eq- | + | <span id="eq-3.230"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\int _\Omega q \, \frac{\partial u_i}{\partial x_i} \, \hbox{d}\Omega + \int _\Omega \frac{\partial q}{\partial x_i} \tau _c \left(\rho \partial _t u_i + \rho u_k \frac{\partial u_i}{\partial x_k} + \frac{\partial p}{\partial x_i} - f_i + \pi _i \right)\, \hbox{d}\Omega = 0 </math> | | style="text-align: center;" | <math>\int _\Omega q \, \frac{\partial u_i}{\partial x_i} \, \hbox{d}\Omega + \int _\Omega \frac{\partial q}{\partial x_i} \tau _c \left(\rho \partial _t u_i + \rho u_k \frac{\partial u_i}{\partial x_k} + \frac{\partial p}{\partial x_i} - f_i + \pi _i \right)\, \hbox{d}\Omega = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.230) |
|} | |} | ||
Line 3,636: | Line 3,482: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>D^g_{ik} = \frac{h_{g_i} r^m_i}{2 \left\Vert \nabla u_i \right\ | + | | style="text-align: center;" | <math>D^g_{ik} = \frac{h_{g_i} r^m_i}{2 \left\Vert \nabla u_i \right\Vert_{ }} \delta _{ik} \qquad \tau _c = \left(\frac{3\rho \left\Vert u \right\Vert_{ }}{h} + \frac{8\mu }{h^2} \right)^{-1} \qquad \beta \in \left[0 ,1 \right] </math> |
|} | |} | ||
|} | |} | ||
Line 3,649: | Line 3,495: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>u_h= \sum _a^{n_n} \boldsymbol{N}_a \left(\boldsymbol{x}\right)\boldsymbol{u}_a \qquad p_h= \sum _a^{n_n} N_a\left(\boldsymbol{x}\right)p_a </math> | | style="text-align: center;" | <math>u_h= \sum _a^{n_n} \boldsymbol{N}_a \left(\boldsymbol{x}\right)\boldsymbol{u}_a \qquad p_h= \sum _a^{n_n} N_a\left(\boldsymbol{x}\right)p_a </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.231) |
|} | |} | ||
Line 3,661: | Line 3,507: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{N}_a = \begin{bmatrix}N_a & 0 & 0 \\ 0 & N_a & 0 \\ 0 & 0 & N_a \end{bmatrix} </math> | | style="text-align: center;" | <math>\boldsymbol{N}_a = \begin{bmatrix}N_a & 0 & 0 \\ 0 & N_a & 0 \\ 0 & 0 & N_a \end{bmatrix} </math> | ||
Line 3,667: | Line 3,513: | ||
|} | |} | ||
− | Furthermore, we introduce the notation <math display="inline">\boldsymbol{U}</math>, <math display="inline">\boldsymbol{\dot{U}}</math> and <math display="inline">\boldsymbol{P}</math> to indicate the vectors of nodal values for velocity, acceleration and pressure, respectively. Given that the variational form of the problem, represented by Eqs. [[#eq- | + | Furthermore, we introduce the notation <math display="inline">\boldsymbol{U}</math>, <math display="inline">\boldsymbol{\dot{U}}</math> and <math display="inline">\boldsymbol{P}</math> to indicate the vectors of nodal values for velocity, acceleration and pressure, respectively. Given that the variational form of the problem, represented by Eqs. [[#eq-3.229|3.229]] and [[#eq-3.230|3.230]], must hold for all admissible test functions and that the set of finite element shape functions <math display="inline">\left\lbrace N_a \right\rbrace</math> constitutes a basis of the interpolation space, we can obtain a system of equations by imposing that the variational form of the problem must hold for each basis function <math display="inline">N_a</math>. This system can be expressed in matrix form as |
− | <span id="eq- | + | <span id="eq-3.232"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\begin{bmatrix}\boldsymbol{M} + \boldsymbol{M}_K & \boldsymbol{0} \\ \boldsymbol{M}_D & \boldsymbol{0} \end{bmatrix} \begin{bmatrix}\boldsymbol{\dot{U}} \\ \boldsymbol{0} \end{bmatrix} + \begin{bmatrix}\boldsymbol{C} + \boldsymbol{K} + \boldsymbol{S}_K + \boldsymbol{D}_G & \boldsymbol{G} + \boldsymbol{S}_G \\ \boldsymbol{D} + \boldsymbol{S}_D & \boldsymbol{L} \\ \end{bmatrix} \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} = \begin{bmatrix}\boldsymbol{F} + \boldsymbol{S}_F + \boldsymbol{T} \\ \boldsymbol{S}_Q + \boldsymbol{S}_\Pi \end{bmatrix} </math> | | style="text-align: center;" | <math>\begin{bmatrix}\boldsymbol{M} + \boldsymbol{M}_K & \boldsymbol{0} \\ \boldsymbol{M}_D & \boldsymbol{0} \end{bmatrix} \begin{bmatrix}\boldsymbol{\dot{U}} \\ \boldsymbol{0} \end{bmatrix} + \begin{bmatrix}\boldsymbol{C} + \boldsymbol{K} + \boldsymbol{S}_K + \boldsymbol{D}_G & \boldsymbol{G} + \boldsymbol{S}_G \\ \boldsymbol{D} + \boldsymbol{S}_D & \boldsymbol{L} \\ \end{bmatrix} \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} = \begin{bmatrix}\boldsymbol{F} + \boldsymbol{S}_F + \boldsymbol{T} \\ \boldsymbol{S}_Q + \boldsymbol{S}_\Pi \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.232) |
|} | |} | ||
− | The different matrices in Eq. [[#eq- | + | The different matrices in Eq. [[#eq-3.232|3.232]] represent the discrete form of the terms in Eqs. [[#eq-3.229|3.229]] and [[#eq-3.230|3.230]]. Each of them can be built by the assembly of elemental contributions. For an element containing <math display="inline">N</math> nodes, an elemental matrix <math display="inline">\boldsymbol{A}^e</math> can be defined using <math display="inline">N \times N</math> blocks <math display="inline">\boldsymbol{A}^e_{ab}</math>, where <math display="inline">a</math> and <math display="inline">b</math> are local node indices. The individual blocks for the different matrices and vectors can be defined as |
− | <span id="eq- | + | <span id="eq-3.233"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{M}^e_{ab} = \int _{\Omega _e} \rho \boldsymbol{N}_a^T \boldsymbol{N}_b \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.233) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{C}^e_{ab} = \int _{\Omega _e} \rho \dfrac{1}{2} \left(\boldsymbol{N}_a^T u_k \frac{\partial \boldsymbol{N}_b}{\partial x_k} - \left(u_k \frac{\partial \boldsymbol{N}_a}{\partial x_k}\right)^T \boldsymbol{N}_b \right)\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.234) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{G}^e_{ab\;i} = - \int _{\Omega _e} \left(\frac{\partial \boldsymbol{N}_a}{\partial x_i} \right)^T N_b \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.235) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{D}^e_{ab\;i} = \int _{\Omega _e} N_a \frac{\partial \boldsymbol{N}_b}{\partial x_i} \, \hbox{d}\Omega = - \left(\boldsymbol{G}^e_{ba\;i} \right)^T </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.236) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{F}^e_{a} = \int _{\Omega _e} \boldsymbol{N}_a^T \boldsymbol{f} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.237) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{T}^e_{a} = \int _{\Gamma _N} \boldsymbol{N}_a^T \left(\boldsymbol{t} - \rho \dfrac{1}{2} \left(u_k n_k \right) \boldsymbol{N}_b \right)\, \hbox{d}\Gamma </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.238) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 3,719: | Line 3,559: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{B}_a^T = \begin{bmatrix}\dfrac{\partial N_a}{\partial x} & 0 & 0 & \dfrac{\partial N_a}{\partial y} & 0 & \dfrac{\partial N_a}{\partial z} \\[1.2em] 0 & \dfrac{\partial N_a}{\partial y} & 0 & \dfrac{\partial N_a}{\partial x} & \dfrac{\partial N_a}{\partial z} & 0 \\[1.2em] 0 & 0 & \dfrac{\partial N_a}{\partial z} & 0 & \dfrac{\partial N_a}{\partial y} & \dfrac{\partial N_a}{\partial x} \end{bmatrix} </math> | | style="text-align: center;" | <math>\boldsymbol{B}_a^T = \begin{bmatrix}\dfrac{\partial N_a}{\partial x} & 0 & 0 & \dfrac{\partial N_a}{\partial y} & 0 & \dfrac{\partial N_a}{\partial z} \\[1.2em] 0 & \dfrac{\partial N_a}{\partial y} & 0 & \dfrac{\partial N_a}{\partial x} & \dfrac{\partial N_a}{\partial z} & 0 \\[1.2em] 0 & 0 & \dfrac{\partial N_a}{\partial z} & 0 & \dfrac{\partial N_a}{\partial y} & \dfrac{\partial N_a}{\partial x} \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.239) |
|} | |} | ||
Line 3,729: | Line 3,569: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{C}_{\mu } = \begin{bmatrix}4\mu /3 & -2\mu /3 & -2\mu /3 & 0 & 0 & 0 \\ -2\mu /3 & 4\mu /3 & -2\mu /3 & 0 & 0 & 0 \\ -2\mu /3 & -2\mu /3 & 4\mu /3 & 0 & 0 & 0 \\ 0 & 0 & 0 & \mu & 0 & 0 \\ 0 & 0 & 0 & 0 & \mu & 0 \\ 0 & 0 & 0 & 0 & 0 & \mu \end{bmatrix} </math> | | style="text-align: center;" | <math>\boldsymbol{C}_{\mu } = \begin{bmatrix}4\mu /3 & -2\mu /3 & -2\mu /3 & 0 & 0 & 0 \\ -2\mu /3 & 4\mu /3 & -2\mu /3 & 0 & 0 & 0 \\ -2\mu /3 & -2\mu /3 & 4\mu /3 & 0 & 0 & 0 \\ 0 & 0 & 0 & \mu & 0 & 0 \\ 0 & 0 & 0 & 0 & \mu & 0 \\ 0 & 0 & 0 & 0 & 0 & \mu \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.240) |
|} | |} | ||
− | the viscosity term in Eq. [[#eq- | + | the viscosity term in Eq. [[#eq-3.229|3.229]] can be expressed in discrete form as the viscous stress matrix |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{K}^e_{ab} = \int _{\Omega _e} \boldsymbol{B}_a^T \boldsymbol{C}_\mu \boldsymbol{B}_b \, \hbox{d}\Omega </math> | | style="text-align: center;" | <math>\boldsymbol{K}^e_{ab} = \int _{\Omega _e} \boldsymbol{B}_a^T \boldsymbol{C}_\mu \boldsymbol{B}_b \, \hbox{d}\Omega </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.241) |
|} | |} | ||
− | The stabilization terms in Eq. [[#eq- | + | The stabilization terms in Eq. [[#eq-3.229|3.229]] and Eq. [[#eq-3.230|3.230]] give rise to the following matrices |
− | <span id="eq- | + | <span id="eq-3.250"></span> |
− | <span id="eq- | + | <span id="eq-3.251"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{M}^e_{K\,ab} = \int _{\Omega _e} \rho \beta \frac{h_u}{2\left\Vert u \right\Vert_{ }} \left(u_k \frac{\partial \boldsymbol{N}_a}{\partial x_k} \right)^T \boldsymbol{N}_b \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.242) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{M}^e_{D\,ab\,i} = \int _{\Omega _e} \rho \tau _c \left(\frac{\partial N_a}{\partial x_i} \right)^T \boldsymbol{N}_b \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.243) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{S}^e_{K\,ab} = \int _{\Omega _e} \rho \beta \frac{h_u}{2\left\Vert u \right\Vert_{ }} \left(u_k \frac{\partial \boldsymbol{N}_a}{\partial x_k} \right)^T \left(u_l \frac{\partial \boldsymbol{N}_b}{\partial x_l} \right)\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.244) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{S}^e_{G\,ab\,i} = \int _{\Omega _e} \beta \frac{h_u}{2\left\Vert u \right\Vert_{ }} \left(u_k \frac{\partial \boldsymbol{N}_a}{\partial x_k} \right)^T \frac{\partial N_b}{\partial x_i} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.245) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{D}^e_{G\,ab} = \int _{\Omega _e} \left(1-\beta \right)\left(\frac{\partial \boldsymbol{N}_a}{\partial x_i} \right)^T D^g_{ik} \left(\frac{\partial \boldsymbol{N}_b}{\partial x_k} \right)\, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.246) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{S}^e_{D\,ab\,i} = \int _{\Omega _e} \tau _c N_a \frac{\partial \boldsymbol{N}_b}{\partial x_i} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.247) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{L}^e_{ab} = \int _{\Omega _e} \tau _c \left(\frac{\partial N_a}{\partial x_k} \right)^T \frac{\partial N_b}{\partial x_k} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.248) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{S}^e_{F\,a} = \int _{\Omega _e} \beta \frac{h_u}{2\left\Vert u \right\Vert_{ }} \left(u_k \frac{\partial \boldsymbol{N}_a}{\partial x_k} \right)^T \boldsymbol{f} \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.249) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{S}^e_{Q\,a} = \int _{\Omega _e} \tau _c \frac{\partial N_a}{\partial x_i} f_i \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.250) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{S}^e_{\Pi \, a} = - \int _{\Omega _e} \tau _c \frac{\partial N_a}{\partial x_i} \pi _i \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.251) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | In the following, Eq. [[#eq- | + | In the following, Eq. [[#eq-3.232|3.232]] will be expressed using the compact notation |
− | <span id="eq- | + | <span id="eq-3.252"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}} \\ \boldsymbol{0} \end{bmatrix} + \boldsymbol{\tilde{C}} \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} = \boldsymbol{\tilde{F}} </math> | | style="text-align: center;" | <math>\boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}} \\ \boldsymbol{0} \end{bmatrix} + \boldsymbol{\tilde{C}} \begin{bmatrix}\boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} = \boldsymbol{\tilde{F}} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.252) |
|} | |} | ||
− | If projections are used in the stabilization of the incompressibility equation, an additional system has to be solved to determine the nodal values of the projection variables <math display="inline">\boldsymbol \pi </math>. The equations for the projection can be obtained from the discrete version of Eq. [[#eq- | + | If projections are used in the stabilization of the incompressibility equation, an additional system has to be solved to determine the nodal values of the projection variables <math display="inline">\boldsymbol \pi </math>. The equations for the projection can be obtained from the discrete version of Eq. [[#eq-3.227|3.227]], resulting in |
− | <span id="eq- | + | <span id="eq-3.253"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{M}_\Pi \boldsymbol \Pi = \boldsymbol{R}_\Pi </math> | | style="text-align: center;" | <math>\boldsymbol{M}_\Pi \boldsymbol \Pi = \boldsymbol{R}_\Pi </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.253) |
|} | |} | ||
where <math display="inline">\boldsymbol \Pi </math> is the array of nodal values for the projection variables and | where <math display="inline">\boldsymbol \Pi </math> is the array of nodal values for the projection variables and | ||
− | <span id="eq- | + | <span id="eq-3.254"></span> |
− | <span id="eq- | + | <span id="eq-3.255"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\boldsymbol{M}^e_{\Pi \, ab} = \int _{\Omega _e} \boldsymbol{N}_a^T \boldsymbol{N}_b \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.254) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{R}^e_{\Pi \, a} = \int _{\Omega _e} \boldsymbol{N}_a^T \boldsymbol{\hat{r}}^m \, \hbox{d}\Omega </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.255) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | Note that the assembly of elemental contributions given by Eq. [[#eq- | + | Note that the assembly of elemental contributions given by Eq. [[#eq-3.254|3.254]] results in a dense matrix. In practice, the system matrix <math display="inline">\boldsymbol{M}_{\Pi }</math> in Eq. [[#eq-3.253|3.253]] is approximated by a diagonal mass matrix for efficiency. |
===3.5.2 Time integration and linearization=== | ===3.5.2 Time integration and linearization=== | ||
− | To solve the problem described by Eqs. [[#eq- | + | To solve the problem described by Eqs. [[#eq-3.229|3.229]] and [[#eq-3.230|3.230]], we first need introduce a time discretization to express the nodal accelerations <math display="inline">\boldsymbol{\dot{U}}</math> in terms of the nodal velocities <math display="inline">\boldsymbol{U}</math>. As in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]], we use the Bossak scheme to obtain the time-discrete problem. Referring the reader to Section [[#2.5 Discrete problem|2.5]] for the details on the method, here we present only the final expression, which can be expressed as |
− | <span id="eq- | + | <span id="eq-3.256"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\left(\frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} \right) \begin{bmatrix}\boldsymbol{U}_{n+1} \\ \boldsymbol{P}_{n+1} \end{bmatrix} =</math> | + | | style="text-align: center;" | <math>\left(\frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} \right) \begin{bmatrix}\boldsymbol{U}_{n+1} \\ \boldsymbol{P}_{n+1} \end{bmatrix} = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{\tilde{F}} - \frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} | + | | style="text-align: center;" | <math> \boldsymbol{\tilde{F}} - \frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{U}_{n} \\ \boldsymbol{0} \end{bmatrix} + \left\lbrace \left(1-\alpha _B \right)\left(\frac{1}{\gamma _N} - 1 \right)+ \alpha _B \right\rbrace \boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}}_{n} \\ \boldsymbol{0} \end{bmatrix} </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.256) |
|} | |} | ||
with <math display="inline">\alpha _B=-0.3</math>, <math display="inline">\Gamma _N = 1/2 - \alpha _B</math> and | with <math display="inline">\alpha _B=-0.3</math>, <math display="inline">\Gamma _N = 1/2 - \alpha _B</math> and | ||
− | <span id="eq- | + | <span id="eq-3.257"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{\dot{U}_n} = \frac{1}{\gamma _N \Delta t} \left(\boldsymbol{U}_{n} - \boldsymbol{U}_{n-1} \right)- \left(\frac{1}{\gamma _N} - 1 \right)\boldsymbol{\dot{U}_{n-1}} </math> | | style="text-align: center;" | <math>\boldsymbol{\dot{U}_n} = \frac{1}{\gamma _N \Delta t} \left(\boldsymbol{U}_{n} - \boldsymbol{U}_{n-1} \right)- \left(\frac{1}{\gamma _N} - 1 \right)\boldsymbol{\dot{U}_{n-1}} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.257) |
|} | |} | ||
− | The only step left to finalize the finite element solver is to introduce a linearization for Eq. [[#eq- | + | The only step left to finalize the finite element solver is to introduce a linearization for Eq. [[#eq-3.256|3.256]]. Both the system matrix and the right-hand side term contain sources of non-linearity in the form of terms that depend on the current values of the variables. This includes all terms involving the convective term <math display="inline">u_k \partial u_i / \partial x_k</math>, stabilization terms due to the dependence of the different stabilization coefficients on the local velocity <math display="inline">u_i</math> and the gradient diffusion term, which involves both the momentum residual <math display="inline">r^m_i</math> and the velocity gradients <math display="inline">\nabla u_i</math>. |
− | As in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]], we rewrite Eq. [[#eq- | + | As in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]], we rewrite Eq. [[#eq-3.256|3.256]] in residual form and introduce a linearization so that the unknowns can be obtained by iteratively solving a linear system of equations. Defining the approximation to the value at time step <math display="inline">n+1</math> after <math display="inline">i</math> non-linear iterations as <math display="inline">\boldsymbol{U}_{n+1}^i</math>, the residual form of Eq. [[#eq-3.256|3.256]] is given by |
− | <span id="eq- | + | <span id="eq-3.258"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\boldsymbol{R}\left(\boldsymbol{U}_{n+1}^{i},\boldsymbol{P}_{n+1}^{i} \right)= \boldsymbol{\tilde{F}} - \frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{U}_{n} \\ \boldsymbol{0} \end{bmatrix} | + | | style="text-align: center;" | <math>\boldsymbol{R}\left(\boldsymbol{U}_{n+1}^{i},\boldsymbol{P}_{n+1}^{i} \right)= \boldsymbol{\tilde{F}} - \frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{U}_{n} \\ \boldsymbol{0} \end{bmatrix} + </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \left\lbrace \left(1-\alpha _B \right)\left(\frac{1}{\gamma _N} - 1 \right)+ \alpha _B \right\rbrace \boldsymbol{\tilde{M}} | + | | style="text-align: center;" | <math> \left\lbrace \left(1-\alpha _B \right)\left(\frac{1}{\gamma _N} - 1 \right)+ \alpha _B \right\rbrace \boldsymbol{\tilde{M}} \begin{bmatrix}\boldsymbol{\dot{U}}_{n} \\ \boldsymbol{0} \end{bmatrix} - \left(\frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} \right) \begin{bmatrix}\boldsymbol{U}_{n+1}^i \\ \boldsymbol{P}_{n+1}^i \end{bmatrix} </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.258) |
|} | |} | ||
Our problem now consists in finding <math display="inline">\boldsymbol{U}_{n+1}^{i+1}</math>, <math display="inline">\boldsymbol{P}_{n+1}^{i+1}</math> such that <math display="inline">\boldsymbol{R}^{i+1}_{n+1} = \boldsymbol{0}</math>. As before, using Picard iterations we obtain the iterative scheme | Our problem now consists in finding <math display="inline">\boldsymbol{U}_{n+1}^{i+1}</math>, <math display="inline">\boldsymbol{P}_{n+1}^{i+1}</math> such that <math display="inline">\boldsymbol{R}^{i+1}_{n+1} = \boldsymbol{0}</math>. As before, using Picard iterations we obtain the iterative scheme | ||
− | <span id="eq- | + | <span id="eq-3.259"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>- \left(\frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} \right) \begin{bmatrix}\boldsymbol{\delta U^i} \\ \boldsymbol{\delta P^i} \end{bmatrix} = \boldsymbol{R}\left(\boldsymbol{U}_{n+1}^{i},\boldsymbol{P}_{n+1}^{i} \right) </math> | | style="text-align: center;" | <math>- \left(\frac{1-\alpha _B}{\gamma _N \Delta t} \boldsymbol{\tilde{M}} + \boldsymbol{\tilde{C}} \right) \begin{bmatrix}\boldsymbol{\delta U^i} \\ \boldsymbol{\delta P^i} \end{bmatrix} = \boldsymbol{R}\left(\boldsymbol{U}_{n+1}^{i},\boldsymbol{P}_{n+1}^{i} \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.259) |
|} | |} | ||
Line 3,914: | Line 3,738: | ||
===3.5.3 Summary of the formulation=== | ===3.5.3 Summary of the formulation=== | ||
− | Starting from the weak form described by Eq. [[#eq- | + | Starting from the weak form described by Eq. [[#eq-3.229|3.229]] and Eq. [[#eq-3.230|3.230]], we have introduced a finite element discretization in space and a time discretization based on the Bossak method. Additionally, a Picard linearization has been used to obtain a linear system of equations to be solved iteratively, given by Eq. [[#eq-3.259|3.259]]. To summarize, the complete FIC solution procedure is presented in compact form as Algorithm [[#algorithm-2|2]]. |
− | |||
− | n = 0 nsteps <math display="inline">n = n+1</math>,<math display="inline">t = t + \Delta t</math> <math>\left\Vert \boldsymbol{R}^i_{n+1} \right\ | + | {| style="margin: 1em auto;border: 1px solid darkgray;" |
+ | |- | ||
+ | | | ||
+ | :'''for''' n = 0 nsteps '''do''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : <math display="inline">n = n+1</math>,<math display="inline">t = t + \Delta t</math> '''while''' <math>\left\Vert \boldsymbol{R}^i_{n+1} \right\Vert_{\Omega } \leq \hbox{tol}</math> '''do''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : <math display="inline">i = i+1</math> elements '''if''' Using dynamic procedure for <math>\beta </math> '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : Compute <math display="inline">\beta _i</math> according to Eq. [[#eq-3.212|3.212]] Evaluate local contributions using Eqs. [[#eq-3.233|3.233]]–[[#eq-3.251|3.251]]. Assemble local contributions to the linear system of Eq. [[#eq-3.259|3.259]]. Solve Eq. [[#eq-3.259|3.259]] for <math display="inline">\boldsymbol{\delta U^i}</math>, <math display="inline">\boldsymbol{\delta P^i}</math>. Update variables <math display="inline">\boldsymbol{U}_{n+1}^{i+1}</math>,<math display="inline">\boldsymbol{P}_{n+1}^{i+1}</math>. '''if''' Using projections '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : elements Assemble projection problem using Eqs. [[#eq-3.254|3.254]] and [[#eq-3.255|3.255]]. Obtain new values for the projection by solving Eq. [[#eq-3.253|3.253]]. Calculate <math display="inline">\boldsymbol{\dot{U}}_{n+1}^{i+1}</math> according to Eq. [[#eq-3.257|3.257]]. | ||
+ | |||
+ | |||
+ | |- | ||
+ | | style="text-align: center; font-size: 75%;"| | ||
+ | <span id='algorithm-2'></span>'''Algorithm. 2''' FIC incompressible flow solver. | ||
+ | |} | ||
− | This formulation has been implemented within the Kratos Multiphysics code <span id='citeF- | + | This formulation has been implemented within the Kratos Multiphysics code <span id='citeF-29'></span>[[#cite-29|[29]]], a software framework for the development of finite element solvers. The code is prepared to work in a parallel environment, as will be presented in Chapter [[#4 Parallel implementation|4]]. This has proved essential to perform the larger simulations in a reasonable time, which were run using the Gottfried cluster of the North-German Supercomputing Alliance (HLRN). |
==3.6 Turbulent channel flow== | ==3.6 Turbulent channel flow== | ||
− | The flow in a plane turbulent channel is a classic turbulence benchmark and represents a challenging problem for LES formulations, due to the dependence of the vortex size to the distance to the wall <span id='citeF- | + | The flow in a plane turbulent channel is a classic turbulence benchmark and represents a challenging problem for LES formulations, due to the dependence of the vortex size to the distance to the wall <span id='citeF-50'></span>[[#cite-50|[50]]]. It has been studied for a wide range of Reynolds numbers, but we direct our attention to the moderate value of <math display="inline">\hbox{Re}_\tau = 395</math>. There is an extensive bibliography regarding this case, with a comprehensive set of statistical data obtained from direct numerical simulations by Moser ''et al.'' in <span id='citeF-51'></span>[[#cite-51|[51]]] and different studies in which the problem was modelled using stabilized VMS-based formulations, both using classical finite elements such as in <span id='citeF-45'></span>[[#cite-45|[45]]] or <span id='citeF-27'></span>[[#cite-27|[27]]] and using isogeometric elements <span id='citeF-21'></span>[[#cite-21|[21]]] or <span id='citeF-23'></span>[[#cite-23|[23]]]. |
− | This Reynolds number is very convenient because it allows using a mesh size in the inertial subrange, even close to the wall, while keeping the computational cost under control. At higher Reynolds numbers, the number of elements required to have a grid size on the inertial subrange increases prohibitively and some type of wall model is usually preferred to reduce the required number of elements (see for example <span id='citeF- | + | This Reynolds number is very convenient because it allows using a mesh size in the inertial subrange, even close to the wall, while keeping the computational cost under control. At higher Reynolds numbers, the number of elements required to have a grid size on the inertial subrange increases prohibitively and some type of wall model is usually preferred to reduce the required number of elements (see for example <span id='citeF-60'></span>[[#cite-60|[60]]] or <span id='citeF-61'></span>[[#cite-61|[61]]]). |
The plane turbulent channel problem simulates a flow driven by a fixed pressure gradient between two parallel infinite walls. Defining the distance between the two walls as <math display="inline">2\delta </math>, the problem is formulated in terms of the wall friction <math display="inline">\tau _w</math> and the friction velocity <math display="inline">u_\tau </math> | The plane turbulent channel problem simulates a flow driven by a fixed pressure gradient between two parallel infinite walls. Defining the distance between the two walls as <math display="inline">2\delta </math>, the problem is formulated in terms of the wall friction <math display="inline">\tau _w</math> and the friction velocity <math display="inline">u_\tau </math> | ||
− | <span id="eq- | + | <span id="eq-3.260"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\tau _w = -\delta \frac{\hbox{d} P }{\hbox{d}x} = \rho u_\tau ^2 \quad \Rightarrow \quad u_\tau = \left(- \frac{\delta }{\rho } \frac{\hbox{d}P}{\hbox{d}x} \right)^{\frac{1}{2}} </math> | | style="text-align: center;" | <math>\tau _w = -\delta \frac{\hbox{d} P }{\hbox{d}x} = \rho u_\tau ^2 \quad \Rightarrow \quad u_\tau = \left(- \frac{\delta }{\rho } \frac{\hbox{d}P}{\hbox{d}x} \right)^{\frac{1}{2}} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.260) |
|} | |} | ||
− | where <math display="inline">\hbox{d} P / \hbox{d}x</math> is the imposed pressure gradient. Using the definitions of Eq. [[#eq- | + | where <math display="inline">\hbox{d} P / \hbox{d}x</math> is the imposed pressure gradient. Using the definitions of Eq. [[#eq-3.260|3.260]], the turbulent channel problem can be characterized by the friction Reynolds number <math display="inline">\hbox{Re}_\tau </math>, defined as |
− | <span id="eq- | + | <span id="eq-3.261"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\hbox{Re}_\tau = \frac{ u_\tau \delta }{\nu } </math> | | style="text-align: center;" | <math>\hbox{Re}_\tau = \frac{ u_\tau \delta }{\nu } </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.261) |
|} | |} | ||
Line 3,961: | Line 3,805: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\rho = 1 \, Kg/m^3 \quad \nu = 1.472\times 10^{-4} \, m^2/s \quad \delta = 1 \, m \quad \frac{\hbox{d}P}{\hbox{d}x} = -3.372040 \times 10^{-3} \, N/m^2 </math> | | style="text-align: center;" | <math>\rho = 1 \, Kg/m^3 \quad \nu = 1.472\times 10^{-4} \, m^2/s \quad \delta = 1 \, m \quad \frac{\hbox{d}P}{\hbox{d}x} = -3.372040 \times 10^{-3} \, N/m^2 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.262) |
|} | |} | ||
===3.6.1 Problem definition=== | ===3.6.1 Problem definition=== | ||
− | We model a domain defined by <math display="inline">\left[0,2\pi \right]\times \left[-\delta ,\delta \right]\times \left[0,2 \pi / 3\right]</math> in the stream-wise, wall-normal and cross-stream directions respectively, using the same domain as in <span id='citeF- | + | We model a domain defined by <math display="inline">\left[0,2\pi \right]\times \left[-\delta ,\delta \right]\times \left[0,2 \pi / 3\right]</math> in the stream-wise, wall-normal and cross-stream directions respectively, using the same domain as in <span id='citeF-21'></span>[[#cite-21|[21]]]. Zero velocity Dirichlet conditions are assigned on the wall sides and periodic boundary conditions are used in the remaining directions. |
The problem has been modeled using linear hexahedral and tetrahedral elements. In the first case, a grid of <math display="inline">64^3</math> elements has been used. Mesh nodes were placed regularly along the stream-wise and cross-stream directions while, in the wall-normal direction, a weighting function is used to move the nodes closer to the wall. The location <math display="inline">y^i</math> of the i''-th'' node in the wall-normal direction is chosen as | The problem has been modeled using linear hexahedral and tetrahedral elements. In the first case, a grid of <math display="inline">64^3</math> elements has been used. Mesh nodes were placed regularly along the stream-wise and cross-stream directions while, in the wall-normal direction, a weighting function is used to move the nodes closer to the wall. The location <math display="inline">y^i</math> of the i''-th'' node in the wall-normal direction is chosen as | ||
− | <span id="eq- | + | <span id="eq-3.263"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>y^i = \delta \, \dfrac{\hbox{tanh}\left(w \left(\dfrac{2 i}{n_{el}} - 1 \right)\right)}{\hbox{tanh}\left(w \right)} \qquad i \in \left[0 , n_{el} \right] </math> | | style="text-align: center;" | <math>y^i = \delta \, \dfrac{\hbox{tanh}\left(w \left(\dfrac{2 i}{n_{el}} - 1 \right)\right)}{\hbox{tanh}\left(w \right)} \qquad i \in \left[0 , n_{el} \right] </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.263) |
|} | |} | ||
with <math display="inline">w=2.432</math> for <math display="inline">n_{el} = 64</math> and <math display="inline">w=2.927</math> for <math display="inline">n_{el} = 32</math>, chosen so that the first node in the mesh is always at a dimensionless distance to the wall <math display="inline">y+ = 1</math>. For the tetrahedral cases, a mesh with the same nodal positions is used, but each hexahedra is split into six tetrahedra. | with <math display="inline">w=2.432</math> for <math display="inline">n_{el} = 64</math> and <math display="inline">w=2.927</math> for <math display="inline">n_{el} = 32</math>, chosen so that the first node in the mesh is always at a dimensionless distance to the wall <math display="inline">y+ = 1</math>. For the tetrahedral cases, a mesh with the same nodal positions is used, but each hexahedra is split into six tetrahedra. | ||
− | The time step for the simulation is chosen as <math display="inline">\Delta t = 0.04 \, s</math> which, according to the analysis in <span id='citeF- | + | The time step for the simulation is chosen as <math display="inline">\Delta t = 0.04 \, s</math> which, according to the analysis in <span id='citeF-62'></span>[[#cite-62|[62]]], should be sufficient to reproduce the features of the flow. We use the expected average velocity profile as the initial condition, adding a random fluctuation to destabilize the solution. Once a fully turbulent flow develops, the flow is left to evolve until it reaches a statistically homogeneous solution. With this, different averages and correlations are calculated using the approach presented in Chapter [[#4 Parallel implementation|4]]. Statistical results were collected at the integration points of each element, averaging over time and over planes parallel to the walls. |
− | We have performed multiple simulations using these settings to study the behaviour of different variants of the FIC formulation presented in the preceding pages. Note that all turbulent channel flow cases were run using the projections for the mass stabilization in Eq. [[#eq- | + | We have performed multiple simulations using these settings to study the behaviour of different variants of the FIC formulation presented in the preceding pages. Note that all turbulent channel flow cases were run using the projections for the mass stabilization in Eq. [[#eq-3.228|3.228]]. |
===3.6.2 Fixed combination parameter=== | ===3.6.2 Fixed combination parameter=== | ||
− | The first simulations were performed using the FIC formulation with a fixed combination parameter, set to <math display="inline">\beta=0.8</math>. The average stream-wise velocity <math display="inline"> \left\langle u \right\rangle </math>, relative to the friction velocity <math display="inline">u_\tau </math>, is shown in Fig. [[#img-21|21]], compared to the DNS data of Moser ''et al.'' <span id='citeF- | + | The first simulations were performed using the FIC formulation with a fixed combination parameter, set to <math display="inline">\beta=0.8</math>. The average stream-wise velocity <math display="inline"> \left\langle u \right\rangle</math>, relative to the friction velocity <math display="inline">u_\tau </math>, is shown in Fig. [[#img-21|21]], compared to the DNS data of Moser ''et al.'' <span id='citeF-51'></span>[[#cite-51|[51]]] for the same Reynolds number. |
<div id='img-21'></div> | <div id='img-21'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08f_u_means.png|230px|Channel flow – average stream-wise velocity profiles obtained using β=0.8, compared to the DNS data of Moser ''et al.'' <span id='citeF-51'></span>[[#cite-51|[51]]].]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure 21:''' Channel flow – average stream-wise velocity profiles obtained using <math>\beta=0.8</math>, compared to the DNS data of Moser ''et al.'' <span id='citeF- | + | | colspan="1" | '''Figure 21:''' Channel flow – average stream-wise velocity profiles obtained using <math>\beta=0.8</math>, compared to the DNS data of Moser ''et al.'' <span id='citeF-51'></span>[[#cite-51|[51]]]. |
|} | |} | ||
The velocity variances for the same simulation are shown in Fig. [[#img-22|22]]. In addition to the variances in each coordinate direction we also present the total turbulence kinetic energy, defined as | The velocity variances for the same simulation are shown in Fig. [[#img-22|22]]. In addition to the variances in each coordinate direction we also present the total turbulence kinetic energy, defined as | ||
− | <span id="eq- | + | <span id="eq-3.264"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>k = \dfrac{1}{2} \left( \left\langle u^{\prime } u^{\prime } \right\rangle | + | | style="text-align: center;" | <math>k = \dfrac{1}{2} \left( \left\langle u^{\prime } u^{\prime } \right\rangle + \left\langle v^{\prime } v^{\prime } \right\rangle + \left\langle w^{\prime } w^{\prime } \right\rangle \right) </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.264) |
|} | |} | ||
− | Additionally, we measured the dissipation of average stream-wise linear momentum in the wall-normal direction. We know from studying the RANS momentum equation that the average shear stress in the <math display="inline">xy</math> plane can be written as (see for example <span id='citeF- | + | Additionally, we measured the dissipation of average stream-wise linear momentum in the wall-normal direction. We know from studying the RANS momentum equation that the average shear stress in the <math display="inline">xy</math> plane can be written as (see for example <span id='citeF-50'></span>[[#cite-50|[50]]] or <span id='citeF-2'></span>[[#cite-2|[2]]]) |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>\left\langle \tau _{xy} \right\rangle | + | | style="text-align: center;" | <math>\left\langle \tau _{xy} \right\rangle = \rho \left\langle u^{\prime } v^{\prime } \right\rangle + \mu \frac{\partial \left\langle u \right\rangle}{\partial y} = \tau _w \frac{y}{\delta } </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.265) |
|} | |} | ||
where the first term of the middle equality represents the Reynolds stresses in the <math display="inline">xy</math> plane and the second the viscous dissipation due to the average velocity. This decomposition is shown in Fig. [[#img-23|23]] for the simulation performed using hexahedral elements. As the addition of the two terms is close to the expected straight line, we consider that the flow is in statistical equilibrium. | where the first term of the middle equality represents the Reynolds stresses in the <math display="inline">xy</math> plane and the second the viscous dissipation due to the average velocity. This decomposition is shown in Fig. [[#img-23|23]] for the simulation performed using hexahedral elements. As the addition of the two terms is close to the expected straight line, we consider that the flow is in statistical equilibrium. | ||
+ | <div id='img-22a'></div> | ||
+ | <div id='img-22b'></div> | ||
+ | <div id='img-22c'></div> | ||
+ | <div id='img-22d'></div> | ||
<div id='img-22'></div> | <div id='img-22'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08f_k_means.png|216px|Turbulence kinetic energy.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08f_uu_means.png|216px|Stream-wise velocity fluctuations $\av{\fl u \fl u}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Turbulence kinetic energy. | ||
+ | | (b) Stream-wise velocity fluctuations <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08f_vv_means.png|216px|Wall-normal velocity fluctuations $\av{\fl v \fl v}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08f_ww_means.png|216px|Cross-stream velocity fluctuations $\av{\fl w \fl w}$.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure 22:''' Channel flow – turbulence kinetic energy and Reynolds stresses obtained using <math>\beta=0.8</math>, compared to Moser ''et al.'' <span id='citeF- | + | | (c) Wall-normal velocity fluctuations <math display="inline"> \left\langle v^{\prime } v^{\prime } \right\rangle</math>. |
+ | | (d) Cross-stream velocity fluctuations <math display="inline"> \left\langle w^{\prime } w^{\prime } \right\rangle</math>. | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 22:''' Channel flow – turbulence kinetic energy and Reynolds stresses obtained using <math>\beta=0.8</math>, compared to Moser ''et al.'' <span id='citeF-51'></span>[[#cite-51|[51]]]. | ||
|} | |} | ||
<div id='img-23'></div> | <div id='img-23'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08f_hexa_uv_means.png|335px|Channel flow – average stress \left〈τₓy \right〉 profile obtained using hexahedra and fixed β=0.8.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure 23:''' Channel flow – average stress <math> \left\langle \tau _xy \right\rangle </math> profile obtained using hexahedra and fixed <math>\beta=0.8</math>. | + | | colspan="1" | '''Figure 23:''' Channel flow – average stress <math> \left\langle \tau _xy \right\rangle</math> profile obtained using hexahedra and fixed <math>\beta=0.8</math>. |
|} | |} | ||
We observe that the results obtained with linear hexahedra are closer to the expected values than those obtained with linear tetrahedra in all cases. This was to be expected, as hexahedra use trilinear shape functions, which define a richer interpolation than the linear functions used in tetrahedra. | We observe that the results obtained with linear hexahedra are closer to the expected values than those obtained with linear tetrahedra in all cases. This was to be expected, as hexahedra use trilinear shape functions, which define a richer interpolation than the linear functions used in tetrahedra. | ||
+ | <div id='img-24a'></div> | ||
+ | <div id='img-24b'></div> | ||
+ | <div id='img-24c'></div> | ||
+ | <div id='img-24d'></div> | ||
+ | <div id='img-24e'></div> | ||
<div id='img-24'></div> | <div id='img-24'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bf_comp_u_means.png|336px|Average stream-wise velocity]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bf_comp_k_means.png|216px|Turbulence kinetic energy.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Average stream-wise velocity | ||
+ | | (b) Turbulence kinetic energy. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bf_comp_uu_means.png|216px|Stream-wise velocity fluctuations $\av{\fl u \fl u}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bf_comp_vv_means.png|216px|Wall-normal velocity fluctuations $\av{\fl v \fl v}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (c) Stream-wise velocity fluctuations <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math>. | ||
+ | | (d) Wall-normal velocity fluctuations <math display="inline"> \left\langle v^{\prime } v^{\prime } \right\rangle</math>. | ||
|- | |- | ||
− | | colspan="2"|[[Image: | + | | colspan="2"|[[Image:Cotela_2016-fic_bf_comp_ww_means.png|216px|Cross-stream velocity fluctuations $\av{\fl w \fl w}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | (e) Cross-stream velocity fluctuations <math display="inline"> \left\langle w^{\prime } w^{\prime } \right\rangle</math>. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 24:''' Channel flow – velocity average and variances for a range of values of <math>\beta </math>, using tetrahedral meshes. | | colspan="2" | '''Figure 24:''' Channel flow – velocity average and variances for a range of values of <math>\beta </math>, using tetrahedral meshes. | ||
Line 4,070: | Line 3,937: | ||
===3.6.3 Variable combination parameter=== | ===3.6.3 Variable combination parameter=== | ||
− | The next set of tests was performed using Eq. [[#eq- | + | The next set of tests was performed using Eq. [[#eq-3.212|3.212]] to assign a value to the combination parameter <math display="inline">\beta </math>, while keeping the remaining simulation settings as in the fixed beta case. The minimum value of the coefficient was set to <math display="inline">\beta \geq 0.8</math> for the first tests, which produced the average velocity distribution presented in Fig. [[#img-25|25]] and the velocity variances shown in Fig. [[#img-26|26]], where we compare them to to the results obtained for a fixed coefficient in previous simulations. |
<div id='img-25'></div> | <div id='img-25'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08_64_all_u_means.png|336px|Channel flow – average stream-wise velocity profiles using a fixed or dynamic combination parameter.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="1" | '''Figure 25:''' Channel flow – average stream-wise velocity profiles using a fixed or dynamic combination parameter. | | colspan="1" | '''Figure 25:''' Channel flow – average stream-wise velocity profiles using a fixed or dynamic combination parameter. | ||
|} | |} | ||
+ | <div id='img-26a'></div> | ||
+ | <div id='img-26b'></div> | ||
+ | <div id='img-26c'></div> | ||
+ | <div id='img-26d'></div> | ||
<div id='img-26'></div> | <div id='img-26'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08_64_all_k_means.png|216px|Turbulence kinetic energy.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08_64_all_uu_means.png|216px|Stream-wise velocity fluctuations $\av{\fl u \fl u}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Turbulence kinetic energy. | ||
+ | | (b) Stream-wise velocity fluctuations <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08_64_all_vv_means.png|216px|Wall-normal velocity fluctuations $\av{\fl v \fl v}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08_64_all_ww_means.png|216px|Cross-stream velocity fluctuations $\av{\fl w \fl w}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (c) Wall-normal velocity fluctuations <math display="inline"> \left\langle v^{\prime } v^{\prime } \right\rangle</math>. | ||
+ | | (d) Cross-stream velocity fluctuations <math display="inline"> \left\langle w^{\prime } w^{\prime } \right\rangle</math>. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 26:''' Channel flow – turbulence kinetic energy and Reynolds stresses using a fixed or dynamic combination parameter. See legend in Fig. [[#img-25|25]]. | | colspan="2" | '''Figure 26:''' Channel flow – turbulence kinetic energy and Reynolds stresses using a fixed or dynamic combination parameter. See legend in Fig. [[#img-25|25]]. | ||
|} | |} | ||
+ | <div id='img-27a'></div> | ||
+ | <div id='img-27b'></div> | ||
+ | <div id='img-27c'></div> | ||
+ | <div id='img-27d'></div> | ||
+ | <div id='img-27e'></div> | ||
<div id='img-27'></div> | <div id='img-27'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bd_tetra_u_means.png|336px|Average stream-wise velocity]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bd_tetra_k_means.png|216px|Turbulence kinetic energy.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Average stream-wise velocity | ||
+ | | (b) Turbulence kinetic energy. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bd_tetra_uu_means.png|216px|Stream-wise velocity fluctuations $\av{\fl u \fl u}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bd_tetra_vv_means.png|216px|Wall-normal velocity fluctuations $\av{\fl v \fl v}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (c) Stream-wise velocity fluctuations <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math>. | ||
+ | | (d) Wall-normal velocity fluctuations <math display="inline"> \left\langle v^{\prime } v^{\prime } \right\rangle</math>. | ||
+ | |- | ||
+ | | colspan="2"|[[Image:Cotela_2016-fic_bd_tetra_ww_means.png|216px|Cross-stream velocity fluctuations $\av{\fl w \fl w}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | (e) Cross-stream velocity fluctuations <math display="inline"> \left\langle w^{\prime } w^{\prime } \right\rangle</math>. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 27:''' Channel flow – velocity average and variances obtained using linear tetrahedra and different limits for the dynamic combination parameter. | | colspan="2" | '''Figure 27:''' Channel flow – velocity average and variances obtained using linear tetrahedra and different limits for the dynamic combination parameter. | ||
|} | |} | ||
+ | <div id='img-28a'></div> | ||
+ | <div id='img-28b'></div> | ||
+ | <div id='img-28c'></div> | ||
+ | <div id='img-28d'></div> | ||
+ | <div id='img-28e'></div> | ||
<div id='img-28'></div> | <div id='img-28'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bd_hexa_u_means.png|335px|Average stream-wise velocity]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bd_hexa_k_means.png|216px|Turbulence kinetic energy.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Average stream-wise velocity | ||
+ | | (b) Turbulence kinetic energy. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bd_hexa_uu_means.png|216px|Stream-wise velocity fluctuations $\av{\fl u \fl u}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_bd_hexa_vv_means.png|216px|Wall-normal velocity fluctuations $\av{\fl v \fl v}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (c) Stream-wise velocity fluctuations <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math>. | ||
+ | | (d) Wall-normal velocity fluctuations <math display="inline"> \left\langle v^{\prime } v^{\prime } \right\rangle</math>. | ||
+ | |- | ||
+ | | colspan="2"|[[Image:Cotela_2016-fic_bd_hexa_ww_means.png|216px|Cross-stream velocity fluctuations $\av{\fl w \fl w}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | (e) Cross-stream velocity fluctuations <math display="inline"> \left\langle w^{\prime } w^{\prime } \right\rangle</math>. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 28:''' Channel flow – velocity average and variances obtained using linear hexahedra and different limits for the dynamic combination parameter. | | colspan="2" | '''Figure 28:''' Channel flow – velocity average and variances obtained using linear hexahedra and different limits for the dynamic combination parameter. | ||
|} | |} | ||
+ | <div id='img-29a'></div> | ||
+ | <div id='img-29b'></div> | ||
+ | <div id='img-29c'></div> | ||
+ | <div id='img-29d'></div> | ||
+ | <div id='img-29e'></div> | ||
<div id='img-29'></div> | <div id='img-29'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08d_mesh_u_means.png|321px|Average stream-wise velocity]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08d_mesh_k_means.png|216px|Turbulence kinetic energy.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Average stream-wise velocity | ||
+ | | (b) Turbulence kinetic energy. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08d_mesh_uu_means.png|216px|Stream-wise velocity fluctuations $\av{\fl u \fl u}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08d_mesh_vv_means.png|216px|Wall-normal velocity fluctuations $\av{\fl v \fl v}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (c) Stream-wise velocity fluctuations <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math>. | ||
+ | | (d) Wall-normal velocity fluctuations <math display="inline"> \left\langle v^{\prime } v^{\prime } \right\rangle</math>. | ||
+ | |- | ||
+ | | colspan="2"|[[Image:Cotela_2016-fic_b08d_mesh_ww_means.png|216px|Cross-stream velocity fluctuations $\av{\fl w \fl w}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | (e) Cross-stream velocity fluctuations <math display="inline"> \left\langle w^{\prime } w^{\prime } \right\rangle</math>. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 29:''' Channel flow – velocity average and variances obtained using different grid sizes (all results with dynamic <math>\beta \geq 0.8</math>). | | colspan="2" | '''Figure 29:''' Channel flow – velocity average and variances obtained using different grid sizes (all results with dynamic <math>\beta \geq 0.8</math>). | ||
|} | |} | ||
+ | <div id='img-30a'></div> | ||
+ | <div id='img-30b'></div> | ||
+ | <div id='img-30c'></div> | ||
+ | <div id='img-30d'></div> | ||
+ | <div id='img-30e'></div> | ||
<div id='img-30'></div> | <div id='img-30'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08d_gls_u_means.png|347px|Average stream-wise velocity]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08d_gls_k_means.png|216px|Turbulence kinetic energy.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Average stream-wise velocity | ||
+ | | (b) Turbulence kinetic energy. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08d_gls_uu_means.png|216px|Stream-wise velocity fluctuations $\av{\fl u \fl u}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-fic_b08d_gls_vv_means.png|216px|Wall-normal velocity fluctuations $\av{\fl v \fl v}$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (c) Stream-wise velocity fluctuations <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math>. | ||
+ | | (d) Wall-normal velocity fluctuations <math display="inline"> \left\langle v^{\prime } v^{\prime } \right\rangle</math>. | ||
+ | |- | ||
+ | | colspan="2"|[[Image:Cotela_2016-fic_b08d_gls_ww_means.png|216px|Cross-stream velocity fluctuations $\av{\fl w \fl w}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | (e) Cross-stream velocity fluctuations <math display="inline"> \left\langle w^{\prime } w^{\prime } \right\rangle</math>. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="2" | '''Figure 30:''' Channel flow – velocity average and variances obtained using FIC with a dynamic combination coefficient <math>\beta \geq 0.8</math> or GLS. | | colspan="2" | '''Figure 30:''' Channel flow – velocity average and variances obtained using FIC with a dynamic combination coefficient <math>\beta \geq 0.8</math> or GLS. | ||
Line 4,154: | Line 4,091: | ||
As the formulation we are proposing has a free parameter, the combination parameter <math display="inline">\beta </math>, we wanted to study the sensitivity to its value. In the cases where the parameter was fixed throughout the simulation, the general trend is to obtain lower variances the smaller the coefficient, which corresponds to giving more weight to the gradient diffusion term (see Fig. [[#img-24|24]]). This suggests that the gradient diffusion term introduces a significant amount of numerical dissipation, producing more homogeneous solutions. However, it must be noted that the average velocity profile is much less sensitive to the choice of parameter, producing very similar results in all cases. | As the formulation we are proposing has a free parameter, the combination parameter <math display="inline">\beta </math>, we wanted to study the sensitivity to its value. In the cases where the parameter was fixed throughout the simulation, the general trend is to obtain lower variances the smaller the coefficient, which corresponds to giving more weight to the gradient diffusion term (see Fig. [[#img-24|24]]). This suggests that the gradient diffusion term introduces a significant amount of numerical dissipation, producing more homogeneous solutions. However, it must be noted that the average velocity profile is much less sensitive to the choice of parameter, producing very similar results in all cases. | ||
− | If the combination parameter is set on each element according to the local weighting function of Eq. [[#eq- | + | If the combination parameter is set on each element according to the local weighting function of Eq. [[#eq-3.212|3.212]], the obtained velocity profiles are generally lower than those obtained with a fixed parameter and measured variances show a better agreement with the DNS data, specially in the <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math> correlation, which is the larger contribution to the total turbulence kinetic energy (see Fig. [[#img-26|26]]). In this case, the only external parameter is the minimum admissible value of <math display="inline">\beta </math>, but our experiments show that the results are not very sensitive to this parameter, at least if it is large enough, as can be observed in Fig. [[#img-27|27]] for tetrahedra and Fig. [[#img-28|28]] for hexahedra. |
− | Finally, we compared our approach to using a standard GLS stabilization, which, for linear elements, is equivalent to the Q-ASGS formulation presented in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]]. The results, shown in Fig. [[#img-30|30]], suggest that the formulation we propose results in a closer approximation to DNS data than the reference for a given mesh size. We propose two reasons a justification for this result. On one hand, we introduce a new term, the gradient diffusion, which has been shown to introduce an additional source of dissipation. On the other, the formulation we propose, unlike GLS, does not include a ''div-div'' term, which was shown in <span id='citeF- | + | Finally, we compared our approach to using a standard GLS stabilization, which, for linear elements, is equivalent to the Q-ASGS formulation presented in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]]. The results, shown in Fig. [[#img-30|30]], suggest that the formulation we propose results in a closer approximation to DNS data than the reference for a given mesh size. We propose two reasons a justification for this result. On one hand, we introduce a new term, the gradient diffusion, which has been shown to introduce an additional source of dissipation. On the other, the formulation we propose, unlike GLS, does not include a ''div-div'' term, which was shown in <span id='citeF-27'></span>[[#cite-27|[27]]] and in our own results in the previous chapter to have a negative impact in the turbulent channel case. |
Based on the results obtained in this set of tests, we conclude that setting the combination parameter locally, limited to a minimum value of <math display="inline">\beta \geq 0.8</math>, is the variant that better approximates the reference solution. As a result, we will adopt this formulation for the remaining cases. | Based on the results obtained in this set of tests, we conclude that setting the combination parameter locally, limited to a minimum value of <math display="inline">\beta \geq 0.8</math>, is the variant that better approximates the reference solution. As a result, we will adopt this formulation for the remaining cases. | ||
Line 4,162: | Line 4,099: | ||
==3.7 Flow around a cylinder== | ==3.7 Flow around a cylinder== | ||
− | The flow over a circular cylinder is a classical problem in CFD simulations, which has been studied extensively, both experimentally and numerically, as can be verified for example in the review of <span id='citeF- | + | The flow over a circular cylinder is a classical problem in CFD simulations, which has been studied extensively, both experimentally and numerically, as can be verified for example in the review of <span id='citeF-63'></span>[[#cite-63|[63]]]. Flow over circular cylinders exhibits a variable behavior depending on the Reynolds number, due to the different vortex shedding mechanisms that develop on the wake <span id='citeF-64'></span>[[#cite-64|[64]]]. As a benchmark example for the FIC formulation, we studied the case corresponding to a Reynolds number <math display="inline">\hbox{Re}= 3900</math> based on the diameter of the cylinder and the inflow velocity. This case was studied experimentally in <span id='citeF-65'></span>[[#cite-65|[65]]] and numerically in <span id='citeF-66'></span>[[#cite-66|[66]]] or <span id='citeF-67'></span>[[#cite-67|[67]]]. In this section, we will use a numerical set up similar to that of <span id='citeF-66'></span>[[#cite-66|[66]]] and compare our results to those presented in that reference. |
We simulated the flow over a cylinder with dimensionless diameter <math display="inline">D = 1</math> using a domain of <math display="inline">30 \,D \times 30 \,D</math>, centered on the cylinder, in the plane normal to the cylinder's axis, and <math display="inline">W = 3.14 \,D</math> in the span-wise direction. The simulation is run for <math display="inline">160</math> dimensionless time units (made dimensionless using the inflow velocity <math display="inline">U_\infty </math> and the diameter <math display="inline">D</math>) with a dimensionless time step <math display="inline">\delta t = 0.1</math>, which should provide sufficient resolution to capture the main vortex shedding frequency. | We simulated the flow over a cylinder with dimensionless diameter <math display="inline">D = 1</math> using a domain of <math display="inline">30 \,D \times 30 \,D</math>, centered on the cylinder, in the plane normal to the cylinder's axis, and <math display="inline">W = 3.14 \,D</math> in the span-wise direction. The simulation is run for <math display="inline">160</math> dimensionless time units (made dimensionless using the inflow velocity <math display="inline">U_\infty </math> and the diameter <math display="inline">D</math>) with a dimensionless time step <math display="inline">\delta t = 0.1</math>, which should provide sufficient resolution to capture the main vortex shedding frequency. | ||
Line 4,169: | Line 4,106: | ||
<div id='img-31'></div> | <div id='img-31'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-cylinder_planes.png|326px|Flow around a cylinder – simulation domain and measurement planes.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="1" | '''Figure 31:''' Flow around a cylinder – simulation domain and measurement planes. | | colspan="1" | '''Figure 31:''' Flow around a cylinder – simulation domain and measurement planes. | ||
Line 4,178: | Line 4,115: | ||
Linear tetrahedral elements have been used to mesh the domain, with sizes ranging between <math display="inline">0.03 \, D</math> near the cylinder to <math display="inline">0.5 \,D</math> in the far regions. This resulted in a total of <math display="inline">1.74</math> million nodes and <math display="inline">10</math> million elements. The velocity is fixed to a constant <math display="inline">U_\infty = 1\, m/s</math> for the inlet and to zero on the cylinder surface. Periodic boundary conditions have been used in the span-wise direction, while a no-penetration condition <math display="inline">v=0</math> has been imposed in the far sides on the cross-stream direction. The combination parameter for the FIC formulation is set locally for each element using the dynamic formulation, with a limit value of <math display="inline">\beta \geq 0.8</math>. | Linear tetrahedral elements have been used to mesh the domain, with sizes ranging between <math display="inline">0.03 \, D</math> near the cylinder to <math display="inline">0.5 \,D</math> in the far regions. This resulted in a total of <math display="inline">1.74</math> million nodes and <math display="inline">10</math> million elements. The velocity is fixed to a constant <math display="inline">U_\infty = 1\, m/s</math> for the inlet and to zero on the cylinder surface. Periodic boundary conditions have been used in the span-wise direction, while a no-penetration condition <math display="inline">v=0</math> has been imposed in the far sides on the cross-stream direction. The combination parameter for the FIC formulation is set locally for each element using the dynamic formulation, with a limit value of <math display="inline">\beta \geq 0.8</math>. | ||
− | The instantaneous stream-wise velocity field on the central <math display="inline">x</math>–<math display="inline">y</math> plane at the end of the simulation is shown in Fig. [[#img-32|32]]. The velocities on the <math display="inline">x</math>–<math display="inline">z</math> plane for the same time instant are shown in Fig. [[#img-33|33]]. From the stream-wise velocity component <math display="inline">u</math> in Fig | + | The instantaneous stream-wise velocity field on the central <math display="inline">x</math>–<math display="inline">y</math> plane at the end of the simulation is shown in Fig. [[#img-32|32]]. The velocities on the <math display="inline">x</math>–<math display="inline">z</math> plane for the same time instant are shown in Fig. [[#img-33|33]]. From the stream-wise velocity component <math display="inline">u</math> in Fig [[#img-33a|33a]], the formation of a recirculation zone just after the cylinder can be observed. Similarly, in Fig. [[#img-33b|33b]], which shows the instantaneous cross-stream component of velocity <math display="inline">v</math>, the alternating direction of the velocity suggests the formation of a vortex trail. |
<div id='img-32'></div> | <div id='img-32'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-cylinder_u_xy.png|330px|Flow around a cylinder – instantaneous stream-wise velocity u on the x–y midplane.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="1" | '''Figure 32:''' Flow around a cylinder – instantaneous stream-wise velocity <math>u</math> on the <math>x</math>–<math>y</math> midplane. | | colspan="1" | '''Figure 32:''' Flow around a cylinder – instantaneous stream-wise velocity <math>u</math> on the <math>x</math>–<math>y</math> midplane. | ||
|} | |} | ||
+ | <div id='img-33a'></div> | ||
+ | <div id='img-33b'></div> | ||
+ | <div id='img-33c'></div> | ||
<div id='img-33'></div> | <div id='img-33'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-cylinder_u_xz.png|332px|Stream-wise velocity $u$.]] |
+ | |[[Image:Cotela_2016-cylinder_v_xz.png|332px|Cross-stream velocity $v$.]] | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | (a) Stream-wise velocity <math>u</math>. |
+ | | (b) Cross-stream velocity <math>v</math>. | ||
+ | |- | ||
+ | | colspan="2"|[[Image:Cotela_2016-cylinder_w_xz.png|332px|Span-wise velocity $w$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | (c) Span-wise velocity <math>w</math>. | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 33:''' Flow around a cylinder – instantaneous velocities on the <math>x</math>–<math>z</math> midplane. | ||
|} | |} | ||
− | While the instantaneous velocity distributions give us a qualitative idea of the flow, we are interested in studying the statistics of the cylinder wake, which can give us a more quantitative idea of the quality of the simulation. We computed the average velocity in the stream-wise and cross-stream directions on different <math display="inline">y</math>–<math display="inline">z</math> sections (that is, normal to the mean flow) on the wake of the cylinder. The results in terms of averages, compared to those of <span id='citeF- | + | While the instantaneous velocity distributions give us a qualitative idea of the flow, we are interested in studying the statistics of the cylinder wake, which can give us a more quantitative idea of the quality of the simulation. We computed the average velocity in the stream-wise and cross-stream directions on different <math display="inline">y</math>–<math display="inline">z</math> sections (that is, normal to the mean flow) on the wake of the cylinder. The results in terms of averages, compared to those of <span id='citeF-66'></span>[[#cite-66|[66]]], are shown in Fig. [[#img-34|34]] for the near wake and in Fig. [[#img-35|35]] for the far wake. |
Observing the results, we can see that we obtain a close agreement with the reference, although the formation of the wake is slightly delayed when compared to the reference. This can be seen by considering that the average velocity defect on the wake should start as a deep ''U''-shaped trough just behind the cylinder, where the average flow in the recirculation zone is very small or negative on average, and become wider and shallower (closer to the inflow velocity <math display="inline">U_\infty </math>) as the wake develops. In general, our profiles are below the expected curve. | Observing the results, we can see that we obtain a close agreement with the reference, although the formation of the wake is slightly delayed when compared to the reference. This can be seen by considering that the average velocity defect on the wake should start as a deep ''U''-shaped trough just behind the cylinder, where the average flow in the recirculation zone is very small or negative on average, and become wider and shallower (closer to the inflow velocity <math display="inline">U_\infty </math>) as the wake develops. In general, our profiles are below the expected curve. | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-34a'></div> |
+ | <div id='img-34b'></div> | ||
+ | <div id='img-34'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-u_near.png|216px|Stream-wise velocity <math>u</math>.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-v_near.png|216px|Cross-stream velocity <math>v</math>.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | Flow around a cylinder | + | | (a) Stream-wise velocity <math>u</math>. |
+ | | (b) Cross-stream velocity <math>v</math>. | ||
+ | |- style="text-align: center; font-size: 75%; | ||
+ | | colspan="2" | '''Figure 34:''' Flow around a cylinder -- average velocities in the near wake. Reference [[Image:Cotela_2016-cylinder_legend_ref.png|600px|]], present work [[Image:Cotela_2016-cylinder_legend_mine.png|400px|]]. From top to bottom: <math>x/D=1.06</math>, <math>x/D=1.54</math>, <math>x/D=2.02</math>. | ||
+ | |- | ||
|} | |} | ||
− | In addition, we have also computed the variance of the stream-wise velocity <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle </math>, shown in Fig. | + | In addition, we have also computed the variance of the stream-wise velocity <math display="inline"> \left\langle u^{\prime } u^{\prime } \right\rangle</math>, shown in Fig. [[#img-36a|36a]] for the near wake and Fig. fig:fic_cyl_corr_far_uu for the far wake. The obtained variance is smaller in general than expected, which suggests a smoother flow and a more diffusive solution. The cross-correlation <math display="inline"> \left\langle u^{\prime } v^{\prime } \right\rangle</math> is shown in Fig. [[#img-36|36]] on the same planes where it was reported in the reference. This result shows some irregularity, in our solution as well as in the reference, which might be reduced with a longer simulation time. |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-35'></div> |
+ | <div id='img-35'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-u_far.png|288px|Flow around a cylinder.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-uu_near.png|288px|Flow around a cylinder.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | | + | | Flow around a cylinder – average stream-wise velocity <math>u</math> in the far wake. Reference [[Image:Cotela_2016-cylinder_legend_ref.png|600px|]], present work [[Image:Cotela_2016-cylinder_legend_mine.png|400px|]]. From top to bottom: <math>x/D=6.0</math>, <math>x/D=7.0</math>, <math>x/D=10.0</math>. |
− | | | + | | Flow around a cylinder – <math> \left\langle u^{\prime } u^{\prime } \right\rangle</math> correlation in the near wake. Reference [[Image:Cotela_2016-cylinder_legend_ref.png|600px|]], present work [[Image:Cotela_2016-cylinder_legend_mine.png|400px|]]. From top to bottom: <math>x/D=1.06</math>, <math>x/D=1.54</math>, <math>x/D=2.02</math>. |
− | + | |- style="text-align: center; font-size: 75%; | |
− | + | | colspan="2" | '''Figure 35''' | |
− | + | ||
− | |- | + | |
− | + | ||
− | | | + | |
|} | |} | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-36a'></div> |
+ | <div id='img-36b'></div> | ||
+ | <div id='img-36'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-uu_far.png|216px|Correlation.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-uv_far.png|216px|Correlation.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | Flow around a cylinder | + | | (a) <math>\left\langle u^{\prime } u^{\prime } \right\rangle</math> correlation. |
+ | | (b) <math>\left\langle u^{\prime } u^{\prime } \right\rangle</math> correlation. | ||
+ | |- | ||
+ | |- style="text-align: center; font-size: 75%; | ||
+ | | colspan="2" | '''Figure 36:''' Flow around a cylinder -- velocity correlations in the far wake. Reference [[Image:Cotela_2016-cylinder_legend_ref.png|600px|]], present work [[Image:Cotela_2016-cylinder_legend_mine.png|400px|]]. From top to bottom: <math>x/D=1.06</math>, <math>x/D=1.54</math>, <math>x/D=2.02</math>. | ||
+ | |- | ||
|} | |} | ||
Finally, we have computed the drag coefficient <math display="inline">C_D</math> and the Strouhal number <math display="inline">\hbox{St}</math>, which represents the dimensionless vortex shedding frequency, as given | Finally, we have computed the drag coefficient <math display="inline">C_D</math> and the Strouhal number <math display="inline">\hbox{St}</math>, which represents the dimensionless vortex shedding frequency, as given | ||
− | <span id="eq- | + | <span id="eq-3.266"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>C_D = \frac{ \left\langle R_x \right\rangle }{ \frac{1}{2} \rho U_\infty D W } \qquad \hbox{St} = \frac{f \, D}{U_\infty } </math> | | style="text-align: center;" | <math>C_D = \frac{ \left\langle R_x \right\rangle }{ \frac{1}{2} \rho U_\infty D W } \qquad \hbox{St} = \frac{f \, D}{U_\infty } </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.266) |
|} | |} | ||
− | where <math display="inline">\left\langle R_x \right\rangle </math> is the average force applied by the fluid on the surface of the cylinder in the stream-wise direction and <math display="inline">f</math> is the vortex-shedding frequency on the cylinder tail, which we have calculated from the lift force history <math display="inline">R_y\left(t\right)</math>. The results, compared to those reported in <span id='citeF- | + | where <math display="inline">\left\langle R_x \right\rangle</math> is the average force applied by the fluid on the surface of the cylinder in the stream-wise direction and <math display="inline">f</math> is the vortex-shedding frequency on the cylinder tail, which we have calculated from the lift force history <math display="inline">R_y\left(t\right)</math>. The results, compared to those reported in <span id='citeF-66'></span>[[#cite-66|[66]]], are reported in Table [[#table-2|2]]. |
− | {| class="wikitable" style="text-align: center; margin: 1em auto;" | + | {| class="floating_tableSCP wikitable" style="text-align: center; margin: 1em auto;min-width:50%;" |
− | |+ <span id='table-2'></span>Table. 2 Flow around a cylinder – flow parameters. | + | |+ style="font-size: 75%;" |<span id='table-2'></span>Table. 2 Flow around a cylinder – flow parameters. |
|- | |- | ||
| style="border-right: 2px solid;" | Analysis | | style="border-right: 2px solid;" | Analysis | ||
| style="border-left: 2px solid;border-right: 2px solid;" | <math>C_D</math> | | style="border-left: 2px solid;border-right: 2px solid;" | <math>C_D</math> | ||
| style="border-left: 2px solid;" | <math>\hbox{St}</math> | | style="border-left: 2px solid;" | <math>\hbox{St}</math> | ||
− | |- | + | |- style="border-top: 2px solid;" |
| style="border-right: 2px solid;" | Present simulation | | style="border-right: 2px solid;" | Present simulation | ||
| style="border-left: 2px solid;border-right: 2px solid;" | <math>1.09</math> | | style="border-left: 2px solid;border-right: 2px solid;" | <math>1.09</math> | ||
| style="border-left: 2px solid;" | <math>0.217</math> | | style="border-left: 2px solid;" | <math>0.217</math> | ||
|- | |- | ||
− | | style="border-right: 2px solid;" | Numerical <span id='citeF- | + | | style="border-right: 2px solid;" | Numerical <span id='citeF-66'></span>[[#cite-66|[66]]] |
| style="border-left: 2px solid;border-right: 2px solid;" | <math>1.04</math> | | style="border-left: 2px solid;border-right: 2px solid;" | <math>1.04</math> | ||
| style="border-left: 2px solid;" | <math>0.210</math> | | style="border-left: 2px solid;" | <math>0.210</math> | ||
|- | |- | ||
− | | style="border-right: 2px solid;" | Experimental (reported in <span id='citeF- | + | | style="border-right: 2px solid;" | Experimental (reported in <span id='citeF-66'></span>[[#cite-66|[66]]]) |
| style="border-left: 2px solid;border-right: 2px solid;" | <math>0.99 \pm 0.05</math> | | style="border-left: 2px solid;border-right: 2px solid;" | <math>0.99 \pm 0.05</math> | ||
| style="border-left: 2px solid;" | <math>0.215 \pm 0.005</math> | | style="border-left: 2px solid;" | <math>0.215 \pm 0.005</math> | ||
Line 4,276: | Line 4,237: | ||
As a final example we wanted to test the capabilities of the formulation when applied to an industrial problem. For this, we simulated the wind flow around a parabolic trough solar collector and compared it to experimental data. A parabolic trough is an array of parabolic mirrors that concentrate solar rays in their focus, where the solar energy is collected and used to operate a steam turbine generator. The mirrors can be large structures (the one we are studying is a parabola with a 5 meter aperture) and are susceptible to damage due to strong winds. As such, there is interest in studying the wind load over the mirror, both numerically and experimentally. | As a final example we wanted to test the capabilities of the formulation when applied to an industrial problem. For this, we simulated the wind flow around a parabolic trough solar collector and compared it to experimental data. A parabolic trough is an array of parabolic mirrors that concentrate solar rays in their focus, where the solar energy is collected and used to operate a steam turbine generator. The mirrors can be large structures (the one we are studying is a parabola with a 5 meter aperture) and are susceptible to damage due to strong winds. As such, there is interest in studying the wind load over the mirror, both numerically and experimentally. | ||
− | We are using one of such experiments as a reference, where a 1:25 scale model of a single mirror was placed in a wind tunnel. This experiment was performed for Abengoa Research, which has given us access to the data, and was reported in <span id='citeF- | + | We are using one of such experiments as a reference, where a 1:25 scale model of a single mirror was placed in a wind tunnel. This experiment was performed for Abengoa Research, which has given us access to the data, and was reported in <span id='citeF-68'></span><span id='citeF-69'></span>[[#cite-68|[68,69]]]. Note that, as requested by the company, we are providing all our results in scaled form to protect intellectual property. |
− | Due to the larger scale of the model compared to the previous examples, we will not attempt to reproduce the full boundary layer and the Werner-Wengle wall model <span id='citeF- | + | Due to the larger scale of the model compared to the previous examples, we will not attempt to reproduce the full boundary layer and the Werner-Wengle wall model <span id='citeF-70'></span>[[#cite-70|[70]]] will be used to introduce the equivalent wall friction close to solid surfaces. Additionally, as we are trying to reproduce a wind tunnel experiment with a turbulent incoming flow, we need to generate a time-dependent inlet condition which bears a statistical resemblance to a real wind signal (see for example <span id='citeF-71'></span>[[#cite-71|[71]]] or <span id='citeF-72'></span>[[#cite-72|[72]]]). |
The geometry of the collector is shown in Fig. [[#img-37|37]] at full scale. To reproduce the different configurations of the collector as it rotates over its axis to follow the sun, the seven cases shown in Fig. [[#img-38|38]] modifying the pitch of the mirror in increments of <math display="inline">30^\circ </math>. The average wind is always assumed to reach the collector frontally, so that the mirror presents the maximum possible area to the flow. | The geometry of the collector is shown in Fig. [[#img-37|37]] at full scale. To reproduce the different configurations of the collector as it rotates over its axis to follow the sun, the seven cases shown in Fig. [[#img-38|38]] modifying the pitch of the mirror in increments of <math display="inline">30^\circ </math>. The average wind is always assumed to reach the collector frontally, so that the mirror presents the maximum possible area to the flow. | ||
<div id='img-37'></div> | <div id='img-37'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-collector_dimensions.png|266px|Parabolic collector dimensions (full scale).]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| colspan="1" | '''Figure 37:''' Parabolic collector dimensions (full scale). | | colspan="1" | '''Figure 37:''' Parabolic collector dimensions (full scale). | ||
|} | |} | ||
+ | <div id='img-38a'></div> | ||
+ | <div id='img-38b'></div> | ||
+ | <div id='img-38c'></div> | ||
+ | <div id='img-38d'></div> | ||
+ | <div id='img-38e'></div> | ||
+ | <div id='img-38f'></div> | ||
+ | <div id='img-38g'></div> | ||
+ | <div id='img-38h'></div> | ||
<div id='img-38'></div> | <div id='img-38'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-collector000.png|100px|$ 0^\circ$]] |
− | |[[Image: | + | |[[Image:Cotela_2016-collector030.png|100px|$ 30^\circ$]] |
+ | |[[Image:Cotela_2016-collector060.png|100px|$ 60^\circ$]] | ||
+ | |[[Image:Cotela_2016-collector090.png|100px|$ 90^\circ$]] | ||
+ | |[[Image:Cotela_2016-collector120.png|100px|$120^\circ$]] | ||
+ | |[[Image:Cotela_2016-collector150.png|100px|$150^\circ$]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) <math> 0^\circ </math> | ||
+ | | (b) <math> 30^\circ </math> | ||
+ | | (c) <math> 60^\circ </math> | ||
+ | | (d) <math> 90^\circ </math> | ||
+ | | (e) <math>120^\circ </math> | ||
+ | | (f) <math>150^\circ </math> | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-collector180.png|100px|$180^\circ$]] |
− | |[[Image: | + | |[[Image:Cotela_2016-collector_wind_arrow.png|100px|]] |
− | |- | + | |- style="text-align: center; font-size: 75%;" |
− | + | | (g) <math>180^\circ </math> | |
− | + | | (h) | |
− | | | + | |
− | | | + | |
− | + | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | colspan="6" | '''Figure 38:''' Solar collector – pitch angles considered in the simulation. Wind blows from the left. |
|} | |} | ||
We simulated the collector at model scale (1:25), reproducing the wind tunnel experiment. The collector was placed on a fluid domain of <math display="inline">3 \times 2 \times 1.4 \, m</math> at model scale in the stream-wise, cross-stream and vertical directions, respectively, at <math display="inline">5 W = 1 \, m</math> from the inlet. | We simulated the collector at model scale (1:25), reproducing the wind tunnel experiment. The collector was placed on a fluid domain of <math display="inline">3 \times 2 \times 1.4 \, m</math> at model scale in the stream-wise, cross-stream and vertical directions, respectively, at <math display="inline">5 W = 1 \, m</math> from the inlet. | ||
− | The incoming wind is generated using the model of <span id='citeF- | + | The incoming wind is generated using the model of <span id='citeF-71'></span>[[#cite-71|[71]]] to follow a Kaimal wind spectrum <span id='citeF-73'></span>[[#cite-73|[73]]] with a reference stream-wise velocity <math display="inline">U_{ref} = 6.26 \, m/s</math> at <math display="inline">0.4 \, m</math> (corresponding to <math display="inline">10 \, m</math> at full scale) and a wall roughness <math display="inline">z_0 = 0.0012 \, m</math> (<math display="inline">z_0 = 0.03 \, m</math> at full scale). The air is assumed to have density <math display="inline">\rho = 1.225 \, Kg/m^3</math> and viscosity <math display="inline">\nu = 1.4604 \times 10^{-5} \, m^2/s</math>, resulting on a Reynolds number <math display="inline">\hbox{Re}\approx 85000</math> calculated using <math display="inline">U_{ref}</math> and <math display="inline">W</math>. |
The calculation was performed with an unstructured tetrahedral mesh, with mesh sizes ranging from <math display="inline">h = W/50 = 0.004 \, m</math> close to the mirror surface to <math display="inline">h = 0.32 \, W = 0.064 \, m</math> on the far regions. This resulted in approximately <math display="inline">1.5 \times 10^5</math> nodes and <math display="inline">8 \times 10^5</math> elements for each simulation. | The calculation was performed with an unstructured tetrahedral mesh, with mesh sizes ranging from <math display="inline">h = W/50 = 0.004 \, m</math> close to the mirror surface to <math display="inline">h = 0.32 \, W = 0.064 \, m</math> on the far regions. This resulted in approximately <math display="inline">1.5 \times 10^5</math> nodes and <math display="inline">8 \times 10^5</math> elements for each simulation. | ||
− | Instantaneous distributions of velocities and pressures close to the collector are shown in Fig. | + | Instantaneous distributions of velocities and pressures close to the collector are shown in Fig. [[#img-39|39]] for the case with pitch angle <math display="inline">60^\circ </math> and in Fig. [[#img-40|40]] for the case of <math display="inline">150^\circ </math> as an example of the results. As can be seen in the figures, a vortex trail develops due to the presence of the collector. |
+ | <div id='img-39a'></div> | ||
+ | <div id='img-39b'></div> | ||
<div id='img-39'></div> | <div id='img-39'></div> | ||
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-collector_p60_vel.png|213px|Velocity vectors.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-collector_p60_pres.png|213px|Pressure contours.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Velocity vectors. | ||
+ | | (b) Pressure contours. | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 39:''' Solar collector – instantaneous velocity and pressure fields for pitch angle <math>60^\circ </math>. | ||
+ | |} | ||
+ | |||
+ | <div id='img-40a'></div> | ||
+ | <div id='img-40b'></div> | ||
+ | <div id='img-40'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-collector_p150_vel.png|213px|Velocity vectors.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-collector_p150_pres.png|213px|Pressure contours.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Velocity vectors. | ||
+ | | (b) Pressure contours. | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 40:''' Solar collector – instantaneous velocity and pressure fields for pitch angle <math>150^\circ </math>. | ||
+ | |} | ||
+ | |||
+ | <div id='img-41a'></div> | ||
+ | <div id='img-41b'></div> | ||
+ | <div id='img-41c'></div> | ||
+ | <div id='img-41d'></div> | ||
+ | <div id='img-41e'></div> | ||
+ | <div id='img-41f'></div> | ||
+ | <div id='img-41'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-collector_avg_drag.png|216px|Average drag]] |
− | |[[Image: | + | |[[Image:Cotela_2016-collector_rms_drag.png|216px|RMS drag]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Average drag | ||
+ | | (b) RMS drag | ||
+ | |- | ||
+ | |[[Image:Cotela_2016-collector_avg_lift.png|216px|Average lift]] | ||
+ | |[[Image:Cotela_2016-collector_rms_lift.png|216px|RMS lift]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (c) Average lift | ||
+ | | (d) RMS lift | ||
+ | |- | ||
+ | |[[Image:Cotela_2016-collector_avg_momb.png|216px|Average moment]] | ||
+ | |[[Image:Cotela_2016-collector_rms_momb.png|216px|RMS moment]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (e) Average moment | ||
+ | | (f) RMS moment | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | colspan="2" | '''Figure 41:''' Solar collector – average reactions. |
|} | |} | ||
Line 4,336: | Line 4,356: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>C_D = \frac{\left\langle R_x \right\rangle }{0.5 \rho U_{ref}^2 \, W \, L} \qquad C_L = \frac{\left\langle R_z \right\rangle }{0.5 \rho U_{ref}^2 \, W \, L} \qquad C_M = \frac{\left\langle M_{yB} \right\rangle }{0.5 \rho U_{ref}^2 \, W^2 \, L} \qquad </math> | + | | style="text-align: center;" | <math>C_D = \frac{\left\langle R_x \right\rangle}{0.5 \rho U_{ref}^2 \, W \, L} \qquad C_L = \frac{\left\langle R_z \right\rangle}{0.5 \rho U_{ref}^2 \, W \, L} \qquad C_M = \frac{\left\langle M_{yB} \right\rangle}{0.5 \rho U_{ref}^2 \, W^2 \, L} \qquad </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (3.267) |
|} | |} | ||
− | the resulting statistics for the different pitch angles considered are compared to the experiment in Fig. [[#img- | + | the resulting statistics for the different pitch angles considered are compared to the experiment in Fig. [[#img-41|41]]. The results are presented relative to the maximum value in each experimental curve as requested by Abengoa. |
As was the general trend in the previous example, we achieve good accuracy in terms of the averages, while the results in terms of fluctuations (the RMS in this case) tend to be less accurate. In any case, we consider that this case serves as a proof of concept, showing that the formulation has potential to solve problems of practical interest in engineering, with complex geometries and variable inlet conditions. | As was the general trend in the previous example, we achieve good accuracy in terms of the averages, while the results in terms of fluctuations (the RMS in this case) tend to be less accurate. In any case, we consider that this case serves as a proof of concept, showing that the formulation has potential to solve problems of practical interest in engineering, with complex geometries and variable inlet conditions. | ||
Line 4,349: | Line 4,369: | ||
==3.9 Summary and conclusions== | ==3.9 Summary and conclusions== | ||
− | In the present chapter we have introduced a new FIC-based formulation for incompressible flows. The main features of our method are the presence of a new term on the momentum equation, which introduces an additional non-isotropic dissipation in the direction of the velocity gradients, and a stabilized formulation for the mass equation which is based on a second order FIC balance in space and represents an incompressible Eulerian version of the method presented for quasi-incompressible flows in <span id='citeF- | + | In the present chapter we have introduced a new FIC-based formulation for incompressible flows. The main features of our method are the presence of a new term on the momentum equation, which introduces an additional non-isotropic dissipation in the direction of the velocity gradients, and a stabilized formulation for the mass equation which is based on a second order FIC balance in space and represents an incompressible Eulerian version of the method presented for quasi-incompressible flows in <span id='citeF-59'></span>[[#cite-59|[59]]]. |
This method has a free parameter in the combination coefficient <math display="inline">\beta </math> that defines the relative weights of the ''classical'' streamline diffusion and the new gradient diffusion term in the stabilization of the momentum equation. We have proposed a way to define this coefficient dynamically, with the intent of improving the results and reducing the dependence of the solution on the free parameter. | This method has a free parameter in the combination coefficient <math display="inline">\beta </math> that defines the relative weights of the ''classical'' streamline diffusion and the new gradient diffusion term in the stabilization of the momentum equation. We have proposed a way to define this coefficient dynamically, with the intent of improving the results and reducing the dependence of the solution on the free parameter. | ||
Line 4,369: | Line 4,389: | ||
We have already remarked that one of the reasons why turbulent flow problems are challenging is that they involve fluid motions with very different characteristic sizes and, as a result, their numerical simulation requires very fine discretizations, both in space and in time. Even with the introduction of turbulence modeling, LES simulations for problems of practical interest in engineering require significant computational resources and are well beyond the range of what currently can be calculated in a reasonable time with a desktop computer. | We have already remarked that one of the reasons why turbulent flow problems are challenging is that they involve fluid motions with very different characteristic sizes and, as a result, their numerical simulation requires very fine discretizations, both in space and in time. Even with the introduction of turbulence modeling, LES simulations for problems of practical interest in engineering require significant computational resources and are well beyond the range of what currently can be calculated in a reasonable time with a desktop computer. | ||
− | Currently, the overwhelming majority of High Performance Computing (HPC) machines are distributed memory clusters (see for example the TOP500 list of the most powerful computer systems <span id='citeF- | + | Currently, the overwhelming majority of High Performance Computing (HPC) machines are distributed memory clusters (see for example the TOP500 list of the most powerful computer systems <span id='citeF-74'></span>[[#cite-74|[74]]]), in which many individual processors work in parallel on different parts of the problem to be solved. Such machines are organized as groups of interconnected calculation nodes, where each node contains one or several processors and a block of memory. In this calculation framework, there exists a very clear distinction between local data, stored in the node's memory, which is readily available to the processor, and non-local data, stored in a different node, which has to be requested to that node requires many more computation cycles to access. |
In the context of finite element simulations, large problems can be solved using a distributed memory approach by dividing the model domain into parallel subdomains, each containing a fraction of the finite element mesh, and assigning each of them to an individual processor. This requires careful design of the calculation software to solve the global problem while minimizing the exchange of information between the individual subdomains. | In the context of finite element simulations, large problems can be solved using a distributed memory approach by dividing the model domain into parallel subdomains, each containing a fraction of the finite element mesh, and assigning each of them to an individual processor. This requires careful design of the calculation software to solve the global problem while minimizing the exchange of information between the individual subdomains. | ||
Line 4,387: | Line 4,407: | ||
While there are multiple strategies to distribute data for finite element problems, the approach of Kratos Multiphysics consists in dividing the mesh into discrete subdomains, such that each individual element is assigned to a given processor, as shown for an example problem in Fig. fig:pi_partition_elements. In this approach, some of the mesh nodes will appear in two or more different subdomains, as they belong to elements assigned to different partitions. Such nodes will be called ''interface nodes''. | While there are multiple strategies to distribute data for finite element problems, the approach of Kratos Multiphysics consists in dividing the mesh into discrete subdomains, such that each individual element is assigned to a given processor, as shown for an example problem in Fig. fig:pi_partition_elements. In this approach, some of the mesh nodes will appear in two or more different subdomains, as they belong to elements assigned to different partitions. Such nodes will be called ''interface nodes''. | ||
− | <div id='img- | + | <div id='img-42a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-42b'></div> |
+ | <div id='img-42'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-partition_elements.png|123px|Element partition.\label{fig:pi_partition_elements}]] |
− | |[[Image: | + | |[[Image:Cotela_2016-partition_nodes.png|156px|Node partition.\label{fig:pi_partition_nodes}]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Element partition. | ||
+ | | (b) Node partition. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | colspan="2" | '''Figure 42:''' Division into subdomains. |
|} | |} | ||
It is critical to the solution of the problem that nodal data for interface nodes is consistent across the different partitions, which requires its synchronization given points of the solution procedure. To simplify this exchange of information, we found it convenient to also assign nodes to a given partition, which holds the reference values for nodal data. From the point of view of a calculation process, nodes which belong to its partition are defined as ''local nodes'', while interface nodes which are known but are assigned to a different partition are called ''ghost nodes''. An example of such partition is shown in Fig. fig:pi_partition_nodes, where local nodes are represented with a full circle in the color of the partition and ghost nodes are represented with empty circles. In the same figure, dashed lines represent inter-process communications which will be required during the solution procedure. | It is critical to the solution of the problem that nodal data for interface nodes is consistent across the different partitions, which requires its synchronization given points of the solution procedure. To simplify this exchange of information, we found it convenient to also assign nodes to a given partition, which holds the reference values for nodal data. From the point of view of a calculation process, nodes which belong to its partition are defined as ''local nodes'', while interface nodes which are known but are assigned to a different partition are called ''ghost nodes''. An example of such partition is shown in Fig. fig:pi_partition_nodes, where local nodes are represented with a full circle in the color of the partition and ghost nodes are represented with empty circles. In the same figure, dashed lines represent inter-process communications which will be required during the solution procedure. | ||
− | In a communication strategy, it is important to define not only which partitions have to share information with each other but also the order in which such communication is done. For example, the communication graph for the partition of Fig. [[#img- | + | In a communication strategy, it is important to define not only which partitions have to share information with each other but also the order in which such communication is done. For example, the communication graph for the partition of Fig. [[#img-42|42]] is shown in Fig. fig:pi_communication_all. |
− | <div id='img- | + | <div id='img-43a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-43b'></div> |
+ | <div id='img-43'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-partition_communication_full.png|100px|All links.\label{fig:pi_communication_all}]] |
− | |[[Image: | + | |[[Image:Cotela_2016-partition_communication_good.png|100px|Optimal.\label{fig:pi_communication_good}]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | (a) All links. |
+ | | (b) Optimal. | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 43:''' Communication patterns for the partition of Fig. [[#img-42|42]]. | ||
|} | |} | ||
Line 4,413: | Line 4,443: | ||
A more efficient approach is to try to group communications in a way that processes are never idle, such as in Fig. fig:pi_communication_good, considering one first stage where process 1 communicates with 2 and 3 with 4, followed by a second phase where process 1 communicates with 4 and 2 with 3. Reducing the number of total communication stages and, in this case, keeping all processes busy at all times. | A more efficient approach is to try to group communications in a way that processes are never idle, such as in Fig. fig:pi_communication_good, considering one first stage where process 1 communicates with 2 and 3 with 4, followed by a second phase where process 1 communicates with 4 and 2 with 3. Reducing the number of total communication stages and, in this case, keeping all processes busy at all times. | ||
− | In the case of Kratos Multiphysics, an existing code which had to be adapted for parallel simulations, the existing data structure had to be adapted to work in a distributed memory context. While we won't go into the details of the Kratos structure here (the interested reader is directed to <span id='citeF- | + | In the case of Kratos Multiphysics, an existing code which had to be adapted for parallel simulations, the existing data structure had to be adapted to work in a distributed memory context. While we won't go into the details of the Kratos structure here (the interested reader is directed to <span id='citeF-75'></span><span id='citeF-28'></span>[[#cite-75|[75,28]]]), we will just say that all model data is stored in an entity known as <nowiki>ModelPart</nowiki>, which contains the definition of the mesh and the associated nodal or elemental data. In a parallel context, each process defines its own <nowiki>ModelPart</nowiki>, which in this case contains all elements in the subdomain assigned to that process and all nodes (both local and ghost) required to perform the simulation. |
− | Data transfer across processes was achieved by adding an additional component in the <nowiki>ModelPart</nowiki>, the <nowiki>Communicator</nowiki>, which handles parallel communication <span id='citeF- | + | Data transfer across processes was achieved by adding an additional component in the <nowiki>ModelPart</nowiki>, the <nowiki>Communicator</nowiki>, which handles parallel communication <span id='citeF-29'></span>[[#cite-29|[29]]]. This object stores the communication strategy (which process will I communicate with on each stage) and the lists of local and ghost nodes to be exchanged in each stage. When data transfer is required, the <nowiki>Communicator</nowiki> collects the nodal data to send on each stage and exchanges it with the corresponding process using Message Passing Interface (MPI) calls <span id='citeF-76'></span>[[#cite-76|[76]]]. |
One of the advantages of this approach is that it allows to reuse a very significant part of the code between serial and parallel simulations. To do so, the code is programmed with the parallel implementation in mind, with all required data transfer performed through <nowiki>Communicator</nowiki> functions. Then, two different <nowiki>Communicator</nowiki> classes are implemented, one for parallel executions that works as defined above, and another for serial runs, which does nothing. With this approach, we have been able to significantly reduce code duplication, minimizing the maintenance problems related to keeping up to date a serial and a parallel version of the same code. | One of the advantages of this approach is that it allows to reuse a very significant part of the code between serial and parallel simulations. To do so, the code is programmed with the parallel implementation in mind, with all required data transfer performed through <nowiki>Communicator</nowiki> functions. Then, two different <nowiki>Communicator</nowiki> classes are implemented, one for parallel executions that works as defined above, and another for serial runs, which does nothing. With this approach, we have been able to significantly reduce code duplication, minimizing the maintenance problems related to keeping up to date a serial and a parallel version of the same code. | ||
Line 4,421: | Line 4,451: | ||
==4.3 Partitioning of input data== | ==4.3 Partitioning of input data== | ||
− | Once we have a data structure that can be used to hold and communicate distributed finite element data we need to be able to, given a simulation domain, generate a partition in as many subdomains as parallel processes will be used in the simulation and a communication strategy to transfer data between them. In Kratos Multiphysics, the usual situation is to have a single input file containing the entire simulation mesh, typically generated with GiD <span id='citeF- | + | Once we have a data structure that can be used to hold and communicate distributed finite element data we need to be able to, given a simulation domain, generate a partition in as many subdomains as parallel processes will be used in the simulation and a communication strategy to transfer data between them. In Kratos Multiphysics, the usual situation is to have a single input file containing the entire simulation mesh, typically generated with GiD <span id='citeF-77'></span>[[#cite-77|[77]]]. The partitioning procedure in this case constitutes one last step of the pre-process of the problem, generating separate inputs for each simulation domain. |
The partitioning process should generate balanced partitions, that is, all partitions should contain a similar number of elements and nodes, to ensure that the computational load is homogeneous for the different processors. A poorly balanced partition means that the processes with lighter work loads have to wait for the other to finish, resulting in longer total calculation times. In addition, the partition should minimize the amount of communication required relative to the total calculation time. This is sometimes expressed by saying that the computational cost of the simulation is proportional to the number of elements, that is to say, to the ''volume'' of the partition, while the communication costs are proportional to its ''surface''. Therefore, a good partitioning algorithm should minimize the surface to volume ratio for the partition. | The partitioning process should generate balanced partitions, that is, all partitions should contain a similar number of elements and nodes, to ensure that the computational load is homogeneous for the different processors. A poorly balanced partition means that the processes with lighter work loads have to wait for the other to finish, resulting in longer total calculation times. In addition, the partition should minimize the amount of communication required relative to the total calculation time. This is sometimes expressed by saying that the computational cost of the simulation is proportional to the number of elements, that is to say, to the ''volume'' of the partition, while the communication costs are proportional to its ''surface''. Therefore, a good partitioning algorithm should minimize the surface to volume ratio for the partition. | ||
− | We use a the capabilities provided by the METIS library <span id='citeF- | + | We use a the capabilities provided by the METIS library <span id='citeF-78'></span>[[#cite-78|[78]]], which generates a partition using a multi-level approach. Starting from a graph of nodal connectivities, multi-level methods are based in generating progressively coarser graphs by grouping close nodes together and generating an optimal partition of the coarsest graph. The partition is then refined by undoing the coarsening. Such approaches are considered to provide good quality partitions for unstructured meshes. |
As mentioned, the approach of METIS is based on the nodal graph, and provides a partition of the nodes. While there are some capabilities in METIS to divide the elements, they work for homogeneous meshes, composed of a single type of element<span id="fnc-1"></span>[[#fn-1|<sup>1</sup>]]. This was insufficient for our needs as, due to the way boundary integrals are implemented in Kratos Multiphysics, the meshes in the problems we are simulating are typically heterogeneous. A <math display="inline">3D</math> simulation, for example, may include tetrahedral volume elements, triangular faces used to apply Neumann boundary terms or wall laws, for example, and point-to-point links to apply periodic boundary conditions. All of these have to be taken into account when building the nodal graph and the latter in particular has a significant impact in the final partition, as it typically indicates a relation between two nodes that are geometrically far away. | As mentioned, the approach of METIS is based on the nodal graph, and provides a partition of the nodes. While there are some capabilities in METIS to divide the elements, they work for homogeneous meshes, composed of a single type of element<span id="fnc-1"></span>[[#fn-1|<sup>1</sup>]]. This was insufficient for our needs as, due to the way boundary integrals are implemented in Kratos Multiphysics, the meshes in the problems we are simulating are typically heterogeneous. A <math display="inline">3D</math> simulation, for example, may include tetrahedral volume elements, triangular faces used to apply Neumann boundary terms or wall laws, for example, and point-to-point links to apply periodic boundary conditions. All of these have to be taken into account when building the nodal graph and the latter in particular has a significant impact in the final partition, as it typically indicates a relation between two nodes that are geometrically far away. | ||
Line 4,433: | Line 4,463: | ||
Once this initial distribution in done, partitions are checked again for isolated nodes. Due to the way the element distribution procedure works, it can happen that some domain has a node but no elements that contain it. This situation would generate unnecessary communication, as the partition would have to store and update the reference data for a node it never uses, so those nodes are reassigned to a partition that needs them. | Once this initial distribution in done, partitions are checked again for isolated nodes. Due to the way the element distribution procedure works, it can happen that some domain has a node but no elements that contain it. This situation would generate unnecessary communication, as the partition would have to store and update the reference data for a node it never uses, so those nodes are reassigned to a partition that needs them. | ||
− | With the partition complete, the next step is to generate a communication strategy. To achieve this, we start by building the domain graph, stored as a matrix where term <math display="inline">a_{ij}</math> is non-zero if there is an interface between partitions <math display="inline">i</math> and <math display="inline">j</math>. For example, the graph for the domain of Fig. [[#img- | + | With the partition complete, the next step is to generate a communication strategy. To achieve this, we start by building the domain graph, stored as a matrix where term <math display="inline">a_{ij}</math> is non-zero if there is an interface between partitions <math display="inline">i</math> and <math display="inline">j</math>. For example, the graph for the domain of Fig. [[#img-42|42]] is |
− | <span id="eq- | + | <span id="eq-4.268"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{A} = \begin{bmatrix}0 & 1 & 0 & 1 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \\ 1 & 0 & 1 & 0 \end{bmatrix} </math> | | style="text-align: center;" | <math>\boldsymbol{A} = \begin{bmatrix}0 & 1 & 0 & 1 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \\ 1 & 0 & 1 & 0 \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.268) |
|} | |} | ||
− | The strategy to organize the communications is known as ''coloring'', as the problem is equivalent to assigning a color to all edges in the graph such that no two edges of the same color reach the same node. Once this is done, communication is achieved by transferring data across all interfaces of the same color at the same time. To perform the coloring, we use a simple approach, always assigning the first available color as they are needed, presented as Algorithm [[# | + | The strategy to organize the communications is known as ''coloring'', as the problem is equivalent to assigning a color to all edges in the graph such that no two edges of the same color reach the same node. Once this is done, communication is achieved by transferring data across all interfaces of the same color at the same time. To perform the coloring, we use a simple approach, always assigning the first available color as they are needed, presented as Algorithm [[#algorithm-3|3]]. This has been shown to be sub-optimal, as in the worst case it can use up to twice as many colors as the number of partitions. However, in our experience, obtained solutions are not usually as bad. A more concerning issue is that it is significantly more computationally expensive than an approach such as <span id='citeF-79'></span>[[#cite-79|[79]]], which would produce optimal strategies. |
− | |||
− | Set <math>N_p</math> to the number of partitions. Initialize matrix of colors <math>\boldsymbol{C}</math> with zeros. Maximum size of <math>\boldsymbol{C}</math> is <math>N_p \times 2 \, N_p</math> Set <math>N_c = 0</math>. <math>i</math> in <math>\left[1,N_{p}\right]</math> <math>j</math> in <math>\left[i+1,N_{p}\right]</math> <math>a_{ij}</math> is not <math>0</math> <math>a_{ij}</math> as given by Eq. [[#eq- | + | {| style="margin: 1em auto;border: 1px solid darkgray;" |
+ | |- | ||
+ | | | ||
+ | :Set <math>N_p</math> to the number of partitions. Initialize matrix of colors <math>\boldsymbol{C}</math> with zeros. Maximum size of <math>\boldsymbol{C}</math> is <math>N_p \times 2 \, N_p</math> Set <math>N_c = 0</math>. '''for''' <math>i</math> in <math>\left[1,N_{p}\right]</math> '''do''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : '''for''' <math>j</math> in <math>\left[i+1,N_{p}\right]</math> '''do''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : '''if''' <math>a_{ij}</math> is not <math>0</math> '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : <math>a_{ij}</math> as given by Eq. [[#eq-4.268|4.268]] '''for''' <math>k</math> in <math>\left[1,2\,N_{p}\right]</math> '''do''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : '''if''' <math>c_{ik}</math> is <math>0</math> '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : Use first available color <math>c_{jk} = i</math> <math>c_{ik} = j</math> '''if''' <math>k > N_c</math> '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : <math>N_c = k</math> '''break''' Once a color is assigned, skip to next communication '''return''' <math>N_c</math> Number of colors used | ||
+ | |||
+ | |||
+ | |- | ||
+ | | style="text-align: center; font-size: 75%;"| | ||
+ | <span id='algorithm-3'></span>'''Algorithm. 3''' A simple coloring procedure. | ||
+ | |} | ||
− | For the partition of Fig. [[#img- | + | For the partition of Fig. [[#img-42|42]], this procedure results in the following color matrix, where each column corresponds to a color and unused columns have been omitted: |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\boldsymbol{C} = \begin{bmatrix}2 & 4 \\ 1 & 3 \\ 4 & 2 \\ 3 & 1 \\ \end{bmatrix} </math> | | style="text-align: center;" | <math>\boldsymbol{C} = \begin{bmatrix}2 & 4 \\ 1 & 3 \\ 4 & 2 \\ 3 & 1 \\ \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.269) |
|} | |} | ||
Line 4,487: | Line 4,543: | ||
Once the problem domain is partitioned and a communication strategy has been determined the model is prepared for a parallel simulation. Compared to a serial solution, a distributed memory simulation introduces additional complications in the procedure. First, as the finite element mesh was divided into subdomains, the system matrix will also be distributed, with the contribution from each individual element being computed in the process that holds it. More importantly, once the system matrix has been assembled, it has to be solved using a distributed algorithm which can take full advantage of the parallel environment. In fact, the choice of a scalable parallel solver has a crucial impact on the parallel performance of the code. Finally, once the problem has been solved, the updated values for the variables are synchronized to ensure that nodal variables are consistent across the processors. | Once the problem domain is partitioned and a communication strategy has been determined the model is prepared for a parallel simulation. Compared to a serial solution, a distributed memory simulation introduces additional complications in the procedure. First, as the finite element mesh was divided into subdomains, the system matrix will also be distributed, with the contribution from each individual element being computed in the process that holds it. More importantly, once the system matrix has been assembled, it has to be solved using a distributed algorithm which can take full advantage of the parallel environment. In fact, the choice of a scalable parallel solver has a crucial impact on the parallel performance of the code. Finally, once the problem has been solved, the updated values for the variables are synchronized to ensure that nodal variables are consistent across the processors. | ||
− | In terms of the parallel finite element assembly procedure, Kratos Multiphysics relies on the Trilinos library <span id='citeF- | + | In terms of the parallel finite element assembly procedure, Kratos Multiphysics relies on the Trilinos library <span id='citeF-80'></span>[[#cite-80|[80]]] to construct and manage the system of linear equations that has to be solved on each iteration. In particular, Trilinos' Epetra package provides an implementation of distributed memory sparse matrices and vectors that can be used to hold the system data and communicate it to other processes when needed. |
Finite element matrices can typically be stored in a sparse format, since most of the terms in the system matrix are zero. Therefore, just as in the serial case, before constructing the system matrix and vector we need to determine the sparsity pattern and allocate the required memory. This is done based on the nodal graph: given that each matrix row (and column) corresponds to a given degree of freedom in the problem, an entry will be non-zero only if an element exists in the mesh connecting the nodes that the row and column degrees of freedom are associated to. Since the matrix implementation in Kratos Multiphysics is row-based, each row is considered local to the processor that owns the node associated to that row's degree of freedom. With this information we can generate the data structure that will hold the system data, which is ultimately an instance of Trilinos' <nowiki>Epetra_FECrsMatrix</nowiki> for the system matrix and an <nowiki>Epetra_FEVector</nowiki> for the right hand side vector. | Finite element matrices can typically be stored in a sparse format, since most of the terms in the system matrix are zero. Therefore, just as in the serial case, before constructing the system matrix and vector we need to determine the sparsity pattern and allocate the required memory. This is done based on the nodal graph: given that each matrix row (and column) corresponds to a given degree of freedom in the problem, an entry will be non-zero only if an element exists in the mesh connecting the nodes that the row and column degrees of freedom are associated to. Since the matrix implementation in Kratos Multiphysics is row-based, each row is considered local to the processor that owns the node associated to that row's degree of freedom. With this information we can generate the data structure that will hold the system data, which is ultimately an instance of Trilinos' <nowiki>Epetra_FECrsMatrix</nowiki> for the system matrix and an <nowiki>Epetra_FEVector</nowiki> for the right hand side vector. | ||
Line 4,497: | Line 4,553: | ||
Once the system is solved, we encounter the inverse problem: the new nodal values have to be communicated from the process that stores that particular row to all processes that have a copy of the corresponding node. Again, this requires a communication step. | Once the system is solved, we encounter the inverse problem: the new nodal values have to be communicated from the process that stores that particular row to all processes that have a copy of the corresponding node. Again, this requires a communication step. | ||
− | The (efficient and scalable) parallel solution of the system is, by itself, a different and very challenging problem, which will only be briefly presented here. Given the size of the systems to be solved, direct methods are not applicable due to their memory requirements and computational cost. A more adequate choice is to use parallel implementations of Krylov methods <span id='citeF- | + | The (efficient and scalable) parallel solution of the system is, by itself, a different and very challenging problem, which will only be briefly presented here. Given the size of the systems to be solved, direct methods are not applicable due to their memory requirements and computational cost. A more adequate choice is to use parallel implementations of Krylov methods <span id='citeF-81'></span>[[#cite-81|[81]]], which are very efficient solvers but are not designed as parallel algorithms and tend to require an increasing number of iterations to converge as more partitions are introduced. Alternatively, a variety of algorithms designed for parallelism exist, including Algebraic Multigrid (AMG) algorithms <span id='citeF-82'></span><span id='citeF-83'></span>[[#cite-82|[82,83]]], which introduce a hierarchy of increasingly coarser versions of the original problem and use the coarser solutions to accelerate the convergence of the finer problem, solution strategies based on domain decomposition techniques, in which each domain is solved separately and its effect on its neighbors is felt through boundary terms and deflation techniques, which combine an aggressive coarsening with domain decomposition. |
− | In Kratos Multiphysics, the usual approach has been to rely on the linear solvers provided by the Trilinos library, which includes both Krylov solvers on its Aztec package <span id='citeF- | + | In Kratos Multiphysics, the usual approach has been to rely on the linear solvers provided by the Trilinos library, which includes both Krylov solvers on its Aztec package <span id='citeF-84'></span>[[#cite-84|[84]]] and Multilevel algorithms through the ML <span id='citeF-85'></span>[[#cite-85|[85]]] library. This approach was used for example to simulate the benchmarks presented in <span id='citeF-29'></span>[[#cite-29|[29]]]. In the following pages we will use a different linear solver in combination with the incompressible flow formulation presented in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]]. This solver is provided by the AMGCL library <span id='citeF-86'></span><span id='citeF-87'></span>[[#cite-86|[86,87]]], currently under development, and is based on combining a deflated approach where the coarse problem is given by the MPI partition with an AMG solver within each subdomain. |
==4.5 Benchmark cases== | ==4.5 Benchmark cases== | ||
Line 4,509: | Line 4,565: | ||
The first test case is adapted from a real simulation mesh courtesy of the uLites<span id="fnc-2"></span>[[#fn-2|<sup>1</sup>]] project team. This project was concerned with the design and construction of inflatable structures subjected to wind loads and included the comparison of numerical and wind tunnel experiments on the designed structure. Here we take one of the simulation meshes, representing the geometry of a rigid scale model that was used in wind tunnel tests and simulate the flow around it using the Q-ASGS formulation described in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]]. | The first test case is adapted from a real simulation mesh courtesy of the uLites<span id="fnc-2"></span>[[#fn-2|<sup>1</sup>]] project team. This project was concerned with the design and construction of inflatable structures subjected to wind loads and included the comparison of numerical and wind tunnel experiments on the designed structure. Here we take one of the simulation meshes, representing the geometry of a rigid scale model that was used in wind tunnel tests and simulate the flow around it using the Q-ASGS formulation described in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]]. | ||
− | The model, presented in Figure [[#img- | + | The model, presented in Figure [[#img-44|44]], is composed of four cylindrical tubes with a diameter of <math display="inline">0.05\,\hbox{m}</math> folded into a semicircle with a radius of <math display="inline">0.2\,\hbox{m}</math>, measured from the tube centerline. The simulation domain, shown in Figure [[#img-45|45]], measures <math display="inline">2.6 \times 1.4 \times 1 \,\hbox{m}</math> in the streamwise, cross-stream and vertical directions, respectively, and the inlet is placed at <math display="inline">0.8\,\hbox{m}</math> of the axis of the module. |
The incoming flow is modeled as air with density <math display="inline">\rho = 1.25\,\hbox{Kg}/\hbox{m}^3</math> and viscosity <math display="inline">\mu = 1.875\times 10^{-5}\,\hbox{Pa}\cdot \hbox{s}</math> flowing at <math display="inline">5.5\,\hbox{m}/\hbox{s}</math>, which corresponds to a Reynolds number of approximately <math display="inline">7.3 \times 10^{4}</math> relative to the radius of the module. Velocity is fixed to zero on the floor and the surface of the module, while a no-penetration condition is used on the sides of the calculation domain. Note that, given the mesh resolution, a wall law would be a more adequate boundary condition for the solid boundaries, but we will not use it here in order to concentrate our attention on the fluid solver. | The incoming flow is modeled as air with density <math display="inline">\rho = 1.25\,\hbox{Kg}/\hbox{m}^3</math> and viscosity <math display="inline">\mu = 1.875\times 10^{-5}\,\hbox{Pa}\cdot \hbox{s}</math> flowing at <math display="inline">5.5\,\hbox{m}/\hbox{s}</math>, which corresponds to a Reynolds number of approximately <math display="inline">7.3 \times 10^{4}</math> relative to the radius of the module. Velocity is fixed to zero on the floor and the surface of the module, while a no-penetration condition is used on the sides of the calculation domain. Note that, given the mesh resolution, a wall law would be a more adequate boundary condition for the solid boundaries, but we will not use it here in order to concentrate our attention on the fluid solver. | ||
− | <div id='img- | + | <div id='img-44a'></div> |
− | <div id='img- | + | <div id='img-44b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-44'></div> |
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-ulites_top.png|155px|Top view.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-ulites_side.png|134px|Side view.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | (a) Top view. |
+ | | (b) Side view. | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 44:''' Inflatable structure model – geometry of the module. | ||
|} | |} | ||
− | <div id='img- | + | <div id='img-45'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-ulites_domain.png|215px|Inflatable structure model – dimensions of the simulation domain.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 45:''' Inflatable structure model – dimensions of the simulation domain. |
|} | |} | ||
Line 4,536: | Line 4,596: | ||
− | {| class="wikitable" style="text-align: center; margin: 1em auto;" | + | {| class="floating_tableSCP wikitable" style="text-align: center; margin: 1em auto;min-width:50%;" |
− | |+ <span id='table-3'></span>Table. 3 Inflatable structure test – measured times and parallel speedup for the <math>4</math> million element mesh. | + | |+ style="font-size: 75%;" |<span id='table-3'></span>Table. 3 Inflatable structure test – measured times and parallel speedup for the <math>4</math> million element mesh. |
|- | |- | ||
| colspan='2' style="border-right: 2px solid;border-right: 2px solid;" | MPI processes | | colspan='2' style="border-right: 2px solid;border-right: 2px solid;" | MPI processes | ||
Line 4,666: | Line 4,726: | ||
− | {| class="wikitable" style="text-align: center; margin: 1em auto;" | + | {| class="floating_tableSCP wikitable" style="text-align: center; margin: 1em auto;min-width:50%;" |
− | |+ <span id='table-4'></span>Table. 4 Inflatable structure test – measured times and parallel speedup for the <math>35</math> million element mesh. | + | |+ style="font-size: 75%;" |<span id='table-4'></span>Table. 4 Inflatable structure test – measured times and parallel speedup for the <math>35</math> million element mesh. |
|- | |- | ||
| colspan='2' style="border-right: 2px solid;border-right: 2px solid;" | MPI processes | | colspan='2' style="border-right: 2px solid;border-right: 2px solid;" | MPI processes | ||
Line 4,805: | Line 4,865: | ||
|} | |} | ||
− | The time costs of a single solution iteration are represented graphically in Fig. [[#img- | + | The time costs of a single solution iteration are represented graphically in Fig. [[#img-46|46]], where the first iteration is compared to a typical iteration, calculated using the average time for the build phase and the last time step average for the solve phase. Here again we see a different behavior for the first and a typical iteration, due to the cost of determining the structure of the system matrix and allocating the required memory. Once this is done, in subsequent iterations the computational cost is driven by the system solution, which takes considerably more time in all cases. |
− | <div id='img- | + | <div id='img-46a'></div> |
− | <div id='img- | + | <div id='img-46b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-46'></div> |
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-ulites_4m_time_bars.png|202px|4 million element mesh.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-ulites_30m_time_bars.png|202px|35 million element mesh.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | (a) 4 million element mesh. |
+ | | (b) 35 million element mesh. | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 46:''' Inflatable structure test – time costs of a single iteration. | ||
|} | |} | ||
− | To measure the parallel performance of the procedure we have measured the strong scalability of the algorithm, that is, we have compared the required taken to solve the same problem with an increasing number of processors. This is presented graphically in Fig. [[#img- | + | To measure the parallel performance of the procedure we have measured the strong scalability of the algorithm, that is, we have compared the required taken to solve the same problem with an increasing number of processors. This is presented graphically in Fig. [[#img-47|47]] for the <math display="inline">4</math> million element case. We can observe that the scalability behavior is basically driven by the system solution, which dominates the solution cost. The parallel efficiency of the finite element assembly is close to linear, taking <math display="inline">7.25</math> times less time when using eight times more processors, although parallel performance degrades when the number of elements per processor is low. This is to be expected, since the communication cost increases when using more processors while the individual work loads decrease as the number of elements per processor is reduced, which means that the total cost for large enough numbers of processors is dictated by communication operations. |
− | <div id='img- | + | <div id='img-47'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-ulites_4m_speedup.png|293px|Inflatable structure test – parallel speedup for the 4 million elements.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 47:''' Inflatable structure test – parallel speedup for the <math>4</math> million elements. |
|} | |} | ||
The behavior of the solution phase is possibly more unexpected. The costs reported in Table [[#table-3|3]] correspond to a better than linear scaling, which is a consequence of the design of the AMGCL solver, which requires less iterations for larger numbers of processors. In any case, we observe that parallel performance is good for smaller numbers of processors but stops being worthwhile for the last test, since doubling the number of processors from <math display="inline">384</math> to <math display="inline">768</math> only produces a modest reduction in calculation costs. Again, this is consistent with communication dominating the total cost of the procedure. | The behavior of the solution phase is possibly more unexpected. The costs reported in Table [[#table-3|3]] correspond to a better than linear scaling, which is a consequence of the design of the AMGCL solver, which requires less iterations for larger numbers of processors. In any case, we observe that parallel performance is good for smaller numbers of processors but stops being worthwhile for the last test, since doubling the number of processors from <math display="inline">384</math> to <math display="inline">768</math> only produces a modest reduction in calculation costs. Again, this is consistent with communication dominating the total cost of the procedure. | ||
− | The same strong scalability study can be done for the <math display="inline">35</math> million elements grid, producing the results presented in Fig. [[#img- | + | The same strong scalability study can be done for the <math display="inline">35</math> million elements grid, producing the results presented in Fig. [[#img-48|48]], and yields results that are qualitatively similar to those obtained for the <math display="inline">4</math> million element case. Here, however, the larger problem size means that we can use more processes before communication costs dominate, obtaining better scalability results for a given number of processors. |
− | <div id='img- | + | <div id='img-48'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-ulites_30m_speedup.png|279px|Inflatable structure test – parallel speedup for the 35 million elements.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 48:''' Inflatable structure test – parallel speedup for the <math>35</math> million elements. |
|} | |} | ||
Line 4,842: | Line 4,906: | ||
− | {| class="wikitable" style="text-align: center; margin: 1em auto;" | + | {| class="floating_tableSCP wikitable" style="text-align: center; margin: 1em auto;min-width:50%;" |
− | |+ <span id='table-5'></span>Table. 5 Inflatable structure test – weak scalability estimate. | + | |+ style="font-size: 75%;" |<span id='table-5'></span>Table. 5 Inflatable structure test – weak scalability estimate. |
|- | |- | ||
| style="border-right: 2px solid;" | Time ratio (fine problem/coarse problem) | | style="border-right: 2px solid;" | Time ratio (fine problem/coarse problem) | ||
| style="border-left: 2px solid;border-right: 2px solid;" | <math>t_{768}/t_{96}</math> | | style="border-left: 2px solid;border-right: 2px solid;" | <math>t_{768}/t_{96}</math> | ||
| style="border-left: 2px solid;" | <math>t_{1536}/t_{192}</math> | | style="border-left: 2px solid;" | <math>t_{1536}/t_{192}</math> | ||
− | |- | + | |- style="border-top: 2px solid;" |
| style="border-right: 2px solid;" | Average assembly time ratio | | style="border-right: 2px solid;" | Average assembly time ratio | ||
| style="border-left: 2px solid;border-right: 2px solid;" | <math>1.01</math> | | style="border-left: 2px solid;border-right: 2px solid;" | <math>1.01</math> | ||
Line 4,863: | Line 4,927: | ||
===4.5.2 Flow around a race car=== | ===4.5.2 Flow around a race car=== | ||
− | The second example we used to benchmark the solver is the flow around a race car, using the geometry shown in Fig. [[#img- | + | The second example we used to benchmark the solver is the flow around a race car, using the geometry shown in Fig. [[#img-49|49]], adapted from <span id='citeF-88'></span>[[#cite-88|[88]]]. The car is <math display="inline">5\,\hbox{m}</math> long, <math display="inline">1.8\,\hbox{m}</math> wide and <math display="inline">1\,\hbox{m}</math> high and it is placed within a fluid domain measuring <math display="inline">13.2\times 6 \times 3.1 \,\hbox{m}</math> in the streamwise, cross-stream and vertical directions respectively. The problem being simulated consists in a flow of air (<math display="inline">\rho = 1.25\,\hbox{Kg}/\hbox{m}^3</math>, <math display="inline">\mu = 1.875\times 10^{-5}\,\hbox{Pa}\cdot \hbox{s}</math>) at <math display="inline">1\,\hbox{m}/\hbox{s}</math>, which corresponds to a Reynolds number of <math display="inline">1.67\times 10^{5}</math>. |
− | <div id='img- | + | <div id='img-49'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-f1_domain.png|360px|Race car test – geometrical model.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 49:''' Race car test – geometrical model. |
|} | |} | ||
− | As in the previous case, the mesh is not designed for high-quality simulation (this would require a boundary layer mesh or at least a wall law) but to test the parallel capabilities of the solver. We test two different meshes: the first one contains <math display="inline">2.3</math> million nodes and <math display="inline">12.7</math> million tetrahedral elements with sizes ranging between <math display="inline">20\,\hbox{mm}</math> close to the surface of the car and <math display="inline">0.9\hbox{m}</math> in the far regions, while the second one is obtained by the edge refinement of the first, which is composed of <math display="inline">17.7</math> million nodes and <math display="inline">102</math> million elements. Some details of the finest mesh used in the tests can be observed in Fig. [[#img- | + | As in the previous case, the mesh is not designed for high-quality simulation (this would require a boundary layer mesh or at least a wall law) but to test the parallel capabilities of the solver. We test two different meshes: the first one contains <math display="inline">2.3</math> million nodes and <math display="inline">12.7</math> million tetrahedral elements with sizes ranging between <math display="inline">20\,\hbox{mm}</math> close to the surface of the car and <math display="inline">0.9\hbox{m}</math> in the far regions, while the second one is obtained by the edge refinement of the first, which is composed of <math display="inline">17.7</math> million nodes and <math display="inline">102</math> million elements. Some details of the finest mesh used in the tests can be observed in Fig. [[#img-50|50]]. |
− | <div id='img- | + | <div id='img-50a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-50b'></div> |
+ | <div id='img-50'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-f1_mesh_1.png|270px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-f1_mesh_2.png|270px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | colspan="2" | '''Figure 50:''' Race car test – details of the finer mesh. |
|} | |} | ||
Line 4,887: | Line 4,956: | ||
− | {| class="wikitable" style="text-align: center; margin: 1em auto;" | + | {| class="floating_tableSCP wikitable" style="text-align: center; margin: 1em auto;min-width:50%;" |
− | |+ <span id='table-6'></span>Table. 6 Race car test – measured times and parallel speedup for the <math>12</math> million element mesh. | + | |+ style="font-size: 75%;" |<span id='table-6'></span>Table. 6 Race car test – measured times and parallel speedup for the <math>12</math> million element mesh. |
|- | |- | ||
| colspan='2' style="border-right: 2px solid;border-right: 2px solid;" | MPI processes | | colspan='2' style="border-right: 2px solid;border-right: 2px solid;" | MPI processes | ||
Line 4,993: | Line 5,062: | ||
|} | |} | ||
− | The parallel efficiency, in terms of strong scalability, is presented in graphical form in Fig. [[#img- | + | The parallel efficiency, in terms of strong scalability, is presented in graphical form in Fig. [[#img-51|51]]. The finite element procedure shows good scalability up to <math display="inline">1536</math> processors, where increasing <math display="inline">8</math> times the number of processors reduces the assembly time by a factor of <math display="inline">7.32</math>. This simulation, which corresponds to around <math display="inline">8</math> thousand elements per process, gives us an upper limit to the scalability of the current implementation since, from this point on, increasing the number of processes does not result in a reduction of the assembly time. The system solution follows a similar trend, since in this case the solution time is actually increased when the number of processors is doubled from <math display="inline">1536</math> to <math display="inline">3072</math>. |
− | <div id='img- | + | <div id='img-51'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-f1_12m_speedup.png|291px|Race car test – parallel speedup for the 12 million elements.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 51:''' Race car test – parallel speedup for the <math>12</math> million elements. |
|} | |} | ||
− | The same test was simulated using the <math display="inline">102</math> million element mesh and the measured times are reported in Table [[#table-7|7]]. Some snapshots of the obtained velocity field are shown in Fig. [[#img- | + | The same test was simulated using the <math display="inline">102</math> million element mesh and the measured times are reported in Table [[#table-7|7]]. Some snapshots of the obtained velocity field are shown in Fig. [[#img-52|52]], to provide an idea of the mesh resolution and the nature of the solution after five time steps. We observe that, with a larger model, we do not reach the limit of the parallel implementation as in the previous case, although the parallel performance does drop slightly for the cases with more processors. |
− | {| class="wikitable" style="text-align: center; margin: 1em auto;" | + | {| class="floating_tableSCP wikitable" style="text-align: center; margin: 1em auto;min-width:50%;" |
− | |+ <span id='table-7'></span>Table. 7 Race car test – measured times and parallel speedup for the <math>102</math> million element mesh. | + | |+ style="font-size: 75%;" |<span id='table-7'></span>Table. 7 Race car test – measured times and parallel speedup for the <math>102</math> million element mesh. |
|- | |- | ||
| colspan='2' style="border-right: 2px solid;border-right: 2px solid;" | MPI processes | | colspan='2' style="border-right: 2px solid;border-right: 2px solid;" | MPI processes | ||
Line 5,112: | Line 5,181: | ||
|} | |} | ||
− | <div id='img- | + | <div id='img-52a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-52b'></div> |
+ | <div id='img-52'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-f1_vectors_1.png|270px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-f1_vectors_2.png|270px|]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | colspan="2" | '''Figure 52:''' Race car test – details of the velocity solution on the finer mesh. |
|} | |} | ||
− | The relative costs of the finite element assembly and solution phases are shown in Fig. [[#img- | + | The relative costs of the finite element assembly and solution phases are shown in Fig. [[#img-53|53]]. As in the inflatable structure test, we see that the solution represents takes the lion's share of the computational time and will have the most impact on the overall performance of the code. Again, we see that the first solution step has a significantly increased cost due to the additional operations and poor scalability, although the drop in parallel performance is not so severe as in the previous example. |
− | <div id='img- | + | <div id='img-53a'></div> |
− | <div id='img- | + | <div id='img-53b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-53'></div> |
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-f1_12m_time_bars.png|202px|12 million element mesh.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-f1_100m_time_bars.png|202px|102 million element mesh.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) 12 million element mesh. | ||
+ | | (b) 102 million element mesh. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | colspan="2" | '''Figure 53:''' Race car test – time costs of a single iteration. |
|} | |} | ||
− | The strong scalability results of the <math display="inline">102</math> million element case are presented in graphical form in Fig. [[#img- | + | The strong scalability results of the <math display="inline">102</math> million element case are presented in graphical form in Fig. [[#img-54|54]]. As was already mentioned, we do not observe the same drop in parallel performance as in the smaller model, due to the fact that here we have 8 times more elements per process. The assembly phase shows good performance up to the largest test, where the reduction in time is less than would correspond to the increase in processors, but the overall performance continues to be dictated by the system solution costs. The system solution shows good parallel performance in all cases. |
− | <div id='img- | + | <div id='img-54'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-f1_100m_speedup.png|291px|Race car test – parallel speedup for the 102 million elements.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 54:''' Race car test – parallel speedup for the <math>102</math> million elements. |
|} | |} | ||
Line 5,146: | Line 5,224: | ||
− | {| class="wikitable" style="text-align: center; margin: 1em auto;" | + | {| class="floating_tableSCP wikitable" style="text-align: center; margin: 1em auto;min-width:50%;" |
− | |+ <span id='table-8'></span>Table. 8 Race car test – weak scalability estimate. | + | |+ style="font-size: 75%;" |<span id='table-8'></span>Table. 8 Race car test – weak scalability estimate. |
|- | |- | ||
| style="border-right: 2px solid;" | Time ratio (fine problem/coarse problem) | | style="border-right: 2px solid;" | Time ratio (fine problem/coarse problem) | ||
| style="border-left: 2px solid;border-right: 2px solid;" | <math>t_{1536}/t_{192}</math> | | style="border-left: 2px solid;border-right: 2px solid;" | <math>t_{1536}/t_{192}</math> | ||
| style="border-left: 2px solid;" | <math>t_{3072}/t_{384}</math> | | style="border-left: 2px solid;" | <math>t_{3072}/t_{384}</math> | ||
− | |- | + | |- style="border-top: 2px solid;" |
| style="border-right: 2px solid;" | Average assembly time ratio | | style="border-right: 2px solid;" | Average assembly time ratio | ||
| style="border-left: 2px solid;border-right: 2px solid;" | <math>0.997</math> | | style="border-left: 2px solid;border-right: 2px solid;" | <math>0.997</math> | ||
Line 5,168: | Line 5,246: | ||
To understand the problems posed by the calculation of statistical results, consider for example the unbiased estimator of the variance <math display="inline">\sigma ^2</math> of a random variable <math display="inline">x</math> obtained using <math display="inline">n</math> samples, given by | To understand the problems posed by the calculation of statistical results, consider for example the unbiased estimator of the variance <math display="inline">\sigma ^2</math> of a random variable <math display="inline">x</math> obtained using <math display="inline">n</math> samples, given by | ||
− | <span id="eq- | + | <span id="eq-4.270"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\sigma _n^2 = \frac{1}{n-1} \sum ^n_k \left(x_k - \mu _n \right)^2 </math> | | style="text-align: center;" | <math>\sigma _n^2 = \frac{1}{n-1} \sum ^n_k \left(x_k - \mu _n \right)^2 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.270) |
|} | |} | ||
where <math display="inline">\mu _n</math> is the estimate of the mean of <math display="inline">x</math> obtained using <math display="inline">n</math> samples, | where <math display="inline">\mu _n</math> is the estimate of the mean of <math display="inline">x</math> obtained using <math display="inline">n</math> samples, | ||
− | <span id="eq- | + | <span id="eq-4.271"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\mu _n = \frac{1}{n} \sum ^n_k x_k </math> | | style="text-align: center;" | <math>\mu _n = \frac{1}{n} \sum ^n_k x_k </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.271) |
|} | |} | ||
− | The naive approach to the computation of the variance of <math display="inline">x</math> involves two loops over the data series: a first one using Eq. [[#eq- | + | The naive approach to the computation of the variance of <math display="inline">x</math> involves two loops over the data series: a first one using Eq. [[#eq-4.271|4.271]] to obtain <math display="inline">\mu _n</math> and a second one to evaluate Eq. [[#eq-4.270|4.270]]. To do so, one should store the entire dataset and analyse it as a post-process. Take as an example the turbulent channel flow simulations using linear hexahedral elements. To record statistical data on this problem, the different values of interest were sampled on the integration points of the mesh. Using second order Gaussian integration we have 8 Gauss points per element. With up to <math display="inline">64^3</math> hexahedra, we obtain <math display="inline">2^{21} \approx 2.1 \times 10^6</math> samples per variable and time step. Keeping in mind that we want to calculate statistics involving all three velocity components, pressures and their gradients, storing the entire data set soon becomes very expensive in terms of memory. |
− | Even if that data was effectively collected, consider that we used it to compute plane averages. In a parallel environment, the integration points on a given plane will likely lie on multiple processes, so the entire data set for the plane has to be gathered on a single process in order to evaluate Eq. [[#eq- | + | Even if that data was effectively collected, consider that we used it to compute plane averages. In a parallel environment, the integration points on a given plane will likely lie on multiple processes, so the entire data set for the plane has to be gathered on a single process in order to evaluate Eq. [[#eq-4.270|4.270]]. |
− | When calculating the variance, one might compute it without storing the entire data series by manipulating Eq. [[#eq- | + | When calculating the variance, one might compute it without storing the entire data series by manipulating Eq. [[#eq-4.270|4.270]] to obtain |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\sigma ^2_n = \frac{n}{n-1} \left(\frac{1}{n} \sum ^n_k x_k^2 - \mu _n^2 \right) </math> | | style="text-align: center;" | <math>\sigma ^2_n = \frac{n}{n-1} \left(\frac{1}{n} \sum ^n_k x_k^2 - \mu _n^2 \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.272) |
|} | |} | ||
− | which can be calculated in a single pass, thus avoiding the need to store the data series. Unfortunately, this expression runs into numerical roundoff errors if <math display="inline">\sigma ^2_n \ll \mu ^2_n</math>. This is easy to see if one considers that in this case, <math display="inline">x_k - \mu _n</math> can be expected to be a small number for each individual term in the summation of Eq. [[#eq- | + | which can be calculated in a single pass, thus avoiding the need to store the data series. Unfortunately, this expression runs into numerical roundoff errors if <math display="inline">\sigma ^2_n \ll \mu ^2_n</math>. This is easy to see if one considers that in this case, <math display="inline">x_k - \mu _n</math> can be expected to be a small number for each individual term in the summation of Eq. [[#eq-4.270|4.270]], while both <math display="inline">\sum ^n_k x_k^2</math> and <math display="inline">\mu _n^2</math> will be large positive numbers, so their difference might have too few significant digits<span id="fnc-3"></span>[[#fn-3|<sup>1</sup>]]. |
− | Instead, we have followed the approach of <span id='citeF- | + | Instead, we have followed the approach of <span id='citeF-89'></span>[[#cite-89|[89]]], which provided formulas to compute the mean and variance of a data set given the means and variances of two sub-sets of the data. A similar procedure is presented for third and fourth order moments in <span id='citeF-90'></span>[[#cite-90|[90]]] and generalized to arbitrary order moments in <span id='citeF-91'></span>[[#cite-91|[91]]]. These formulas allowed us to calculate statistical results in a single pass, storing (and communicating across processes when needed) only a partial result for each statistic. |
<span id="fn-3"></span> | <span id="fn-3"></span> | ||
Line 5,222: | Line 5,300: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>\sum ^n_k x_k = \sum ^{n_a}_i x_i + \sum ^{n_b}_j x_j </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> n \mu _n = n_a \mu _a + n_b \mu _b </math> |
− | + | ||
|} | |} | ||
|} | |} | ||
Line 5,235: | Line 5,311: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>n \mu _n = \left(n - n_b \right)\mu _a + n_b \mu _b = n \mu _a + n_b \left(\mu _b - \mu _a \right) </math> | | style="text-align: center;" | <math>n \mu _n = \left(n - n_b \right)\mu _a + n_b \mu _b = n \mu _a + n_b \left(\mu _b - \mu _a \right) </math> | ||
Line 5,243: | Line 5,319: | ||
defining <math display="inline">\delta _{ba} = \mu _b - \mu _a</math> we can write | defining <math display="inline">\delta _{ba} = \mu _b - \mu _a</math> we can write | ||
− | <span id="eq- | + | <span id="eq-4.273"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\mu _n = \mu _a + \frac{n_b}{n}\delta _{ba} </math> | | style="text-align: center;" | <math>\mu _n = \mu _a + \frac{n_b}{n}\delta _{ba} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.273) |
|} | |} | ||
− | Eq. [[#eq- | + | Eq. [[#eq-4.273|4.273]] can be introduced in Eq. [[#eq-4.270|4.270]] to obtain a single pass formula for variances. Introducing the intermediate result <math display="inline">M_{2,n} = \left(n-1\right)\sigma ^2_n</math>, |
− | <span id="eq- | + | <span id="eq-4.274"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>M_{2,n} = \sum ^n_k \left(x_k - \mu _n \right)^2 = \sum ^{n_a}_k \left(x_k - \mu _n \right)^2 + \sum ^{_b} n_k \left(x_k - \mu _n \right)^2 </math> | | style="text-align: center;" | <math>M_{2,n} = \sum ^n_k \left(x_k - \mu _n \right)^2 = \sum ^{n_a}_k \left(x_k - \mu _n \right)^2 + \sum ^{_b} n_k \left(x_k - \mu _n \right)^2 </math> | ||
Line 5,266: | Line 5,342: | ||
| style="text-align: center;" | <math> = \sum ^{n_a}_k \left(x_k - \mu _a + \frac{n_b}{n}\delta _{ba} \right)^2 + \sum ^{_b} n_k \left(x_k - \mu _b + \frac{n_a}{n}\delta _{ab} \right)^2 </math> | | style="text-align: center;" | <math> = \sum ^{n_a}_k \left(x_k - \mu _a + \frac{n_b}{n}\delta _{ba} \right)^2 + \sum ^{_b} n_k \left(x_k - \mu _b + \frac{n_a}{n}\delta _{ab} \right)^2 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.274) |
|} | |} | ||
Line 5,274: | Line 5,350: | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\sum ^{n_a}_k \left(\left(x_k - \mu _a \right)^2 + \left(\frac{n_b}{n}\delta _{ba} \right)^2 - 2 \left(x_k - \mu _a \right)\frac{n_b}{n}\delta _{ba} \right)</math> | | style="text-align: center;" | <math>\sum ^{n_a}_k \left(\left(x_k - \mu _a \right)^2 + \left(\frac{n_b}{n}\delta _{ba} \right)^2 - 2 \left(x_k - \mu _a \right)\frac{n_b}{n}\delta _{ba} \right)</math> | ||
Line 5,284: | Line 5,360: | ||
|} | |} | ||
− | where we have used the definition of <math display="inline">\mu _a</math> to say <math display="inline">\sum ^{n_a}_k \left(x_k - \mu _a \right)= 0</math> in the last step. The same reasoning can be used on the second term on the last line of Eq. [[#eq- | + | where we have used the definition of <math display="inline">\mu _a</math> to say <math display="inline">\sum ^{n_a}_k \left(x_k - \mu _a \right)= 0</math> in the last step. The same reasoning can be used on the second term on the last line of Eq. [[#eq-4.274|4.274]] to obtain |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\sum ^{_b} n_k \left(x_k - \mu _b + \frac{n_a}{n}\delta _{ab} \right)^2 = M_{2,n_b} + n_b \left(\frac{n_a}{n}\delta _{ab} \right)^2 </math> | | style="text-align: center;" | <math>\sum ^{_b} n_k \left(x_k - \mu _b + \frac{n_a}{n}\delta _{ab} \right)^2 = M_{2,n_b} + n_b \left(\frac{n_a}{n}\delta _{ab} \right)^2 </math> | ||
Line 5,295: | Line 5,371: | ||
|} | |} | ||
− | Going back to Eq. [[#eq- | + | Going back to Eq. [[#eq-4.274|4.274]], we can use the fact that <math display="inline">\delta _{ab}^2 = \delta _{ba}^2</math> to write |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>M_{2,n} = M_{2,n_a} + n_a \left(\frac{n_b}{n}\delta _{ba} \right)^2 + M_{2,n_b} + n_b \left(\frac{n_a}{n}\delta _{ab} \right)^2 </math> | | style="text-align: center;" | <math>M_{2,n} = M_{2,n_a} + n_a \left(\frac{n_b}{n}\delta _{ba} \right)^2 + M_{2,n_b} + n_b \left(\frac{n_a}{n}\delta _{ab} \right)^2 </math> | ||
Line 5,308: | Line 5,384: | ||
|} | |} | ||
− | from here we can obtain the desired expression, given in <span id='citeF- | + | from here we can obtain the desired expression, given in <span id='citeF-92'></span>[[#cite-92|[92]]], which is |
− | <span id="eq- | + | <span id="eq-4.275"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>M_{2,n} = M_{2,n_a} + M_{2,n_b} + \frac{n_a n_b}{n} \delta _{ba}^2 </math> | | style="text-align: center;" | <math>M_{2,n} = M_{2,n_a} + M_{2,n_b} + \frac{n_a n_b}{n} \delta _{ba}^2 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.275) |
|} | |} | ||
− | In practice, it is convenient to store the sum of all terms as an intermediate result instead of the mean. Defining <math display="inline">M_{1,n} = n \mu _n = \sum ^n_k x_k</math>, Eq. [[#eq- | + | In practice, it is convenient to store the sum of all terms as an intermediate result instead of the mean. Defining <math display="inline">M_{1,n} = n \mu _n = \sum ^n_k x_k</math>, Eq. [[#eq-4.275|4.275]] can be rewritten as |
− | <span id="eq- | + | <span id="eq-4.276"></span> |
− | <span id="eq- | + | <span id="eq-4.277"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>M_{1,n} = M_{1,n_a} + M_{1,n_b} </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.276) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> M_{2,n} = M_{2,n_a} + M_{2,n_b} + \frac{1}{n_a n_b n} \left(n_a M_{1,n_b} - n_b M_{1,n_a} \right)^2 </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.277) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
Line 5,342: | Line 5,416: | ||
It is useful to particularize this expression for the case <math display="inline">n_a = n</math>, <math display="inline">n_b = 1</math>, which corresponds to adding a new measurement, <math display="inline">x_{n+1}</math>, to the data set | It is useful to particularize this expression for the case <math display="inline">n_a = n</math>, <math display="inline">n_b = 1</math>, which corresponds to adding a new measurement, <math display="inline">x_{n+1}</math>, to the data set | ||
− | <span id="eq- | + | <span id="eq-4.278"></span> |
− | <span id="eq- | + | <span id="eq-4.279"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>M_{1,n+1} = M_{1,n} + x_{n+1} </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.278) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> M_{2,n+1} = M_{2,n} + \frac{1}{n(n+1)} \left(n x_{n+1} - M_{1,n} \right)^2 </math> |
− | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.279) | |
− | | style="width: 5px;text-align: right;" | ( | + | |
|} | |} | ||
|} | |} | ||
− | We can keep track of as many partial results as needed by storing <math display="inline">n</math>, <math display="inline">M_{1,n}</math> and <math display="inline">M_{2,n}</math> for each subset and using Eqs. [[#eq- | + | We can keep track of as many partial results as needed by storing <math display="inline">n</math>, <math display="inline">M_{1,n}</math> and <math display="inline">M_{2,n}</math> for each subset and using Eqs. [[#eq-4.278|4.278]] and [[#eq-4.279|4.279]] to update them. Once the calculation is finished and, for parallel simulations, any distributed data is gathered, the partial results can be combined using Eqs. [[#eq-4.276|4.276]] and [[#eq-4.277|4.277]] and the mean and variance of the complete record is recovered by |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>\mu _n = \frac{1}{n}M_{1,n} \qquad \sigma ^2_n = \frac{1}{n-1}M_{2,n} </math> | | style="text-align: center;" | <math>\mu _n = \frac{1}{n}M_{1,n} \qquad \sigma ^2_n = \frac{1}{n-1}M_{2,n} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.280) |
|} | |} | ||
===4.6.2 Covariances=== | ===4.6.2 Covariances=== | ||
− | The present approach was extended to covariances in <span id='citeF- | + | The present approach was extended to covariances in <span id='citeF-91'></span>[[#cite-91|[91]]]. The covariance of two random variables <math display="inline">x</math>, <math display="inline">y</math> with means <math display="inline">\mu ^x</math>, <math display="inline">\mu ^y</math> can be estimated from <math display="inline">n</math> realizations of <math display="inline">(x,y)</math> as |
− | <span id="eq- | + | <span id="eq-4.281"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>c^{xy}_n = \frac{1}{n-1} \sum ^n_k \left(x_k - \mu ^x_n \right)\left(y_k - \mu ^y_n \right) </math> | | style="text-align: center;" | <math>c^{xy}_n = \frac{1}{n-1} \sum ^n_k \left(x_k - \mu ^x_n \right)\left(y_k - \mu ^y_n \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.281) |
|} | |} | ||
which again requires a previous estimate of the mean of each variable. | which again requires a previous estimate of the mean of each variable. | ||
− | We can obtain a single pass formula for the covariance using a similar procedure to that followed for variances in the previous section. We define the intermediate result <math display="inline">C^{xy}_{2,n} = \left(n-1\right)c^{xy}_n</math> and use Eq. [[#eq- | + | We can obtain a single pass formula for the covariance using a similar procedure to that followed for variances in the previous section. We define the intermediate result <math display="inline">C^{xy}_{2,n} = \left(n-1\right)c^{xy}_n</math> and use Eq. [[#eq-4.273|4.273]] to write <math display="inline">\mu ^x_n</math> and <math display="inline">\mu ^y_n</math> in terms of the partial results in Eq. [[#eq-4.281|4.281]]. After rearranging the resulting expression, we obtain |
− | <span id="eq- | + | <span id="eq-4.282"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>C^{xy}_{2,n} = C^{xy}_{2,n_a} + C^{xy}_{2,n_b} + \frac{1}{n_a n_b n} \left(n_a M^x_{1,n_b} - n_b M^x_{1,n_a} \right)\left(n_a M^y_{1,n_b} - n_b M^y_{1,n_a} \right) </math> | | style="text-align: center;" | <math>C^{xy}_{2,n} = C^{xy}_{2,n_a} + C^{xy}_{2,n_b} + \frac{1}{n_a n_b n} \left(n_a M^x_{1,n_b} - n_b M^x_{1,n_a} \right)\left(n_a M^y_{1,n_b} - n_b M^y_{1,n_a} \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.282) |
|} | |} | ||
which can be particularized for the case where <math display="inline">n_a = n</math>, <math display="inline">n_b = 1</math> as | which can be particularized for the case where <math display="inline">n_a = n</math>, <math display="inline">n_b = 1</math> as | ||
− | <span id="eq- | + | <span id="eq-4.283"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math>C^{xy}_{2,n+1} = C^{xy}_{2,n} + \frac{1}{n(n+1)} \left(n x_{n+1} - M^x_{1,n} \right)\left(n y_{n+1} - M^y_{1,n} \right) </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.283) |
|} | |} | ||
Line 5,419: | Line 5,490: | ||
The third order central moment of a distribution can be estimated from <math display="inline">n</math> samples as | The third order central moment of a distribution can be estimated from <math display="inline">n</math> samples as | ||
− | <span id="eq- | + | <span id="eq-4.284"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>s_x = \frac{1}{n} \sum ^n_k \left(x_k - \mu _n \right)^3 </math> | | style="text-align: center;" | <math>s_x = \frac{1}{n} \sum ^n_k \left(x_k - \mu _n \right)^3 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.284) |
|} | |} | ||
− | It can also be calculated in a single pass by means of the following formula, taken from <span id='citeF- | + | It can also be calculated in a single pass by means of the following formula, taken from <span id='citeF-90'></span>[[#cite-90|[90]]]: |
− | <span id="eq- | + | <span id="eq-4.285"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>M_{3,n} = M_{3,n_a} + M_{3,n_b} + \frac{n_a n_b \left(n_a - n_b \right)}{n^2} \delta ^3_{ba} + \frac{3}{n} \left(n_a M_{2,n_b} - n_b M_{2,n_a}\right)\delta _{ba} </math> | | style="text-align: center;" | <math>M_{3,n} = M_{3,n_a} + M_{3,n_b} + \frac{n_a n_b \left(n_a - n_b \right)}{n^2} \delta ^3_{ba} + \frac{3}{n} \left(n_a M_{2,n_b} - n_b M_{2,n_a}\right)\delta _{ba} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.285) |
|} | |} | ||
In the present work, we have not used third order central moments, but the turbulence energy budget involves correlations between three different variables (two velocity fluctuations and a gradient). Triple correlations can be estimated using the general expression | In the present work, we have not used third order central moments, but the turbulence energy budget involves correlations between three different variables (two velocity fluctuations and a gradient). Triple correlations can be estimated using the general expression | ||
− | <span id="eq- | + | <span id="eq-4.286"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>c^{xyz}_n = \frac{1}{n} \sum ^n_k \left(x_k - \mu ^x_n \right)\left(y_k - \mu ^y_n \right)\left(z_k - \mu ^z_n \right) </math> | | style="text-align: center;" | <math>c^{xyz}_n = \frac{1}{n} \sum ^n_k \left(x_k - \mu ^x_n \right)\left(y_k - \mu ^y_n \right)\left(z_k - \mu ^z_n \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.286) |
|} | |} | ||
− | which again can be transformed into a single-pass formula by using Eq. [[#eq- | + | which again can be transformed into a single-pass formula by using Eq. [[#eq-4.273|4.273]] to write the different means that appear in Eq. [[#eq-4.286|4.286]] in terms of the partial means in each subset. Rearranging the terms and introducing the partial result <math display="inline">C^{xyz}_{3,n} = n c^{xyz}_n</math> produces the final expression |
− | <span id="eq- | + | <span id="eq-4.287"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>C^{xyz}_{3,n} = C^{xyz}_{3,n_a} + C^{xyz}_{3,n_b} </math> | | style="text-align: center;" | <math>C^{xyz}_{3,n} = C^{xyz}_{3,n_a} + C^{xyz}_{3,n_b} </math> | ||
Line 5,474: | Line 5,545: | ||
| style="text-align: center;" | <math> + \frac{1}{n_a n_b n } \left(n_a M^{zx}_{2,n_b} - n_b M^{zx}_{2,n_a} \right)\left(n_a M^y_{1,n_b} - n_b M^y_{1,n_a} \right) </math> | | style="text-align: center;" | <math> + \frac{1}{n_a n_b n } \left(n_a M^{zx}_{2,n_b} - n_b M^{zx}_{2,n_a} \right)\left(n_a M^y_{1,n_b} - n_b M^y_{1,n_a} \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.287) |
|} | |} | ||
− | Using Eq. [[#eq- | + | Using Eq. [[#eq-4.287|4.287]], we can evaluate any triple correlation in a single pass, provided that we also keep track of the pairwise covariances and individual averages of each variable involved in the calculation. Fortunately, in the present work we were already interested in these quantities, as they appear in other terms of the turbulence energy budget, and this did not suppose an additional cost. |
Finally, the particular case <math display="inline">n_a = n</math>, <math display="inline">n_b = 1</math> results in the following simplified expression | Finally, the particular case <math display="inline">n_a = n</math>, <math display="inline">n_b = 1</math> results in the following simplified expression | ||
− | <span id="eq- | + | <span id="eq-4.288"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math>C^{xyz}_{3,n+1} = C^{xyz}_{3,n} + </math> | | style="text-align: center;" | <math>C^{xyz}_{3,n+1} = C^{xyz}_{3,n} + </math> | ||
Line 5,491: | Line 5,562: | ||
| style="text-align: center;" | <math> \frac{ n - 1 }{n^2 \left(n+1 \right)^2} \left(n x_{n+1} - M^x_{1,n} \right)\left(n y_{n+1} - M^y_{1,n} \right)\left(n z_{n+1} - M^z_{1,n} \right)</math> | | style="text-align: center;" | <math> \frac{ n - 1 }{n^2 \left(n+1 \right)^2} \left(n x_{n+1} - M^x_{1,n} \right)\left(n y_{n+1} - M^y_{1,n} \right)\left(n z_{n+1} - M^z_{1,n} \right)</math> | ||
|- | |- | ||
− | | style="text-align: center;" | <math> - \frac{1}{n \left(n+1\right)} \left[M^{xy}_{2,n} \left(n z_{n+1} - M^z_{1,n} \right)+ M^{yz}_{2,n} \left(n x_{n+1} - M^x_{1,n} \right) \right. </math> | + | | style="text-align: center;" | <math> - \frac{1}{n \left(n+1\right)} \left[M^{xy}_{2,n} \left(n z_{n+1} - M^z_{1,n} \right)+ M^{yz}_{2,n} \left(n x_{n+1} - M^x_{1,n} \right) \right.</math> |
|- | |- | ||
− | | style="text-align: center;" | <math> \left. + M^{zx}_{2,n} \left(n y_{n+1} - M^y_{1,n} \right)\right] </math> | + | | style="text-align: center;" | <math> \left.+ M^{zx}_{2,n} \left(n y_{n+1} - M^y_{1,n} \right)\right] </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (4.288) |
|} | |} | ||
Line 5,516: | Line 5,587: | ||
One of the main advantages of finite elements is the possibility of using unstructured meshes, adapting the element size to the features of the problem and using finer resolutions near regions of interest. This requires a certain degree of familiarity with the problem being solved, as an insufficient mesh resolution can lead to missing important features such as boundary layers or sharp changes in the solution. In this sense, it would be desirable to have the ability to adaptively modify the mesh during the simulation, ensuring that its resolution is sufficient to represent the solution with a given accuracy at all times. | One of the main advantages of finite elements is the possibility of using unstructured meshes, adapting the element size to the features of the problem and using finer resolutions near regions of interest. This requires a certain degree of familiarity with the problem being solved, as an insufficient mesh resolution can lead to missing important features such as boundary layers or sharp changes in the solution. In this sense, it would be desirable to have the ability to adaptively modify the mesh during the simulation, ensuring that its resolution is sufficient to represent the solution with a given accuracy at all times. | ||
− | The first problem related to this strategy is how to quantify the error in the solution. One popular approach to this question are ''a posteriori'' error estimation techniques (see for example <span id='citeF- | + | The first problem related to this strategy is how to quantify the error in the solution. One popular approach to this question are ''a posteriori'' error estimation techniques (see for example <span id='citeF-93'></span><span id='citeF-94'></span><span id='citeF-95'></span><span id='citeF-96'></span>[[#cite-93|[93,94,95,96]]]), where the computed solution itself is used to assess its accuracy. We explore one of such methods, closely related to the VMS stabilized formulations introduced in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]], which was originally presented in <span id='citeF-97'></span>[[#cite-97|[97]]] for convection-diffusion problems and has been applied to the Navier-Stokes equations in <span id='citeF-98'></span><span id='citeF-99'></span>[[#cite-98|[98,99]]]. |
− | Once we are able to estimate the error and its distribution across the domain, we can modify the calculation grid to increase the overall accuracy. Many different mesh modification strategies have been proposed since the pioneering work in the late eighties <span id='citeF- | + | Once we are able to estimate the error and its distribution across the domain, we can modify the calculation grid to increase the overall accuracy. Many different mesh modification strategies have been proposed since the pioneering work in the late eighties <span id='citeF-100'></span><span id='citeF-101'></span><span id='citeF-102'></span>[[#cite-100|[100,101,102]]], involving for example local mesh modifications <span id='citeF-103'></span>[[#cite-103|[103]]], movement of mesh nodes through the solution of an auxiliary elasticity problem <span id='citeF-104'></span>[[#cite-104|[104]]], mesh morphing techniques <span id='citeF-105'></span>[[#cite-105|[105]]] or edge stretching <span id='citeF-106'></span>[[#cite-106|[106]]]. However, mesh refinement, and meshing in general, is a particularly challenging problem in a distributed memory setting, as maintaining mesh quality over the entire domain and ensuring that the mesh is conforming is a very non-local problem, requiring communication across the different parallel subdomains. We propose a mesh refinement algorithm based on edge division that was designed with parallel performance as its main goal, requiring as little information that is not local to each element as possible. |
Our mesh refinement strategy was originally conceived as a complement to the incompressible fluid solver of Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]], with the goal of increasing the reliability of the solution and optimizing the number of elements for the simulation of large turbulent flow problems with meshes in the LES range. However, during the development of the present work, an opportunity appeared to use the same approach in the simulation of viscoplastic fluids. | Our mesh refinement strategy was originally conceived as a complement to the incompressible fluid solver of Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]], with the goal of increasing the reliability of the solution and optimizing the number of elements for the simulation of large turbulent flow problems with meshes in the LES range. However, during the development of the present work, an opportunity appeared to use the same approach in the simulation of viscoplastic fluids. | ||
− | Viscoplastic fluids are a class of non-Newtonian fluids that are rigid unless the applied shear stress is larger than a threshold, known as the yield stress. We concentrate our attention on Bingham fluids in which, once the material starts to flow, shear stress varies linearly with strain rate increments. Adaptive mesh refinement techniques, involving full remeshing of the domain, have been used in the past to simulate plane and axisymmetric Bingahm fows <span id='citeF- | + | Viscoplastic fluids are a class of non-Newtonian fluids that are rigid unless the applied shear stress is larger than a threshold, known as the yield stress. We concentrate our attention on Bingham fluids in which, once the material starts to flow, shear stress varies linearly with strain rate increments. Adaptive mesh refinement techniques, involving full remeshing of the domain, have been used in the past to simulate plane and axisymmetric Bingahm fows <span id='citeF-107'></span><span id='citeF-108'></span><span id='citeF-109'></span>[[#cite-107|[107,108,109]]] and also to simulate depth-integrated <math display="inline">3D</math> free surface flows using a shallow water approximation <span id='citeF-110'></span>[[#cite-110|[110]]]. We will apply our approach to the simulation of both plane and fully tri-dimensional cases. |
The present chapter is organized as follows: first, the complete refinement procedure and its parallel implementation are presented in Section [[#5.2 Adaptive refinement strategy|5.2]], followed by their application to incompressible flows in Section [[#5.3 Application to laminar and turbulent flows|5.3]]. Section [[#5.4 A FEM solver with adaptive mesh refinement for viscoplastic flows|5.4]] introduces the solver used for the simulation of non-Newtonian flows, which is applied to the simulation of Bingham fluids in Section [[#5.5 Application to Bingham fluids|5.5]]. Some final remarks and conclusions are given in Section [[#5.6 Summary and conclusions|5.6]]. | The present chapter is organized as follows: first, the complete refinement procedure and its parallel implementation are presented in Section [[#5.2 Adaptive refinement strategy|5.2]], followed by their application to incompressible flows in Section [[#5.3 Application to laminar and turbulent flows|5.3]]. Section [[#5.4 A FEM solver with adaptive mesh refinement for viscoplastic flows|5.4]] introduces the solver used for the simulation of non-Newtonian flows, which is applied to the simulation of Bingham fluids in Section [[#5.5 Application to Bingham fluids|5.5]]. Some final remarks and conclusions are given in Section [[#5.6 Summary and conclusions|5.6]]. | ||
Line 5,540: | Line 5,611: | ||
===5.2.1 Error estimation=== | ===5.2.1 Error estimation=== | ||
− | The error estimator we use is based on the ideas presented by Hauke ''et al.'' in <span id='citeF- | + | The error estimator we use is based on the ideas presented by Hauke ''et al.'' in <span id='citeF-97'></span>[[#cite-97|[97]]] for fluid transport problems. The same approach was applied to the Navier-Stokes equations in <span id='citeF-99'></span>[[#cite-99|[99]]] and in <span id='citeF-98'></span>[[#cite-98|[98]]], where part of the material that constitutes this chapter was originally presented. This estimator is motivated by the scale separation introduced in VMS formulations, which we presented in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]] for Newtonian flows and will be used again in Section [[#5.5 Application to Bingham fluids|5.5]] to stabilize viscoplastic flows. |
Considering that the large scale variables represent the part of the solution reproduced by the finite element mesh, and small scale variables represent the part that is not resolved, the later can be understood as a measure of the local error in the solution. Once the large scale flow has been solved, the small scale can be evaluated on chosen points in the domain and its magnitude can be used as an ''a posteriori'' error estimator, identifying regions where the mesh is too coarse. | Considering that the large scale variables represent the part of the solution reproduced by the finite element mesh, and small scale variables represent the part that is not resolved, the later can be understood as a measure of the local error in the solution. Once the large scale flow has been solved, the small scale can be evaluated on chosen points in the domain and its magnitude can be used as an ''a posteriori'' error estimator, identifying regions where the mesh is too coarse. | ||
Line 5,546: | Line 5,617: | ||
Following this argument, we define the following estimate of the error in element <math display="inline">e</math>, to be used in VMS stabilized formulations | Following this argument, we define the following estimate of the error in element <math display="inline">e</math>, to be used in VMS stabilized formulations | ||
− | <span id="eq- | + | <span id="eq-5.289"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>I\left(e\right)= \left\Vert u_s\right\ | + | | style="text-align: center;" | <math>I\left(e\right)= \left\Vert u_s\right\Vert_{\Omega _e} = \left(\int _{\Omega _e} u_s\cdot u_s\, \hbox{d}\Omega \right)^{\frac{1}{2}} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.289) |
|} | |} | ||
In the present chapter we are mainly concerned with the static versions of the ASGS and OSS methods, which will be briefly recalled. The small scale model for the static ASGS formulation was defined in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]] as | In the present chapter we are mainly concerned with the static versions of the ASGS and OSS methods, which will be briefly recalled. The small scale model for the static ASGS formulation was defined in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]] as | ||
− | <span id="eq- | + | <span id="eq-5.290"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>u_s | + | | style="text-align: center;" | <math>u_s= \tau _1 \boldsymbol{R}^m\left(u_h,p_h\right)</math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> = \tau _1 \left(\boldsymbol{f} - \rho \partial _t u_h - \rho \dfrac{1}{2} \left(u_h\cdot \nabla u_h+ \nabla \cdot \left(u_h\otimes u_h\right)\right)- \nabla \cdot 2\mu \nabla ^s u_h- \nabla p_h\right) </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.290) |
|} | |} | ||
while the corresponding model for the static OSS method was introduced as | while the corresponding model for the static OSS method was introduced as | ||
− | <span id="eq- | + | <span id="eq-5.291"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>u_s | + | | style="text-align: center;" | <math>u_s= \tau _1 \left(\boldsymbol{R}^m\left(u_h,p_h\right)- \boldsymbol{\Pi }^m \right)</math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> = \tau _1 \left(\boldsymbol{f} - \rho \partial _t u_h - \rho \dfrac{1}{2} \left(u_h\cdot \nabla u_h+ \nabla \cdot \left(u_h\otimes u_h\right)\right)- \nabla \cdot 2\mu \nabla ^s u_h- \nabla p_h- \boldsymbol{\Pi }^m \right) </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.291) |
|} | |} | ||
− | Replacing the small scale velocities in Eq. [[#eq- | + | Replacing the small scale velocities in Eq. [[#eq-5.289|5.289]] by their definition we obtain the final expression for the estimator. Using Eq. [[#eq-5.291|5.291]], the OSS estimator can be expressed as |
− | <span id="eq- | + | <span id="eq-5.292"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math>I\left(e\right)= \left(\int _{\Omega _e} \tau _1^2 \left\Vert \boldsymbol{R}^m - \boldsymbol{\Pi }^m \right\Vert ^2 \, \hbox{d}\Omega \right)^{\frac{1}{2}} </math> | + | | style="text-align: center;" | <math>I\left(e\right)= \left(\int _{\Omega _e} \tau _1^2 \left\Vert \boldsymbol{R}^m - \boldsymbol{\Pi }^m \right\Vert^2 \, \hbox{d}\Omega \right)^{\frac{1}{2}} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.292) |
|} | |} | ||
− | On the other hand, for the ASGS formulation, we use the definition for the small scales given by Eq. [[#eq- | + | On the other hand, for the ASGS formulation, we use the definition for the small scales given by Eq. [[#eq-5.290|5.290]]. This leads to an expression that is equivalent to dropping the projection <math display="inline">\boldsymbol{\Pi }^m</math> from Eq. [[#eq-5.291|5.291]]. |
To perform a refinement step we evaluate the error estimate <math display="inline">I(e)</math> on each element and identify those elements where the estimate is larger than a pre-defined tolerance. These elements are then split according to the algorithm described in the following section. | To perform a refinement step we evaluate the error estimate <math display="inline">I(e)</math> on each element and identify those elements where the estimate is larger than a pre-defined tolerance. These elements are then split according to the algorithm described in the following section. | ||
− | It is worth noting that multiple variants of a subscale based error estimator were presented in <span id='citeF- | + | It is worth noting that multiple variants of a subscale based error estimator were presented in <span id='citeF-97'></span>[[#cite-97|[97]]]. The version presented here corresponds to the case where no elemental boundary integrals are included in the indicator. We chose to do so to keep consistency with the actual small scale model we use in the calculations. The boundary terms in question appear when keeping the elemental boundary integrals in the derivation of the stabilized VMS formulation. Since we neglected these terms in our derivation (as was shown in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]]), we will not take them into account here. |
===5.2.2 Mesh refinement strategy=== | ===5.2.2 Mesh refinement strategy=== | ||
− | The mesh refinement strategy we use is based on the local subdivision of existing triangles or tetrahedra by edge division. The procedure was designed to require only a minimal amount of information that is not local to the elements to be refined, in order to simplify its implementation in a distributed memory environment. The main idea of the refinement algorithm is that, once an element has been identified as a candidate for refinement, it is divided into new elements created by splitting the edges of the original element in half. Neighboring elements are then refined by splitting some of their edges as required to maintain consistency. The main steps of this procedure are shown graphically in Figure [[#img- | + | The mesh refinement strategy we use is based on the local subdivision of existing triangles or tetrahedra by edge division. The procedure was designed to require only a minimal amount of information that is not local to the elements to be refined, in order to simplify its implementation in a distributed memory environment. The main idea of the refinement algorithm is that, once an element has been identified as a candidate for refinement, it is divided into new elements created by splitting the edges of the original element in half. Neighboring elements are then refined by splitting some of their edges as required to maintain consistency. The main steps of this procedure are shown graphically in Figure [[#img-55|55]] and can be described as follows: |
− | <div id='img- | + | <div id='img-55a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-55b'></div> |
+ | <div id='img-55c'></div> | ||
+ | <div id='img-55d'></div> | ||
+ | <div id='img-55'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-refinement_step1.png|180px|]] |
− | |[[Image: | + | |[[Image:Cotela_2016-refinement_step2.png|180px|]] |
+ | |[[Image:Cotela_2016-refinement_step3.png|180px|]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) | ||
+ | | (b) | ||
+ | | (c) | ||
|- | |- | ||
− | |[[Image: | + | | colspan="3"|[[Image:Cotela_2016-refinement_step4.png|180px|]] |
− | | | + | |- style="text-align: center; font-size: 75%;" |
+ | | (d) | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | colspan="3" | '''Figure 55:''' Refinement procedure: (a) identify elements to refine; (b) divide edges and insert new nodes; (c) remove all elements with split edges; (d) create new elements to recover a conforming mesh. |
|} | |} | ||
<ol> | <ol> | ||
− | <li>Iterate over mesh elements, evaluating the error estimator of Eq. [[#eq- | + | <li>Iterate over mesh elements, evaluating the error estimator of Eq. [[#eq-5.289|5.289]]. </li> |
− | <li>If the error estimate is larger than a predefined tolerance in a given element, mark it and its edges as ''needing refinement'' (Fig. | + | <li>If the error estimate is larger than a predefined tolerance in a given element, mark it and its edges as ''needing refinement'' (Fig. [[#img-55a|55a]]). </li> |
− | <li>A new node is created in the mid-point of all edges that have been identified as ''needing refinement''. All nodal data (and in particular initial guesses for velocity and pressure) is interpolated from the nodes that define the edge (Fig. | + | <li>A new node is created in the mid-point of all edges that have been identified as ''needing refinement''. All nodal data (and in particular initial guesses for velocity and pressure) is interpolated from the nodes that define the edge (Fig. [[#img-55b|55b]]). </li> |
− | <li>All elements with refined edges are deleted. Note that this includes elements where the error estimator was not larger than the tolerance (Fig. | + | <li>All elements with refined edges are deleted. Note that this includes elements where the error estimator was not larger than the tolerance (Fig. [[#img-55c|55c]]). </li> |
− | <li>New elements are created using predefined patterns (Fig. | + | <li>New elements are created using predefined patterns (Fig. [[#img-55d|55d]]). </li> |
</ol> | </ol> | ||
Line 5,640: | Line 5,717: | ||
===5.2.3 Local refinement of triangles and tetrahedra=== | ===5.2.3 Local refinement of triangles and tetrahedra=== | ||
− | The mesh refinement strategy described in the previous section is based on inserting nodes on edge midpoints and subdividing existing elements to include the new nodes. Unfortunately, knowing only which edges to split in each tetrahedron is not enough to ensure that the resulting mesh will be conforming. Consider for example the two elements in Fig. [[#img- | + | The mesh refinement strategy described in the previous section is based on inserting nodes on edge midpoints and subdividing existing elements to include the new nodes. Unfortunately, knowing only which edges to split in each tetrahedron is not enough to ensure that the resulting mesh will be conforming. Consider for example the two elements in Fig. [[#img-56|56]], where two new nodes are inserted. There are two possible ways in which the common face can be divided, corresponding to the two tetrahedra in Fig. [[#img-56c|56c]]. To obtain a conforming mesh, the splitting strategy has to be designed in a way that ensures that the division of each element results in conforming faces. |
− | <div id='img- | + | <div id='img-56a'></div> |
− | <div id='img- | + | <div id='img-56b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-56c'></div> |
+ | <div id='img-56'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-refinement_tetra_split.png|119px|Original elements.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-refinement_tetra_conf.png|210px|Conforming division.]] |
− | + | |[[Image:Cotela_2016-refinement_tetra_non_conf.png|210px|Non-conforming division.]] | |
− | + | |- style="text-align: center; font-size: 75%;" | |
+ | | (a) Original elements. | ||
+ | | (b) Conforming division. | ||
+ | | (c) Non-conforming division. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | colspan="3" | '''Figure 56:''' Division of tetrahedra based on edge splitting. |
|} | |} | ||
This restriction is problematic in a distributed memory environment, as the elements involved might belong to different partitions. In such situation, obtaining information from the neighbor element is not straightforward and involves communication between the partitions. | This restriction is problematic in a distributed memory environment, as the elements involved might belong to different partitions. In such situation, obtaining information from the neighbor element is not straightforward and involves communication between the partitions. | ||
− | To solve this issue, we use an approach that is based exclusively in the numbering of the existing nodes, which is both available locally in the partition and known to be identical across partitions, avoiding all parallel communication. We start by assuming that all the edges of the element are split by their midpoints, resulting in four smaller elements in the case of a triangle or eight in a tetrahedra. If a given edge is not divided, at least one of the new elements touching that edge is eliminated. An example of this operation, which we call a ''collapse'', is presented in Fig. [[#img- | + | To solve this issue, we use an approach that is based exclusively in the numbering of the existing nodes, which is both available locally in the partition and known to be identical across partitions, avoiding all parallel communication. We start by assuming that all the edges of the element are split by their midpoints, resulting in four smaller elements in the case of a triangle or eight in a tetrahedra. If a given edge is not divided, at least one of the new elements touching that edge is eliminated. An example of this operation, which we call a ''collapse'', is presented in Fig. [[#img-57|57]], in which the four potential elements obtained by the full refinement of a triangle are reduced to three. |
− | <div id='img- | + | <div id='img-57a'></div> |
− | <div id='img- | + | <div id='img-57b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-57c'></div> |
− | + | <div id='img-57'></div> | |
− | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | |
− | + | ||
|- | |- | ||
− | | | + | |[[Image:Cotela_2016-refine_full.png|100px|]] |
+ | |[[Image:Cotela_2016-collapse_left.png|100px|]] | ||
+ | |[[Image:Cotela_2016-collapse_right.png|100px|]] | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | (a) |
+ | | (b) | ||
+ | | (c) | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="3" | '''Figure 57:''' Collapse operations on a triangle: (a) no collapse; (b) edge collapsed towards node <math>a</math> or (c) collapsed towards node <math>b</math>. | ||
|} | |} | ||
− | To choose between the two possible outcomes of the collapse, the global node indexes of nodes <math display="inline">a</math> and <math display="inline">b</math> are compared. The partitioning in Fig. | + | To choose between the two possible outcomes of the collapse, the global node indexes of nodes <math display="inline">a</math> and <math display="inline">b</math> are compared. The partitioning in Fig. [[#img-57b|57b]] is adopted if the index of node <math display="inline">a</math> is smaller and the division of Fig. [[#img-57c|57c]] is used otherwise. When subdividing two tetrahedra that share a face, using this criterion ensures that the subdivisions obtained from each element will be conforming. It must be noted that this approach has the obvious drawback of not taking the quality of the refined elements into account, but on the other hand it is purely local and therefore easily parallelizable. |
Using this strategy we can determine the shape of the refined triangles or, in the case of a tetrahedron, the way in which its faces will be refined. For tetrahedra, the volume is then divided according to predefined patterns, depending on the shape of its faces. | Using this strategy we can determine the shape of the refined triangles or, in the case of a tetrahedron, the way in which its faces will be refined. For tetrahedra, the volume is then divided according to predefined patterns, depending on the shape of its faces. | ||
− | The splitting operation defines three possible situations on each edge of the tetrahedron, corresponding to the three cases in Fig. [[#img- | + | The splitting operation defines three possible situations on each edge of the tetrahedron, corresponding to the three cases in Fig. [[#img-57|57]]. Given that there are six edges on each tetrahedron, up to <math display="inline">3^6 = 729</math> potential face patterns can be defined. Each of those is matched to a division pattern using an utility<span id="fnc-4"></span>[[#fn-4|<sup>1</sup>]] distributed within Kratos Multiphyisics <span id='citeF-29'></span>[[#cite-29|[29]]] which implements the local refinement operations. This tool, given an array containing the global indices for the nodes involved in the subdivision, divides the faces according to the collapse criterion and produces the connectivities for the new elements to be created. Note that, for some division patterns, a new node is added on the element's center of mass to improve the quality of the resulting elements. A very important point to be made here is to consider how this procedure affects mesh quality. If all edges of an element are divided, the refinement procedure ensures that its quality is preserved, as all new elements have the same angles as the original in this case. Unfortunately, this is not the case for elements where only some of the edges are refined, and mesh quality can be significantly degraded if this kind of partial refinement is performed repeatedly over the same patch of elements. To alleviate the problem, we improve the quality of the resulting mesh using local mesh improvement techniques. For <math>2D</math> simulations, we used the algorithm presented in <span id='citeF-111'></span>[[#cite-111|[111]]], which is based on reconnecting the nodes of adjacent elements. For <math>3D</math> cases, we used the procedure presented in <span id='citeF-112'></span>[[#cite-112|[112]]], which consists in analyzing clusters of adjacent elements and changing the local topology, adding or deleting nodes and reconnecting elements to improve mesh quality within the cluster. As these techniques were incorporated in the code on a late stage in the presented work, they were not used for the turbulent flow cases. However, we took full advantage of them to simulate the Bingham flow cases presented in Section [[#5.5 Application to Bingham fluids|5.5]]. |
<span id="fn-4"></span> | <span id="fn-4"></span> | ||
Line 5,681: | Line 5,768: | ||
===5.2.4 Parallel implementation=== | ===5.2.4 Parallel implementation=== | ||
− | The proposed mesh refinement strategy has been implemented for a distributed memory environment within the Kratos Multiphysics framework. This means that the domain partitioning model introduced in Chapter [[#4 Parallel implementation|4]] is also used here. Individual elements are assigned to a single parallel subdomain and are completely unknown by the others. Nodes are also assigned to a subdomain, which holds the reference values for all data associated to that node, but might be also needed in neighboring domains if they are connected to elements lying on different partitions. When this happens, other partitions store a copy of the nodal data, which has to be updated at different points during the simulation. From the point of view of a given subdomain, nodes are said to be ''local nodes'' when that subdomain holds the reference values for their data or ''ghost nodes'' otherwise. Our implementation of the refinement strategy relies on an auxiliary sparse matrix that reproduces the edge connectivity pattern of the mesh. As in Chapter [[#4 Parallel implementation|4]], we rely on the implementation of sparse distributed memory matrices provided by the Trilinos library <span id='citeF- | + | The proposed mesh refinement strategy has been implemented for a distributed memory environment within the Kratos Multiphysics framework. This means that the domain partitioning model introduced in Chapter [[#4 Parallel implementation|4]] is also used here. Individual elements are assigned to a single parallel subdomain and are completely unknown by the others. Nodes are also assigned to a subdomain, which holds the reference values for all data associated to that node, but might be also needed in neighboring domains if they are connected to elements lying on different partitions. When this happens, other partitions store a copy of the nodal data, which has to be updated at different points during the simulation. From the point of view of a given subdomain, nodes are said to be ''local nodes'' when that subdomain holds the reference values for their data or ''ghost nodes'' otherwise. Our implementation of the refinement strategy relies on an auxiliary sparse matrix that reproduces the edge connectivity pattern of the mesh. As in Chapter [[#4 Parallel implementation|4]], we rely on the implementation of sparse distributed memory matrices provided by the Trilinos library <span id='citeF-80'></span>[[#cite-80|[80]]] to define and store it. We consider a simplified scenario to clarify the presentation of the algorithm. Consider an initial finite element mesh containing <math>N</math> nodes and <math>M</math> elements divided in <math>K</math> subdomains. The nodes are numbered consecutively in the range <math>0 \leq i < N</math> and ordered by subdomains, such that, if a node is local to subdomain <math>k</math>, its index will be in the range <math>n_{k} \leq i < n_{k+1}</math>. We remark that this is done to simplify the notation used to describe the implementation, but it does not represent a restriction on the actual implementation. In practice we only assume that the nodes are numbered sequentially as a whole, even if consecutive nodes are not in the same partition. Additionally, we denote the edges of finite elements in the mesh as pairs of node indices <math>\left(i,j\right)</math>, with <math>i < j</math>. We define a sparse matrix <math>\boldsymbol{E}</math> of size <math>N \times N</math> representing the edge connectivity pattern. Position <math>E_{ij}</math> can only be different from zero if there is some elemental edge <math>\left(i,j\right)</math> joining nodes <math>i</math> and <math>j</math>. Note that, using our definition of the edge, <math>\boldsymbol{E}</math> only contains terms above its diagonal. Matrix <math>\boldsymbol{E}</math> is stored using compact storage by rows (CSR) notation and distributed, meaning that each parallel process <math>k</math> stores non-zero terms for rows in the range <math>n_{k} \leq i < n_{k+1}</math>. Note that the process will sometimes need to access rows outside this range, corresponding to ghost nodes in the partition, an operation that requires parallel communication. In the following we refer to the set including all local and ghost nodes known to partition <math>k</math> as <math>S_k</math>. The implementation of the refinement algorithm involves multiple tasks that can be grouped into the following steps: |
<ol> | <ol> | ||
− | <li>Build a sparse matrix of edge connectivities <math display="inline">\boldsymbol{E}</math>, where position <math display="inline">E_{ij}</math> of the matrix only exists if there is an element edge joining nodes <math display="inline">i</math> and <math display="inline">j</math> in the mesh. Positions corresponding to an edge are initialized to the arbitrary value <nowiki>-1</nowiki>. This is represented in pseudo-code in Algorithm [[# | + | <li>Build a sparse matrix of edge connectivities <math display="inline">\boldsymbol{E}</math>, where position <math display="inline">E_{ij}</math> of the matrix only exists if there is an element edge joining nodes <math display="inline">i</math> and <math display="inline">j</math> in the mesh. Positions corresponding to an edge are initialized to the arbitrary value <nowiki>-1</nowiki>. This is represented in pseudo-code in Algorithm [[#algorithm-4|4]]. Note that, as the matrix is defined as upper-triangular only the positions where <math display="inline">i<j</math> are considered. </li> |
</ol> | </ol> | ||
− | + | ||
+ | {| style="margin: 1em auto;border: 1px solid darkgray;" | ||
+ | |- | ||
+ | | | ||
+ | : Initialize empty sparse matrix <math>\boldsymbol{E}</math> Elements Edges <math>\left(i,j\right)</math>, with <math>i < j</math> <math>\boldsymbol{E} \left(i,j\right)= -1</math> | ||
+ | |||
+ | |||
+ | |- | ||
+ | | style="text-align: center; font-size: 75%;"| | ||
+ | <span id='algorithm-4'></span>'''Algorithm. 4''' Initialization of the matrix of edge connectivities <math>\boldsymbol{E}</math>. | ||
+ | |} | ||
<ol> | <ol> | ||
− | <li>Iterate over the elements, checking if they should be refined. If an element is identified as needing refinement, set the positions corresponding to its edges in <math>\boldsymbol{E}</math> to <nowiki>-2</nowiki> (Algorithm [[#5 | + | <li>Iterate over the elements, checking if they should be refined. If an element is identified as needing refinement, set the positions corresponding to its edges in <math>\boldsymbol{E}</math> to <nowiki>-2</nowiki> (Algorithm [[#algorithm-5|5]]). Note that this step requires parallel communication to ensure that edge data is consistent on all subdomains. </li> |
</ol> | </ol> | ||
− | + | ||
+ | {| style="margin: 1em auto;border: 1px solid darkgray;" | ||
+ | |- | ||
+ | | | ||
+ | : Elements '''if''' Refinement needed '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : Edges <math>i,j</math>, with <math>i < j</math> '''if''' <math>\boldsymbol{E} \left(i,j\right)</math> is not <math>-2</math> '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : <math>\boldsymbol{E} \left(i,j\right)= -2</math> Synchronize <math>\boldsymbol{E} \left(i,j\right)</math> | ||
+ | |||
+ | |||
+ | |- | ||
+ | | style="text-align: center; font-size: 75%;"| | ||
+ | <span id='algorithm-5'></span>'''Algorithm. 5''' Identification of edges to refine. | ||
+ | |} | ||
<ol> | <ol> | ||
− | <li>The number of new nodes <math display="inline">t</math> to be added in each subdomain is equal to the number of <nowiki>-2</nowiki> entries in all known rows of <math display="inline">\boldsymbol{E}</math>. Use this information to assign a range of temporary node indices <math display="inline">r_k</math>, <math display="inline">r_{k+1}</math> to each process (Algorithm [[# | + | <li>The number of new nodes <math display="inline">t</math> to be added in each subdomain is equal to the number of <nowiki>-2</nowiki> entries in all known rows of <math display="inline">\boldsymbol{E}</math>. Use this information to assign a range of temporary node indices <math display="inline">r_k</math>, <math display="inline">r_{k+1}</math> to each process (Algorithm [[#algorithm-6|6]]). Some new nodes will be counted twice, as they are known by multiple domains. </li> |
</ol> | </ol> | ||
− | + | ||
+ | {| style="margin: 1em auto;border: 1px solid darkgray;" | ||
+ | |- | ||
+ | | | ||
+ | : <math>t = 0</math> <math>i \in S_k</math> <math>j</math> in non-zero columns of row <math>i</math> '''if''' <math>\boldsymbol{E} \left(i,j\right)</math> is <math>-2</math> '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : <math>t = t+1</math> Gather <math>P</math> as the sum of new nodes for all processes <math>p < k</math> Set <math>r_k = N+P</math> and <math>r_{k+1} = N + P + t</math> | ||
+ | |||
+ | |||
+ | |- | ||
+ | | style="text-align: center; font-size: 75%;"| | ||
+ | <span id='algorithm-6'></span>'''Algorithm. 6''' Definition of temporary node ranges for process <math>k</math>. | ||
+ | |} | ||
<ol> | <ol> | ||
− | <li>Each process claims ownership of known new nodes by assigning it node index in its range. Note that this process will sometimes produce clashes, as nodes in the interface between subdomains are known by multiple processes (Algorithm [[# | + | <li>Each process claims ownership of known new nodes by assigning it node index in its range. Note that this process will sometimes produce clashes, as nodes in the interface between subdomains are known by multiple processes (Algorithm [[#algorithm-7|7]]). We decided to allow overwriting node indices set by other processes, so that the last process to assign an index will own the node. </li> |
</ol> | </ol> | ||
− | + | ||
+ | {| style="margin: 1em auto;border: 1px solid darkgray;" | ||
+ | |- | ||
+ | | | ||
+ | : <math>m = r_k</math> <math>i \in S_k</math> <math>j</math> in non-zero columns of row <math>i</math> '''if''' <math>\boldsymbol{E} \left(i,j\right)</math> is not <math>-1</math> '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : <math>\boldsymbol{E} \left(i,j\right)= m</math> Communicate change in <math>\boldsymbol{E}</math> to other processes if needed. <math>m = m + 1</math> | ||
+ | |||
+ | |||
+ | |- | ||
+ | | style="text-align: center; font-size: 75%;"| | ||
+ | <span id='algorithm-7'></span>'''Algorithm. 7''' Definition of node ownership. | ||
+ | |} | ||
<ol> | <ol> | ||
− | <li>Each process creates new nodes locally on edge midpoints (Algorithm [[# | + | <li>Each process creates new nodes locally on edge midpoints (Algorithm [[#algorithm-8|8]]). Nodal data is initialized by averaging the values stored by the nodes on both ends of the edge. The new node must be created on all partitions that know it, independently of which process owns the node, as node ownership only determines which process holds the reference data during synchronization. </li> |
</ol> | </ol> | ||
− | + | ||
+ | {| style="margin: 1em auto;border: 1px solid darkgray;" | ||
+ | |- | ||
+ | | | ||
+ | : <math>i \in S_k</math> <math>j</math> in non-zero columns of row <math>i</math> '''if''' <math>\boldsymbol{E} \left(i,j\right)> 0</math> '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : <math>k = \boldsymbol{E} \left(i,j\right)</math> Create node with index <math>k</math>. Initialize node <math>k</math> using data from nodes <math>i</math> and <math>j</math>. | ||
+ | |||
+ | |||
+ | |- | ||
+ | | style="text-align: center; font-size: 75%;"| | ||
+ | <span id='algorithm-8'></span>'''Algorithm. 8''' Creation of new nodes. | ||
+ | |} | ||
<ol> | <ol> | ||
− | <li>Create new elements locally using the subdivision procedure described in Section [[#5.2.3 Local refinement of triangles and tetrahedra|5.2.3]] (Algorithm [[# | + | <li>Create new elements locally using the subdivision procedure described in Section [[#5.2.3 Local refinement of triangles and tetrahedra|5.2.3]] (Algorithm [[#algorithm-9|9]]). Note that all elements with one or more refined edges must be subdivided, not just those identified using the refinement criteria. Recall that, in <math display="inline">3D</math>, new nodes can be created at the element center in some cases, to avoid creating highly distorted elements. If this happens, the node is created as local to the partition that owns the element and its nodal data is interpolated from the nodes of the original tetrahedron. </li> |
</ol> | </ol> | ||
− | + | ||
+ | {| style="margin: 1em auto;border: 1px solid darkgray;" | ||
+ | |- | ||
+ | | | ||
+ | : Elements '''if''' Some edge refined '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : Divide element '''if''' New nodes created '''then''' | ||
+ | :: | ||
+ | :'''end''' | ||
+ | : Interpolate data for new node using existing element's nodes. | ||
+ | |||
+ | |||
+ | |- | ||
+ | | style="text-align: center; font-size: 75%;"| | ||
+ | <span id='algorithm-9'></span>'''Algorithm. 9''' Creation of new elements. | ||
+ | |} | ||
<ol> | <ol> | ||
Line 5,741: | Line 5,909: | ||
===5.2.5 Scalability test=== | ===5.2.5 Scalability test=== | ||
− | As a first test of the refinement algorithm and its parallel implementation we refined a tetrahedral mesh homogeneously. We define a cubic domain given by its corners <math>\left(-1,-1,-1\right)</math> and <math>\left(1,1,1\right)</math> and generate an initial mesh composed of slightly over one million tetrahedra. This mesh, as all initial meshes used in later examples, has been generated using the pre-processing module of GiD <span id='citeF- | + | As a first test of the refinement algorithm and its parallel implementation we refined a tetrahedral mesh homogeneously. We define a cubic domain given by its corners <math>\left(-1,-1,-1\right)</math> and <math>\left(1,1,1\right)</math> and generate an initial mesh composed of slightly over one million tetrahedra. This mesh, as all initial meshes used in later examples, has been generated using the pre-processing module of GiD <span id='citeF-77'></span>[[#cite-77|[77]]]. The domain is fully refined in two passes, first splitting all elements to obtain about <math>8</math> million tetrahedra and again for a total of <math>64</math> million elements. The local mesh improvement strategy is not used in this case, as we are interested in testing the implementation of the refinement algorithm and its performance. Times required to complete this operation using different amounts of parallel processes is recorded in Table [[#table-9|9]]. Reported times were obtained using up to three Intel Xeon E5645 processors, each consisting in two six-core CPU at <math>2.40 \, \hbox{GHz}</math> connected to <math>48 \; \hbox{GB}</math> RAM each. Communication between processors was done through an Infiniband connection. The results are also presented in graphical form in Fig. [[#img-58|58]]. |
− | {| class="wikitable" style="text-align: center; margin: 1em auto;" | + | {| class="floating_tableSCP wikitable" style="text-align: center; margin: 1em auto;min-width:50%;" |
− | |+ <span id='table-9'></span>Table. 9 Homogeneous refinement test – wall times and parallel speedup. | + | |+ style="font-size: 75%;" |<span id='table-9'></span>Table. 9 Homogeneous refinement test – wall times and parallel speedup. |
|- | |- | ||
| style="border-right: 2px solid;" | | | style="border-right: 2px solid;" | | ||
| colspan='2' style="border-left: 2px solid;border-right: 2px solid;border-left: 2px solid;border-right: 2px solid;" | First step | | colspan='2' style="border-left: 2px solid;border-right: 2px solid;border-left: 2px solid;border-right: 2px solid;" | First step | ||
| colspan='2' style="border-left: 2px solid;border-left: 2px solid;border-right: 2px solid;" | Second step | | colspan='2' style="border-left: 2px solid;border-left: 2px solid;border-right: 2px solid;" | Second step | ||
− | |- | + | |- style="border-top: 2px solid;" |
| style="border-right: 2px solid;" | Num. procs. | | style="border-right: 2px solid;" | Num. procs. | ||
| style="border-left: 2px solid;border-right: 2px solid;" | Wall time (s) | | style="border-left: 2px solid;border-right: 2px solid;" | Wall time (s) | ||
Line 5,754: | Line 5,922: | ||
| style="border-left: 2px solid;border-right: 2px solid;" | Wall time (s) | | style="border-left: 2px solid;border-right: 2px solid;" | Wall time (s) | ||
| style="border-left: 2px solid;" | Speedup | | style="border-left: 2px solid;" | Speedup | ||
− | |- | + | |- style="border-top: 2px solid;" |
| style="border-right: 2px solid;" | 4 | | style="border-right: 2px solid;" | 4 | ||
| style="border-left: 2px solid;border-right: 2px solid;" | 21.16 | | style="border-left: 2px solid;border-right: 2px solid;" | 21.16 | ||
Line 5,780: | Line 5,948: | ||
|} | |} | ||
− | <div id='img- | + | <div id='img-58a'></div> |
− | <div id='img- | + | <div id='img-58b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-58'></div> |
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-refinement_cube_times.png|202px|Relative wall time.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-refinement_cube_speedup.png|202px|Parallel speedup.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | (a) Relative wall time. |
+ | | (b) Parallel speedup. | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 58:''' Homogeneous refinement test – parallel performance. | ||
|} | |} | ||
While the test results show good parallel performance, it must be remarked that this experiment does not take into account an important aspect in practice: when refinement is not homogeneous, the number of elements in each subdomain changes and, without a load balancing strategy, parallel performance may degrade as different processors can have very different loads if refinement is concentrated on a few of the original subdomains. | While the test results show good parallel performance, it must be remarked that this experiment does not take into account an important aspect in practice: when refinement is not homogeneous, the number of elements in each subdomain changes and, without a load balancing strategy, parallel performance may degrade as different processors can have very different loads if refinement is concentrated on a few of the original subdomains. | ||
Line 5,793: | Line 5,965: | ||
==5.3 Application to laminar and turbulent flows== | ==5.3 Application to laminar and turbulent flows== | ||
− | We simulated a first set of cases combining the incompressible fluid solver presented in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]] with the refinement algorithm introduced in the previous pages. All simulations were performed with the static OSS method, coupled with the corresponding error estimator, given by Eq. [[#eq- | + | We simulated a first set of cases combining the incompressible fluid solver presented in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]] with the refinement algorithm introduced in the previous pages. All simulations were performed with the static OSS method, coupled with the corresponding error estimator, given by Eq. [[#eq-5.292|5.292]]. With these tests, our aim was to test the applicability of our refinement strategy on distributed memory simulations, rather than obtaining high quality solutions. |
===5.3.1 Flow around a cylinder at <math>\hbox{Re}=</math> 100=== | ===5.3.1 Flow around a cylinder at <math>\hbox{Re}=</math> 100=== | ||
− | As a relatively simple, small scale application we simulate the two-dimensional flow around a cylinder using static OSS stabilization. The set up of the problem, taken from <span id='citeF- | + | As a relatively simple, small scale application we simulate the two-dimensional flow around a cylinder using static OSS stabilization. The set up of the problem, taken from <span id='citeF-30'></span>[[#cite-30|[30]]], consists in a cylindrical obstacle of diameter <math>D = 1 \, \hbox{m}</math> centered on the origin of a domain defined by the range <math>\left[-4D,12D \right]\times \left[-4D,4D\right]</math>. A horizontal velocity <math>U = 1 \, \hbox{m/s}</math> is imposed on the left side of the domain, while a no-penetration condition is set on the top and bottom edges. The velocity is fixed to zero on the cylinder. The fluid properties are defined as <math>\rho = 1 \, \hbox{Kg}/\hbox{m}^3</math> and <math>\mu = 0.01 \, \hbox{Pa} \cdot \hbox{s}</math>, such that the Reynolds number in terms of the diameter is <math>\hbox{Re}= 100</math>. Starting from a uniform structured mesh containing <math>3984</math> linear triangles, <math>60</math> seconds of flow are simulated using a time step of <math>0.1</math> seconds. In this case, the refinement strategy is used after a starting phase to allow the simulation to transition from the initial condition to a dynamic solution. The refinement procedure is then used every 20 solution steps, resulting in a total of 40 refinement passes. The maximum number of refinements over a single original element is limited to 3 to preserve mesh quality and prevent excessive refinement on localized areas. Although the problem is small enough to be run on a desktop computer, the simulation was performed in a distributed memory machine, using 8 processes to test the parallel implementation. The initial mesh and the partition into parallel subdomains are shown in Fig. [[#img-59|59]]. <div id='img-59a'></div> |
− | <div id='img- | + | <div id='img-59b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-59'></div> |
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-amr_cylinder_mesh_initial.png|207px|Initial mesh.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-amr_cylinder_domain.png|207px|Parallel subdomains.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | (a) Initial mesh. |
+ | | (b) Parallel subdomains. | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 59:''' Cylinder test – initial mesh and parallel partition. | ||
|} | |} | ||
− | At the end of the simulation the mesh had been refined to contain a total of <math>11666</math> elements, as shown in Fig. [[#img- | + | At the end of the simulation the mesh had been refined to contain a total of <math>11666</math> elements, as shown in Fig. [[#img-60|60]]. The total number of elements per subdomain at the begining and the end of the simulation is shown in Table [[#table-10|10]]. Observing the velocity isolines in Fig. [[#img-60b|60b]], it can be seen that the zones that have been refined generally coincide with high velocity gradient zones in the front of the cylinder and the vortex tail that forms after it. <div id='img-60a'></div> |
− | <div id='img- | + | <div id='img-60b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-60'></div> |
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-amr_cylinder_mesh_final.png|207px|Final mesh.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-amr_cylinder_contours.png|208px|Isolines of velocity magnitude.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Final mesh. | ||
+ | | (b) Isolines of velocity magnitude. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | colspan="2" | '''Figure 60:''' Cylinder test – final mesh and velocity isolines. |
|} | |} | ||
From the point of view of load balancing, the element counts in Table [[#table-10|10]] show that refinement is not homogeneous across subdomains and, at the end of the simulation, the largest domain has close to three times more elements than the smallest one. This suggests that the practical applicability of the method in a parallel context would be much greater if it included a dynamic load balancing strategy so that elements are always distributed evenly across subdomains. | From the point of view of load balancing, the element counts in Table [[#table-10|10]] show that refinement is not homogeneous across subdomains and, at the end of the simulation, the largest domain has close to three times more elements than the smallest one. This suggests that the practical applicability of the method in a parallel context would be much greater if it included a dynamic load balancing strategy so that elements are always distributed evenly across subdomains. | ||
− | {| class="wikitable" style="text-align: center; margin: 1em auto;" | + | {| class="floating_tableSCP wikitable" style="text-align: center; margin: 1em auto;min-width:50%;" |
− | |+ <span id='table-10'></span>Table. 10 Cylinder test – distribution of elements per partition. | + | |+ style="font-size: 75%;" |<span id='table-10'></span>Table. 10 Cylinder test – distribution of elements per partition. |
|- | |- | ||
| style="border-right: 2px solid;" | Process | | style="border-right: 2px solid;" | Process | ||
Line 5,829: | Line 6,009: | ||
| style="border-left: 2px solid;border-right: 2px solid;" | 7 | | style="border-left: 2px solid;border-right: 2px solid;" | 7 | ||
| style="border-left: 2px solid;" | Total | | style="border-left: 2px solid;" | Total | ||
− | |- | + | |- style="border-top: 2px solid;" |
| style="border-right: 2px solid;" | Initial | | style="border-right: 2px solid;" | Initial | ||
| style="border-left: 2px solid;border-right: 2px solid;" | 496 | | style="border-left: 2px solid;border-right: 2px solid;" | 496 | ||
Line 5,856: | Line 6,036: | ||
===5.3.2 Flow around a 6 meter cube=== | ===5.3.2 Flow around a 6 meter cube=== | ||
− | Additionally, we studied a realistic three-dimensional case in order to test the refinement strategy on a tetrahedral mesh. We chose to simulate the flow around the Silsoe cube, a benchmark problem for the flow over bluff bodies. This test case reproduces an experiment performed at the Silsoe Research Institute <span id='citeF- | + | Additionally, we studied a realistic three-dimensional case in order to test the refinement strategy on a tetrahedral mesh. We chose to simulate the flow around the Silsoe cube, a benchmark problem for the flow over bluff bodies. This test case reproduces an experiment performed at the Silsoe Research Institute <span id='citeF-113'></span>[[#cite-113|[113]]] in which a cube with <math>6</math> meter sides was placed under incoming wind. We simulate the configuration where the average wind direction is perpendicular to one of the cube faces. The cube is placed at a distance of <math>60 \, \hbox{m}</math> from the inlet, while the incoming wind is defined according to the logarithmic wind profile of Eq. [[#eq-5.293|5.293]] (see for example <span id='citeF-2'></span>[[#cite-2|[2]]]). |
− | <span id="eq- | + | <span id="eq-5.293"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> \frac{u_x\left(z\right)}{u_\tau } = \frac{1}{\kappa } \log \left(\frac{z \, u_\tau }{\nu } \right)+ B </math> | | style="text-align: center;" | <math> \frac{u_x\left(z\right)}{u_\tau } = \frac{1}{\kappa } \log \left(\frac{z \, u_\tau }{\nu } \right)+ B </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.293) |
|} | |} | ||
− | For the present simulation, we define <math>u_\tau = 0.272 \, \hbox{m}/\hbox{s}</math> as the friction velocity, a kinematic viscosity of <math>\nu = 1.51 \times 10 ^ {-5} \, \hbox{m}^2/\hbox{s}</math>, corresponding to air, a value of <math>\kappa = 0.41</math> for Von Kármán's constant and <math>B= 5.2</math>. An air density <math>\rho=1.225 \, \hbox{Kg}/\hbox{m}^3</math> is assumed. We simulate a flow time of <math>6</math> seconds, using a time step of <math>0.1</math> seconds. The simulation domain has a total length of <math>108 \, \hbox{m}</math> in the direction of the mean flow (<math>x</math>), <math>48 \, \hbox{m}</math> in the cross-wind direction (<math>y</math>) and a total height of <math>30 \, \hbox{m}</math> in the <math>z</math> direction. The refinement algorithm is used for the first time after 20 solution steps of the flow problem and every 10 steps from then on, for a total of five refinement iterations. In this case, the tolerance for the error indicator is set relative to the average velocity of the flow, so elements are refined if the magnitude of the small scale on the center of the element is larger than <math>5%</math> of the average large-scale velocity. To preserve mesh quality, only two refinements are allowed over a single original element. The initial mesh is composed of <math>1.6</math> million tetrahedral elements, refined to a total of <math>5.3</math> million elements at the end of the simulation. The instantaneous pressure contours on the central <math>x</math>–<math>z</math> plane obtained for time <math>1\, \hbox{s}</math>, along with the original mesh, are shown in Fig. | + | For the present simulation, we define <math>u_\tau = 0.272 \, \hbox{m}/\hbox{s}</math> as the friction velocity, a kinematic viscosity of <math>\nu = 1.51 \times 10 ^ {-5} \, \hbox{m}^2/\hbox{s}</math>, corresponding to air, a value of <math>\kappa = 0.41</math> for Von Kármán's constant and <math>B= 5.2</math>. An air density <math>\rho=1.225 \, \hbox{Kg}/\hbox{m}^3</math> is assumed. We simulate a flow time of <math>6</math> seconds, using a time step of <math>0.1</math> seconds. The simulation domain has a total length of <math>108 \, \hbox{m}</math> in the direction of the mean flow (<math>x</math>), <math>48 \, \hbox{m}</math> in the cross-wind direction (<math>y</math>) and a total height of <math>30 \, \hbox{m}</math> in the <math>z</math> direction. The refinement algorithm is used for the first time after 20 solution steps of the flow problem and every 10 steps from then on, for a total of five refinement iterations. In this case, the tolerance for the error indicator is set relative to the average velocity of the flow, so elements are refined if the magnitude of the small scale on the center of the element is larger than <math>5%</math> of the average large-scale velocity. To preserve mesh quality, only two refinements are allowed over a single original element. The initial mesh is composed of <math>1.6</math> million tetrahedral elements, refined to a total of <math>5.3</math> million elements at the end of the simulation. The instantaneous pressure contours on the central <math>x</math>–<math>z</math> plane obtained for time <math>1\, \hbox{s}</math>, along with the original mesh, are shown in Fig. [[#img-61a|61a]]. The same contours for time <math>6\, \hbox{s}</math> and the final mesh are shown in Fig. [[#img-61b|61b]]. <div id='img-61a'></div> |
− | <div id='img- | + | <div id='img-61b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-61'></div> |
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-silsoe_start.png|213px|Pressure distribution at $t = 1 \, \text{s}$, original mesh]] |
− | |[[Image: | + | |[[Image:Cotela_2016-silsoe_end.png|213px|Pressure distribution at $t = 6 \, \text{s}$, refined mesh]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | (a) Pressure distribution at <math display="inline">t = 1 \, \hbox{s}</math>, original mesh |
+ | | (b) Pressure distribution at <math display="inline">t = 6 \, \hbox{s}</math>, refined mesh | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 61:''' Silsoe cube – pressure results on the central plane and simulation meshes. | ||
|} | |} | ||
− | We observe that the refined elements are concentrated near the cube and its immediate wake. In the front of the cube, they are roughly placed along the area where the flow starts to deviate due to the obstacle. Experimental results show that a horseshoe vortex should develop close to the ground in that zone, and the distribution of elements seems to follow it. On the wake region, the refined area develops progressively as vortices detach from the cube and travel downstream. If the simulation was run for a longer period, it should be expected that the refined area would advance towards the exit to obtain a fully refined wake, as happened previously in the cylinder example. Finally, we want to remark that this simulation was performed to test the refinement algorithm in a realistic setting and not to obtain precise results. The Silsoe cube problem was analyzed using the same solver (without adaptive mesh refinement) in <span id='citeF- | + | We observe that the refined elements are concentrated near the cube and its immediate wake. In the front of the cube, they are roughly placed along the area where the flow starts to deviate due to the obstacle. Experimental results show that a horseshoe vortex should develop close to the ground in that zone, and the distribution of elements seems to follow it. On the wake region, the refined area develops progressively as vortices detach from the cube and travel downstream. If the simulation was run for a longer period, it should be expected that the refined area would advance towards the exit to obtain a fully refined wake, as happened previously in the cylinder example. Finally, we want to remark that this simulation was performed to test the refinement algorithm in a realistic setting and not to obtain precise results. The Silsoe cube problem was analyzed using the same solver (without adaptive mesh refinement) in <span id='citeF-114'></span>[[#cite-114|[114]]], obtaining good agreement with the benchmark solutions. |
==5.4 A FEM solver with adaptive mesh refinement for viscoplastic flows== | ==5.4 A FEM solver with adaptive mesh refinement for viscoplastic flows== | ||
Line 5,888: | Line 6,072: | ||
Defining the fluid's velocity <math>u</math> and density <math>\rho </math>, the stress tensor <math>\boldsymbol{\sigma }</math> and the external forces <math>\boldsymbol{f}</math>, the conservation of linear momentum can be stated as | Defining the fluid's velocity <math>u</math> and density <math>\rho </math>, the stress tensor <math>\boldsymbol{\sigma }</math> and the external forces <math>\boldsymbol{f}</math>, the conservation of linear momentum can be stated as | ||
− | <span id="eq- | + | <span id="eq-5.294"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> \rho \, u\cdot \nabla u- \nabla \cdot \boldsymbol{\sigma }= \boldsymbol{f} </math> | | style="text-align: center;" | <math> \rho \, u\cdot \nabla u- \nabla \cdot \boldsymbol{\sigma }= \boldsymbol{f} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.294) |
|} | |} | ||
and the conservation of mass implies that, for an incompressible fluid, | and the conservation of mass implies that, for an incompressible fluid, | ||
− | <span id="eq- | + | <span id="eq-5.295"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> \nabla \cdot u= 0 </math> | | style="text-align: center;" | <math> \nabla \cdot u= 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.295) |
|} | |} | ||
The definition of the problem is completed by introducing a model domain <math>\Omega </math> with boundary <math>\partial \Omega = \Gamma _D \cup \Gamma _N</math> and appropriate boundary conditions | The definition of the problem is completed by introducing a model domain <math>\Omega </math> with boundary <math>\partial \Omega = \Gamma _D \cup \Gamma _N</math> and appropriate boundary conditions | ||
− | <span id="eq- | + | <span id="eq-5.296"></span> |
− | <span id="eq- | + | <span id="eq-5.297"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
+ | |- | ||
+ | | style="text-align: center;" | <math> u= u_0 \quad \hbox{ on} \; \Gamma _D </math> | ||
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.296) | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \boldsymbol{\sigma }\cdot \boldsymbol{n} = \boldsymbol{t} \quad \hbox{ on} \; \Gamma _N </math> |
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.297) | ||
|} | |} | ||
− | |||
|} | |} | ||
− | where <math>u_0</math> is the imposed velocity on the Dirichlet boundary <math>\Gamma _D</math>, <math>\boldsymbol{n}</math> is the outwards unit normal on the Neumann boundary <math>\Gamma _N</math> and <math>\boldsymbol{t}</math> are the imposed tractions. The stress tensor of Eq. [[#eq- | + | where <math>u_0</math> is the imposed velocity on the Dirichlet boundary <math>\Gamma _D</math>, <math>\boldsymbol{n}</math> is the outwards unit normal on the Neumann boundary <math>\Gamma _N</math> and <math>\boldsymbol{t}</math> are the imposed tractions. The stress tensor of Eq. [[#eq-5.294|5.294]] can be decomposed into a volumetric part involving the pressure <math>p</math> and a deviatoric stress tensor <math>\boldsymbol{\tau }</math>: |
− | <span id="eq- | + | <span id="eq-5.298"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> \boldsymbol{\sigma }= - p \, \boldsymbol{I} + \boldsymbol{\tau } </math> | | style="text-align: center;" | <math> \boldsymbol{\sigma }= - p \, \boldsymbol{I} + \boldsymbol{\tau } </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.298) |
|} | |} | ||
where <math>\boldsymbol{I}</math> is the second order identity tensor. A constitutive model is required to close the formulation, giving an expression for the deviatoric stresses <math>\boldsymbol{\tau }</math>. A broad class of fluid materials follow a generalized Newtonian law given by | where <math>\boldsymbol{I}</math> is the second order identity tensor. A constitutive model is required to close the formulation, giving an expression for the deviatoric stresses <math>\boldsymbol{\tau }</math>. A broad class of fluid materials follow a generalized Newtonian law given by | ||
− | <span id="eq- | + | <span id="eq-5.299"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> \boldsymbol{\tau }= 2 \eta \boldsymbol{S} </math> | | style="text-align: center;" | <math> \boldsymbol{\tau }= 2 \eta \boldsymbol{S} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.299) |
|} | |} | ||
where the apparent viscosity <math>\eta </math> is, in general, a variable that depends on the characteristics of the flow and <math>\boldsymbol{S}</math> is the strain rate tensor, defined as | where the apparent viscosity <math>\eta </math> is, in general, a variable that depends on the characteristics of the flow and <math>\boldsymbol{S}</math> is the strain rate tensor, defined as | ||
− | <span id="eq- | + | <span id="eq-5.300"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> \boldsymbol{S}= \nabla ^s u= \frac{1}{2} \left(\nabla u+ \left(\nabla u\right)^T \right) </math> | | style="text-align: center;" | <math> \boldsymbol{S}= \nabla ^s u= \frac{1}{2} \left(\nabla u+ \left(\nabla u\right)^T \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.300) |
|} | |} | ||
Additionally, it is convenient to introduce the following tensor invariants to measure the magnitude of the strain rate and deviatoric stresses | Additionally, it is convenient to introduce the following tensor invariants to measure the magnitude of the strain rate and deviatoric stresses | ||
− | <span id="eq- | + | <span id="eq-5.301"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> \dot{\gamma } = \sqrt{2 \, \boldsymbol{S} \,:\, \boldsymbol{S} } \qquad \left\Vert \boldsymbol{\tau }\right\Vert = \sqrt{\frac{1}{2} \, \boldsymbol{\tau }\,:\, \boldsymbol{\tau }} </math> | | style="text-align: center;" | <math> \dot{\gamma } = \sqrt{2 \, \boldsymbol{S} \,:\, \boldsymbol{S} } \qquad \left\Vert \boldsymbol{\tau }\right\Vert = \sqrt{\frac{1}{2} \, \boldsymbol{\tau }\,:\, \boldsymbol{\tau }} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.301) |
|} | |} | ||
− | In the present work, a regularized Bingham model will be used. A Bingham fluid <span id='citeF- | + | In the present work, a regularized Bingham model will be used. A Bingham fluid <span id='citeF-115'></span><span id='citeF-116'></span>[[#cite-115|[115,116]]] is a material that remains rigid while the applied shear stress is lower than its yield stress <math>\tau _0</math>. Once this limit is reached, the material starts flowing with a constant viscosity <math>\mu _p</math>, the plastic viscosity. This can be expressed using the notation of Eq. [[#eq-5.299|5.299]] if the apparent viscosity is defined as: |
− | <span id="eq- | + | <span id="eq-5.302"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math> \eta | + | | style="text-align: center;" | <math> \eta = \infty \quad \hbox{ if} \quad \left\Vert \boldsymbol{\tau }\right\Vert < \tau _0 </math> |
− | + | ||
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \eta | + | | style="text-align: center;" | <math> \eta = \mu _p + \frac{\tau _0}{\dot{\gamma } } \quad \hbox{ if} \quad \left\Vert \boldsymbol{\tau }\right\Vert \geq \tau _0 </math> |
− | + | ||
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.302) |
|} | |} | ||
− | Unfortunately, the discontinuous nature of the Bingham model introduces numerical difficulties, as the apparent viscosity <math>\eta </math> is infinite for small strain rates that don't produce flow. As a way to prevent this issue, we have adopted the regularized equation proposed by Papanastasiou <span id='citeF- | + | Unfortunately, the discontinuous nature of the Bingham model introduces numerical difficulties, as the apparent viscosity <math>\eta </math> is infinite for small strain rates that don't produce flow. As a way to prevent this issue, we have adopted the regularized equation proposed by Papanastasiou <span id='citeF-117'></span>[[#cite-117|[117]]], replacing Eq. [[#eq-5.302|5.302]] with |
− | <span id="eq- | + | <span id="eq-5.303"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> \eta = \mu _p + \frac{\tau _0}{ \dot{\gamma } } \left(1 - e^{ -m \dot{\gamma } } \right) </math> | | style="text-align: center;" | <math> \eta = \mu _p + \frac{\tau _0}{ \dot{\gamma } } \left(1 - e^{ -m \dot{\gamma } } \right) </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.303) |
|} | |} | ||
− | where <math>m</math> is a regularization coefficient with units of time. Using this regularized expression, it can be shown that <math>\eta \rightarrow \mu _p + m \tau _0</math> when <math>\dot{\gamma } \rightarrow 0</math> and the apparent viscosity is never infinite. The regularized law of Eq. [[#eq- | + | where <math>m</math> is a regularization coefficient with units of time. Using this regularized expression, it can be shown that <math>\eta \rightarrow \mu _p + m \tau _0</math> when <math>\dot{\gamma } \rightarrow 0</math> and the apparent viscosity is never infinite. The regularized law of Eq. [[#eq-5.303|5.303]], which tends to the original Bingham model of Eq. [[#eq-5.302|5.302]] as <math>m</math> increases, is compared to an ideal Bingham fluid in Fig. [[#img-62|62]]. Note this is not the only choice for a regularized formulation, other alternatives have been presented in <span id='citeF-118'></span><span id='citeF-119'></span><span id='citeF-120'></span>[[#cite-118|[118,119,120]]]. <div id='img-62'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-bingham.png|216px|Bingham model.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 62:''' Bingham model. |
|} | |} | ||
===5.4.2 Stabilized formulation=== | ===5.4.2 Stabilized formulation=== | ||
− | To introduce the variational form of the problem we define spaces <math>V</math> and <math>Q</math> containing the exact values <math>u</math> and <math>p</math>, respectively, of the solution of the problem in <math>\Omega </math>. Additionally, we define the test functions <math>\boldsymbol{w}\in V_0</math>, <math>q \in Q</math>, where <math>V_0</math> is defined as <math>V</math> restricted to the zero Dirichlet condition <math>\boldsymbol{w}= 0</math> on <math>\Gamma _D</math>. The variational form of the problem can be obtained by multiplying Eqs. [[#eq- | + | To introduce the variational form of the problem we define spaces <math>V</math> and <math>Q</math> containing the exact values <math>u</math> and <math>p</math>, respectively, of the solution of the problem in <math>\Omega </math>. Additionally, we define the test functions <math>\boldsymbol{w}\in V_0</math>, <math>q \in Q</math>, where <math>V_0</math> is defined as <math>V</math> restricted to the zero Dirichlet condition <math>\boldsymbol{w}= 0</math> on <math>\Gamma _D</math>. The variational form of the problem can be obtained by multiplying Eqs. [[#eq-5.294|5.294]] and [[#eq-5.295|5.295]] by test functions <math>\boldsymbol{w}</math>, <math>q</math> and integrating over the simulation domain <math>\Omega </math>: |
− | <span id="eq- | + | <span id="eq-5.304"></span> |
− | <span id="eq- | + | <span id="eq-5.305"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega \boldsymbol{w}\, \rho u\cdot \nabla u\, \hbox{d}\Omega \, + \int _\Omega 2\eta \nabla ^s \boldsymbol{w}: \nabla ^s u\, \hbox{d}\Omega </math> |
+ | |- | ||
+ | | style="text-align: center;" | <math> - \int _\Omega \nabla \cdot \boldsymbol{w}\, p \, \, \hbox{d}\Omega = \int _\Omega \boldsymbol{w}\boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}\boldsymbol{t} \, \hbox{d}\Gamma </math> | ||
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.304) | ||
+ | |- | ||
+ | | style="text-align: center;" | <math> \int _\Omega q \nabla \cdot u\, \hbox{d}\Omega = 0 </math> | ||
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.305) | ||
|} | |} | ||
− | |||
|} | |} | ||
where some terms have been integrated by parts. As seen in the previous chapters, the Galerkin weak form of the Navier-Stokes equations suffers from stability issues. In this case, we used the static versions of both the ASGS and OSS formulations to stabilize it. The choice of using a VMS based formulation has an added benefit: it allows us to use the error estimator presented in Section [[#5.2.1 Error estimation|5.2.1]] without modification. We introduce the discrete solution as <math>u_h\in V_h</math>, <math>p_h\in Q_h</math>, where <math>V_h \subset V</math> and <math>Q_h \subset Q</math> are the discrete spaces defined by the finite element interpolation. Given these definitions, the VMS approach is based in decomposing the problem variables into a large scale part, identified with the finite element solution, and a small scale part: | where some terms have been integrated by parts. As seen in the previous chapters, the Galerkin weak form of the Navier-Stokes equations suffers from stability issues. In this case, we used the static versions of both the ASGS and OSS formulations to stabilize it. The choice of using a VMS based formulation has an added benefit: it allows us to use the error estimator presented in Section [[#5.2.1 Error estimation|5.2.1]] without modification. We introduce the discrete solution as <math>u_h\in V_h</math>, <math>p_h\in Q_h</math>, where <math>V_h \subset V</math> and <math>Q_h \subset Q</math> are the discrete spaces defined by the finite element interpolation. Given these definitions, the VMS approach is based in decomposing the problem variables into a large scale part, identified with the finite element solution, and a small scale part: | ||
− | <span id="eq- | + | <span id="eq-5.306"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> u= u_h+ u_s\qquad p = p_h+ p_s </math> | | style="text-align: center;" | <math> u= u_h+ u_s\qquad p = p_h+ p_s </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.306) |
|} | |} | ||
− | where the small scale variables <math>u_s</math>, <math>p_s</math> represent the part of the continuous solution that is not resolved with the discrete interpolation. Next we introduce the scale separation of Eq. [[#eq- | + | where the small scale variables <math>u_s</math>, <math>p_s</math> represent the part of the continuous solution that is not resolved with the discrete interpolation. Next we introduce the scale separation of Eq. [[#eq-5.306|5.306]] in the variational problem given by Eqs. [[#eq-5.304|5.304]] and [[#eq-5.305|5.305]]. Using test functions belonging to the discrete space <math>\boldsymbol{w}_h\in V_h</math>, <math>q_h\in Q_h</math>, we obtain |
− | <span id="eq- | + | <span id="eq-5.307"></span> |
− | <span id="eq- | + | <span id="eq-5.309"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega \boldsymbol{w}_h\, \rho u_h\cdot \nabla u_h\, \hbox{d}\Omega + \int _\Omega 2\eta \nabla ^s \boldsymbol{w}_h: \nabla ^s u_h\, \hbox{d}\Omega </math> |
+ | |- | ||
+ | | style="text-align: center;" | <math> - \int _\Omega \nabla \cdot \boldsymbol{w}_h\, p_h\, \hbox{d}\Omega - \sum _{e} \int _{\Omega ^e} \nabla \cdot \left(2 \eta \nabla ^s \boldsymbol{w}_h\right)u_s\, \hbox{d}\Omega </math> | ||
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.307) | ||
+ | |- | ||
+ | | style="text-align: center;" | <math> - \sum _{e} \int _{\Omega ^e} \rho u_h\cdot \nabla \boldsymbol{w}_h\, u_s\, \hbox{d}\Omega - \sum _{e} \int _{\Omega ^e} \nabla \cdot \boldsymbol{w}_h\, p_s\, \hbox{d}\Omega = \int _\Omega \boldsymbol{w}_h\boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}_h\boldsymbol{t} \, \hbox{d}\Gamma </math> | ||
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.308) | ||
+ | |- | ||
+ | | style="text-align: center;" | <math> \int _\Omega q_h\nabla \cdot u= \sum _{e} \int _{\Omega ^e} \nabla q_hu_s\, \hbox{d}\Omega </math> | ||
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.309) | ||
|} | |} | ||
− | |||
|} | |} | ||
where <math>\Omega ^e</math> represents a single element. Note that, to obtain this expression, we integrated by parts over individual finite element domains to ensure that the equations only involve the small scale values and not their spatial derivatives. In doing so, we neglected all integrals over element boundaries. Using ASGS stabilization, the model for the small scales is defined as | where <math>\Omega ^e</math> represents a single element. Note that, to obtain this expression, we integrated by parts over individual finite element domains to ensure that the equations only involve the small scale values and not their spatial derivatives. In doing so, we neglected all integrals over element boundaries. Using ASGS stabilization, the model for the small scales is defined as | ||
− | <span id="eq- | + | <span id="eq-5.310"></span> |
− | <span id="eq- | + | <span id="eq-5.311"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
+ | |- | ||
+ | | style="text-align: center;" | <math> u_s= \tau _1 \boldsymbol{R}^m\left(u_h,p_h\right) = \tau _1 \left(\boldsymbol{f} - \rho u_h\cdot \nabla u_h+ \nabla \cdot 2\eta \nabla ^s u_h- \nabla p_h\right) </math> | ||
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.310) | ||
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> p_s= \tau _2 R^c\left(u_h\right)= \tau _2 \left(- \nabla \cdot u_h\right) </math> |
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.311) | ||
|} | |} | ||
− | |||
|} | |} | ||
− | where <math>\boldsymbol{R}^m\left(u_h,p_h\right)</math> and <math>R^c\left(u_h\right)</math> represent the residuals of Eqs. [[#eq- | + | where <math>\boldsymbol{R}^m\left(u_h,p_h\right)</math> and <math>R^c\left(u_h\right)</math> represent the residuals of Eqs. [[#eq-5.294|5.294]] and [[#eq-5.295|5.295]] respectively, evaluated using only the large scale part of the solution <math>u_h</math>, <math>p_h</math>. The stabilization parameters <math>\tau _1</math>, <math>\tau _2</math> are defined in terms of a characteristic element length <math>h</math> as: |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math> \tau _1 = \left(\frac{2 \rho \left\Vert u_h\right\Vert }{h} + \frac{4\eta }{h^2} \right)^{-1} \quad \tau _2 = \eta + \frac{\rho \left\Vert u_h\right\Vert h}{2} </math> | + | | style="text-align: center;" | <math> \tau _1 = \left(\frac{2 \rho \left\Vert u_h\right\Vert}{h} + \frac{4\eta }{h^2} \right)^{-1} \quad \tau _2 = \eta + \frac{\rho \left\Vert u_h\right\Vert h}{2} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.312) |
|} | |} | ||
When using OSS stabilization, only the part of the residuals <math>\boldsymbol{R}^m\left(u_h,p_h\right)</math> and <math>R^c\left(u_h\right)</math> that is orthogonal to the finite element space is used to stabilize the solution. This results in the following modified model for the small scales: | When using OSS stabilization, only the part of the residuals <math>\boldsymbol{R}^m\left(u_h,p_h\right)</math> and <math>R^c\left(u_h\right)</math> that is orthogonal to the finite element space is used to stabilize the solution. This results in the following modified model for the small scales: | ||
− | <span id="eq- | + | <span id="eq-5.313"></span> |
− | <span id="eq- | + | <span id="eq-5.314"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> u_s= \tau _1 \left(\boldsymbol{f} - \rho u_h\cdot \nabla u_h+ \nabla \cdot 2 \eta \nabla ^s u_h- \nabla p_h- \boldsymbol{\Pi }^m \right) </math> |
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.313) | ||
+ | |- | ||
+ | | style="text-align: center;" | <math> p_s= \tau _2 \left(- \nabla \cdot u_h- \Pi ^c \right) </math> | ||
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.314) | ||
|} | |} | ||
− | |||
|} | |} | ||
where <math>\boldsymbol{\Pi }^m\left(u_h,p_h\right)</math> and <math>\Pi ^c\left(u_h\right)</math> are the <math>L_2</math> projections of the residuals onto the finite element space, that is, the solution of the auxiliary projection problem | where <math>\boldsymbol{\Pi }^m\left(u_h,p_h\right)</math> and <math>\Pi ^c\left(u_h\right)</math> are the <math>L_2</math> projections of the residuals onto the finite element space, that is, the solution of the auxiliary projection problem | ||
− | <span id="eq- | + | <span id="eq-5.315"></span> |
− | <span id="eq- | + | <span id="eq-5.316"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \int _\Omega \boldsymbol{w}_h\boldsymbol{\Pi }^{m} \, \hbox{d}\Omega = \int _\Omega \boldsymbol{w}_h\left(\boldsymbol{f} - \rho u_h\cdot \nabla u_h+ \nabla \cdot 2 \eta \nabla ^s u_h- \nabla p_h\right)\, \hbox{d}\Omega </math> |
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.315) | ||
+ | |- | ||
+ | | style="text-align: center;" | <math> \int _\Omega q_h\Pi ^{c} \, \hbox{d}\Omega = - \int _\Omega q_h \nabla \cdot u_h\, \hbox{d}\Omega </math> | ||
+ | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.316) | ||
|} | |} | ||
− | |||
|} | |} | ||
− | It is worth mentioning that the viscous term <math>\nabla \cdot 2\eta \nabla ^s u_h</math> in Eqs. [[#eq- | + | It is worth mentioning that the viscous term <math>\nabla \cdot 2\eta \nabla ^s u_h</math> in Eqs. [[#eq-5.310|5.310]] and [[#eq-5.313|5.313]], as well as in the momentum projection in Eq. [[#eq-5.315|5.315]], cannot be evaluated using linear finite elements, as is the case of the formulation used in the present work. This is due to the fact that second order derivatives of velocity shape functions are identically zero within the elements. Therefore, this term will be neglected in the following. Introducing the OSS small scale model into the variational form of Eqs. [[#eq-5.307|5.307]] and [[#eq-5.309|5.309]], the following stabilized formulation is obtained: |
− | <span id="eq- | + | <span id="eq-5.317"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> \int _\Omega \rho \boldsymbol{w}_h\, u_h\nabla u_h\, \hbox{d}\Omega + \int _\Omega 2\eta \nabla ^s \boldsymbol{w}_h: \nabla ^s u_h\, \hbox{d}\Omega - \int _\Omega \nabla \cdot \boldsymbol{w}_h\, p_h\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> + \sum _e \int _{\Omega _e} \rho u_h\nabla \boldsymbol{w}_h\tau _1 \left(\rho u_h\cdot \nabla u_h+ \nabla p_h\right)\, \hbox{d}\Omega - \sum _e \int _{\Omega _e} \nabla \cdot \boldsymbol{w}_h\tau _2 \left(- \nabla \cdot u_h- \Pi ^{c} \right)\, \hbox{d}\Omega = </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center | + | | style="text-align: center;" | <math> \quad \quad \int _\Omega \boldsymbol{w}_h\boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{w}_h\boldsymbol{t} \, \hbox{d}\Gamma + \sum _e \int _{\Omega _e} \rho u_h\nabla \boldsymbol{w}_h\tau _1 \left(\boldsymbol{f} - \boldsymbol{\Pi }^{m} \right)\, \hbox{d}\Omega </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.317) |
|} | |} | ||
− | <span id="eq- | + | <span id="eq-5.318"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> \int _\Omega q_h\nabla \cdot u+ \sum _e \int _{\Omega _e} \nabla q_h\tau _1 \left(\rho u_h\nabla u_h+ \nabla p_h\right)\, \hbox{d}\Omega = \sum _e \int _{\Omega _e} \nabla q_h\tau _1 \left(\boldsymbol{f} - \boldsymbol{\Pi }^{m} \right)\, \hbox{d}\Omega </math> | | style="text-align: center;" | <math> \int _\Omega q_h\nabla \cdot u+ \sum _e \int _{\Omega _e} \nabla q_h\tau _1 \left(\rho u_h\nabla u_h+ \nabla p_h\right)\, \hbox{d}\Omega = \sum _e \int _{\Omega _e} \nabla q_h\tau _1 \left(\boldsymbol{f} - \boldsymbol{\Pi }^{m} \right)\, \hbox{d}\Omega </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.318) |
|} | |} | ||
− | Analogously, the ASGS stabilized formulation can be recovered by dropping all terms involving <math>\boldsymbol{\Pi }^{m}</math> and <math>\Pi ^{c}</math> in Eqs. [[#eq- | + | Analogously, the ASGS stabilized formulation can be recovered by dropping all terms involving <math>\boldsymbol{\Pi }^{m}</math> and <math>\Pi ^{c}</math> in Eqs. [[#eq-5.317|5.317]] and [[#eq-5.318|5.318]]. |
===5.4.3 Matrix formulation=== | ===5.4.3 Matrix formulation=== | ||
Line 6,152: | Line 6,354: | ||
At this point we can use the standard linear finite element functions to interpolate the large scale velocity and pressure solutions using nodal shape functions <math>N_a</math>: | At this point we can use the standard linear finite element functions to interpolate the large scale velocity and pressure solutions using nodal shape functions <math>N_a</math>: | ||
− | <span id="eq- | + | <span id="eq-5.319"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> u_h\approx \sum _a^{n_n} \boldsymbol{N}_a \boldsymbol{u}_a \qquad p_h\approx \sum _a^{n_n} N_a p_a </math> | | style="text-align: center;" | <math> u_h\approx \sum _a^{n_n} \boldsymbol{N}_a \boldsymbol{u}_a \qquad p_h\approx \sum _a^{n_n} N_a p_a </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.319) |
|} | |} | ||
− | where <math>a</math> is the node index and <math>n_n</math> the total number of nodes, <math>N_a</math> represents the standard finite element functions for scalar variables and <math>\boldsymbol{N}_a</math> its matrix equivalent for vectorial quantities. Introducing the interpolation of Eq. [[#eq- | + | where <math>a</math> is the node index and <math>n_n</math> the total number of nodes, <math>N_a</math> represents the standard finite element functions for scalar variables and <math>\boldsymbol{N}_a</math> its matrix equivalent for vectorial quantities. Introducing the interpolation of Eq. [[#eq-5.319|5.319]] into Eqs. [[#eq-5.317|5.317]] and [[#eq-5.318|5.318]] and successively using the shape functions of each node as test functions <math>\boldsymbol{w}_h</math>, <math>p_h</math>, we obtain the following system of equations |
− | <span id="eq- | + | <span id="eq-5.320"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: | + | | style="text-align: center;" | <math> \begin{bmatrix} \boldsymbol{C} + \boldsymbol{K} + \boldsymbol{S}_K & \boldsymbol{G} + \boldsymbol{S}_G \\ \boldsymbol{D} + \boldsymbol{S}_D & \boldsymbol{L} \end{bmatrix} \begin{bmatrix} \boldsymbol{U} \\ \boldsymbol{P} \end{bmatrix} = \begin{bmatrix} \boldsymbol{F} + \boldsymbol{S}_M \\ \boldsymbol{S}_C \end{bmatrix} </math> |
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.323) |
|} | |} | ||
− | where <math>\boldsymbol{U}</math> and <math>\boldsymbol{P}</math> represent the vectors of nodal values for velocity and pressure, respectively. The blocks that appear in the system matrix and the right hand side vector of Eq. [[#eq- | + | where <math>\boldsymbol{U}</math> and <math>\boldsymbol{P}</math> represent the vectors of nodal values for velocity and pressure, respectively. The blocks that appear in the system matrix and the right hand side vector of Eq. [[#eq-5.320|5.320]] are obtained from the finite element assembly of the different integrals that appeared in the stabilized equations. If <math>a</math> and <math>b</math> represent node indices, the Galerkin terms in Eqs. [[#eq-5.317|5.317]] and [[#eq-5.318|5.318]] give rise to the following local matrices: |
− | <span id="eq- | + | <span id="eq-5.324"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{C}^e_{ab} | + | | style="text-align: center;" | <math> \boldsymbol{C}^e_{ab} = \int _{\Omega _e} \boldsymbol{N}_a^T \rho u_h\cdot \nabla \boldsymbol{N}_b \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{K}^e_{ab} | + | | style="text-align: center;" | <math> \boldsymbol{K}^e_{ab} = \int _{\Omega _e} 2 \eta \left(\dot{\gamma } \right)\nabla \boldsymbol{N}_a^T \nabla ^s \boldsymbol{N}_b \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{G}^e_{ab} | + | | style="text-align: center;" | <math> \boldsymbol{G}^e_{ab} = - \int _{\Omega _e} \boldsymbol{N}_a^T \nabla N_b \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{D}^e_{ab} | + | | style="text-align: center;" | <math> \boldsymbol{D}^e_{ab} = \int _{\Omega _e} \nabla N_b^T \boldsymbol{N}_a \, \hbox{d}\Omega = - \left(\boldsymbol{G}^e_{ba} \right)^T </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{F}^e_{a} | + | | style="text-align: center;" | <math> \boldsymbol{F}^e_{a} = \int _{\Omega _e} \boldsymbol{N}_a^T \boldsymbol{f} \, \hbox{d}\Omega + \int _{\Gamma _N} \boldsymbol{N}_a^T \boldsymbol{f} \, \hbox{d}\Gamma </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.324) |
|} | |} | ||
Analogously, the discretization of the stabilization terms allows us to write | Analogously, the discretization of the stabilization terms allows us to write | ||
− | <span id="eq- | + | <span id="eq-5.325"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{S}^e_{K\,ab} | + | | style="text-align: center;" | <math> \boldsymbol{S}^e_{K\,ab} = \int _{\Omega _e} \left(\rho u_h\cdot \nabla \boldsymbol{N}_a \right)^T \tau _1 \rho u_h\cdot \nabla \boldsymbol{N}_b \, \hbox{d}\Omega + \int _{\Omega _e} \left(\nabla \cdot \boldsymbol{N}_a \right)^T \tau _2 \nabla \cdot \boldsymbol{N}_b \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{S}^e_{G\,ab} | + | | style="text-align: center;" | <math> \boldsymbol{S}^e_{G\,ab} = \int _{\Omega _e} \left(\rho u_h\cdot \nabla \boldsymbol{N}_a \right)^T \tau _1 \nabla N_b \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{S}^e_{D\,ab} | + | | style="text-align: center;" | <math> \boldsymbol{S}^e_{D\,ab} = \left(\boldsymbol{S}^e_{G\,ba} \right)^T </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{L}^e_{ab} | + | | style="text-align: center;" | <math> \boldsymbol{L}^e_{ab} = \int _{\Omega _e} \left(\nabla N_a \right)^T \tau _1 \nabla N_b \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{S}^e_{M\,ab} | + | | style="text-align: center;" | <math> \boldsymbol{S}^e_{M\,ab} = \int _{\Omega _e} \left(\rho u_h\cdot \nabla \boldsymbol{N}_a \right)^T \tau _1 \left(\boldsymbol{f} - \boldsymbol{\Pi }^m \right)\, \hbox{d}\Omega - \int _{\Omega _e} \left(\nabla \cdot \boldsymbol{N}_a \right)^T \tau _2 \Pi ^c \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{S}^e_{C\,ab} | + | | style="text-align: center;" | <math> \boldsymbol{S}^e_{C\,ab} = \int _{\Omega _e} \left(\nabla N_a \right)^T \tau _1 \left(\boldsymbol{f} - \boldsymbol{\Pi }^m \right)\, \hbox{d}\Omega </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.325) |
|} | |} | ||
− | The system in Eq. [[#eq- | + | The system in Eq. [[#eq-5.320|5.320]] contains multiple non-linear terms: the convective term is non-linear in the velocity, as are all terms involving either the apparent viscosity <math>\eta </math>, the stabilization parameters <math>\tau _1</math>, <math>\tau _2</math> and, in the OSS formulation, the projections. To linearize it we use Picard iterations, evaluating all terms in the local contributions using the last known values of the variables and solving the system iteratively. In the case of OSS stabilization, an associated problem has to be solve to calculate the projections, given by the discrete form of Eqs. [[#eq-5.315|5.315]] and [[#eq-5.316|5.316]]: |
− | <span id="eq- | + | <span id="eq-5.326"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> \begin{bmatrix} \boldsymbol{M}_M & \boldsymbol{0} \\ \boldsymbol{0} & \boldsymbol{M}_C \\ \end{bmatrix} \begin{bmatrix} \boldsymbol{\Pi }_M \\ \boldsymbol{\Pi }_C \end{bmatrix} = \begin{bmatrix} \boldsymbol{R}_M \\ \boldsymbol{R}_C \end{bmatrix} </math> | | style="text-align: center;" | <math> \begin{bmatrix} \boldsymbol{M}_M & \boldsymbol{0} \\ \boldsymbol{0} & \boldsymbol{M}_C \\ \end{bmatrix} \begin{bmatrix} \boldsymbol{\Pi }_M \\ \boldsymbol{\Pi }_C \end{bmatrix} = \begin{bmatrix} \boldsymbol{R}_M \\ \boldsymbol{R}_C \end{bmatrix} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.326) |
|} | |} | ||
where <math>\boldsymbol{\Pi }_M</math> and <math>\boldsymbol{\Pi }_C</math> represent the vectors of nodal values for the momentum and mass projections, respectively, and the different terms in the matrix and right hand side vector can be obtained by the finite element assembly of the following local contributions: | where <math>\boldsymbol{\Pi }_M</math> and <math>\boldsymbol{\Pi }_C</math> represent the vectors of nodal values for the momentum and mass projections, respectively, and the different terms in the matrix and right hand side vector can be obtained by the finite element assembly of the following local contributions: | ||
− | <span id="eq- | + | <span id="eq-5.327"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{M}^e_{M\,ab} | + | | style="text-align: center;" | <math> \boldsymbol{M}^e_{M\,ab} = \int _{\Omega _e} \left(\boldsymbol{N}_a \right)^T \boldsymbol{N}_b \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{M}^e_{C\,ab} | + | | style="text-align: center;" | <math> \boldsymbol{M}^e_{C\,ab} = \int _{\Omega _e} N_a \, N_b \, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{R}^e_{M\,ab} | + | | style="text-align: center;" | <math> \boldsymbol{R}^e_{M\,ab} = \int _{\Omega _e} \left(\boldsymbol{N}_a \right)^T \left(\boldsymbol{f} - \rho u_h\cdot \nabla u_h- \nabla p_h\right)\, \hbox{d}\Omega </math> |
− | + | ||
|- | |- | ||
− | | style="text-align: center;" | <math> \boldsymbol{R}^e_{C\,ab} | + | | style="text-align: center;" | <math> \boldsymbol{R}^e_{C\,ab} = \int _{\Omega _e} N_a \left(- \nabla \cdot u_h\right)\, \hbox{d}\Omega </math> |
− | + | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.327) |
|} | |} | ||
Line 6,271: | Line 6,458: | ||
==5.5 Application to Bingham fluids== | ==5.5 Application to Bingham fluids== | ||
− | The formulation introduced in the previous section can be combined with the adaptive mesh refinement procedure by introducing the small scale model of Eq. [[#eq- | + | The formulation introduced in the previous section can be combined with the adaptive mesh refinement procedure by introducing the small scale model of Eq. [[#eq-5.310|5.310]] for ASGS simulations, or Eq. [[#eq-5.313|5.313]] for OSS, in the error estimator of Eq. [[#eq-5.289|5.289]]. We have used it to simulate several classical examples of Bingham flow problems. As in the previous examples, GiD is used to generate the initial mesh. Here all examples considered are small enough to be computed in a desktop computer and, as a result, the distributed memory capabilities are not relevant. In all examples but the Poiseuille flow, local mesh improvement is used to correct the refined mesh. |
===5.5.1 Poiseuille flow=== | ===5.5.1 Poiseuille flow=== | ||
− | The first test case is a simple Poiseuille flow under an imposed pressure gradient. We define a <math>6 \times 1 \, \hbox{m}</math> plane channel and prescribe a pressure variation <math>\Delta p = - 2 \times 10^3 \, \hbox{Pa}</math> between its extremes as shown in Fig. [[#img- | + | The first test case is a simple Poiseuille flow under an imposed pressure gradient. We define a <math>6 \times 1 \, \hbox{m}</math> plane channel and prescribe a pressure variation <math>\Delta p = - 2 \times 10^3 \, \hbox{Pa}</math> between its extremes as shown in Fig. [[#img-63|63]]. A no-slip condition is imposed along the edges of the channel. The fluid density is set to <math>\rho = 1 \, \hbox{Kg}/\hbox{m}^3</math> while the plastic viscosity takes a value of <math>\mu _p = 10 \, \hbox{Pa} \cdot \hbox{s}</math> and the regularization coefficient is set to <math>m = 10^3 \, \hbox{s}</math>. We consider two cases: a Bingham flow with yield stress <math>\tau _0 = 100 \, \hbox{Pa}</math> and a Newtonian case with viscosity <math>\mu = \mu _p</math>. <div id='img-63'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-poiseuille_geometry.png|259px|Poiseuille flow – geometry and boundary conditions.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 63:''' Poiseuille flow – geometry and boundary conditions. |
|} | |} | ||
− | <div id='img- | + | <div id='img-64'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-poiseuille_coarse_mesh.png|510px|Poiseuille flow – initial mesh.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 64:''' Poiseuille flow – initial mesh. |
|} | |} | ||
− | We start the simulation using the unstructured mesh shown in Fig. [[#img- | + | We start the simulation using the unstructured mesh shown in Fig. [[#img-64|64]], containing <math>66</math> nodes and <math>92</math> triangular elements, which corresponds to three elements along the channel width. The problem is solved iteratively: the solution of the flow is followed by the mesh refinement algorithm, repeating the procedure until the error estimator is smaller than a fixed tolerance for every element in the mesh. To study the sensitivity of the proposed approach with respect to the maximum admissible value for the error indicator, we simulated a series of cases with estimator tolerances in the range <math>10^{-3}</math>–<math>10^{-6}</math>. The number of elements obtained in each case for the different stabilized formulations is shown in Fig. [[#img-65|65]]. The velocity profiles on the central transversal section of the domain for some values of the tolerance are shown in Fig. [[#img-66|66]]. <div id='img-65a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-65b'></div> |
+ | <div id='img-65'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-poiseuille_counts_Newtonian.png|450px|Newtonian fluid.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-poiseuille_counts_Bingham.png|400px|Bingham fluid.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | (a) Newtonian fluid. |
+ | | (b) Bingham fluid. | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 65:''' Poiseuille flow – number of elements at the end of the simulation for different tolerances. | ||
|} | |} | ||
− | <div id='img- | + | <div id='img-66a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-66b'></div> |
+ | <div id='img-66c'></div> | ||
+ | <div id='img-66d'></div> | ||
+ | <div id='img-66'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-poiseuille_profiles_Newtonian_ASGS.png|450px|Newtonian fluid (ASGS).]] |
− | |[[Image: | + | |[[Image:Cotela_2016-poiseuille_profiles_Newtonian_OSS.png|400px|Newtonian fluid (OSS).]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Newtonian fluid (ASGS). | ||
+ | | (b) Newtonian fluid (OSS). | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-poiseuille_profiles_Bingham_ASGS.png|450px|Bingham fluid (ASGS).]] |
− | |[[Image: | + | |[[Image:Cotela_2016-poiseuille_profiles_Bingham_OSS.png|400px|Bingham fluid (OSS).]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | (c) Bingham fluid (ASGS). |
+ | | (d) Bingham fluid (OSS). | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 66:''' Poiseuille flow – streamwise velocity profiles. | ||
|} | |} | ||
Analyzing the results, we observe a different behavior for the two cases considered. In the Newtonian case, the number of elements in the final grid increases uniformly as the tolerance is reduced. This is in agreement with the expected behavior of the estimator used: consider the that analytical solution of the Newtonian Poiseuille flow is a parabolic velocity profile given by the expression | Analyzing the results, we observe a different behavior for the two cases considered. In the Newtonian case, the number of elements in the final grid increases uniformly as the tolerance is reduced. This is in agreement with the expected behavior of the estimator used: consider the that analytical solution of the Newtonian Poiseuille flow is a parabolic velocity profile given by the expression | ||
− | <span id="eq- | + | <span id="eq-5.328"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> u\left(y\right)= \frac{1}{2\mu } \left(-\frac{\Delta p}{\Delta x} \right)y \left(H-y\right)\qquad u_y = 0 </math> | | style="text-align: center;" | <math> u\left(y\right)= \frac{1}{2\mu } \left(-\frac{\Delta p}{\Delta x} \right)y \left(H-y\right)\qquad u_y = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.328) |
|} | |} | ||
where <math>H</math> is the channel width and <math>y</math> is the vertical distance to the lower wall. Consider the solution obtained using the ASGS stabilization. Assuming we obtained a nodally exact solution, the momentum error would be | where <math>H</math> is the channel width and <math>y</math> is the vertical distance to the lower wall. Consider the solution obtained using the ASGS stabilization. Assuming we obtained a nodally exact solution, the momentum error would be | ||
− | <span id="eq- | + | <span id="eq-5.329"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> R^m_x = \mu \frac{\partial ^2 u}{\partial y^2} - \frac{\partial p}{\partial x} \qquad R^m_y = 0 </math> | | style="text-align: center;" | <math> R^m_x = \mu \frac{\partial ^2 u}{\partial y^2} - \frac{\partial p}{\partial x} \qquad R^m_y = 0 </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.329) |
|} | |} | ||
− | as the velocity is only different from zero in the streamwise direction and the velocity gradient is orthogonal to the velocity, cancelling the convective term. If Eq. [[#eq- | + | as the velocity is only different from zero in the streamwise direction and the velocity gradient is orthogonal to the velocity, cancelling the convective term. If Eq. [[#eq-5.329|5.329]] is evaluated using the exact solution, it can be seen to be identically zero, as <math>\partial ^2 u/\partial y^2 = 1/\mu \Delta p / \Delta x</math>. However, Eq. [[#eq-5.329|5.329]] can never evaluate to zero numerically in our case, not even with a nodally exact solution, as second derivatives are zero when using linear finite elements. In practice, the ASGS error estimator of Eq. [[#eq-5.289|5.289]] will evaluate to <math>\sqrt{A} \tau _1 \Delta p / \Delta x</math>, where <math>A</math> is the area of the element. This explains its behavior and the large number of elements that it introduces for all tolerances, even when the solution is already properly represented with a lower number of elements. This can be seen, for example, in Fig. [[#img-66a|66a]], where the solution for the larger tolerance simulation is practically identical to the finer solution. This effect is mitigated by the use of OSS stabilization and the corresponding error estimator which, as can be seen in Fig. [[#img-65a|65a]], results in roughly five times less elements than the ASGS case for a given tolerance. When using OSS, we are missing the second derivatives both in the model for the small scales, given by Eq. [[#eq-5.313|5.313]], and in the calculation of the nodal projections in Eq. [[#eq-5.315|5.315]]. As the second derivatives and the projection terms have opposite signs in Eq. [[#eq-5.313|5.313]], the total error in the estimation of the momentum residual is reduced. As can be seen in Fig. [[#img-65|65]], the total number of elements at the end of the simulation is larger for the Newtonian flow in all cases. This is due to the spatial distribution of the refinement, as can be observed in Fig. [[#img-67|67]], and is related to the shape of the solution. For the Newtonian case, the parabolic velocity profile of the solution results in the error estimate of Eq. [[#eq-5.329|5.329]], which is independent of the position. As a result, the entire domain is refined homogeneously. <div id='img-67a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-67b'></div> |
+ | <div id='img-67c'></div> | ||
+ | <div id='img-67'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-poiseuille_original_mesh_detail.png|133px|Initial mesh.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-poiseuille_detail_newtonian.png|133px|Newtonian fluid.]] |
− | + | |[[Image:Cotela_2016-poiseuille_detail_bingham.png|134px|Bingham fluid.]] | |
− | + | |- style="text-align: center; font-size: 75%;" | |
+ | | (a) Initial mesh. | ||
+ | | (b) Newtonian fluid. | ||
+ | | (c) Bingham fluid. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | colspan="3" | '''Figure 67:''' Poiseuille flow – detail of the final meshes for the OSS case with tolerance <math>10^{-6}</math>. |
|} | |} | ||
− | On the other hand, in the Bingham case the profile has an unyielded central area that moves as a block and two yielded regions close to the wall with a parabolic velocity profile. The central area, with constant velocity, can be solved with practically no error with a coarse mesh size, and most of the new elements are placed in the yielded regions. As the refinement is more localized, the overall number of elements is smaller. As a final remark, we can observe that, for small tolerances, the refinement fails to start if the mesh is too coarse to properly represent the flow. This can be seen in in Fig. | + | On the other hand, in the Bingham case the profile has an unyielded central area that moves as a block and two yielded regions close to the wall with a parabolic velocity profile. The central area, with constant velocity, can be solved with practically no error with a coarse mesh size, and most of the new elements are placed in the yielded regions. As the refinement is more localized, the overall number of elements is smaller. As a final remark, we can observe that, for small tolerances, the refinement fails to start if the mesh is too coarse to properly represent the flow. This can be seen in in Fig. [[#img-65b|65b]] for the ASGS simulation with a tolerance of <math>10^{-3}</math> and for the OSS cases with tolerances <math>10^{-3}</math> and <math>10^{-4}</math>, where no new elements are added. These cases produce a solution where the yielded regions do not develop and the velocity is practically zero everywhere. |
===5.5.2 Plane extrusion=== | ===5.5.2 Plane extrusion=== | ||
− | We simulated the plane extrusion of a Bingham fluid through a die with a 3 to 1 reduction of the cross-section. This problem, presented in <span id='citeF- | + | We simulated the plane extrusion of a Bingham fluid through a die with a 3 to 1 reduction of the cross-section. This problem, presented in <span id='citeF-121'></span>[[#cite-121|[121]]], was also solved in <span id='citeF-122'></span>[[#cite-122|[122]]], using a fixed fluid mesh and an ASGS-based solver similar to that of Section [[#5.4 A FEM solver with adaptive mesh refinement for viscoplastic flows|5.4]], and in <span id='citeF-123'></span>[[#cite-123|[123]]], using OSS stabilization. As can be seen in Fig. [[#img-68|68]], we use symmetry to simulate only one half of the domain. The walls are assumed to be smooth, and only the wall-normal component of velocity is restricted. The flow is driven by a ram pressure applied on the left side of the domain, which introduces a pressure gradient. The fluid parameters are reported in Table [[#table-11|11]]. <div id='img-68'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_geometry.png|350px|Plane extrusion – geometry and boundary conditions.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 68:''' Plane extrusion – geometry and boundary conditions. |
|} | |} | ||
− | {| class="wikitable" style="text-align: center; margin: 1em auto;" | + | {| class="floating_tableSCP wikitable" style="text-align: center; margin: 1em auto;min-width:50%;" |
− | |+ <span id='table-11'></span>Table. 11 Plane extrusion – flow parameters for the problem. | + | |+ style="font-size: 75%;" |<span id='table-11'></span>Table. 11 Plane extrusion – flow parameters for the problem. |
|- | |- | ||
| style="border-right: 2px solid;" | Parameter | | style="border-right: 2px solid;" | Parameter | ||
| style="border-left: 2px solid;" | Value | | style="border-left: 2px solid;" | Value | ||
− | |- | + | |- style="border-top: 2px solid;" |
| style="border-right: 2px solid;" | Fluid density | | style="border-right: 2px solid;" | Fluid density | ||
| style="border-left: 2px solid;" | <math>\rho = 100 \, \hbox{Kg}/\hbox{m}^3</math> | | style="border-left: 2px solid;" | <math>\rho = 100 \, \hbox{Kg}/\hbox{m}^3</math> | ||
Line 6,375: | Line 6,583: | ||
|} | |} | ||
− | As discussed in <span id='citeF- | + | As discussed in <span id='citeF-121'></span>[[#cite-121|[121]]], using the present settings, with smooth walls and a very small plastic viscosity, the problem is analogue to a perfect plasticity problem. An exact solution for the plasticity problem, obtained using slip line theory, is reported by Lubliner in <span id='citeF-124'></span>[[#cite-124|[124]]]. This solution predicts the formation of slip lines once the applied pressure reaches |
− | <span id="eq- | + | <span id="eq-5.330"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> p = \frac{4}{3}\left(1+\frac{\pi }{2}\right)\tau _y \approx 3427 \, \hbox{Pa} </math> | | style="text-align: center;" | <math> p = \frac{4}{3}\left(1+\frac{\pi }{2}\right)\tau _y \approx 3427 \, \hbox{Pa} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.330) |
|} | |} | ||
− | An increasing normal pressure is applied on the left end in steps of <math>2 \, \hbox{Pa}</math>, starting from <math>0</math> to a maximum value of <math>p_{max} = 5000 \, \hbox{Pa}</math>. After each step, the mesh refinement algorithm is used to improve mesh resolution, with a tolerance of <math>10^{-6}</math> for the error indicator. In this case we applied additional controls to prevent an excessive refinement in specific zones. The minimum allowed area for refined elements is set to <math>10^{-4} \, \hbox{m}^2</math>. The domain is initially discretized with an unstructured mesh composed of <math>102</math> nodes and <math>152</math> linear triangles. <div id='img- | + | An increasing normal pressure is applied on the left end in steps of <math>2 \, \hbox{Pa}</math>, starting from <math>0</math> to a maximum value of <math>p_{max} = 5000 \, \hbox{Pa}</math>. After each step, the mesh refinement algorithm is used to improve mesh resolution, with a tolerance of <math>10^{-6}</math> for the error indicator. In this case we applied additional controls to prevent an excessive refinement in specific zones. The minimum allowed area for refined elements is set to <math>10^{-4} \, \hbox{m}^2</math>. The domain is initially discretized with an unstructured mesh composed of <math>102</math> nodes and <math>152</math> linear triangles. <div id='img-69a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-69b'></div> |
+ | <div id='img-69c'></div> | ||
+ | <div id='img-69d'></div> | ||
+ | <div id='img-69e'></div> | ||
+ | <div id='img-69f'></div> | ||
+ | <div id='img-69g'></div> | ||
+ | <div id='img-69h'></div> | ||
+ | <div id='img-69i'></div> | ||
+ | <div id='img-69j'></div> | ||
+ | <div id='img-69k'></div> | ||
+ | <div id='img-69l'></div> | ||
+ | <div id='img-69m'></div> | ||
+ | <div id='img-69n'></div> | ||
+ | <div id='img-69o'></div> | ||
+ | <div id='img-69p'></div> | ||
+ | <div id='img-69'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_oss_0_strain_legend.png|198px|$0 \, \text{Pa}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_asgs_0_mesh.png|198px|$0 \, \text{Pa}$.]] |
+ | |[[Image:Cotela_2016-extrusion_asgs_3448_strain.png|198px|$3448 \, \text{Pa}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) <math>0 \, \hbox{Pa}</math>. | ||
+ | | (b) <math>0 \, \hbox{Pa}</math>. | ||
+ | | (c) <math>3448 \, \hbox{Pa}</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_asgs_3448_mesh.png|198px|$3448 \, \text{Pa}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_asgs_3454_strain.png|198px|$3454 \, \text{Pa}$.]] |
+ | |[[Image:Cotela_2016-extrusion_asgs_3454_mesh.png|198px|$3454 \, \text{Pa}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (d) <math>3448 \, \hbox{Pa}</math>. | ||
+ | | (e) <math>3454 \, \hbox{Pa}</math>. | ||
+ | | (f) <math>3454 \, \hbox{Pa}</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_asgs_3462_strain.png|198px|$3462 \, \text{Pa}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_asgs_3462_mesh.png|198px|$3462 \, \text{Pa}$.]] |
+ | |[[Image:Cotela_2016-extrusion_asgs_3500_strain.png|198px|$3500 \, \text{Pa}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (g) <math>3462 \, \hbox{Pa}</math>. | ||
+ | | (h) <math>3462 \, \hbox{Pa}</math>. | ||
+ | | (i) <math>3500 \, \hbox{Pa}</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_asgs_3500_mesh.png|198px|$3500 \, \text{Pa}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_asgs_3750_strain.png|198px|$3750 \, \text{Pa}$.]] |
+ | |[[Image:Cotela_2016-extrusion_asgs_3750_mesh.png|198px|$3750 \, \text{Pa}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (j) <math>3500 \, \hbox{Pa}</math>. | ||
+ | | (k) <math>3750 \, \hbox{Pa}</math>. | ||
+ | | (l) <math>3750 \, \hbox{Pa}</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_asgs_4000_strain.png|198px|$4000 \, \text{Pa}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_asgs_4000_mesh.png|198px|$4000 \, \text{Pa}$.]] |
+ | |[[Image:Cotela_2016-extrusion_oss_4500_strain.png|198px|$4500 \, \text{Pa}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (m) <math>4000 \, \hbox{Pa}</math>. | ||
+ | | (n) <math>4000 \, \hbox{Pa}</math>. | ||
+ | | (o) <math>4500 \, \hbox{Pa}</math>. | ||
|- | |- | ||
− | |[[Image: | + | | colspan="3"|[[Image:Cotela_2016-extrusion_oss_4500_mesh.png|198px|$4500 \, \text{Pa}$.]] |
− | + | |- style="text-align: center; font-size: 75%;" | |
− | |- | + | | (p) <math>4500 \, \hbox{Pa}</math>. |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | | | + | |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | colspan="3" | '''Figure 69:''' Plane extrusion (ASGS) – evolution of strain rate (left) and mesh (right). |
|} | |} | ||
− | <div id='img- | + | <div id='img-70a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-70b'></div> |
+ | <div id='img-70c'></div> | ||
+ | <div id='img-70d'></div> | ||
+ | <div id='img-70e'></div> | ||
+ | <div id='img-70f'></div> | ||
+ | <div id='img-70g'></div> | ||
+ | <div id='img-70h'></div> | ||
+ | <div id='img-70i'></div> | ||
+ | <div id='img-70j'></div> | ||
+ | <div id='img-70k'></div> | ||
+ | <div id='img-70l'></div> | ||
+ | <div id='img-70m'></div> | ||
+ | <div id='img-70n'></div> | ||
+ | <div id='img-70o'></div> | ||
+ | <div id='img-70p'></div> | ||
+ | <div id='img-70'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_oss_0_strain_legend.png|198px|$0 \, \text{Pa}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_oss_0_mesh.png|198px|$0 \, \text{Pa}$.]] |
+ | |[[Image:Cotela_2016-extrusion_oss_3448_strain.png|198px|$3448 \, \text{Pa}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) <math>0 \, \hbox{Pa}</math>. | ||
+ | | (b) <math>0 \, \hbox{Pa}</math>. | ||
+ | | (c) <math>3448 \, \hbox{Pa}</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_oss_3448_mesh.png|198px|$3448 \, \text{Pa}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_oss_3454_strain.png|198px|$3454 \, \text{Pa}$.]] |
+ | |[[Image:Cotela_2016-extrusion_oss_3454_mesh.png|198px|$3454 \, \text{Pa}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (d) <math>3448 \, \hbox{Pa}</math>. | ||
+ | | (e) <math>3454 \, \hbox{Pa}</math>. | ||
+ | | (f) <math>3454 \, \hbox{Pa}</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_oss_3462_strain.png|198px|$3462 \, \text{Pa}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_oss_3462_mesh.png|198px|$3462 \, \text{Pa}$.]] |
+ | |[[Image:Cotela_2016-extrusion_oss_3500_strain.png|198px|$3500 \, \text{Pa}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (g) <math>3462 \, \hbox{Pa}</math>. | ||
+ | | (h) <math>3462 \, \hbox{Pa}</math>. | ||
+ | | (i) <math>3500 \, \hbox{Pa}</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_oss_3500_mesh.png|198px|$3500 \, \text{Pa}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_oss_3750_strain.png|198px|$3750 \, \text{Pa}$.]] |
+ | |[[Image:Cotela_2016-extrusion_oss_3750_mesh.png|198px|$3750 \, \text{Pa}$.]] | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (j) <math>3500 \, \hbox{Pa}</math>. | ||
+ | | (k) <math>3750 \, \hbox{Pa}</math>. | ||
+ | | (l) <math>3750 \, \hbox{Pa}</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_oss_4000_strain.png|198px|$4000 \, \text{Pa}$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_oss_4000_mesh.png|198px|$4000 \, \text{Pa}$.]] |
− | + | |[[Image:Cotela_2016-extrusion_oss_4500_strain.png|198px|$4500 \, \text{Pa}$.]] | |
− | |[[Image: | + | |- style="text-align: center; font-size: 75%;" |
− | | | + | | (m) <math>4000 \, \hbox{Pa}</math>. |
+ | | (n) <math>4000 \, \hbox{Pa}</math>. | ||
+ | | (o) <math>4500 \, \hbox{Pa}</math>. | ||
|- | |- | ||
− | | | + | | colspan="3"|[[Image:Cotela_2016-extrusion_oss_4500_mesh.png|198px|$4500 \, \text{Pa}$.]] |
− | + | ||
− | + | ||
− | + | ||
− | |[[Image: | + | |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | (p) <math>4500 \, \hbox{Pa}</math>. |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="3" | '''Figure 70:''' Plane extrusion (OSS) – evolution of strain rate (left) and mesh (right). | ||
|} | |} | ||
− | The evolution of the strain rate and the refined mesh for different values of ram pressure is shown in Fig. [[#img- | + | The evolution of the strain rate and the refined mesh for different values of ram pressure is shown in Fig. [[#img-69|69]] for the ASGS formulation and in Fig. [[#img-70|70]] for the OSS method. Both simulations show the same qualitative behavior: as the ram pressure increases, a yielded region characterized by high strain rates develops, matching the slip line mechanism. The finite element mesh is refined accordingly, following the distribution of high strain rates. The ASGS solution seems to be slightly advanced in this case, producing larger strain rates for a given ram pressure. <div id='img-71a'></div> |
− | <div id='img- | + | <div id='img-71b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-71'></div> |
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_nelems.png|202px|Number of elements.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_nnodes.png|202px|Number of nodes.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Number of elements. | ||
+ | | (b) Number of nodes. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | colspan="2" | '''Figure 71:''' Plane extrusion – evolution of the simulation mesh. |
|} | |} | ||
− | The evolution of mesh during the simulation is shown in Fig. [[#img- | + | The evolution of mesh during the simulation is shown in Fig. [[#img-71|71]]. The number of elements required to solve the problem remains relatively constant for low values of the ram pressure until the yielded zone starts to develop. At this point, the number of elements increases rapidly as the material starts to flow. The new elements are concentrated at the fluidified regions, as can be observed in Figs. [[#img-69|69]] and [[#img-70|70]], and the refinement process continues as the yielded region expands and moves downstream. The mesh at the end of the simulation, corresponding to an external pressure of <math>5000 \; \hbox{Pa}</math>, contains <math>15173</math> nodes and <math>30166</math> elements in the ASGS case and <math>14466</math> nodes and <math>28756</math> elements in the OSS case. The velocity of the fluid on the left boundary (measured on point A in Fig. [[#img-68|68]]) is related to the ram pressure in Fig. [[#img-72|72]]. We can observe that velocity is very low until the pressure reaches about <math>3460 \, \hbox{Pa}</math>, when the material starts to flow, accelerating rapidly. Again, the change in behavior corresponds to the formation of a yielded zone just before the extrusion section. This is found to be in agreement with the expected behavior, although the material starts flowing at slightly higher pressures than expected from perfect plasticity theory, which is indicated in Fig. [[#img-72|72]] using a dotted line. <div id='img-72'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-extrusion_pv_plot.png|216px|Plane extrusion – applied pressure vs. inlet velocity.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 72:''' Plane extrusion – applied pressure vs. inlet velocity. |
|} | |} | ||
− | We can also observe in Fig. [[#img- | + | We can also observe in Fig. [[#img-72|72]] that the OSS simulation predicts a slightly later plastification, corresponding to higher ram pressures, when compared to the ASGS method, while the latter is closer to the plasticity theory result. A possible explanation for this could be that the ASGS estimator produces a larger number of elements overall, as can be seen in Fig. [[#img-71|71]], which provides a slightly better accuracy in the solution. As an attempt to quantify the effectiveness of the refinement procedure, we also simulated the problem using OSS and a uniform mesh containing <math>28072</math> elements, a similar amount as in the finest mesh obtained during the refinement, to use as a reference solution. The velocity–pressure relation for this simulation is also plotted in Fig. [[#img-72|72]] and shows a delayed formation of the yielded region, which appears at higher ram pressures than expected. While using a uniform mesh would be a very naive approach in this case, the results show that the use of a refinement procedure results in an improved solution for a given number of elements in the mesh. |
===5.5.3 Cavity flow=== | ===5.5.3 Cavity flow=== | ||
− | The next example we considered is the 2D cavity flow of a Bingham fluid. The problem uses the same settings as Mitsoulis and Zisis in <span id='citeF- | + | The next example we considered is the 2D cavity flow of a Bingham fluid. The problem uses the same settings as Mitsoulis and Zisis in <span id='citeF-125'></span>[[#cite-125|[125]]]. Defining a square domain <math>\Omega = \left(0,H\right)\times \left(0,H\right)</math>, we impose a horizontal velocity <math>U = 1 \, \hbox{m}/\hbox{s}</math> on the <math>y = H</math> side and zero velocity on the remaining sides. We simulate a leaky cavity, the top left and top right corner nodes have a fixed horizontal velocity. This condition is re-imposed after each refinement step, so that the wall node immediately next to the corner always has zero velocity, as shown in Fig. [[#img-73|73]], even if this node didn't exist in previous iterations. <div id='img-73'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-amr_cavity_bc.png|284px|2D cavity flow – boundary conditions.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 73:''' <math>2D</math> cavity flow – boundary conditions. |
|} | |} | ||
The fluid density is set to <math>\rho = 1 \, \hbox{Kg}/\hbox{m}^3</math> and the dynamic viscosity for the yielded region is set to <math>\mu _p = 1 \, \hbox{Pa} \cdot \hbox{s}</math>. We will simulate multiple cases with different yield stresses to test a range of values of the Bingham number, defined as | The fluid density is set to <math>\rho = 1 \, \hbox{Kg}/\hbox{m}^3</math> and the dynamic viscosity for the yielded region is set to <math>\mu _p = 1 \, \hbox{Pa} \cdot \hbox{s}</math>. We will simulate multiple cases with different yield stresses to test a range of values of the Bingham number, defined as | ||
− | <span id="eq- | + | <span id="eq-5.331"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> \hbox{Bn} = \frac{\tau _0 H}{\mu _p \, U} </math> | | style="text-align: center;" | <math> \hbox{Bn} = \frac{\tau _0 H}{\mu _p \, U} </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.331) |
|} | |} | ||
− | The regularization coefficient is set to <math>m = 300 \, \hbox{s}</math>. In this case, all simulations were performed using OSS stabilization. As in the previous test, we start from a relatively coarse uniform mesh composed of <math>2900</math> nodes and <math>5600</math> triangular elements and we solve the problem iteratively, with a mesh refinement phase after each solution. The refinement algorithm is set to a tolerance of <math>10^{-6}</math> and to a maximum of 10 refinement steps over the same original element. This is important in this case, as a concentration of pressure can be expected to appear in the corners of the cavity and the mesh refinement could potentially continue indefinitely on these points. The final distribution of yielded and unyielded regions and the corresponding velocity streamlines are shown in Fig. [[#img- | + | The regularization coefficient is set to <math>m = 300 \, \hbox{s}</math>. In this case, all simulations were performed using OSS stabilization. As in the previous test, we start from a relatively coarse uniform mesh composed of <math>2900</math> nodes and <math>5600</math> triangular elements and we solve the problem iteratively, with a mesh refinement phase after each solution. The refinement algorithm is set to a tolerance of <math>10^{-6}</math> and to a maximum of 10 refinement steps over the same original element. This is important in this case, as a concentration of pressure can be expected to appear in the corners of the cavity and the mesh refinement could potentially continue indefinitely on these points. The final distribution of yielded and unyielded regions and the corresponding velocity streamlines are shown in Fig. [[#img-74|74]] for the different simulations. <div id='img-74a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-74b'></div> |
+ | <div id='img-74c'></div> | ||
+ | <div id='img-74d'></div> | ||
+ | <div id='img-74e'></div> | ||
+ | <div id='img-74f'></div> | ||
+ | <div id='img-74'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-cavity_b2_oss.png|300px|$\text{Bn} = 2$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-cavity_b5_oss.png|300px|$\text{Bn} = 5$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) <math>\hbox{Bn} = 2</math>. | ||
+ | | (b) <math>\hbox{Bn} = 5</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-cavity_b20_oss.png|300px|$\text{Bn} = 20$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-cavity_b50_oss.png|300px|$\text{Bn} = 50$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (c) <math>\hbox{Bn} = 20</math>. | ||
+ | | (d) <math>\hbox{Bn} = 50</math>. | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-cavity_b200_oss.png|300px|$\text{Bn} = 200$.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-cavity_b500_oss.png|300px|$\text{Bn} = 500$.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (e) <math>\hbox{Bn} = 200</math>. | ||
+ | | (f) <math>\hbox{Bn} = 500</math>. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | colspan="2" | '''Figure 74:''' <math>2D</math> cavity flow – velocity streamlines and distribution of yielded (light) and unyielded (dark) regions. |
|} | |} | ||
− | The vertical position of the vortex center for each case is compared to the results reported in <span id='citeF- | + | The vertical position of the vortex center for each case is compared to the results reported in <span id='citeF-125'></span>[[#cite-125|[125]]] in Fig. [[#img-75|75]]. The results are in agreement with the reference, although we obtain a slightly higher position for the center in the higher Bingham numbers. <div id='img-75'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-cavity_center.png|216px|2D cavity flow – vertical position of the vortex center, compared to the results of <span id='citeF-125'></span>[[#cite-125|[125]]].]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 75:''' <math>2D</math> cavity flow – vertical position of the vortex center, compared to the results of <span id='citeF-125'></span>[[#cite-125|[125]]]. |
|} | |} | ||
− | Fig. [[#img- | + | Fig. [[#img-76|76]] displays the evolution of the number of elements during the simulation, which can be seen to increase quickly during the first steps, until the error estimator complies with the imposed tolerance in most of the domain. <div id='img-76a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-76b'></div> |
+ | <div id='img-76'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-cavity_elements_2_oss.png|450px|$\text{Bn} = {2,20,200}$]] |
− | |[[Image: | + | |[[Image:Cotela_2016-cavity_elements_5_oss.png|400px|$\text{Bn} = {5,50,500}$]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | (a) <math>\hbox{Bn} = {2,20,200}</math> |
+ | | (b) <math>\hbox{Bn} = {5,50,500}</math> | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 76:''' <math>2D</math> cavity flow – evolution of the number of elements. | ||
|} | |} | ||
− | Although the cavity flow is essentially a <math>2D</math> problem for the range of values we are testing, we also simulated a <math>3D</math> case in order to validate our approach for tetrahedra. The geometry of the problem is shown in Fig. [[#img- | + | Although the cavity flow is essentially a <math>2D</math> problem for the range of values we are testing, we also simulated a <math>3D</math> case in order to validate our approach for tetrahedra. The geometry of the problem is shown in Fig. [[#img-77a|77a]] and follows the definition of Elias ''et al.'' in <span id='citeF-126'></span>[[#cite-126|[126]]]. The domain is a cube of side <math>H = 1 \, \hbox{m}</math>, where velocity is fixed to <math>\left(U, 0, 0 \right)</math> on the top side. Taking <math>Y</math> to be the vertical axis, the velocity is set to zero on the bottom and on the sides of the cube normal to the flow. On the remaining sides, parallel to the flow on the top, only the normal (<math>Z</math>) component of velocity is restricted. We solve the flow for a Reynolds number <math>\hbox{Re} = 1</math> and a Bingham number <math>\hbox{Bn} = 5</math>. All fluid parameters are defined as in the <math>2D</math> case, setting the top velocity to <math>U = 1 \, m/s</math> and the yield stress is <math>\tau _0 = 5 \, \hbox{Pa}</math>. The regularization coefficient is set to <math>m = 1000 \; \hbox{s}</math>. <div id='img-77a'></div> |
− | <div id='img- | + | <div id='img-77'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-cavity_3d_geometry.png|288px|3D cavity flow – geometry and velocity boundary conditions.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-cavity_3d_yielded.png|288px|3D cavity flow – velocity streamlines and distribution of yielded (light) and unyielded (dark) regions.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
| (a) <math>3D</math> cavity flow – geometry and velocity boundary conditions. | | (a) <math>3D</math> cavity flow – geometry and velocity boundary conditions. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | colspan="2" | '''Figure 77:''' <math>3D</math> cavity flow – velocity streamlines and distribution of yielded (light) and unyielded (dark) regions. |
|} | |} | ||
− | The flow is simulated in 10 solution steps, refining after each solution. Starting from a uniform tetrahedral mesh with <math>30</math> divisions along each edge, containing approximately <math>51</math> thousand nodes and <math>277</math> thousand elements, a final mesh with <math>113</math> thousand nodes and <math>612</math> thousand elements is obtained. The final distribution of yielded and unyielded regions and velocity streamlines is shown in Fig. [[#img- | + | The flow is simulated in 10 solution steps, refining after each solution. Starting from a uniform tetrahedral mesh with <math>30</math> divisions along each edge, containing approximately <math>51</math> thousand nodes and <math>277</math> thousand elements, a final mesh with <math>113</math> thousand nodes and <math>612</math> thousand elements is obtained. The final distribution of yielded and unyielded regions and velocity streamlines is shown in Fig. [[#img-77|77]]. The vortex center in this case is placed at a vertical position <math>y/H = 0.848</math>, in agreement with the <math>2D</math> results shown in Fig. [[#img-75|75]]. |
===5.5.4 Flow through a sudden expansion=== | ===5.5.4 Flow through a sudden expansion=== | ||
− | As a final test case we have simulated the <math>3D</math> flow through a square sudden expansion. This problem was studied in <span id='citeF- | + | As a final test case we have simulated the <math>3D</math> flow through a square sudden expansion. This problem was studied in <span id='citeF-127'></span><span id='citeF-128'></span>[[#cite-127|[127,128]]] for Herschel-Bulkley fluids and represents a three-dimensional version of the more common planar or axisymmetric expansions (see for example <span id='citeF-129'></span><span id='citeF-130'></span><span id='citeF-131'></span>[[#cite-129|[129,130,131]]]). The cross section of the problem is shown in Fig. [[#img-78|78]]. We modeled the flow through expansions with 1 to 2 and 1 to 4 width ratios, which correspond to <math>W/H=2</math> and <math>W/H=4</math> using the notation of Fig. [[#img-78|78]]. <div id='img-78'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_geometry.png|247px|Sudden expansion – geometry.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 78:''' Sudden expansion – geometry. |
|} | |} | ||
− | Using symmetry, only one fourth of the domain is simulated, resulting in the calculation geometries shown in Fig. [[#img- | + | Using symmetry, only one fourth of the domain is simulated, resulting in the calculation geometries shown in Fig. [[#img-79|79]]. No-slip boundary conditions are used to model the solid walls, while a no-penetration conditions is set for the symmetry planes. The flow is driven by a pressure applied on the narrow side of the domain. <div id='img-79'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_domains.png|212px|Sudden expansion – simulation domains.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 79:''' Sudden expansion – simulation domains. |
|} | |} | ||
− | The problem is solved for the case where both the Reynolds and Bingham numbers equal to one, calculated using <math>H</math> as the reference length and a reference velocity <math>U_0</math> defined in <span id='citeF- | + | The problem is solved for the case where both the Reynolds and Bingham numbers equal to one, calculated using <math>H</math> as the reference length and a reference velocity <math>U_0</math> defined in <span id='citeF-127'></span>[[#cite-127|[127]]] as |
− | <span id="eq- | + | <span id="eq-5.332"></span> |
{| class="formulaSCP" style="width: 100%; text-align: left;" | {| class="formulaSCP" style="width: 100%; text-align: left;" | ||
|- | |- | ||
| | | | ||
− | {| style="text-align: left; margin:auto;" | + | {| style="text-align: left; margin:auto;width: 100%;" |
|- | |- | ||
| style="text-align: center;" | <math> U_0 = \frac{1}{\mu _p} \left(H \left\vert \frac{\Delta p}{\Delta x} \right\vert - \tau _0 \right)H </math> | | style="text-align: center;" | <math> U_0 = \frac{1}{\mu _p} \left(H \left\vert \frac{\Delta p}{\Delta x} \right\vert - \tau _0 \right)H </math> | ||
|} | |} | ||
− | | style="width: 5px;text-align: right;" | ( | + | | style="width: 5px;text-align: right;white-space: nowrap;" | (5.332) |
|} | |} | ||
− | where <math>\Delta p/\Delta x</math> is the pressure gradient that drives the flow. We apply the external pressure in <math>10</math> incremental load steps, refining after each iteration. Once the loading process is finished, we simulate <math>5</math> extra steps under full load to ensure that the final solution does not require additional refinement. The distribution of yielded and unyielded regions on different sections can be observed in Fig. [[#img- | + | where <math>\Delta p/\Delta x</math> is the pressure gradient that drives the flow. We apply the external pressure in <math>10</math> incremental load steps, refining after each iteration. Once the loading process is finished, we simulate <math>5</math> extra steps under full load to ensure that the final solution does not require additional refinement. The distribution of yielded and unyielded regions on different sections can be observed in Fig. [[#img-80|80]] for the <math>W/H=2</math> expansion and in Fig. [[#img-81|81]] for the <math>W/H=4</math> case. <div id='img-80a'></div> |
− | <div id='img- | + | <div id='img-80b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-80c'></div> |
+ | <div id='img-80d'></div> | ||
+ | <div id='img-80'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_2_side.png|220px|Side view.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_2_in.png|100px|$A$–$A^\prime$]] |
− | + | |[[Image:Cotela_2016-expansion_2_corner.png|100px|$B$–$B^\prime$]] | |
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_2_out.png|100px|$C$–$C^\prime$]] |
− | |[[Image: | + | |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | (a) Side view. |
+ | | (b) <math>A</math>–<math display="inline">A^\prime </math> | ||
+ | | (c) <math>B</math>–<math display="inline">B^\prime </math> | ||
+ | | (d) <math>C</math>–<math display="inline">C^\prime </math> | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="4" | '''Figure 80:''' <math>W/H=2</math> expansion – yielded (dark) and unyielded (light) regions. | ||
|} | |} | ||
− | <div id='img- | + | <div id='img-81a'></div> |
− | <div id='img- | + | <div id='img-81b'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-81c'></div> |
+ | <div id='img-81d'></div> | ||
+ | <div id='img-81'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_4_side.png|220px|Side view.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_4_in.png|100px|$A$–$A^\prime$]] |
− | + | |[[Image:Cotela_2016-expansion_4_corner.png|100px|$B$–$B^\prime$]] | |
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_4_out.png|100px|$C$–$C^\prime$]] |
− | |[[Image: | + | |- style="text-align: center; font-size: 75%;" |
+ | | (a) Side view. | ||
+ | | (b) <math>A</math>–<math display="inline">A^\prime </math> | ||
+ | | (c) <math>B</math>–<math display="inline">B^\prime </math> | ||
+ | | (d) <math>C</math>–<math display="inline">C^\prime </math> | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | colspan="4" | '''Figure 81:''' <math>W/H=4</math> expansion – yielded (dark) and unyielded (light) regions. |
|} | |} | ||
− | Both simulations exhibit a qualitatively similar behavior, in agreement with the results obtained in the references. Far from the expansion, we can differentiate a yielded region close to the wall, due to the shear produced by wall friction, and a central core of unyielded material. Close to the expansion, high velocity gradients develop as the flow adapts to the change in cross section and the central region is completely fluidified. Just after the expansion, on the wide side, a region of stationary unyielded material appears, unaffected by the main flow, which can be understood as equivalent to the recirculation zones for a Newtonian fluid. As in the previous cases, the simulation begins with a uniform tetrahedral mesh, composed of approximately <math>5000</math> nodes and <math>22000</math> elements for the <math>W/H=2</math> case or <math>10000</math> nodes and <math>53000</math> elements for the <math>W/H=4</math> case. The evolution of the number elements during the solution is shown in Fig. [[#img- | + | Both simulations exhibit a qualitatively similar behavior, in agreement with the results obtained in the references. Far from the expansion, we can differentiate a yielded region close to the wall, due to the shear produced by wall friction, and a central core of unyielded material. Close to the expansion, high velocity gradients develop as the flow adapts to the change in cross section and the central region is completely fluidified. Just after the expansion, on the wide side, a region of stationary unyielded material appears, unaffected by the main flow, which can be understood as equivalent to the recirculation zones for a Newtonian fluid. As in the previous cases, the simulation begins with a uniform tetrahedral mesh, composed of approximately <math>5000</math> nodes and <math>22000</math> elements for the <math>W/H=2</math> case or <math>10000</math> nodes and <math>53000</math> elements for the <math>W/H=4</math> case. The evolution of the number elements during the solution is shown in Fig. [[#img-82|82]]. The number of elements grows as the applied pressure gradient increases and stabilizes once the loading process finishes, resulting in a final grid of <math>106000</math> nodes and <math>596000</math> elements for the <math>W/H=2</math> case and <math>123000</math> nodes and <math>694000</math> elements for the <math>W/H=4</math> expansion. <div id='img-82'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" |
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_nelems.png|216px|Sudden expansion – evolution of the number of elements during the simulation.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="1" | '''Figure | + | | colspan="1" | '''Figure 82:''' Sudden expansion – evolution of the number of elements during the simulation. |
|} | |} | ||
− | <div id='img- | + | <div id='img-83a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-83b'></div> |
+ | <div id='img-83'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_2_mesh_initial.png|209px|Initial mesh.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_2_mesh_final.png|209px|Final mesh.]] |
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | (a) Initial mesh. | ||
+ | | (b) Final mesh. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | colspan="2" | '''Figure 83:''' <math>W/H=2</math> expansion – side view of the calculation meshes. |
|} | |} | ||
− | <div id='img- | + | <div id='img-84a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-84b'></div> |
+ | <div id='img-84'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_4_mesh_initial.png|209px|Initial mesh.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-expansion_4_mesh_final.png|209px|Final mesh.]] |
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan="2" | '''Figure | + | | (a) Initial mesh. |
+ | | (b) Final mesh. | ||
+ | |- style="text-align: center; font-size: 75%;" | ||
+ | | colspan="2" | '''Figure 84:''' <math>W/H=4</math> expansion – side view of the calculation meshes. | ||
|} | |} | ||
− | The initial and final meshes are shown in Fig. [[#img- | + | The initial and final meshes are shown in Fig. [[#img-83|83]] for the <math>W/H=2</math> test and Fig. [[#img-84|84]] for the <math>W/H=4</math> case. It can be observed that refined areas coincide with yielded regions, where higher velocity gradients are generally found: close to the solid walls and just after the expansion section. |
==5.6 Summary and conclusions== | ==5.6 Summary and conclusions== | ||
− | In the previous pages we have presented an adaptive mesh refinement technique that combines an ''a posteriori'' error estimator based on the VMS scale separation and a mesh refinement strategy based on edge division, designed and implemented to work in a distributed memory parallel environment. This approach has been applied to the simulation of turbulent and viscoplastic flows, improving the resolution of triangular meshes in <math>2D</math> and tetrahedral meshes in <math>3D</math>. To conclude the presentation, we will give some final thoughts on the method and propose future lines of improvement. We have shown that our approach to mesh refinement is parallel by design and its distributed memory implementation shows good parallel performance. This is achieved through the use of a very simple refinement procedure, based only on data that is local to the element. In fact, the division procedure presented in Section [[#5.2.3 Local refinement of triangles and tetrahedra|5.2.3]] is based only on the nodal numbering. The drawback of this approach is that the quality of the resulting refined mesh is not taken into account when dividing elements, which can result in a sub-optimal mesh quality. A local division strategy that took into account the shape of the element and its neighbors when refining could allow us to chose a more convenient division pattern in many cases, resulting in better mesh quality. This suggests a first venue for future improvement, for example devising an improved approach that incorporates the ideas of the local mesh improvement techniques we now use as a post-process to choose an optimal refined configuration, but always keeping in mind that the parallelization of such approach would have to be carefully considered. A second possibility for improvement of the mesh refinement strategy is the treatment of curved surfaces. While this has not been significant in the examples presented here (only the cylinder example included curved edges), a drawback of our refinement algorithm is that, when working with curved surfaces, the quality of their representation is given by the ''coarsest'' mesh used during the process. This issue is shown graphically in Fig. [[#img- | + | In the previous pages we have presented an adaptive mesh refinement technique that combines an ''a posteriori'' error estimator based on the VMS scale separation and a mesh refinement strategy based on edge division, designed and implemented to work in a distributed memory parallel environment. This approach has been applied to the simulation of turbulent and viscoplastic flows, improving the resolution of triangular meshes in <math>2D</math> and tetrahedral meshes in <math>3D</math>. To conclude the presentation, we will give some final thoughts on the method and propose future lines of improvement. We have shown that our approach to mesh refinement is parallel by design and its distributed memory implementation shows good parallel performance. This is achieved through the use of a very simple refinement procedure, based only on data that is local to the element. In fact, the division procedure presented in Section [[#5.2.3 Local refinement of triangles and tetrahedra|5.2.3]] is based only on the nodal numbering. The drawback of this approach is that the quality of the resulting refined mesh is not taken into account when dividing elements, which can result in a sub-optimal mesh quality. A local division strategy that took into account the shape of the element and its neighbors when refining could allow us to chose a more convenient division pattern in many cases, resulting in better mesh quality. This suggests a first venue for future improvement, for example devising an improved approach that incorporates the ideas of the local mesh improvement techniques we now use as a post-process to choose an optimal refined configuration, but always keeping in mind that the parallelization of such approach would have to be carefully considered. A second possibility for improvement of the mesh refinement strategy is the treatment of curved surfaces. While this has not been significant in the examples presented here (only the cylinder example included curved edges), a drawback of our refinement algorithm is that, when working with curved surfaces, the quality of their representation is given by the ''coarsest'' mesh used during the process. This issue is shown graphically in Fig. [[#img-85|85]], and would likely be problematic in cases where a precise description of the geometry is required, such as flows around wing profiles or wind turbine blades, regardless of the final mesh size. A starting point to solve this issue could be storing the original geometry using, for example, a NURBS-based description and using this information to correct the position of new nodes, placing them closer to the original surface instead of on the edge midpoint. <div id='img-85a'></div> |
− | {| style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | + | <div id='img-85b'></div> |
+ | <div id='img-85c'></div> | ||
+ | <div id='img-85'></div> | ||
+ | {| class="floating_imageSCP" style="text-align: center; border: 1px solid #BBB; margin: 1em auto; width: 100%;max-width: 100%;" | ||
|- | |- | ||
− | |[[Image: | + | |[[Image:Cotela_2016-amr_corners_exact.png|100px|Original domain.]] |
− | |[[Image: | + | |[[Image:Cotela_2016-amr_corners_coarse.png|100px|Coarse mesh.]] |
− | + | |[[Image:Cotela_2016-amr_corners_refined.png|100px|Refined mesh.]] | |
− | + | |- style="text-align: center; font-size: 75%;" | |
+ | | (a) Original domain. | ||
+ | | (b) Coarse mesh. | ||
+ | | (c) Refined mesh. | ||
|- style="text-align: center; font-size: 75%;" | |- style="text-align: center; font-size: 75%;" | ||
− | | colspan=" | + | | colspan="3" | '''Figure 85:''' Refinement of curved edges. |
|} | |} | ||
The incompressible flow examples presented in Section [[#5.3 Application to laminar and turbulent flows|5.3]] allow us to say that our approach correctly identifies the zones where refinement is required. However, regarding the parallel efficiency of the method, we found that dynamic load balancing is necessary to solve large scale examples efficiently, as local refinement can quickly unbalance the original partitioning of the model. Additionally, mesh coarsening would be a welcome addition to solve dynamic problems as, in our experience, the regions with larger error tend to follow moving vortices and this currently results in a complete refinement of turbulent wakes. Although our adaptive refinement strategy was originally designed to simulate turbulent flows, we found that it is also suited to the simulation of viscoplastic fluids. The fact that many problems of interest in this field are generally static and have sharp interfaces between yielded and unyielded regions plays to the strengths of our approach, as coarsening is rarely required. We found that our method was able to identify the regions where fluidification occurs even when starting from a uniform initial mesh. While the capabilities of the method have been demonstrated by the test cases presented in Section [[#5.5 Application to Bingham fluids|5.5]], there are some questions that could be addressed in the future. For example, how should the tolerance for the error estimator be set? Is it problem dependent? In our experience, the solution is sensitive to the tolerance set for the error estimator: a small tolerance produces very fine meshes, while a large tolerance can even prevent the refinement from starting if the original mesh is too coarse. This was shown to be the case in some of the Poiseuille flow examples presented in Section [[#5.5.1 Poiseuille flow|5.5.1]]. Going back to turbulent flow, there is one interesting question regarding the chosen estimator. According to the arguments presented in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]], the small scale part of the solution can be understood as the basic ingredient of a VMS-based turbulence modeling. In this sense, imposing a restriction on its magnitude seems to be contradictory with our goal in previous chapters, which was to perform a LES-like simulation thanks to the contribution of the small scale terms, and seems to push the mesh size towards DNS simulations, which we discarded as prohibitively expensive for problems of engineering interest. | The incompressible flow examples presented in Section [[#5.3 Application to laminar and turbulent flows|5.3]] allow us to say that our approach correctly identifies the zones where refinement is required. However, regarding the parallel efficiency of the method, we found that dynamic load balancing is necessary to solve large scale examples efficiently, as local refinement can quickly unbalance the original partitioning of the model. Additionally, mesh coarsening would be a welcome addition to solve dynamic problems as, in our experience, the regions with larger error tend to follow moving vortices and this currently results in a complete refinement of turbulent wakes. Although our adaptive refinement strategy was originally designed to simulate turbulent flows, we found that it is also suited to the simulation of viscoplastic fluids. The fact that many problems of interest in this field are generally static and have sharp interfaces between yielded and unyielded regions plays to the strengths of our approach, as coarsening is rarely required. We found that our method was able to identify the regions where fluidification occurs even when starting from a uniform initial mesh. While the capabilities of the method have been demonstrated by the test cases presented in Section [[#5.5 Application to Bingham fluids|5.5]], there are some questions that could be addressed in the future. For example, how should the tolerance for the error estimator be set? Is it problem dependent? In our experience, the solution is sensitive to the tolerance set for the error estimator: a small tolerance produces very fine meshes, while a large tolerance can even prevent the refinement from starting if the original mesh is too coarse. This was shown to be the case in some of the Poiseuille flow examples presented in Section [[#5.5.1 Poiseuille flow|5.5.1]]. Going back to turbulent flow, there is one interesting question regarding the chosen estimator. According to the arguments presented in Chapter [[#2 Variational multiscale stabilization for turbulent flow problems|2]], the small scale part of the solution can be understood as the basic ingredient of a VMS-based turbulence modeling. In this sense, imposing a restriction on its magnitude seems to be contradictory with our goal in previous chapters, which was to perform a LES-like simulation thanks to the contribution of the small scale terms, and seems to push the mesh size towards DNS simulations, which we discarded as prohibitively expensive for problems of engineering interest. | ||
Line 6,657: | Line 6,991: | ||
In terms of VMS formulations we are of the opinion that, while using scale separation and mesh projection is a valid option introduce a LES-like separation between the resolved and unresolved part of the solution, there is still work to do in understanding the practical behavior of the resulting method as a turbulence model. In particular, the behavior of the pressure small scale and its impact on the solution is still poorly understood. While we were able to compare the results obtained using different formulations, it is not always clear why a particular method provides a more accurate solution than the other. Additionally, for the proposed pressure subscale model, although the results in our test are encouraging, there is still work to do in understanding precisely why we obtained a better approximation and to verify if this result would hold for other problems. | In terms of VMS formulations we are of the opinion that, while using scale separation and mesh projection is a valid option introduce a LES-like separation between the resolved and unresolved part of the solution, there is still work to do in understanding the practical behavior of the resulting method as a turbulence model. In particular, the behavior of the pressure small scale and its impact on the solution is still poorly understood. While we were able to compare the results obtained using different formulations, it is not always clear why a particular method provides a more accurate solution than the other. Additionally, for the proposed pressure subscale model, although the results in our test are encouraging, there is still work to do in understanding precisely why we obtained a better approximation and to verify if this result would hold for other problems. | ||
− | A similar argument could be made in terms of the new FIC formulation: while the resulting formulation results in an improved accuracy, we did not provide a justification of why this happens. In this particular case, it is interesting to note that the gradient diffusion terms that constitute the main difference to the classical FIC approach have a similar structure to the family of LES methods known as gradient models such as the Clark model <span id='citeF- | + | A similar argument could be made in terms of the new FIC formulation: while the resulting formulation results in an improved accuracy, we did not provide a justification of why this happens. In this particular case, it is interesting to note that the gradient diffusion terms that constitute the main difference to the classical FIC approach have a similar structure to the family of LES methods known as gradient models such as the Clark model <span id='citeF-132'></span>[[#cite-132|[132]]] or Modulated Gradient Diffusion <span id='citeF-133'></span>[[#cite-133|[133]]]. Exploring its relation to such models could allow us to obtain a better understanding of the method in terms of its behavior in turbulent problems and motivate future improvements. |
Regarding the development of parallel capabilities, the immediate work will be centered on continuing the integration of the AMGCL library as it is developed. Another possibility that will be explored is the addition of a hybrid implementation, combining shared and distributed memory capabilities. It could also be worthwhile to work on improving the partitioning procedure, using a more efficient coloring procedure and, most importantly, adding dynamic load balancing procedures to adjust the work load in each processor if the simulation mesh is changed. This would be a welcome addition in particular for the adaptive mesh refinement procedure presented in Chapter [[#5 Adaptive mesh refinement for turbulent and viscoplastic flows|5]], as it would extend the range of applicability of the method. | Regarding the development of parallel capabilities, the immediate work will be centered on continuing the integration of the AMGCL library as it is developed. Another possibility that will be explored is the addition of a hybrid implementation, combining shared and distributed memory capabilities. It could also be worthwhile to work on improving the partitioning procedure, using a more efficient coloring procedure and, most importantly, adding dynamic load balancing procedures to adjust the work load in each processor if the simulation mesh is changed. This would be a welcome addition in particular for the adaptive mesh refinement procedure presented in Chapter [[#5 Adaptive mesh refinement for turbulent and viscoplastic flows|5]], as it would extend the range of applicability of the method. | ||
Line 6,664: | Line 6,998: | ||
<div id="cite-1"></div> | <div id="cite-1"></div> | ||
− | '''[[#citeF-1|[1]]]''' Simiu, Emil and Scanlan, Robert H. | + | '''[[#citeF-1|[1]]]''' Simiu, Emil and Scanlan, Robert H. (1996) "Wind effects on structures: fundementals and applications to design". John Wiley & Sons, Ltd |
<div id="cite-2"></div> | <div id="cite-2"></div> | ||
− | '''[[#citeF-2|[2]]]''' Pope, Stephen B. | + | '''[[#citeF-2|[2]]]''' Pope, Stephen B. (2000) "Turbulent Flows". Cambridge University Press |
<div id="cite-3"></div> | <div id="cite-3"></div> | ||
− | '''[[#citeF-3|[3]]]''' Kolmogorov, A. N. | + | '''[[#citeF-3|[3]]]''' Kolmogorov, A. N. (1941) "The Local Structure of Turbulence in Incompressible Viscous Fluid for Very Large Reynolds Numbers", Volume 30. Doklady Akademiia Nauk SSSR 301–305 |
<div id="cite-4"></div> | <div id="cite-4"></div> | ||
− | '''[[#citeF-4|[4]]]''' Kolmogorov, A. N. | + | '''[[#citeF-4|[4]]]''' Kolmogorov, A. N. (1991) "The Local Structure of Turbulence in Incompressible Viscous Fluid for Very Large Reynolds Numbers", Volume 434. Proceedings of the Royal Society of London. Series A: Mathematical and Physical Sciences 1890 9-13 |
<div id="cite-5"></div> | <div id="cite-5"></div> | ||
− | '''[[#citeF-5|[5]]]''' Spalart, P. R. and Allmaras, S. R. | + | '''[[#citeF-5|[5]]]''' Spalart, P. R. and Allmaras, S. R. (1994) "A One-Equation Turbulence Model for Aerodynamic Flows", Volume 1. Recherche Aerospatiale 5–21 |
<div id="cite-6"></div> | <div id="cite-6"></div> | ||
− | '''[[#citeF-6|[6]]]''' Launder, B. E. and Sharma, B. I. | + | '''[[#citeF-6|[6]]]''' Launder, B. E. and Sharma, B. I. (1974) "Application of the energy-dissipation model of turbulence to the calculation of flow near a spinning disc", Volume 1. Letters in Heat and Mass Transfer 2 131 - 137 |
<div id="cite-7"></div> | <div id="cite-7"></div> | ||
− | '''[[#citeF-7|[7]]]''' Chien, Kuei-Yuan. | + | '''[[#citeF-7|[7]]]''' Chien, Kuei-Yuan. (1982) "Predictions of channel and boundary-layer flows with a low-Reynolds-number turbulence model", Volume 20. AIAA journal 1 33–38 |
<div id="cite-8"></div> | <div id="cite-8"></div> | ||
− | '''[[#citeF-8|[8]]]''' Wilcox, David C. | + | '''[[#citeF-8|[8]]]''' Wilcox, David C. (1998) "Turbulence Modeling for CFD". DCW industries |
<div id="cite-9"></div> | <div id="cite-9"></div> | ||
− | '''[[#citeF-9|[9]]]''' Smagorinsky, J. | + | '''[[#citeF-9|[9]]]''' Smagorinsky, J. (1963) "General circulation experiments with the primitive equations: I The basic equations", Volume 91. Monthly Weather Review 99–164 |
<div id="cite-10"></div> | <div id="cite-10"></div> | ||
− | '''[[#citeF-10|[10]]]''' Donea, Jean and Huerta, Antonio. | + | '''[[#citeF-10|[10]]]''' Donea, Jean and Huerta, Antonio. (2003) "Finite Element Methods for Flow Problems". John Wiley & Sons, Ltd |
<div id="cite-11"></div> | <div id="cite-11"></div> | ||
− | '''[[#citeF-11|[11]]]''' Andrés E. Tejada-Martínez and Kenneth E. Jansen. | + | '''[[#citeF-11|[11]]]''' Andrés E. Tejada-Martínez and Kenneth E. Jansen. (2005) "On the interaction between dynamic model dissipation and numerical dissipation due to streamline upwind/Petrov-Galerkin stabilization", Volume 194. Computer Methods in Applied Mechanics and Engineering 9-11 1225 - 1248 |
<div id="cite-12"></div> | <div id="cite-12"></div> | ||
− | '''[[#citeF-12|[12]]]''' Alisa V. Trofimova and Andrés E. Tejada-Martínez and Kenneth E. Jansen and Richard T. Lahey Jr. | + | '''[[#citeF-12|[12]]]''' Alisa V. Trofimova and Andrés E. Tejada-Martínez and Kenneth E. Jansen and Richard T. Lahey Jr. (2009) "Direct numerical simulation of turbulent channel flows using a stabilized finite element method", Volume 38. Computers & Fluids 4 924 – 938 |
<div id="cite-13"></div> | <div id="cite-13"></div> | ||
− | '''[[#citeF-13|[13]]]''' Oñate, Eugenio and Valls, Aleix and García, Julio. | + | '''[[#citeF-13|[13]]]''' Oñate, Eugenio and Valls, Aleix and García, Julio. (2007) "Computation of turbulent flows using a finite calculus-finite element formulation", Volume 54. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Fluids 6-8 609–637 |
<div id="cite-14"></div> | <div id="cite-14"></div> | ||
− | '''[[#citeF-14|[14]]]''' Oñate, Eugenio and Valls, Aleix and García, Julio. | + | '''[[#citeF-14|[14]]]''' Oñate, Eugenio and Valls, Aleix and García, Julio. (2007) "Modeling incompressible flows at low and high Reynolds numbers via a finite calculus-finite element approach", Volume 224. Journal of Computational Physics 1 332 - 351 |
<div id="cite-15"></div> | <div id="cite-15"></div> | ||
− | '''[[#citeF-15|[15]]]''' Hughes, Thomas J. R. | + | '''[[#citeF-15|[15]]]''' Hughes, Thomas J. R. (1995) "Multiscale phenomena: Green's functions, the Dirichlet-to-Neumann formulation, subgrid scale models, bubbles and the origins of stabilized methods", Volume 127. Computer Methods in Applied Mechanics and Engineering 1-4 387–401 |
<div id="cite-16"></div> | <div id="cite-16"></div> | ||
− | '''[[#citeF-16|[16]]]''' Hughes, Thomas J. R. and Feijóo, Gonzalo R. and Mazzei, Luca and Quincy, Jean-Baptiste. | + | '''[[#citeF-16|[16]]]''' Hughes, Thomas J. R. and Feijóo, Gonzalo R. and Mazzei, Luca and Quincy, Jean-Baptiste. (1998) "The variational multiscale method–a paradigm for computational mechanics", Volume 166. Computer Methods in Applied Mechanics and Engineering 1-2 3–24 |
<div id="cite-17"></div> | <div id="cite-17"></div> | ||
− | '''[[#citeF-17|[17]]]''' Hughes, Thomas J. R. and Mazzei, Luca and Jansen, Kenneth E. | + | '''[[#citeF-17|[17]]]''' Hughes, Thomas J. R. and Mazzei, Luca and Jansen, Kenneth E. (2000) "Large Eddy Simulation and the variational multiscale method", Volume 3. Springer Berlin / Heidelberg. Computing and Visualization in Science 47–59 |
<div id="cite-18"></div> | <div id="cite-18"></div> | ||
− | '''[[#citeF-18|[18]]]''' Hughes, Thomas J. R. and Mazzei, Luca and Oberai, Assad A. and Wray, Alan A. | + | '''[[#citeF-18|[18]]]''' Hughes, Thomas J. R. and Mazzei, Luca and Oberai, Assad A. and Wray, Alan A. (2001) "The multiscale formulation of large eddy simulation: Decay of homogeneous isotropic turbulence", Volume 13. Physics of Fluids 2 505–512 |
<div id="cite-19"></div> | <div id="cite-19"></div> | ||
− | '''[[#citeF-19|[19]]]''' Gravemeier, Volker. | + | '''[[#citeF-19|[19]]]''' Gravemeier, Volker. (2006) "The variational multiscale method for laminar and turbulent flow", Volume 13. Springer Netherlands. Archives of Computational Methods in Engineering 2 249-324 |
<div id="cite-20"></div> | <div id="cite-20"></div> | ||
− | '''[[#citeF-20|[20]]]''' Codina, Ramon and Príncipe, Javier and Guasch, Oriol and Badia, Santiago. | + | '''[[#citeF-20|[20]]]''' Codina, Ramon and Príncipe, Javier and Guasch, Oriol and Badia, Santiago. (2007) "Time dependent subscales in the stabilized finite element approximation of incompressible flow problems", Volume 196. Computer Methods in Applied Mechanics and Engineering 21-24 2413-2430 |
<div id="cite-21"></div> | <div id="cite-21"></div> | ||
− | '''[[#citeF-21|[21]]]''' | + | '''[[#citeF-21|[21]]]''' Y. Bazilevs and V.M. Calo and J.A. Cottrell and T.J.R. Hughes and A. Reali and G. Scovazzi. (2007) "Variational multiscale residual-based turbulence modeling for large eddy simulation of incompressible flows", Volume 197. Computer Methods in Applied Mechanics and Engineering 1-4 173 - 201 |
<div id="cite-22"></div> | <div id="cite-22"></div> | ||
− | '''[[#citeF-22|[22]]]''' | + | '''[[#citeF-22|[22]]]''' Bazilevs, Y. and Michler, C. and Calo, V. M. and Hughes, T. J. R. (2007) "Weak Dirichlet boundary conditions for wall-bounded turbulent flows", Volume 196. Computer Methods in Applied Mechanics and Engineering 49-52 4853 – 4862 |
<div id="cite-23"></div> | <div id="cite-23"></div> | ||
− | '''[[#citeF-23|[23]]]''' | + | '''[[#citeF-23|[23]]]''' Akkerman, I. and Bazilevs, Y. and Calo, V. and Hughes, T. and Hulshoff, S. (2008) "The role of continuity in residual-based variational multiscale modeling of turbulence", Volume 41. Springer Berlin / Heidelberg. Computational Mechanics 371–378 |
<div id="cite-24"></div> | <div id="cite-24"></div> | ||
− | '''[[#citeF-24|[24]]]''' | + | '''[[#citeF-24|[24]]]''' Y. Bazilevs and C. Michler and V.M. Calo and T.J.R. Hughes. (2010) "Isogeometric variational multiscale modeling of wall-bounded turbulent flows with weakly enforced boundary conditions on unstretched meshes", Volume 199. Computer Methods in Applied Mechanics and Engineering 13-16 780–790 |
<div id="cite-25"></div> | <div id="cite-25"></div> | ||
− | '''[[#citeF-25|[25]]]''' | + | '''[[#citeF-25|[25]]]''' Príncipe, Javier and Codina, Ramon and Henke, Florian. (2010) "The dissipative structure of variational multiscale methods for incompressible flows", Volume 199. Computer Methods in Applied Mechanics and Engineering 13-16 791-801 |
<div id="cite-26"></div> | <div id="cite-26"></div> | ||
− | '''[[#citeF-26|[26]]]''' | + | '''[[#citeF-26|[26]]]''' Guasch, Oriol and Codina, Ramon. (2013) "Statistical behavior of the orthogonal subgrid scale stabilization terms in the finite element large eddy simulation of turbulent flows", Volume 261–262. Computer Methods in Applied Mechanics and Engineering 0 154 – 166 |
<div id="cite-27"></div> | <div id="cite-27"></div> | ||
− | '''[[#citeF-27|[27]]]''' | + | '''[[#citeF-27|[27]]]''' Colomés, Oriol and Badia, Santiago and Codina, Ramon and Príncipe, Javier. (2015) "Assessment of variational multiscale models for the large eddy simulation of turbulent incompressible flows", Volume 285. Computer Methods in Applied Mechanics and Engineering 0 32 - 63 |
<div id="cite-28"></div> | <div id="cite-28"></div> | ||
− | '''[[#citeF-28|[28]]]''' | + | '''[[#citeF-28|[28]]]''' Dadvand, Pooyan and Rossi, Riccardo and Oñate, Eugenio. (2010) "An object-oriented environment for developing finite element codes for multi-disciplinary applications", Volume 17. Archives of Computational Methods in Engineering 253-297 |
<div id="cite-29"></div> | <div id="cite-29"></div> | ||
− | '''[[#citeF-29|[29]]]''' | + | '''[[#citeF-29|[29]]]''' Dadvand, Pooyan and Rossi, Riccardo and Gil, Marisa and Martorell, Xavier and Cotela-Dalmau, Jordi and Juanpere, Edgar and Idelsohn, Sergio R. and Oñate, Eugenio. (2013) "Migration of a Generic Multi-Physics Framework to HPC Environments", Volume 80. Computers & Fluids 301–309 |
<div id="cite-30"></div> | <div id="cite-30"></div> | ||
− | '''[[#citeF-30|[30]]]''' | + | '''[[#citeF-30|[30]]]''' Codina, Ramon. (2002) "Stabilized finite element approximation of transient incompressible flows using orthogonal subscales", Volume 191. Computer Methods in Applied Mechanics and Engineering 39-40 4295-4321 |
<div id="cite-31"></div> | <div id="cite-31"></div> | ||
− | '''[[#citeF-31|[31]]]''' | + | '''[[#citeF-31|[31]]]''' Ávila, Matías. (2012) "Nonlinear subgrid finite element models for low Mach number flows coupled with radiative heat transfer" |
<div id="cite-32"></div> | <div id="cite-32"></div> | ||
− | '''[[#citeF-32|[32]]]''' | + | '''[[#citeF-32|[32]]]''' Temam, Roger. (2001) "Navier-Stokes Equations: Theory and Numerical Analysis". American Mathematical Soc. |
<div id="cite-33"></div> | <div id="cite-33"></div> | ||
− | '''[[#citeF-33|[33]]]''' | + | '''[[#citeF-33|[33]]]''' Ern, Alexandre and Guermond, Jean-Luc. (2013) "Theory and practice of finite elements", Volume 159. Springer Science & Business Media |
<div id="cite-34"></div> | <div id="cite-34"></div> | ||
− | '''[[#citeF-34|[34]]]''' Codina, Ramon. | + | '''[[#citeF-34|[34]]]''' Codina, Ramon and Principe, Javier and Ávila, Matías. (2010) "Finite element approximation of turbulent thermally coupled incompressible flows with numerical sub-grid scale modeling", Volume 20. International Journal for Numerical Methods for Heat & Fluid Flow 492–516 |
<div id="cite-35"></div> | <div id="cite-35"></div> | ||
− | '''[[#citeF-35|[35]]]''' | + | '''[[#citeF-35|[35]]]''' Taylor, C. and Hood, P. (1973) "A numerical solution of the Navier-Stokes equations using the finite element technique", Volume 1. Computers & Fluids 1 73 - 100 |
<div id="cite-36"></div> | <div id="cite-36"></div> | ||
− | '''[[#citeF-36|[36]]]''' | + | '''[[#citeF-36|[36]]]''' Hughes, Thomas J. R. and Mallet, Michel. (1986) "A new finite element formulation for computational fluid dynamics: III. The generalized streamline operator for multidimensional advective-diffusive systems", Volume 58. Computer Methods in Applied Mechanics and Engineering 3 305–328 |
<div id="cite-37"></div> | <div id="cite-37"></div> | ||
− | '''[[#citeF-37|[37]]]''' | + | '''[[#citeF-37|[37]]]''' Hughes, Thomas J. R. and Franca, Leopoldo P. and Hulbert, Gregory M. (1989) "A new finite element formulation for computational fluid dynamics: VIII. The Galerkin/least-squares method for advective-diffusive equations", Volume 73. Computer Methods in Applied Mechanics and Engineering 2 173–189 |
<div id="cite-38"></div> | <div id="cite-38"></div> | ||
− | '''[[#citeF-38|[38]]]''' | + | '''[[#citeF-38|[38]]]''' Hughes, Thomas J. R. and Stewart, James R. (1996) "A space-time formulation for multiscale phenomena", Volume 74. Journal of Computational and Applied Mathematics 1-2 217-229 |
<div id="cite-39"></div> | <div id="cite-39"></div> | ||
− | '''[[#citeF-39|[39]]]''' | + | '''[[#citeF-39|[39]]]''' Codina, Ramon. (2001) "A stabilized finite element method for generalized stationary incompressible flows", Volume 190. Computer Methods in Applied Mechanics and Engineering 20-21 268–2706 |
<div id="cite-40"></div> | <div id="cite-40"></div> | ||
− | '''[[#citeF-40|[40]]]''' | + | '''[[#citeF-40|[40]]]''' Codina, Ramon. (2000) "Stabilization of incompressibility and convection through orthogonal sub-scales in finite element methods", Volume 190. Computer Methods in Applied Mechanics and Engineering 13-14 1579–1599 |
<div id="cite-41"></div> | <div id="cite-41"></div> | ||
− | '''[[#citeF-41|[41]]]''' Gravemeier, Volker | + | '''[[#citeF-41|[41]]]''' Gravemeier, Volker and Wall, Wolfgang A. and Ramm, Ekkehard. (2004) "A three-level finite element method for the instationary incompressible Navier-Stokes equations", Volume 193. Computer Methods in Applied Mechanics and Engineering 15-16 1323 - 1366 |
<div id="cite-42"></div> | <div id="cite-42"></div> | ||
− | '''[[#citeF-42|[42]]]''' | + | '''[[#citeF-42|[42]]]''' Codina, Ramon. (2001) "Pressure stability in fractional step finite element methods for incompressible flows", Volume 170. Journal of Computational Physics 1 112–140 |
<div id="cite-43"></div> | <div id="cite-43"></div> | ||
− | '''[[#citeF-43|[43]]]''' | + | '''[[#citeF-43|[43]]]''' Bochev, Pavel B. and Gunzburger, Max D. and Lehoucq, Richard B. (2007) "On stabilized finite element methods for the Stokes problem in the small time step limit", Volume 53. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Fluids 4 573-597 |
<div id="cite-44"></div> | <div id="cite-44"></div> | ||
− | '''[[#citeF-44|[44]]]''' | + | '''[[#citeF-44|[44]]]''' Boris, J. P. and Grinstein, F. F. and Oran, E. S. and Kolbe, R. L. (1992) "New insights into large eddy simulation", Volume 10. Fluid Dynamics Research 4-6 199 |
<div id="cite-45"></div> | <div id="cite-45"></div> | ||
− | '''[[#citeF-45|[45]]]''' | + | '''[[#citeF-45|[45]]]''' Gravemeier, Volker and Gee, Michael W. and Kronbichler, Martin and Wall, Wolfgang A. (2010) "An algebraic variational multiscale–multigrid method for large eddy simulation of turbulent flow", Volume 199. Computer Methods in Applied Mechanics and Engineering 13-16 853 - 864 |
<div id="cite-46"></div> | <div id="cite-46"></div> | ||
− | '''[[#citeF-46|[46]]]''' | + | '''[[#citeF-46|[46]]]''' Oberai, A. A. and Wanderer, J. (2005) "A dynamic approach for evaluating parameters in a numerical method", Volume 62. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 1 50–71 |
<div id="cite-47"></div> | <div id="cite-47"></div> | ||
− | '''[[#citeF-47|[47]]]''' | + | '''[[#citeF-47|[47]]]''' Oberai, A. A. and Wanderer, J. (2005) "Variational formulation of the Germano identity for the Navier–Stokes equations", Volume 6. Journal of Turbulence 1-17 |
<div id="cite-48"></div> | <div id="cite-48"></div> | ||
− | '''[[#citeF-48|[48]]]''' | + | '''[[#citeF-48|[48]]]''' Hughes, Thomas J. R. (2000) "The Finite Element Method: Linear Static and Dynamic Finite Element Analysis". Dover Publications, Inc |
<div id="cite-49"></div> | <div id="cite-49"></div> | ||
− | '''[[#citeF-49|[49]]]''' | + | '''[[#citeF-49|[49]]]''' Ávila, Matías and Príncipe, Javier and Codina, Ramon. (2011) "A finite element dynamical nonlinear subscale approximation for the low Mach number flow equations", Volume 230. Journal of Computational Physics 22 7988 - 8009 |
<div id="cite-50"></div> | <div id="cite-50"></div> | ||
− | '''[[#citeF-50|[50]]]''' | + | '''[[#citeF-50|[50]]]''' Tennekes, Hendrik and Lumley, John Leask. (1972) "A first course in turbulence". MIT Press |
<div id="cite-51"></div> | <div id="cite-51"></div> | ||
− | '''[[#citeF-51|[51]]]''' | + | '''[[#citeF-51|[51]]]''' Moser, Robert D. and Kim, John and Mansour, Nagi N. (1999) "Direct numerical simulation of turbulent channel flow up to <math>\hbox{Re}_{\tau } = 590</math>", Volume 11. Physics of Fluids 4 943–945 |
<div id="cite-52"></div> | <div id="cite-52"></div> | ||
− | '''[[#citeF-52|[52]]]''' | + | '''[[#citeF-52|[52]]]''' Stull, Roland B. (1988) "An introduction to boundary layer meteorology". Springer |
<div id="cite-53"></div> | <div id="cite-53"></div> | ||
− | '''[[#citeF-53|[53]]]''' Oñate, Eugenio | + | '''[[#citeF-53|[53]]]''' Oñate, Eugenio. (1998) "Derivation of stabilized equations for numerical solution of advective-diffusive transport and fluid flow problems", Volume 151. Computer Methods in Applied Mechanics and Engineering 1 - 2 233 - 265 |
<div id="cite-54"></div> | <div id="cite-54"></div> | ||
− | '''[[#citeF-54|[54]]]''' Oñate, Eugenio. | + | '''[[#citeF-54|[54]]]''' Oñate, Eugenio. (2000) "A stabilized finite element method for incompressible viscous flows using a finite increment calculus formulation", Volume 182. Computer Methods in Applied Mechanics and Engineering 3-4 355 - 370 |
<div id="cite-55"></div> | <div id="cite-55"></div> | ||
− | '''[[#citeF-55|[55]]]''' Oñate, Eugenio and Idelsohn, Sergio R. and Felippa, Carlos | + | '''[[#citeF-55|[55]]]''' Oñate, Eugenio and Nadukandi, Prashanth and Idelsohn, Sergio R. and García, Julio and Felippa, Carlos. (2011) "A family of residual-based stabilized finite element methods for Stokes flows", Volume 65. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Fluids 1-3 106–134 |
<div id="cite-56"></div> | <div id="cite-56"></div> | ||
− | '''[[#citeF-56|[56]]]''' | + | '''[[#citeF-56|[56]]]''' Oñate, Eugenio. (2004) "Possibilities of finite calculus in computational mechanics", Volume 60. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 1 255–281 |
<div id="cite-57"></div> | <div id="cite-57"></div> | ||
− | '''[[#citeF-57|[57]]]''' Oñate, Eugenio and | + | '''[[#citeF-57|[57]]]''' Oñate, Eugenio and Idelsohn, Sergio R. and Felippa, Carlos A. (2011) "Consistent pressure Laplacian stabilization for incompressible continua via higher-order finite calculus", Volume 87. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 1-5 171–195 |
<div id="cite-58"></div> | <div id="cite-58"></div> | ||
− | '''[[#citeF-58|[58]]]''' | + | '''[[#citeF-58|[58]]]''' Ramon Codina. (1993) "A discontinuity-capturing crosswind-dissipation for the finite element solution of the convection-diffusion equation", Volume 110. Computer Methods in Applied Mechanics and Engineering 3-4 325 - 342 |
<div id="cite-59"></div> | <div id="cite-59"></div> | ||
− | '''[[#citeF-59|[59]]]''' | + | '''[[#citeF-59|[59]]]''' Oñate, Eugenio and Franci, Alessandro and Carbonell, Josep M. (2014) "Lagrangian formulation for finite element analysis of quasi-incompressible fluids with reduced mass losses", Volume 74. International Journal for Numerical Methods in Fluids 10 699–731 |
<div id="cite-60"></div> | <div id="cite-60"></div> | ||
− | '''[[#citeF-60|[60]]]''' | + | '''[[#citeF-60|[60]]]''' Piomelli, U. and Balaras, E. (2002) "Wall-layer models for large-eddy simulations", Volume 34. ANNUAL REVIEWS. Annual Review of Fluid Mechanics 524XP 349-374 |
<div id="cite-61"></div> | <div id="cite-61"></div> | ||
− | '''[[#citeF-61|[61]]]''' | + | '''[[#citeF-61|[61]]]''' Bou-Zeid, Elie and Meneveau, Charles and Parlange, Marc. (2005) "A scale-dependent Lagrangian dynamic model for large eddy simulation of complex turbulent flows", Volume 17. Physics of Fluids (1994-present) 2 025105 |
<div id="cite-62"></div> | <div id="cite-62"></div> | ||
− | '''[[#citeF-62|[62]]]''' | + | '''[[#citeF-62|[62]]]''' Ham, F. E. and Lien, F.S. and Strong, A. B. (2002) "A Fully Conservative Second-Order Finite Difference Scheme for Incompressible Flow on Nonuniform Grids", Volume 177. Journal of Computational Physics 1 117 - 133 |
<div id="cite-63"></div> | <div id="cite-63"></div> | ||
− | '''[[#citeF-63|[63]]]''' | + | '''[[#citeF-63|[63]]]''' Norberg, C. (2003) "Fluctuating lift on a circular cylinder: review and new measurements", Volume 17. Journal of Fluids and Structures 1 57–96 |
<div id="cite-64"></div> | <div id="cite-64"></div> | ||
− | '''[[#citeF-64|[64]]]''' | + | '''[[#citeF-64|[64]]]''' Lienhard, John H. (1966) "Synopsis of lift, drag, and vortex frequency data for rigid circular cylinders". Washington State University |
<div id="cite-65"></div> | <div id="cite-65"></div> | ||
− | '''[[#citeF-65|[65]]]''' | + | '''[[#citeF-65|[65]]]''' Ong, L. and Wallace, J. (1996) "The velocity field of the turbulent very near wake of a circular cylinder", Volume 20. Springer Berlin / Heidelberg. Experiments in Fluids 441–453 |
<div id="cite-66"></div> | <div id="cite-66"></div> | ||
− | '''[[#citeF-66|[66]]]''' | + | '''[[#citeF-66|[66]]]''' Kravchenko, Arthur G. and Moin, Parviz. (2000) "Numerical studies of flow over a circular cylinder at <math display="inline">{R}e_{D} = 3900</math>", Volume 12. Physics of Fluids 2 403–417 |
<div id="cite-67"></div> | <div id="cite-67"></div> | ||
− | '''[[#citeF-67|[67]]]''' | + | '''[[#citeF-67|[67]]]''' Beaudan, Patrick and Moin, Parviz. (1994) "Numerical Experiments on the Flow Past a Circular Cylinder at Sub-Critical Reynolds Number". Department of Mechanical Engineering, Stanford University TF-62 |
<div id="cite-68"></div> | <div id="cite-68"></div> | ||
− | '''[[#citeF-68|[68]]]''' | + | '''[[#citeF-68|[68]]]''' M. Mier-Torrecilla and E. Herrera and M. Doblaré. (2014) "Numerical Calculation of Wind Loads over Solar Collectors", Volume 49. Energy Procedia 0 163 - 173 |
<div id="cite-69"></div> | <div id="cite-69"></div> | ||
− | '''[[#citeF-69|[69]]]''' | + | '''[[#citeF-69|[69]]]''' Andre, Michael and Mier-Torrecilla, Monica and Wüchner, Roland. (2015) "Numerical simulation of wind loads on a parabolic trough solar collector using lattice Boltzmann and finite element methods", Volume 146. Journal of Wind Engineering and Industrial Aerodynamics 185 - 194 |
<div id="cite-70"></div> | <div id="cite-70"></div> | ||
− | '''[[#citeF-70|[70]]]''' | + | '''[[#citeF-70|[70]]]''' Werner, H. and Wengle, H. (1993) "Large-Eddy Simulation of Turbulent Flow Over and Around a Cube in a Plate Channel". Springer Berlin Heidelberg 155-168 |
<div id="cite-71"></div> | <div id="cite-71"></div> | ||
− | '''[[#citeF-71|[71]]]''' | + | '''[[#citeF-71|[71]]]''' Mann, Jakob. (1998) "Wind field simulation", Volume 13. Probabilistic Engineering Mechanics 4 269 - 282 |
<div id="cite-72"></div> | <div id="cite-72"></div> | ||
− | '''[[#citeF-72|[72]]]''' | + | '''[[#citeF-72|[72]]]''' Rossi, Riccardo and Lazzari, Massimiliano and Vitaliani, Renato. (2004) "Wind field simulation for structural engineering purposes", Volume 61. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 5 738–763 |
<div id="cite-73"></div> | <div id="cite-73"></div> | ||
− | '''[[#citeF-73|[73]]]''' | + | '''[[#citeF-73|[73]]]''' Kaimal, J. C. and Wyngaard, J. C. and Izumi, Y. and Coté, O. R. (1972) "Spectral characteristics of surface-layer turbulence", Volume 98. John Wiley & Sons, Ltd. Quarterly Journal of the Royal Meteorological Society 417 563–589 |
<div id="cite-74"></div> | <div id="cite-74"></div> | ||
− | '''[[#citeF-74|[74]]]''' | + | '''[[#citeF-74|[74]]]''' Strohmaier, Erich and Dongarra, Jack and Simon, Horst and Meuer, Martin "TOP500 list" |
<div id="cite-75"></div> | <div id="cite-75"></div> | ||
− | '''[[#citeF-75|[75]]]''' | + | '''[[#citeF-75|[75]]]''' Dadvand, Pooyan. (2007) "A framework for developing finite element codes for multi-disciplinary applications.". PhD thesis: Universitat Politécnica de Cataluña |
<div id="cite-76"></div> | <div id="cite-76"></div> | ||
− | '''[[#citeF-76|[76]]]''' | + | '''[[#citeF-76|[76]]]''' Message Passing Interface Forum. (2008) "MPI: A Message Passing Interface Standard. Version 2.1" |
<div id="cite-77"></div> | <div id="cite-77"></div> | ||
− | '''[[#citeF-77|[77]]]''' | + | '''[[#citeF-77|[77]]]''' CIMNE "GiD, the personal pre and post processor" |
<div id="cite-78"></div> | <div id="cite-78"></div> | ||
− | '''[[#citeF-78|[78]]]''' | + | '''[[#citeF-78|[78]]]''' Karypis, George and Kumar, Vipin. (1998) "A Fast and High Quality Multilevel Scheme for Partitioning Irregular Graphs", Volume 20. SIAM Journal on Scientific Computing 1 359-392 |
<div id="cite-79"></div> | <div id="cite-79"></div> | ||
− | '''[[#citeF-79|[79]]]''' | + | '''[[#citeF-79|[79]]]''' Misra, J. and Gries, David. (1992) "A constructive proof of Vizing's theorem", Volume 41. Information Processing Letters 3 131 - 133 |
<div id="cite-80"></div> | <div id="cite-80"></div> | ||
− | '''[[#citeF-80|[80]]]''' | + | '''[[#citeF-80|[80]]]''' Heroux, Michael A. and Bartlett, Roscoe A. and Howle, Vicki E. and Hoekstra, Robert J. and Hu, Jonathan J. and Kolda, Tamara G. and Lehoucq, Richard B. and Long, Kevin R. and Pawlowski, Roger P. and Phipps, Eric T. and Salinger, Andrew G. and Thornquist, Heidi K. and Tuminaro, Ray S. and Willenbring, James M. and Williams, Alan and Stanley, Kendall S. (2005) "An overview of the Trilinos project", Volume 31. ACM Press. ACM Transactions on Mathematical Software 3 397–423 |
<div id="cite-81"></div> | <div id="cite-81"></div> | ||
− | '''[[#citeF-81|[81]]]''' | + | '''[[#citeF-81|[81]]]''' Saad, Yousef. (2003) "Iterative methods for sparse linear systems". Siam |
<div id="cite-82"></div> | <div id="cite-82"></div> | ||
− | '''[[#citeF-82|[82]]]''' | + | '''[[#citeF-82|[82]]]''' Trottenberg, Ulrich and Oosterlee, Cornelius W. and Schuller, Anton. (2000) "Multigrid". Academic press |
<div id="cite-83"></div> | <div id="cite-83"></div> | ||
− | '''[[#citeF-83|[83]]]''' | + | '''[[#citeF-83|[83]]]''' Stüben, Krechel A. (2001) "A review of algebraic multigrid", Volume 128. Journal of Computational and Applied Mathematics 1–2 281 - 309 |
<div id="cite-84"></div> | <div id="cite-84"></div> | ||
− | '''[[#citeF-84|[84]]]''' | + | '''[[#citeF-84|[84]]]''' Tuminaro, Ray S. and Heroux, Michael A. and Hutchinson, Scott A. and Shadid, John N. (1999) "Official Aztec Users's Guide Version 2.1". Sandia National Laboratories SAND99-8801J |
<div id="cite-85"></div> | <div id="cite-85"></div> | ||
− | '''[[#citeF-85|[85]]]''' | + | '''[[#citeF-85|[85]]]''' M.W. Gee and C.M. Siefert and J.J. Hu and R.S. Tuminaro and M.G. Sala. (2006) "ML 5.0 Smoothed Aggregation User's Guide". Sandia National Laboratories SAND2006-2649 |
<div id="cite-86"></div> | <div id="cite-86"></div> | ||
− | '''[[#citeF-86|[86]]]''' | + | '''[[#citeF-86|[86]]]''' Demidov, Denis "AMGCL: a C++ library for solution of large sparse linear systems with algebraic multigrid method" |
<div id="cite-87"></div> | <div id="cite-87"></div> | ||
− | '''[[#citeF-87|[87]]]''' | + | '''[[#citeF-87|[87]]]''' Demidov, Denis and Rossi, Riccardo "Subdomain deflation and algebraic multigrid: combining multiscale with multilevel" |
<div id="cite-88"></div> | <div id="cite-88"></div> | ||
− | '''[[#citeF-88|[88]]]''' | + | '''[[#citeF-88|[88]]]''' Coll Sans, Abel. (2014) "Robust volume mesh generation for non-watertight geometries" |
<div id="cite-89"></div> | <div id="cite-89"></div> | ||
− | '''[[#citeF-89|[89]]]''' | + | '''[[#citeF-89|[89]]]''' Welford, B. P. (1962) "Note on a Method for Calculating Corrected Sums of Squares and Products", Volume 4. Technometrics 3 419-420 |
<div id="cite-90"></div> | <div id="cite-90"></div> | ||
− | '''[[#citeF-90|[90]]]''' | + | '''[[#citeF-90|[90]]]''' Terriberry, Timothy P. (2008) "Computing higher-order moments online" |
<div id="cite-91"></div> | <div id="cite-91"></div> | ||
− | '''[[#citeF-91|[91]]]''' | + | '''[[#citeF-91|[91]]]''' Pébay, Philippe P. (2008) "Formulas for robust, one-pass parallel computation of covariances and arbitrary-order statistical moments". Sandia National Laboratories SAND2008-6212 |
<div id="cite-92"></div> | <div id="cite-92"></div> | ||
− | '''[[#citeF-92|[92]]]''' | + | '''[[#citeF-92|[92]]]''' Chan, Tony F. and Golub, Gene H. and LeVeque, Randall J. (1979) "Updating formulae and a pairwise algorithm for computing sample variances". Department of Computer Science, Stanford University STAN-CS-79-773 |
<div id="cite-93"></div> | <div id="cite-93"></div> | ||
− | '''[[#citeF-93|[93]]]''' | + | '''[[#citeF-93|[93]]]''' Ainsworth, Mark and Oden, J. Tinsley. (1997) "A posteriori error estimation in finite element analysis", Volume 142. Computer Methods in Applied Mechanics and Engineering 1–2 1 - 88 |
<div id="cite-94"></div> | <div id="cite-94"></div> | ||
− | '''[[#citeF-94|[94]]]''' | + | '''[[#citeF-94|[94]]]''' Ainsworth, Mark and Oden, J. Tinsley. (2000) "A Posteriori Error Estimation in Finite Element Analysis". John Wiley & Sons, Ltd |
<div id="cite-95"></div> | <div id="cite-95"></div> | ||
− | '''[[#citeF-95|[95]]]''' | + | '''[[#citeF-95|[95]]]''' John, Volker. (2000) "A numerical study of a posteriori error estimators for convection-diffusion equations", Volume 190. Computer Methods in Applied Mechanics and Engineering 5-7 757 - 781 |
<div id="cite-96"></div> | <div id="cite-96"></div> | ||
− | '''[[#citeF-96|[96]]]''' | + | '''[[#citeF-96|[96]]]''' Papastavrou, Areti and Verfürth, Rüdiger. (2000) "A posteriori error estimators for stationary convection-diffusion problems: a computational comparison", Volume 189. Computer Methods in Applied Mechanics and Engineering 2 449 - 462 |
<div id="cite-97"></div> | <div id="cite-97"></div> | ||
− | '''[[#citeF-97|[97]]]''' Hauke, Guillermo and | + | '''[[#citeF-97|[97]]]''' Hauke, Guillermo and Doweidar, Mohamed H. and Miana, Mario. (2006) "The multiscale approach to error estimation and adaptivity", Volume 195. Computer Methods in Applied Mechanics and Engineering 13-16 1573–1593 |
<div id="cite-98"></div> | <div id="cite-98"></div> | ||
− | '''[[#citeF-98|[98]]]''' | + | '''[[#citeF-98|[98]]]''' Rossi, Riccardo and Cotela-Dalmau, Jordi and Lafontaine, Nelson M. and Dadvand, Pooyan and Idelsohn, Sergio R. (2013) "Parallel adaptive mesh refinement for incompressible flow problems", Volume 80. Computers & Fluids 324–355 |
<div id="cite-99"></div> | <div id="cite-99"></div> | ||
− | '''[[#citeF-99|[99]]]''' | + | '''[[#citeF-99|[99]]]''' Hauke, Guillermo and Fuster, Daniel and Lizarraga, Fernando. (2015) "Variational multiscale a posteriori error estimation for systems: The Euler and Navier-Stokes equations", Volume 283. Computer Methods in Applied Mechanics and Engineering 1493 - 1524 |
<div id="cite-100"></div> | <div id="cite-100"></div> | ||
− | '''[[#citeF-100|[100]]]''' | + | '''[[#citeF-100|[100]]]''' Peraire, J. and Vahdati, M. and Morgan, K. and Zienkiewicz, O. C. (1987) "Adaptive remeshing for compressible flow computations", Volume 72. Journal of Computational Physics 2 449 - 466 |
<div id="cite-101"></div> | <div id="cite-101"></div> | ||
− | '''[[#citeF-101|[101]]]''' | + | '''[[#citeF-101|[101]]]''' Löhner, Rainald. (1989) "Adaptive remeshing for transient problems", Volume 75. Computer Methods in Applied Mechanics and Engineering 1–3 195 - 214 |
<div id="cite-102"></div> | <div id="cite-102"></div> | ||
− | '''[[#citeF-102|[102]]]''' | + | '''[[#citeF-102|[102]]]''' Selmin, V. and Formaggia, L. (1992) "Simulation of hypersonic flows on unstructured grids", Volume 34. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 2 569–606 |
<div id="cite-103"></div> | <div id="cite-103"></div> | ||
− | '''[[#citeF-103|[103]]]''' | + | '''[[#citeF-103|[103]]]''' Zienkiewicz, O. C. and Wu, J. (1994) "Automatic directional refinement in adaptive analysis of compressible flows", Volume 37. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 13 2189–2210 |
<div id="cite-104"></div> | <div id="cite-104"></div> | ||
− | '''[[#citeF-104|[104]]]''' | + | '''[[#citeF-104|[104]]]''' Chiandussi, G. and Bugeda, G. and Oñate, E. (2000) "A simple method for automatic update of finite element meshes", Volume 16. John Wiley & Sons, Ltd. Communications in Numerical Methods in Engineering 1 1–19 |
<div id="cite-105"></div> | <div id="cite-105"></div> | ||
− | '''[[#citeF-105|[105]]]''' | + | '''[[#citeF-105|[105]]]''' Sieger, Daniel and Menzel, Stefan and Botsch, Mario. (2014) "RBF morphing techniques for simulation-based design optimization", Volume 30. Springer London. Engineering with Computers 2 161-174 |
<div id="cite-106"></div> | <div id="cite-106"></div> | ||
− | '''[[#citeF-106|[106]]]''' | + | '''[[#citeF-106|[106]]]''' Hachem, Elie and Feghali, Stephanie and Codina, Ramon and Coupez, Thierry. (2013) "Anisotropic adaptive meshing and monolithic Variational Multiscale method for fluid-structure interaction", Volume 122. Computers & Structures 88 – 100 |
<div id="cite-107"></div> | <div id="cite-107"></div> | ||
− | '''[[#citeF-107|[107]]]''' Roquet, Nicolas | + | '''[[#citeF-107|[107]]]''' Saramito, Pierre and Roquet, Nicolas. (2001) "An adaptive finite element method for viscoplastic fluid flows in pipes", Volume 190. Computer Methods in Applied Mechanics and Engineering 40–41 5391 - 5412 |
<div id="cite-108"></div> | <div id="cite-108"></div> | ||
− | '''[[#citeF-108|[108]]]''' | + | '''[[#citeF-108|[108]]]''' Roquet, Nicolas and Saramito, Pierre. (2003) "An adaptive finite element method for Bingham fluid flows around a cylinder", Volume 192. Computer Methods in Applied Mechanics and Engineering 31-32 3317 - 3341 |
<div id="cite-109"></div> | <div id="cite-109"></div> | ||
− | '''[[#citeF-109|[109]]]''' | + | '''[[#citeF-109|[109]]]''' Roquet, Nicolas and Saramito, Pierre. (2008) "An adaptive finite element method for viscoplastic flows in a square pipe with stick-slip at the wall", Volume 155. Journal of Non-Newtonian Fluid Mechanics 3 101 - 115 |
<div id="cite-110"></div> | <div id="cite-110"></div> | ||
− | '''[[#citeF-110|[110]]]''' | + | '''[[#citeF-110|[110]]]''' Bernabeu, Noé and Saramito, Pierre and Smutek, Claude. (2014) "Numerical modeling of non-Newtonian viscoplastic flows: Part II. Viscoplastic fluids and general tridimensional topographies". International Journal of Numerical Analysis and Modeling |
<div id="cite-111"></div> | <div id="cite-111"></div> | ||
− | '''[[#citeF-111|[111]]]''' | + | '''[[#citeF-111|[111]]]''' Frey, Pascal Jean and George, Paul Luis. (2008) "Mesh Generation: Application to finite elements". John Wiley & Sons, Ltd, 2nd Edition |
<div id="cite-112"></div> | <div id="cite-112"></div> | ||
− | '''[[#citeF-112|[112]]]''' | + | '''[[#citeF-112|[112]]]''' D'Amato, Juan Pablo and Vénere, Marcelo. (2013) "A CPU–GPU framework for optimizing the quality of large meshes", Volume 73. Journal of Parallel and Distributed Computing 8 1127 - 1134 |
<div id="cite-113"></div> | <div id="cite-113"></div> | ||
− | '''[[#citeF-113|[113]]]''' | + | '''[[#citeF-113|[113]]]''' Richards, P. J. and Hoxey, R. P. and Short, L. J. (2001) "Wind pressures on a 6m cube", Volume 89. Journal of Wind Engineering and Industrial Aerodynamics 14–15 1553–1564 |
<div id="cite-114"></div> | <div id="cite-114"></div> | ||
− | '''[[#citeF-114|[114]]]''' | + | '''[[#citeF-114|[114]]]''' Steber, Gerhard. (2012) "Evaluation of the finite element method for turbulent flows with the open source software Kratos" |
<div id="cite-115"></div> | <div id="cite-115"></div> | ||
− | '''[[#citeF-115|[115]]]''' | + | '''[[#citeF-115|[115]]]''' Bingham, Eugene C. (1922) "Fluidity and Plasticity". McGraw-Hill |
<div id="cite-116"></div> | <div id="cite-116"></div> | ||
− | '''[[#citeF-116|[116]]]''' | + | '''[[#citeF-116|[116]]]''' Oldroyd, J. G. (1947) "A rational formulation of the equations of plastic flow for a Bingham solid", Volume 43. Mathematical Proceedings of the Cambridge Philosophical Society 100–105 |
<div id="cite-117"></div> | <div id="cite-117"></div> | ||
− | '''[[#citeF-117|[117]]]''' | + | '''[[#citeF-117|[117]]]''' Papanastasiou, Tasos C. (1987) "Flows of Materials with Yield", Volume 31. Journal of Rheology (1978-present) 5 385-404 |
<div id="cite-118"></div> | <div id="cite-118"></div> | ||
− | '''[[#citeF-118|[118]]]''' | + | '''[[#citeF-118|[118]]]''' Tanner, R. I. and Milthorpe, J. F. (1983) "Numerical simulation of the flow of fluids with yield stress". Pineridge Press 680-690 |
<div id="cite-119"></div> | <div id="cite-119"></div> | ||
− | '''[[#citeF-119|[119]]]''' | + | '''[[#citeF-119|[119]]]''' Souza Mendes, Paulo R. and Dutra, Eduardo S. S. (2004) "Viscosity Function for Yield-Stress Liquids", Volume 14. Applied Rheology 6 296-302 |
<div id="cite-120"></div> | <div id="cite-120"></div> | ||
− | '''[[#citeF-120|[120]]]''' | + | '''[[#citeF-120|[120]]]''' Mitsoulis, Evan. (2007) "Flows of viscoplastic materials: models and computations". British Society of Rheology |
<div id="cite-121"></div> | <div id="cite-121"></div> | ||
− | '''[[#citeF-121|[121]]]''' | + | '''[[#citeF-121|[121]]]''' Peric, D. and Slijepcevic, S. (2001) "Computational modelling of viscoplastic fluids based on a stabilised finite element method", Volume 18. Engineering Computations 3/4 577-591 |
<div id="cite-122"></div> | <div id="cite-122"></div> | ||
− | '''[[#citeF-122|[122]]]''' | + | '''[[#citeF-122|[122]]]''' A. Larese. (2012) "A coupled Eulerian-PFEM model for the simulation of overtopping in rockfill dams". Phd thesis: Universitat Politecnica de Catalunya. UPC BarcelonaTech |
<div id="cite-123"></div> | <div id="cite-123"></div> | ||
− | '''[[#citeF-123|[123]]]''' | + | '''[[#citeF-123|[123]]]''' Moreno, Elvira and Cervera, Miguel. (2015) "Elementos finitos mixtos estabilizados para flujos confinados de Bingham y de Herschel-Bulkley Parte II: soluciones numéricas". Revista Internacional de Métodos Numéricos para Cálculo y Diseño en Ingeniería |
<div id="cite-124"></div> | <div id="cite-124"></div> | ||
− | '''[[#citeF-124|[124]]]''' | + | '''[[#citeF-124|[124]]]''' Lubliner, J. (1990) "Plasticity Theory". Macmillan Publishing Company |
<div id="cite-125"></div> | <div id="cite-125"></div> | ||
− | '''[[#citeF-125|[125]]]''' | + | '''[[#citeF-125|[125]]]''' Mitsoulis, Evan and Zisis, Th. (2001) "Flow of Bingham plastics in a lid-driven square cavity", Volume 101. Journal of Non-Newtonian Fluid Mechanics 1–3 173 - 180 |
<div id="cite-126"></div> | <div id="cite-126"></div> | ||
− | '''[[#citeF-126|[126]]]''' | + | '''[[#citeF-126|[126]]]''' Elias, R.N. and Martins, M.A.D. and Coutinho, A.L.G.A. (2006) "Parallel edge-based solution of viscoplastic flows with the SUPG/PSPG formulation", Volume 38. Springer-Verlag. Computational Mechanics 4-5 365-381 |
<div id="cite-127"></div> | <div id="cite-127"></div> | ||
− | '''[[#citeF-127|[127]]]''' | + | '''[[#citeF-127|[127]]]''' Burgos, Gilmer R. and Alexandrou, Andreas N. (1999) "Flow development of Herschel-Bulkley fluids in a sudden three-dimensional square expansion", Volume 43. Journal of Rheology 3 485-498 |
<div id="cite-128"></div> | <div id="cite-128"></div> | ||
− | '''[[#citeF-128|[128]]]''' | + | '''[[#citeF-128|[128]]]''' Alexandrou, Andreas N. and McGilvreay, Timothy M. and Burgos, Gilmer. (2001) "Steady Herschel-Bulkley fluid flow in three-dimensional expansions", Volume 100. Journal of Non-Newtonian Fluid Mechanics 1-3 77 - 96 |
<div id="cite-129"></div> | <div id="cite-129"></div> | ||
− | '''[[#citeF-129|[129]]]''' | + | '''[[#citeF-129|[129]]]''' Sheen, H. J. and Chen, W. J. and Wu, J. S. (1997) "Flow patterns for an annular flow over an axisymmetric sudden expansion", Volume 350. Journal of Fluid Mechanics 177–188 |
<div id="cite-130"></div> | <div id="cite-130"></div> | ||
− | '''[[#citeF-130|[130]]]''' | + | '''[[#citeF-130|[130]]]''' Alleborn,N. and Nandakumar, K. and Raszillier, H. and Durst, F. (1997) "Further contributions on the two-dimensional flow in a sudden expansion", Volume 330. Journal of Fluid Mechanics 169–188 |
<div id="cite-131"></div> | <div id="cite-131"></div> | ||
− | '''[[#citeF-131|[131]]]''' Lu, Hao and Porté-Agel, Fernando. | + | '''[[#citeF-131|[131]]]''' Mitsoulis, Evan and Huilgol, R. R. (2004) "Entry flows of Bingham plastics in expansions", Volume 122. Journal of Non-Newtonian Fluid Mechanics 1–3 45 - 54 |
+ | |||
+ | <div id="cite-132"></div> | ||
+ | '''[[#citeF-132|[132]]]''' Clark,Robert A. and Ferziger,Joel H. and Reynolds,W. C. (1979) "Evaluation of subgrid-scale models using an accurately simulated turbulent flow", Volume 91. Journal of Fluid Mechanics 1–16 | ||
+ | |||
+ | <div id="cite-133"></div> | ||
+ | '''[[#citeF-133|[133]]]''' Lu, Hao and Porté-Agel, Fernando. (2010) "A modulated gradient model for large-eddy simulation: Application to a neutral atmospheric boundary layer", Volume 22. Physics of Fluids 1 |
This work explores the use of stabilized finite element formulations for the incompressible Navier-Stokes equations to simulate turbulent flow problems. Turbulence is a challenging problem due to its complex and dynamic nature and its simulation if further complicated by the fact that it involves fluid motions at vastly different length and time scales, requiring fine meshes and long simulation times. A solution to this issue is turbulence modeling, in which only the large scale part of the solution is retained and the effect of smaller turbulent motions is represented by a model, which is generally dissipative in nature.
In the context of finite element simulations for fluids, a second problem is the apparition of numerical instabilities. These can be avoided by the use of stabilized formulations, in which the problem is modified to ensure that it has a stable solution. Since stabilization methods typically introduce numerical dissipation, the relation between numerical and physical dissipation plays a crucial role in the accuracy of turbulent flow simulations. We investigate this issue by studying the behavior of stabilized finite element formulations based on the Variational Multiscale framework and on Finite Calculus, analyzing the results they provide for well-known turbulent problems, with the final goal of obtaining a method that both ensures numerical stability and introduces physically correct turbulent dissipation.
Given that, even with the use of turbulence models, turbulent flow problems require significant computational resources, we also focused on programming and parallel implementation aspects of finite element codes, and in particular in ensuring that our solver can perform efficiently on distributed memory architectures and high-performance computing clusters.
Finally, we have developed an adaptive mesh refinement technique to improve the quality of unstructured tetrahedral meshes, again with the goal of enabling the simulation of large turbulent flow problems. This technique combines an error estimator based on Variational Multiscale principles with a simple refinement procedure designed to work in a distributed memory context and we have applied it to the simulation of both turbulent and non-Newtonian flow problems.
Turbulent flows are a subject of paramount interest in engineering, physics and earth sciences, since they govern many phenomena involving moving fluids like volumes of air or water. Turbulent phenomena appear in flows of all sizes, from large scale processes such as the atmospheric flow of air or oceanic currents to local problems such as wind loads over lightweight structures or the efficiency of a wind turbine. However, the complex nature of turbulent flows means that they can rarely be solved analytically and, as a result, we have to rely on experimental studies or numerical simulations for their analysis.
Experimental studies, which typically involve either campaigns of field measurements or wind tunnel tests, tend to be expensive and complex endeavors (see for example [1]) and, although they are an essential tool in providing a deeper understanding of the problem, tend to provide localized measurements such as point recordings or line averages, which are limited to the regions where sensors are placed, or indirect measurements, such as trajectories of tracers. From this point of view, numerical modeling represents a less costly alternative to experiments with the added advantage of providing a global image of the velocity and pressure fields for the entire volume of interest. Unfortunately, numerical study of turbulent problems is not without difficulty. The fundamental problem in turbulent flow simulations is the wide range of time and spatial scales involved [2], which have to be taken into account in the analysis.
Taking as an example the flow around an obstacle, the largest fluid motions, or eddies, in the flow can be assumed to have a characteristic size comparable to the size of the obstacle itself. Under a turbulent flow regime, coherent flow structures tend to break and the energy associated to these motions is transferred to successively smaller eddies until, for very localized fluctuations, viscous effects dominate and the energy is dissipated. This process can be formalized in terms of the energy associated to motions of a characteristic wavelength in what is known as the Kolmogorov energy cascade [3,4,2] and the size at which viscous dissipation dominates is defined as the Kolmogorov length .
Turbulent flows can be characterized by the Reynolds number , a dimensionless parameter indicative of the balance between inertial and viscous forces in the problem,
|
(1.1) |
where is the fluid's density and its dynamic viscosity and is a characteristic velocity of the flow. The Kolmogorov length scale can be related to the largest motions of the flow by means of the Reynolds number [2] as
|
(1.2) |
To properly represent the full range of turbulent motions in a numerical simulation, the size of the problem domain would be a multiple of the size of the obstacle on each dimension, while the grid size would have to be small enough to capture motions on the Kolmogorov scale. For a problem, this implies that the total number of elements would be on the order of . Keeping in mind that the Reynolds number in engineering applications is typically on the order of , the number of elements involved in a typical simulation would put it beyond the reach of most computers and scientific computation clusters. As a result, this approach, which is known as Direct Numerical Simulation (DNS) is only applicable to problems with a moderate Reynolds number and is not commonly used in engineering.
The only viable option in most cases is to introduce a turbulence model to reduce the computational requirements of the simulation. This typically involves neglecting the smallest motions and modifying the problem to include terms that model the effect of the neglected motions on the problem. The addition of such model increases the minimum element size required to simulate the problem, extending the range of problems that can be simulated with given computational resources. Turbulence models can be grouped into two broad families, Reynolds Averaged Navier-Stokes (RANS) and Large Eddy Simulation (LES).
RANS models are based on rewriting the problem in terms of time-averaged variables (or time- and space-averaged, if there are spatial directions of homogeneity) and introducing a model for the effect of turbulent motions on the averaged solution. This model has a dissipative effect, removing energy from the average motions, and most commonly takes the form of an added viscosity, called turbulent or eddy viscosity. The temporal and spatial distribution of the eddy viscosity is given by the specific model and is usually determined by the solution of one or more additional equations that describe the production and transport of turbulent quantities. Typical examples of RANS models are the Spalart-Allmaras model [5], which involves one additional equation, or the – [6,7] and – models [8], which introduce two additional variables.
LES models are based on introducing a spatial filter to smooth out high wave number fluctuations in the solution and writing the problem equations in terms of filtered quantities. This allows the separation of larger flow features, influenced by the geometry of the fluid domain and the boundary conditions, from the smaller motions, which are assumed to have an universal behavior and thus can be replaced by local dissipation model, which is problem-independent. The most well known member of this family of models is the Smagorinsky method [9], but many variants and alternatives exist [2].
Note that, while the use of turbulence models makes the simulation of turbulent flows possible in terms of mesh resolution and computational resources, many flows of practical interest still require fine meshes and long simulation times in order to obtain statistically steady solutions and reliable statistical measurements. As a result, the simulation of complex flows at high Reynolds number still requires significant computational resources, frequently beyond what a single computer can provide, and has to be solved using High Performance Computing (HPC) clusters.
A second problem frequently encountered in the finite element simulation of incompressible flows is the apparition of numerical instabilities, which are a consequence of the incompressibility constraint and the effect of the convective term in the equations for convection-dominated flows (see for example [10] for an introduction to this topic). In the context of finite elements, one possible solution for this issue is the use of stabilization techniques, where the original Galerkin weak form of the problem is modified to obtain a stable formulation. The modified equations are characterized by the addition of new terms that are typically dissipative in nature, in a way that ensures consistency, that is, that the modified problem tends to the original equations as the simulation mesh is refined.
For turbulent flows in particular, the interaction between turbulence models and stabilization terms is an active area of research. While they have clearly different origins and motivations (turbulence models are typically motivated using physical arguments, while stabilization methods are purely numerical in nature), both types of methods have a dissipative effect on the solution, which has raised some questions regarding their interaction or the possibility of using a unified formulation to provide both stability and turbulence modeling. This subject has been studied for example for Streamline-Upwind Petrov-Galerkin (SUPG) stabilization [11,12], Finite Calculus (FIC) based formulations [13,14] and stabilization techniques within the Variational Multiscale (VMS) framework.
In the case of VMS formulations, the stabilized problem is motivated by a separation of scales, differentiating a large scale part of the solution, that can be represented by the finite element mesh, from a small scale part, which remains unresolved, by means of a projection of the solution onto the finite element mesh [15,16]. This concept has intriguing parallels with the spatial filtering introduced in LES methods and can be understood as a mesh-induced filtering. This has motivated multiple investigations studying the use VMS formulations in turbulence modeling [17,18,19,20,21,22,23,24,25,26,27], analyzing their relationship both from the theoretical point of view and through its application to the simulation of turbulent flows of interest.
The main topic of this monograph is the study of the applicability of stabilized finite element techniques to the solution of turbulent flow problems of practical interest in engineering, with a special focus in analyzing the behavior of different formulations as a LES-like turbulence model. The research is organized around two main lines: The first of them is centered on stabilized finite element formulations and their relationship with turbulence modeling, while the second focuses on computational techniques to facilitate the calculation of complex flows in large simulation domains.
Regarding the relationship between stabilized formulations and turbulence modeling, we choose to focus on two types of methods. The first of them is the VMS framework, where we intend to analyze the behavior of two well-known formulations, algebraic subgrid scales and orthogonal subgrid scales, as well as dynamic subscales, while the second is a new formulation derived from the application of the FIC balance to the incompressible Navier-Stokes equations. We have implemented a fluid solver based on the different techniques and used it to analyze their performance.
The first topic that will be discussed in terms of the computational aspects of the present work is the use of parallel programming techniques for the simulation of finite element problems in a distributed memory context. In this sense, all developments have been made with a parallel implementation in mind, choosing algorithms and implementations that are suited to a parallel implementation in preference to alternatives that are not, and the parallel capabilities of the implemented code have been evaluated.
A related topic in relation to the calculation of large problems is the use of adaptive mesh refinement techniques to simplify the mesh generation procedure and reduce the overall number of elements required to perform the simulation. We have developed a technique based on a simple refinement technique that can work in a distributed memory environment, which has been implemented to work in combination with the fluid solver. During the course of the present work we also found the opportunity to apply these refinement techniques to non-Newtonian flow problems. The results of our investigation in this area will also be presented.
The methods presented in this document have been implemented within the open source Kratos Multiphysics finite element framework [28,29], which is based on C++ and Python and has parallel calculation capabilities, some of which have been developed or expanded as part of the present work. This implementation has been used to simulate all the examples considered and generate the presented results.
The present document is organized along the main goals outlined above. In Chapter 2 we introduce VMS methods, with a special emphasis on dynamic subscale approximations, and review the arguments that have been used in the literature to relate them to LES formulations. Our tests have driven us to propose a variant of the method characterized by a new model for the pressure subscale. We use both the standard approach and our modified formulation to simulate a turbulent channel flow benchmark problem, which allows us to compare our results to DNS data.
In Chapter 3 we present a new stabilized formulation for incompressible flows based on the FIC balance principles. This formulation is also used to simulate the channel flow problem, as well as other benchmark examples.
Chapter 4 is concerned with different aspects of the parallel implementation of the finite element flow solver that has been used to perform the simulations presented in the previous chapters, including tests of the parallel performance of the solver. In the same chapter we present the approach we used to record spatial averages and variances in a distributed memory context.
Chapter 5 presents an adaptive mesh refinement technique that combines a parallel refinement algorithm based on edge subdivision with an error indicator motivated by the VMS formulation. This technique is then used to solve both turbulent and non-Newtonian flow cases.
Finally, in Chapter 6 we summarize the work and present its main conclusions, as well as proposing future lines of research.
Variational multiscale (VMS) methods [15,16] provide a theoretical framework for the design of stabilized finite element formulations based on the separation of the solution into resolved and unresolved parts, which is achieved through the definition of large scale and small scale solution spaces. The projection of the original equations onto the large scale space gives an equivalent problem that depends on the small scale variables, while the projection of the original equations onto the small scale space is used to motivate a model for the effect of the small scale variables, which are not solved, to the large scale solution.
This methodology has interesting parallels with LES turbulence models, which use a spatial filter to introduce a separation between the resolved and unresolved parts of the solution. This fact has motivated research into the relationship between VMS stabilized formulations and LES methods, and in particular on the possible use of VMS methods as turbulence models. In the present chapter we review some current trends in VMS formulations, including the derivation of algebraic and orthogonal models for the small scales, and the arguments that have been used to relate them to turbulence modeling. We also direct our attention to dynamic subscale models [30,20], which have been shown to provide good results in turbulent flow simulations without requiring the use of an explicit turbulence model [25,31,27].
In spite of the success of the method in the mentioned tests, some aspects of the behavior of VMS methods as turbulence models are not completely understood. In particular, the solution of the problem has a degree of dependency on the precise definition of the stabilization parameters (see for example [31]) and on using or neglecting the pressure small scale [27]. We investigate this issue through the analysis of the results of turbulent channel flow simulations. Additionally, we propose a new model for the pressure small scale, which we found to provide more accurate results in our simulations.
The chapter is organized as follows: in the next pages we review the state of the art for the formulations of interest, introducing the Galerkin weak form of the incompressible Navier-Stokes equations Section 2.2 and using it Section 2.3 to obtain the complete stabilized equations for the different variants that will be considered in this work. We continue by presenting the arguments that have been used to justify their use as a turbulence model in Section 2.4. In Section 2.5 we present the finite element solver that we have implemented based on the described VMS formulations. In Section 2.6 we present our proposal for a new model of pressure small scale and in Section 2.7 we use both this and standard VMS methods to simulate a turbulent channel flow test case, analyzing the solution in terms of different measured statistics of the flow and their comparison with reference DNS data. Finally, we present our conclusions in Section 2.8.
The incompressible Navier-Stokes equations state the balance of linear momentum and mass in a fluid domain , given by
|
where is the fluid velocity, its density, represents the stress tensor and the external forces acting on the domain.
The problem described by Eqs. 2.3 and 2.4 must be completed with suitable initial and boundary conditions. We denote the domain boundary as and introduce its partition into Dirichlet () and Neumann () parts, verifying and . The initial and boundary conditions for the problem can be expressed as:
|
where is the initial velocity field, represents the imposed velocity on the Dirichlet boundary, the outer normal vector and the imposed traction acting along the Neumann boundary. Note that the initial velocity must be chosen to be divergence free to ensure that Eq. 2.4 is verified at all times.
For Newtonian fluids, the stress tensor can be related to the fluid velocity and pressure using the constitutive relation
|
(2.8) |
where is the second order identity tensor, the fluid's viscosity and the symmetric gradient of velocity, defined as
|
(2.9) |
To obtain a finite element formulation for the Navier-Stokes equations we need to rewrite them in weak form. We multiply Eq. 2.3 by a velocity test function , defined to be zero on the Dirichlet boundary , and Eq. 2.4 by a pressure test function . Integrating the resulting expressions over the fluid domain we obtain
|
The Neumann boundary condition can be introduced in the formulation by using the product rule on the stress term in Eq. 2.10 and expressing the resulting divergence as a boundary integral, which allows us to write
|
(2.12) |
Substituting Eq. 2.12 into Eq. 2.10 and introducing the definition of the stress tensor in Eq. 2.8 we obtain
|
Eqs. 2.13 and 2.14, together with the initial and Dirichlet boundary conditions, allow us to state the weak form of the problem. In addition, they also impose regularity requirements on the solution, test functions and problem data, as it must be ensured that all the integrals that appear in the equations remain bounded. This is only briefly discussed here, directing the reader to more specific literature on this topic for a rigorous formulation (see for example [32,33]). In general, for any two given functions we want to ensure that
|
We define the norm of a function as
|
and functions with bounded norm are said to be square-integrable. The space of functions that are square-integrable in is denoted as .
Although no proof is given here, it can be shown that, for any given time instant , it is sufficient to require that both the momentum test function , the velocity solution and their first order derivatives belong to . The space of functions verifying this property is a Hilbert space commonly denoted as in functional analysis. For the mass conservation test function and the pressure solution , it is enough to require them to be square-integrable, as their spatial derivatives do not appear in Eqs. 2.13 and 2.14.
Considering that must verify the Dirichlet boundary condition when evaluated in the Dirichlet boundary and is zero in by definition, the solutions (for any fixed instant in time) and test functions must be contained in the spaces of functions given by
|
Likewise, the external forces must be such that the domain integral in the right hand side of Eq. 2.13 is well defined. Given that , this is equivalent to requiring the forces to belong to the dual of that space, denoted as . There is a similar requirement on the traction , as it has to be integrable when multiplied by the test function restricted to the Neumann boundary, but it will not be formally stated here.
Finally, to make sure that the dynamic problem is well-posed it is sufficient to require that and square-integrable along the time interval of the problem. This is denoted as . In the case of the pressure it is enough to enforce that the norm is square-integrable in time, that is, .
Before we introduce the variational form of the problem, there is an important remark to be made about the convective term in the momentum equation Eq. 2.3. As long as the velocity field is strongly (point-wise) divergence-free, the following three expressions are identical:
|
(2.15) |
or, in variational form,
|
The three expressions in Eq. 2.15 are respectively known as non-conservative, conservative and skew-symmetric forms of the convective term. However, in practice, the expressions in Eq. 2.16 are not equivalent for the discrete problem, as the velocity solution is only divergence-free in a weak (integral) sense. In fact, as shown in [34], each of them gives rise to a variational problem with different conservation properties. While the continuous Navier-Stokes equations enforce the balance of linear and angular momentum, as well as kinetic energy, none of the discrete variants ensures conservation of the three quantities at the same time. According to the analysis in the same reference, the variational form resulting from each expression conserves the quantities listed in Table 1.
Convective term | Linear momentum | Angular mom. | Kinetic energy |
Non-conservative | For equal - interpolations | No | No |
Conservative | Yes | Yes | No |
Skew-symmetric | For equal - interpolations | No | Yes |
In the present work we have used the skew-symmetric form, as the kinetic energy balance is an important concern in the present study and something that can be measured to to gain insight on turbulent flow simulations. In fact, we can report that using a formulation based on the skew-symmetric form resulted in a better fit to DNS data in our preliminary tests for the channel flow simulations presented in Section 2.7.
Using the skew-symmetric form for the convective term, the Galerkin weak form of the Navier-Stokes problem can be stated as
Find , such that, ,
|
Unfortunately, this problem is not straightforward to solve using finite elements, as its discrete version is not numerically stable. In fact, to ensure that that problem of finding a pair that satisfies the above weak form for all suitable choices of has a stable solution, the discrete spaces in which the solution is sought must verify the inf-sup or Ladyzhenskaya-Babuska-Brezzi (LBB) condition, given by
|
(2.18) |
where and are spaces containing the velocity and pressure solutions, respectively, and is a positive constant. In practice, satisfaction of the LBB condition implies the use of a higher order interpolation for velocity than for pressure, as is done for example in Taylor-Hood elements [35].
Numerical instabilities in the discrete solution of the Navier-Stokes may also appear in convection-dominated flows, that is, when the convective term is large in relation to the viscous term. In turbulent flows, this issue can be understood from a physical point of view by noting that viscous dissipation occurs predominantly due to high velocity gradients at small scales. If the finite element mesh is coarse, these gradients cannot be reproduced and dissipation is underestimated, which leads to energy accumulation on the larger scales and the eventual loss of convergence of the solution.
Both instabilities can be cured by the use of a stabilized formulation, which involves obtaining a modified weak form not restricted by the inf-sup condition of Eq. 2.18. This has the advantage of allowing the use of equal order interpolations for velocity and pressure. Two classical stabilized formulations for the Navier-Stokes equations are known as Streamline-Upwind Petrov-Galerkin (SUPG) [36] and Galerkin-Least Squares (GLS) [37]. Other alternatives are methods within the VMS framework, which are the main subject of the present chapter, and the Finite Calculus (FIC) approach, presented in Chapter 3.
The Variational Multiscale (VMS) method, introduced in [15,38,16] is a theoretical framework for the development of stabilized finite element methods that has been used extensively during the last two decades in finite element formulations for fluid problems. The basic premise of this method is the separation of the problem variables into large scale and small scale, or subscale, values , which in our case corresponds to
|
The notation chosen to represent the large scales should be understood as a reference to the finite element mesh size . In practice, scale separation is closely related to the spatial discretization used to solve the problem. This is shown graphically in Figure 1, where the solution along a line is represented. The large scales correspond to the part of the solution that can be described using the finite element interpolation, while the small scales represent fine features of the solution that cannot be reproduced due to the limitations of the discrete interpolation.
(a) Continuous domain. | (b) Discrete domain. | (c) Continuous solution. |
(d) Large scale solution. | (e) Small scale solution. | |
Figure 1: Scale separation. |
Once a finite element discretization is defined, the space containing the large scale part of the solution can be identified with that of the admissible finite element functions on the discrete domain. This implies that, instead of working with test functions and solutions defined on infinite-dimensional spaces of functions, we now seek a solution on a restricted, finite-dimensional space of admissible solutions, expressed as
|
This in turn allows us to define spaces containing the small scale part of the solution , . The subscale spaces complete the corresponding large scale space, that is, , . As a result, it is clear that small scale spaces are infinite-dimensional, unlike the large scale ones, and have to be approximated in order to obtain a solution. There is no single way to approximate them and, in fact, the choice of approximate space for the small scales is one of the defining features of the solution method.
We introduce the following compact notation
|
Note that we have modified the convective terms in to introduce a convection velocity . This notation is introduced for convenience, as it will allow us to introduce a linearized version of the operator later. Using the compact notation, the weak form of the problem can be expressed as
|
We introduce the scale separation of the problem variables in Eqs. 2.19 and 2.20. Testing against large scale functions, we can write
|
If the small scale test functions are used instead, the following expression is obtained
|
The large scale problem given by Eqs. 2.21 and 2.22 represents the finite element approximation of the original problem, now containing terms that describe the effect of the unresolved scales on the large scale solution. These additional terms cannot be evaluated in practice, as the small scale variables are not known. VMS methods are based on the definition of a model for the small scale variables, which is motivated by the small scale problem of Eqs. 2.23 and 2.24. This model can then be introduced in the large scale equations, closing the problem.
Before we apply this procedure to our problem, it is convenient to operate on Eqs. 2.21 and 2.22 to eliminate all spatial derivatives of small scale functions, obtaining an expression that depends on and , which will be modeled, but not on their gradients, which will remain unknown. We start by separating the terms involving the large and small scale parts of the solution
|
Integrating by parts within each element in the mesh, differential operators acting on and are moved to the test functions. To do so, we introduce the notation of to refer to the part of the problem domain corresponding to element and to denote its boundary.
|
In the present work, the boundary integrals appearing in Eqs. 2.27 and 2.28 will be neglected. This is common in VMS formulations, and can be understood as assuming that the small scale unknowns vanish on element boundaries.
In the following we express this element-by-element integration using the notation
|
Now the question is to define a model for and that can be used to evaluate the domain integrals in Eqs. 2.27 and 2.28. To do this, we start from the small scale problem, given by Eqs. 2.23 and 2.24, which can be developed to read
|
Again, it is convenient to use integration by parts element-by-element on some of the terms in the momentum equation, obtaining the expression
|
(2.32) |
Note that the elemental boundary integrals in Eq. 2.32 vanish over internal boundaries because they involve either the exact traction or the exact velocity over the boundary, which are both continuous. Similarly, they cancel out with the corresponding traction in the Neumann boundary. As a result, all boundary terms in Eq. 2.32 can be eliminated in the following.
Rearranging terms in Eqs. 2.32 and 2.31 to separate large and small scale unknowns we can write
|
Eqs. 2.35 and 2.36 can be understood as the projection onto the space of small scales of a differential equation, in the same sense as Eqs. 2.10 and 2.11 represent the projection onto of the Navier-Stokes equations. Moreover, observing the right hand side terms of Eq. 2.35, we can see that it represents the projection of the strong-form linear momentum equation applied to the large scale part of the solution ,. The same can be said about the right hand side of Eq. 2.35, which corresponds to the mass conservation equation applied to the large scale velocity.
Denoting the projection onto the small scale spaces , with and , respectively, Eqs. 2.35 and 2.36 equation can be stated as
|
Since Eqs. 2.39 and 2.40 must hold for all admissible small-scale test functions and , they are equivalent to imposing that the small scale variables , verify the following problem in each element :
|
where and represent the residual form of the Navier-Stokes equations applied to the large scale variables
|
and and are chosen to enforce that right hand sides of Eqs. 2.41 and 2.42 belong to the corresponding small scale space.
As mentioned in the previous pages, the small scale spaces are infinite-dimensional and have to be approximated before the problem given by Eqs. 2.41 and 2.42 can be solved. In practice, the definition of an approximate small scale space corresponds to a choice of projectors and . The most straightforward possibility is to use the entire residual (without projecting to a particular space), which corresponds to considering operators , equal to the identity function or, equivalently, and . This formulation gives rise to the algebraic sub-grid scale (ASGS) method [39].
Another well-known choice consists in taking a small scale space that is orthogonal to the large scale space. If and are the projection onto the large scale spaces and respectively, then the projections in Eqs. 2.39 and 2.40 are defined as , . In this case, and are chosen to subtract from the equation the part of the residuals that belongs to the finite element space, that is,
|
This choice leads to the orthogonal sub-scale (OSS) method, presented in [40,30].
Note that, due to their definition, and belong to the space of finite element functions and can be constructed from their values on mesh nodes using standard finite element interpolation functions.
A second important remark is that the calculation of and requires knowledge of the finite element solutions , and, as a result, it is coupled to the solution of the stabilized Navier-Stokes equations. In principle, this would double the number of nodal degrees of freedom of the problem. However, in practice, given that the Navier-Stokes problem is non-linear and has to be solved iteratively anyway, the projection problem can be implemented in an staggered way, updating the projections after each non-linear Navier-Stokes iteration.
The problem for the small scales, given by Eqs. 2.41 and 2.42, is not usually solved. Instead, it is approximated by an expression of the form
|
(2.47) |
where second order tensor and the scalar , known as stabilization parameters, are algorithmic quantities that have to be defined to complete the method.
A motivation for this expression can be found in [30], where the parameters in Eq. 2.47 are designed to ensure that the norm of the modeled subscale variables is the same as that of the exact small scale values. A different justification, based on the approximation of the Green's function of the small scale problem, is provided in [16,21].
While Eq. 2.47 represents the complete small scale model derived from the dynamic Navier-Stokes equations, many VMS formulations that can be found in the literature (see for example [39,41,21]) neglect the time variation of the velocity small scale model and define the small scales as
|
(2.48) |
This choice corresponds to the assumption that the velocity small scales adapt automatically to the large scale residual. Following the nomenclature of [39], we refer to models based on Eq. 2.48 as quasi-static subscales, as opposed to dynamic subscale models, based on Eq. 2.47.
To complete the formulation, a definition for the stabilization parameters is needed. We follow the approach of [39], where the velocity stabilization parameter is taken to be a diagonal matrix and
|
where is a characteristic length of the element and , are constants, which, for linear finite elements, are usually defined as , (this is the case for example in [42] or [34]). However, the studies presented in [31] for a turbulent channel flow in the low Mach number regime suggest that the choice of values for these parameters can have an impact on the solution. Based on the results presented in that reference and in [27], we have adopted , for our tests.
As pointed out in [20], the use of quasi-static subscales leaves open the possibility of instabilities appearing for small time steps once the problem is discretized in time. The same instability is studied in [43] for the Stokes problem, where it is shown that it can be neutralized if the stabilization parameter satisfies the condition
|
(2.51) |
where is the time step and is a constant. To avoid this instability, the stabilization parameter can be replaced by the modified expression
|
(2.52) |
although, as remarked in [20], this introduces a dependency of the solution on the time step, even for problems that result in a stationary solution.
If, instead of the quasi-static model of Eq. 2.48, we use the dynamic model of 2.47, the time evolution of the velocity small scale has to be taken into account. This was achieved in [30,20] by introducing a time discretization for the small scale acceleration, resulting in the time-discrete small scale model
|
(2.53) |
Taking , which corresponds to a backward Euler time scheme, we can write a closed expression for the small scale velocity, given by
|
(2.54) |
As remarked in [20], the effective stabilization parameter in Eq. 2.54 is
|
(2.55) |
which is precisely the expression introduced as in Eq. 2.52 and prevents the apparition of instabilities due to small time steps. However, unlike in quasi-static approximations, when the problem has a stationary solution, the dependency on the time step is eliminated as, in that case, and the quasi-static model of Eq. 2.48 is recovered.
From the point of view of its implementation, the main difference between the quasi-static model of Eq. 2.48 and Eq. 2.54 is that the latter introduces the old value of the velocity small scale in the model. This means that has to be tracked in time. In practice, this implies evaluating and storing historical values for on the integration points of the finite element mesh.
Once the small scale model is defined, it can be introduced in the large scale equations, given by Eqs. 2.27 and 2.28. The most general formulation that can be obtained from the material presented in the previous section is given by
Momentum equation
|
(2.56) |
Mass conservation
|
(2.57) |
The first two rows of Eq. 2.56, in combination with its right hand side, constitute the standard Galerkin discretization of the momentum equation. The terms in the third row model the effect of the velocity small scale fluctuations and the velocity small scale itself, respectively, on the large scale equations, while the first term in the last row of Eq. 2.56 represents the effect of pressure small scales.
Analogously, the left hand side of Eq. 2.57 represents the Galerkin weak form of the incompressibility equation, while its right hand side models the effect of the small scales in mass conservation.
While Eqs. 2.56 and 2.57 represent a general VMS formulation, they can be particularized to recover several well-known stabilized methods:
D-ASGS Dynamic algebraic sub-grid scales [20]. The algebraic approximation to the small scales is characterized by using an identity projector to define the small scale space, which implies that the projection terms and are zero. zero.
Q-ASGS Quasi-static algebraic sub-grid scales [39]. A quasi-static approximation to the small scales can be recovered by neglecting all terms involving either the small scale acceleration or the old small-scale velocities and replacing by the static stabilization parameter . Additionally, as the small scales are algebraic, projection terms and are also zero.
D-OSS Dynamic orthogonal subgrid-scales [30,20]. If the small scale space is assumed to be orthogonal to the large scale space, the integral involving and is zero, as it corresponds to the product of two terms belonging to orthogonal spaces.
Q-OSS Quasi-static orthogonal subgrid-scales [30] can be recovered from the original expression by neglecting all terms involving or and replacing by .
For OSS formulations, the projections and are defined as the projections of the momentum and mass residuals, respectively, onto the finite element mesh. Applying this definition, they can be obtained as the solution of the projection problem
|
The only question that remains to close the formulation is to provide a formal definition for the auxiliary convection velocity , something that we have been deliberately avoiding up to this point. This variable was introduced to linearize the convective term, and in practice we can identify it with the last known value of velocity, which corresponds to a Picard linearization of the momentum equation. However, in a context of scale separation, should we use the large scale velocity or the full velocity ?
Both choices result in viable stabilized formulations. The classical approach is to use only the large scale velocity , as it corresponds to the finite element solution. However, from a theoretical point of view, using the full velocity has interesting implications for turbulence modeling, which will be the main focus of Section 2.4.
The concept of scale separation introduced by VMS formulations has some parallels with Large Eddy Simulation (LES) methods for the simulation of turbulent flows. LES turbulence models are also based on separating large and small motions in the flow, but in the LES approach this is is typically achieved through the introduction a filtering operation [2], defined as
|
(2.61) |
where is a filter function defined on the interval and is known as the filter width.
Applying a filter function to Eqs. 2.3 and 2.4 allows us to write the filtered Navier-Stokes equations, given by
|
where we have used the conservative form of the convective term and is the subgrid stress tensor, defined as
|
(2.64) |
The subgrid stress tensor represents the effect of the small scale motions on the large scale part of the solution and and is an unknown, since the quantity cannot be obtained from the filtered velocity . This means that Eqs. 2.62 and 2.63 do not represent a closed expression. However, if the filter width is chosen small enough that the filtered-out small scale motions can be assumed to lie in the inertial subrange, Kolmogorov's hypotheses [3,4] tell us that they have an isotropic, universal (problem-independent) behavior. LES methods use this approach to motivate a model for and justify its introduction in the filtered equations, closing the formulation.
Introducing the subgrid velocity , the subgrid stress tensor can be rewritten using the Leonard decomposition as
|
(2.65) |
where each of the individual terms is defined as:
|
The different terms in Eqs. 2.66–2.68 represent subgrid stresses due to the interaction between resolved motions (Leonard stresses), to the interaction between large and unresolved motions (cross stresses) and to the effect of completely unresolved motions (Reynolds stresses).
Like filtering in LES methods, scale separation in VMS formulations introduces a clear division between the resolved and unresolved parts of the solution, which in this case is achieved through the projection to the finite element mesh. This projection to the mesh was introduced in writing the large scale equation, given by Eqs. 2.21 and 2.22, which is rewritten using the conservative form of the convective term to be consistent with the LES expression above, obtaining
|
where boundary terms and terms related to the trace of the viscous stresses have been omitted for clarity and the full velocity has been used for both arguments of the convective term.
An analogy can be established between Eqs. 2.62 and 2.63, which represent the filtered Navier-Stokes equations and Eqs. 2.69 and 2.70, which expresses the projection of the Navier-Stokes equations to the finite element mesh. This was analyzed in [17,20], where it is remarked that the convective term in Eq. 2.69 can be expanded as
|
(2.71) |
The last three terms in Eq. 2.71 can be understood as a variational version of the LES subgrid stress tensor . Ignoring the density, they can be rearranged as
|
(2.72) |
where we introduced as a variational analogue of the LES subgrid stress tensor.
Furthermore, can be decomposed into Cross and Reynolds terms as:
|
while an analogue of the Leonard stress, representing the contribution of the resolved velocities to the unresolved stresses, appears in the corresponding small scale equation
|
(2.75) |
Assuming that the grid size is small enough for the unresolved scales to be in the inertial subrange, we can observe that scale separation and projection to the finite element mesh play a similar role to that of filtering in classical LES methods. It is worth mentioning that the concept of mesh-induced filtering has also been explored by the LES community, where it is known as implicit filtering. This is the basis of the Monotone Integrated Large-Eddy Simulation (MILES) approach of Boris et al. [44], where the authors propose not using an explicit model for the subgrid stresses and relying instead on a specially designed numerical method to introduce the correct dissipation for a given mesh resolution.
A different approach to VMS-based LES, which will only be mentioned here, is based on a three–level scale separation (see for example [41,45] or the review of [19]). In such approaches, the small scales are in turn divided into resolved and unresolved small scales. The presence of two levels of small scales can be used to either introduce explicit LES model terms to represent the effect of the unresolved small scales on the problem or to calibrate the amount of dissipation that is introduced using the variational equivalent of the Germano identity [46,47].
Given that the derivation of VMS formulations is based exclusively in numerical and mathematical arguments, the physical behavior of VMS methods, in terms of reproducing the expected dissipation rates when the small scales are on the inertial subrange, has to be verified. This topic has been studied in [17,18] for the formulation that we are calling Q-ASGS and in [25,26] for OSS-based methods.
An energy balance for the original Navier-Stokes problem can be obtained by taking in the Galerkin weak form of the momentum equation, given by Eq. 2.13, which produces
|
(2.76) |
We are interested in obtaining a balance for the kinetic energy, . Using the fact that the full velocity is incompressible and the equality , Eq. 2.76 can be expressed as
|
(2.77) |
Eq. 2.77 expresses the balance of total kinetic energy in the domain, and the individual terms represent energy storage () and convection (), the power exerted by external forces () and boundary tensions () and finally viscous dissipation ().
We can obtain an equivalent expression for the kinetic energy contained in the large scale motions, , by taking in Eq. 2.69, in Eq. 2.70 and adding the two equations, obtaining:
|
(2.78) |
Note that in Eq. 2.78, and for the remainder of this section, we neglected all boundary integrals to simplify the discussion. This is equivalent to considering a problem with homogeneous Dirichlet boundary conditions.
It is convenient to integrate some of the terms in Eq. 2.78 by parts and rearrange the convective term as follows:
|
where we have used the fact that the exact velocity is divergence free.
With this, Eq. 2.78 can be restated as
|
(2.79) |
Analogously to the complete energy balance, Eq. 2.79 can be understood as a balance for the kinetic energy associated to large scale motions. Terms and represent the storage and convection of large scale kinetic energy, while term represents the power exerted by the external forces on large scale motions. Term is the viscous dissipation associated to the large scale motions, which can be assumed to be negligible for high Reynolds numbers. The remaining terms represent the transfer of energy between large scale and residual motions, playing an analogous role to production terms in the filtered Navier-Stokes equations.
Finally, we define the residual kinetic energy as . A balance statement for can be obtained by subtracting Eq. 2.79 from Eq. 2.77, which results in
|
(2.80) |
In Eq. 2.80, terms and represent the storage and convection of residual kinetic energy, while term represents the power exerted by the external forces on small scale (high wavenumber) motions. The next two terms represent the difference between the total viscous dissipation () and the large scale viscous dissipation (), which was already accounted for in the large scale energy balance of Eq. 2.79. Again, we remark that, in practice, term is expected to be negligible in comparison to term , since viscous dissipation occurs predominantly for motions in the range of the Kolmogorov length scale, while will contain only motions on a much larger scale , lying on the inertial subrange. Finally, terms and represent the production of residual energy due to the pressure and velocity small scales, respectively, and are exactly the same (but now with opposite sign) as the production terms in Eq. 2.79.
Terms and can be modified by noting that, since and ,
|
The last step to obtain the residual kinetic energy balance is to introduce the small scale models for velocity and pressure in Eqs. 2.81 and 2.82. Noting that represents the large scale viscous dissipation and will be negligible for high Reynolds numbers, we can write
|
(2.83) |
It is clear that terms and , since the stabilization parameters and were defined as strictly positive. They play the role of energy sinks in the large scale energy balance of Eq. 2.79, while acting as sources on the residual energy equation Eq. 2.80. Term is problem dependent but, if an OSS small scale model is used, it will vanish unless the external forces have a high-frequency (small scale) component. Finally, term only exists for dynamic small scale models. This fact was used in [25] to justify that OSS formulations can account for backscatter (energy transfer from the small scales to the large ones) if a dynamic small scale model is used.
Starting from a similar reasoning, Guasch and Codina [26] use statistical and scaling arguments to show that OSS formulations extract energy from the large scale equations at the correct rate, provided that some constraints on the behavior of stabilization parameters are respected.
As a final remark on this topic, we compare the large scale energy balance to the filtered energy balance used in filter-based LES formulations. If the kinetic energy associated to the filtered velocity field is defined as , the balance for can be obtained by multiplying the filtered linear momentum equation Eq. 2.62 by and integrating over the fluid domain (see [2]), resulting in
|
(2.84) |
where boundary fluxes have been omitted.
We can introduce the definition of the VMS subgrid stress tensor in Eq. 2.78, obtaining
|
(2.85) |
where the conservative form of the convective term has been used. Rearranging some terms, Eq. 2.85 can be rewritten as
|
(2.86) |
where we have used the fact that is a symmetric tensor to write . Terms to have an analogous interpretation to their counterparts in Eq. 2.79, but here we have obtained an additional term, , which explicitly represents the contribution of the residual subgrid stresses in the energy transfer. Comparing Eq. 2.86 to Eq. 2.84, we see that both LES and VMS approaches extract energy from the large scale problem through subgrid stresses, but that the variational approach gives rise to two additional energy transfer mechanisms, represented by terms and , compared to filter-based LES.
To obtain a finite element solver based on the VMS formulation introduced in Section 2.3 we need to discretize the simulation domain, both in space and in time, and linearize the problem to obtain a system of equations that can be inverted using a linear solver. We start by introducing a finite element partition for the problem domain . Given the discrete domain , the large scale interpolation spaces and can be identified with the standard finite element interpolation functions and the large scale part of the solution, and , can be represented using a finite element interpolation as
|
(2.87) |
where represents the number of nodes in the finite element mesh, and are the nodal values of the large scale variables and respectively, represents the standard finite element basis function associated to node and its counterpart for vectorial variables, given by
|
Additionally, we introduce the following notation for the gradient and divergence of the finite element shape functions, which will be used to write the discrete form of the differential operators involved in the problem
|
(2.88) |
We also introduce the following operator to describe convection
|
(2.89) |
and the strain rate matrix, which will be used to write the discrete version of the viscous term
|
(2.90) |
Additionally, we define , and as the vectors of nodal values of large scale velocity , acceleration and pressure , respectively.
We introduce the finite element discretization of Eq. 2.87 in the variational formulation given by Eqs. 2.56 and 2.57 to obtain the matrix form of the problem. We will analyze the resulting expression for each of the variants we are considering in turn.
Note that in the present work we use linear finite elements, which can not be used to write second derivatives of the variables or test functions. As a result, terms involving in Eq. 2.56 or the strong-form viscous term that appears in the residual introduced in Eq. 2.43 will be neglected in the discrete form. It must be remarked that all terms lost in this way are related to viscous stresses, which should be small in turbulent flow problems.
The quasi-static ASGS formulation is in some sense the classical VMS formulation for the Navier-Stokes equations. It is also relatively simple, as it does not involve dynamic terms or projections, so we will present it first.
Starting from Eqs. 2.56 and 2.57, we can neglect all terms involving the projections or . As the small scales are described using Eq. 2.48, terms involving or in these equations can be ignored and the momentum stabilization parameter is , given by Eq. 2.49. After these simplifications, we introduce the finite element interpolation of Eq. 2.87 to describe the problem variables , . Testing against each nodal basis function in turn we obtain a system of equations that can be expressed in matrix form as
|
(2.91) |
|
(2.92) |
Again, we have used a generic convection velocity in all terms that have a non-linear dependence of velocity. Doing so, we leave open the possibility of using either the full velocity or the only large scale part . Note that, for linear finite elements, the latter choice is equivalent to the Galerkin-Least Squares (GLS) method [37].
The different matrices in Eqs. 2.91 and 2.92 represent the discrete version of the operators in Eqs. 2.56 and 2.57 and can be built from the assembly of elemental contributions. In general, matrix is constructed by the finite element assembly of elemental matrices of the form . For a finite element with nodes, can be defined using blocks , where and are local node indices. Using this notation, the standard Galerkin terms in the variational form of the problem give rise to the following elemental matrices
|
When defining the viscous matrix in Eq. 2.96 we introduced the constitutive matrix , which is given by
|
(2.101) |
In the same way, the stabilization terms in the Q-ASGS give rise to additional elemental matrices, expressed here as
|
The next variant to be presented is the quasi-static OSS formulation. Compared to the Q-ASGS formulation, OSS is characterized by the inclusion of the projections and , which make the small scale variables orthogonal to the large scale unknowns and should reduce the overall amount of numerical diffusion introduced in the problem. As in the previous case, we leave open the possibility of using either or for convection and the corresponding stabilization terms. The matrix form of the Q-OSS formulation can be expressed as
|
(2.111) |
|
(2.112) |
where the following three new terms terms, involving the projections, have been introduced:
|
The calculation of the projections involves the solution of an additional problem, given by Eqs. 2.59 and 2.60, which can be expressed in discrete form as
|
where and represent the vectors of nodal values of and respectively and the remaining matrices and vectors are given by
|
Eqs. 2.116 and 2.117 represent an additional problem, coupled to Eqs 2.111 and 2.112, which effectively doubles the number of nodal unknowns in the problem. However, since the system matrices for the projection problem, defined by Eqs. 2.118 and 2.119, are effectively mass matrices, they can be replaced by the corresponding diagonal mass matrix, which allows us to obtain an approximate projection while avoiding the solution of an additional system.
Note that the matrices and that appear in Eqs. 2.111 and 2.112 are not strictly necessary in OSS based formulations, since they involve the acceleration term that appears in the residual . As noted in [39], the acceleration of the large scale lies in the large scale space and therefore its projection should be itself. As a result, we could neglect both these terms if we also not take into account when evaluating the residual that appears in the projection right hand side vector . However, as the projection is only calculated approximately using a diagonal mass matrix, we have found it convenient to take these terms into account to improve stability.
When we use a dynamic approximation for the subscales we have keep track and update the small scale values at each integration point of the mesh. The dynamic small scale velocities are defined by the local problem given by Eq. 2.47, which was discretized in time using a Backward Euler time scheme to produce Eq. 2.53. Eq. 2.53 provides an expression for in terms of the residual and the old subscale value . The same Backward Euler scheme can also be used to obtain the following time-discrete expression for the small scale acceleration that appears in the variational form of the problem:
|
(2.122) |
Introducing Eq. 2.122 in Eqs. 2.56, we obtain a modified momentum equation with time-discrete small scales, given by
|
(2.123) |
where the first term in the third row and the last term on the right hand side appear from the time discretization of the small scale acceleration. Note that all terms without an index are evaluated at the current time step. Although they play no role in ASGS stabilization, we have included the projections and both in Eq. 2.122 and in Eq. 2.123, since the same expressions will be used as a starting point for the dynamic OSS method.
The matrix form of the D-ASGS formulation can be written as
|
(2.124) |
|
(2.125) |
where we have introduced three new terms on the right hand side involving the old subscale velocity, defined as
|
The terms that arise from the residual in the expression for the small scale acceleration, Eq. 2.122, have been grouped with the corresponding terms in the small scale velocity model, resulting in the following modified stabilization matrices:
|
Note that, unlike in the quasi-static variants, we will only consider using the full velocity to calculate convection for dynamic subscale models.
Finally, we consider the discrete form of the dynamic OSS formulation. Here, contrary to what happened for the D-ASGS formulation, the integral involving and can be eliminated a priori, since it corresponds to the inner product of two terms that belong to orthogonal subspaces. This results in the following matrix formulation:
|
(2.133) |
|
(2.134) |
where all involved elemental matrices have already been defined in the previous sections.
Note that, as presented for the Q-OSS method, the projections can be solved using a diagonal mass matrix to avoid the solution of an additional system. In this case, there is also the possibility of re-introducing in Eq. 2.133 and 2.134 all terms neglected using an orthogonality argument. To do so, we can replace , , and by their D-ASGS variants, given by Eqs. 2.129–2.132, and subtracting , given by Eq. 2.127, from the right hand side of Eq. 2.133.
Regardless of the VMS variant used, once the problem has been discretized in space we obtain an equivalent matrix problem written in terms of the vectors of nodal velocities , pressures and accelerations that can be expressed in general form as
|
(2.135) |
We need to introduce a time discretization to write the accelerations in terms the velocities. For this we use the Bossak time integration method (see [48]), which can be described as a member of the generalized- Newmark family of methods with second order accuracy in time. The basic expression of the Newmark method, which is commonly used in solid mechanics problem and written in terms of displacements , velocities and accelerations , is
|
where and are constant parameters. In fluid dynamics it is convenient to rewrite Eq. 2.136 and 2.137 in terms of velocities, as these are the main variables of the problem, resulting in
|
Note that for the velocity based formulation, the displacements only appear in the equation for the new displacements, Eq. 2.139. As a result, both the displacements and the equation to obtain them can be omitted from the problem if we are not interested in their values.
The Bossak method is a generalization of the Newmark method based on introducing a relaxation factor on the acceleration of the system
|
(2.140) |
In the Bossak scheme, Eq. 2.138 is used to discretize in time Eq. 2.140, obtaining a system that depends exclusively on velocities, pressures and their spatial gradients. After rearranging some terms, this yields the following time-discrete problem
|
(2.141) |
A common choice for the Bossak parameter is , which provides maximum damping of high-frequency oscillations. The Newmark parameters are then chosen to be
|
The system described in Eq. 2.141 is non-linear due to the fact that the convective operator, the stabilization parameters, multiple stabilization matrices and the projections all depend on the current value of velocity. We define the residual of the problem at time step after non-linear iterations as
|
(2.142) |
The problem now consists in finding , such that . Denoting the increment between two successive iterations with , we use a first order Taylor decomposition to write the zero of Eq. 2.142 as
|
(2.143) |
We use Picard iterations, evaluating all matrices and vectors using the last known values of the variables. With this approximation, the system matrix can be written as
|
(2.144) |
which means that the linear system of equations that is assembled and solved at each iteration is
|
(2.145) |
The problem given by Eq. 2.145 is solved iteratively until the increments of the system variables and or the residual vector are smaller than a predefined tolerance.
The dynamic small scale problem was discretized in time as Eq. 2.54. Using the full velocity, which is divergence-free, as the convective velocity, and neglecting the viscous stress term, since we are restricting ourselves to linear finite elements, we expand the residual that appears in Eq. 2.54 to obtain the following expression for the small scale velocity:
|
(2.146) |
Eq. 2.146 is non-linear, since and both depend on when using . Moreover, it is coupled to the large scale problem through its dependence to and . Similarly, under these assumptions, all terms that depend on or the convection velocity in the large scale problem require a value for to be computed.
To update the value of the small scale velocity we follow the procedure presented in [49,31]. Given known values of the large scale variables, and , we define a target function
|
(2.147) |
where we use to denote computed using in Eq. 2.52. We use Newton-Raphson iterations to find a zero of , resulting in
|
(2.148) |
The tangent matrix in Eq. 2.148 is computed neglecting the dependence of on , resulting in:
|
(2.149) |
With this we can obtain new values for by iteratively solving Eq. 2.148 on each integration point. These can be used to evaluate the values of the convective velocity and in the next iteration of the large scale problem. Similarly, once the large scale problem is converged and we advance to the next time step, Eq. 2.148 is solved once more to obtain the historical values for the small scale.
Note that, for OSS formulations, also depends on the value of , as it represents the projection of . However, this dependence is ignored in the procedure outlined in this section. Taking it into account would imply solving the (global) projection problem, given by Eqs. 2.116 and 2.117, every time a new is obtained.
As a summary of the formulation described in this section, we present the full solution procedure for the method as Algorithm 1, including the calculation of nodal projections and tracking of dynamic small scales. For variants where they are not necessary, the corresponding step in the algorithm can be skipped.
|
Algorithm. 1 VMS incompressible flow solver. |
This procedure was implemented within the Kratos Multiphysics finite element framework and used to compute all numerical test cases presented in this chapter.
As described in the previous pages, the VMS formulation provides a stabilized method for the simulation of the Navier-Stokes equations that can be understood as a turbulence model, as justified in Section 2.4. However, its application in numerical simulations shows that the results have a strong dependency on the choice of the stabilization parameters. This is observed both in our own results and in the literature (see for example [31,27], which use basically the same formulation we have described), where it can be observed that the obtained mean velocity profile in the turbulent channel flow changes depending on the precise definition of and on whether the pressure small scale is considered or taken to be zero. In particular, the results in [27] suggest that the optimal choice is problem-dependent, since some test cases provide a better fit to the reference data when the pressure small scale is kept, while in other cases neglecting it yields better results.
All this suggests that the current design for the stabilization parameters does not capture the correct behavior for at least some turbulent flow problems. To further investigate this issue, we study an alternate design for the pressure subscale. We start by motivating the design for the stabilization parameters we have been using up to this point and follow by presenting an alternative.
Recall that the small scale model is motivated by the small scale problem, given by Eqs. 2.41 and 2.42, repeated here in simplified form as
|
where we have written the convective term in non-conservative form and neglected the trace of . The motivation for the stabilization parameters used up to now, (or ) and , is given in [30], where the response of Eqs. 2.150 and 2.151 to high wave number excitations (which we are most interested in, since the small scales represent highly fluctuating motions) is analysed. In such circumstances, it is observed that
|
The design for given in Eq. 2.49 can be justified by noting that has the same limit behavior as the term in Eq. 2.152 when either the convective or the viscous terms are significantly larger than the other. The justification for is given by introducing Eq. 2.152 in the static version of Eq. 2.150 and taking the divergence. Assuming that and are divergence-free, we obtain
|
(2.154) |
or, equivalently,
|
(2.155) |
The analysis in [30] also shows that the pressure Laplacian in Eq. 2.155 behaves as , resulting in
|
(2.156) |
where the algorithmic constant is adopted by analogy with the viscous term in Eq. 2.152. From this expression, and using Eq. 2.151 the usual formulation for the pressure subscale is recovered
|
(2.157) |
Finally, we introduce the scaling argument of Eq. 2.152 back to Eq. 2.150 and obtain
|
(2.158) |
The small scale model we have been using up to this point, given by Eq. 2.47, is then recovered by neglecting , which effectively uncouples the small scale velocity and pressure models.
As an alternative, we propose a formulation which keeps the pressure gradient in Eq. 2.150 and uses it to introduce the pressure subscale. We start by analyzing how keeping the small scale pressure gradient modifies the large scale problem. Retaining means that Eq. 2.158 can be rewritten as
|
(2.159) |
hence the corresponding time-discrete small scale velocity model is
|
(2.160) |
Introducing Eq. 2.160 as our small scale model in Eqs. 2.56 and 2.57 we can obtain the full problem corresponding to this formulation. The resulting formulation, particularized for the quasi-static subscale case to reduce the number of terms involved, can be expressed as
|
(2.161) |
|
(2.162) |
where the terms including contributions from have been underlined. Note that the same reasoning could be applied to dynamic subscale formulations.
If we could define an approximate space for and discretize Eqs. 2.161 and 2.162, we would be able to write a matrix problem of the type
|
(2.163) |
where matrix and vector represent the matrix problem resulting from either Eqs. 2.91 and 2.92 for the Q-ASGS formulation or Eqs. 2.111 and 2.112 for the Q-OSS formulation, and are the (large scale) vectors of nodal unknowns and results from the contribution of to the underlined terms in Eqs. 2.161 and 2.162. Its precise definition, if was known at the integration points of each element, would be given by
|
We need to provide a model for before we can complete the formulation. To do so, we take a little detour. Consider that the finite element velocity solution , which is not divergence-free, can be decomposed as
|
where is a solenoidal field verifying and is a potential field. We identify the pressure small scale with the potential part of the solution , with the goal of obtaining a velocity field that is more divergence-free in some weak sense.
Taking the divergence of and integrating over the element's domain, we write
|
(2.166) |
Integrating by parts both sides of Eq. 2.166 we obtain
|
(2.167) |
Eq. 2.167 can not be evaluated in practice, since the exact small scale space is infinite-dimensional, but can be estimated using an approximate small scale space. Our proposal is to assume that the the space for the small scale pressure can be approximated by the discontinous version of the large scale space, that is, functions that are linear within each element and discontinuous across element boundaries. The fact that our interpolation functions are discontinuous across element boundaries allows us to write a local problem on each element, given by the discrete form of Eq. 2.167. Denoting with the small scale shape function for node , we can write
|
(2.168) |
where and represent the nodal values of and on the element and the matrices are build from nodal contributions of the type
|
Note that, for the shape functions we are proposing, on a given element, is equivalent to the elemental discrete divergence matrix of the large scale problem, given by Eq. 2.98.
Matrix represents the discrete form of a Laplacian problem and can be explicitly inverted on each element if additional restrictions are imposed on the variable . In our tests, we have imposed that is zero on average over the element, which allows us to write
|
(2.171) |
Going back to the enhanced matrix problem of Eq. 2.163, the small scale shape functions can be used to rewrite the additional terms and in terms of the nodal vector
|
(2.172) |
where we introduced the new finite element matrices
|
Finally, we substitute Eq. 2.171 in Eq. 2.172, eliminating the additional variables from the problem algebraically
|
(2.175) |
To complete the formulation we would need to define a model for (as opposed to its gradient), which also appears in Eq. 2.161. However, since we imposed that is zero on average in each element to ensure that can be inverted and we are using linear shape elements (which means that is constant within each element), it can be verified that, for the proposed formulation,
|
(2.176) |
where is a constant that depends on the shape of the element.
The turbulent channel flow is a classical benchmark for LES formulations, in which a fluid circulates between two parallel walls. In the turbulent regime, the flow is characterized by a transfer of energy from the central regions to the zones close to the wall, achieved through turbulent motions, where it is dissipated through viscous friction. This problem represents a challenge for turbulence models in general and LES methods in particular and is well studied in the literature [50,2]. For moderate Reynolds numbers, it is also within reach of direct numerical simulation (DNS), which means that simulations representing all scales of the flow are available in the literature. In particular, we will use data from the simulations of Moser et al. [51] to validate our results. Note that, while this particular problem could be simulated using DNS, we are not interested in fully resolving all scales of the flow, since we want to study the behavior of the formulation as a LES method.
There is abundant literature validating VMS (and other) formulations on this particular benchmark, which was simulated using dynamic subscales in [27], and in [31] for the low Mach number regime; with and without explicit LES (Smagorinsky) modelling terms in [45], using VMS methods in combination with isogeometric finite element formulations [21,23] and using SUPG stabilization by itself [12] or in combination with the Smagorinsky model [11]. As a result, this example allows us to validate our implementation and test our new approach for the pressure subscale. However, we also note that all previous studies, as far as we know, have used linear hexahedra or higher order interpolations. In contrast with previous studies, we want to use this example to compare the results obtained with tetrahedral and hexahedral elements since, while hexahedra provide a richer interpolation, tetrahedra are in many cases the only practical choice to discretize complex geometries, and we want to quantify the impact of using tetrahedral interpolation on the solution.
The simulation consists in modeling the flow between two parallel flat plates that are separated a distance . The flow is driven by a pressure gradient applied on the streamwise direction, , which is balanced by the friction produced by the wall, . The wall friction is conventionally expressed as , where is defined as the friction velocity. Given that the forces acting on the problem must be in equilibrium, the pressure gradient and the wall friction are related by the following expressions (see [50] for example):
|
The Reynolds number can be given in terms of the friction velocity and the channel width as
|
which is denoted by to distinguish it from the bulk Reynolds number, computed using the average streamwise velocity of the flow (see [2]).
For our tests, the Reynolds number is set to , which can be obtained by setting the problem parameters to
|
The problem domain is restricted to in the stream-wise, wall-normal and cross-stream directions respectively, which corresponds to the domain used in [21]. Zero Dirichlet conditions are applied on the solid walls and periodic boundary conditions are used for the remaining sides.
For a first set of tests, we simulate the problem using regular hexahedral and tetrahedral meshes. The meshes are defined by introducing 32 or 64 divisions on each coordinate direction, which immediately defines a mesh of or hexahedra. Tetrahedral meshes can then be obtained by splitting each hexahedra into six tetrahedra. The mesh nodes are evenly distributed on the streamwise and cross-stream directions while, on the wall normal direction, they are distributed according to the law
|
where is the number of divisions on the direction and . The weight is chosen as for and for so that the first node has a dimensionless distance to the wall .
The flow is simulated using a time step of , starting from the average flow profile plus a random disturbance and let to evolve until a statistically steady regime is obtained. Discarding this initial transient phase, statistics are recorded on the integration points of the mesh using the method described in Chapter 4. Since the problem is statistically homogeneous, statistics can be obtained by ensemble-averaging data on planes corresponding to the same wall distance. This averaging of spatial and time data is known as Reynolds averaging in the context of turbulence modeling. We denote the (Reynolds) average value of a quantity as and the fluctuation as . A snapshot of the obtained instantaneous streamwise velocity and the distribution of the elements close to the wall can be observed in Fig. 2 for a tetrahedral mesh and in Fig. 3 for a hexahedral mesh.
(a) Instantaneous streamwise velocity. | (b) Detail of the mesh. |
Figure 2: Channel flow – Solution and mesh for the tetrahedra simulation. |
(a) Instantaneous streamwise velocity. | (b) Detail of the mesh. |
Figure 3: Channel flow – Solution and mesh for the hexahedra simulation. |
We have measured both average velocities and velocity correlations, all of which can be compared to the DNS data of [51]. Note that the velocity fluctuation correlations can be identified with the turbulence kinetic energy, defined as
|
The first set of results has been obtained using the Q-ASGS formulation and the different meshes. The obtained average is compared to the reference data in Fig. 4, while the velocity variances are presented in Fig. 5. Note that the results are expressed in terms of the dimensionless distance to the wall , which is the common practice for this problem. In this notation, corresponds to the wall, while the channel center line is close to .
(a) |
Figure 4: Channel flow – average stream-wise velocity profile obtained for the Q-ASGS formulation, using different meshes. |
Not surprisingly, there is a noticeable change of behavior depending on the element type, with tetrahedra producing generally poorer results for a given mesh size than hexahedra. In particular, it can be observed that the results obtained using tetrahedra are similar to those obtained hexahedra, which suggests that an order of magnitude more tetrahedra are required in this case to obtain a solution comparable to hexahedra.
We can see that we generally overpredict the average streamwise velocity profile, which suggests that we are not dissipating enough linear momentum and stronger velocity gradients are required to achieve an equilibrium solution. Observing the measured velocity variances in Fig. 5, we can see that there are larger than expected velocity fluctuations on the streamwise direction. The dynamic evolution of the solution presents larger divergences from the average value than expected, which again suggests that we are slightly underestimating the dissipation. This situation is reversed on the wall-normal and cross-flow directions, where the obtained dissipation is generally under the DNS measurements.
The next set of tests is designed to evaluate the effect of the small scale model on the solution. We have chosen the hexahedra mesh and used it to simulate the same case using the different models presented in Section 2.3. Based on the results presented in [27], we have chosen to neglect the pressure small scale for this set of tests, which corresponds to setting , as this was found to result in a better fit to DNS data in that reference. Note that the quasi-static results presented were calculated using only the large scale part of the solution in the convection term, while the full velocity was used for dynamic models.
The average stream-wise velocity profiles for this set of tests are presented Fig. 6, while the measured velocity variances are shown in Fig. 7. The results are in general comparable to those obtained for the same mesh in the previous set of tests and, while the qualitative behavior of the solution is properly captured, the average velocity is slightly overpredicted.
(a) |
Figure 6: Channel flow – average stream-wise velocity profile obtained on the hexahedra mesh using different small scale models. |
From the obtained results, we can see that the choice of small scale model has an impact on the solution. However, we see that, in our case, the result that produces a closer approximation to the DNS stream-wise velocity profile is the Q-ASGS model, which is the most simplified one from the theoretical point of view.
In terms of the velocity variances, the points made for the previous set of tests still stand. The stream-wise velocity variances are generally overestimated compared to the expected results, while the fluctuations on the other directions are underestimated. Again, the different models introduce some differences in the final solution, with the Q-ASGS and D-OSS variants providing the closest match to DNS data.
To obtain a deeper understanding of the results we measured the turbulence kinetic energy balance for the problem. A balance statement for the turbulence kinetic energy can be obtained using a procedure analogous to what presented in Section 2.4 for the residual energy , using Reynolds averaging in place of filtering. Only the final expression is presented here, but the interested reader is directed to [52,2] for detailed proof.
|
(2.177) |
where the terms represent, respectively:
For the turbulent channel flow, we have that the average velocity is exclusively in the streamwise () direction and that the flow is homogeneous in the streamwise and cross-stream directions. As a result, all terms involving either , or spatial derivatives along the or directions can be can be neglected from Eq. 2.177, resulting in the simplified expression
|
(2.178) |
where the numbered terms have the same interpretation as the corresponding term in Eq. 2.177. Note that, once a statistically steady state has been reached, the storage term in Eq. 2.178 will also be zero, as in equilibrium the power introduced in the system by the external pressure gradient is exactly balanced by wall friction.
The different terms in Eq. 2.178 have been measured in the course of the simulations presented in the previous pages and are presented in graphical form in Figs. 8 to 17, again compared to DNS measurements from [51]. Note that in this case we are only presenting the part of the solution closer to the wall, , as energy transfer phenomena are mostly localized close to the wall for this problem.
The values for term in Eq. 2.178, turbulence kinetic energy production, are plotted in Fig. 8 for the different meshes and in Fig. 9 for the different small scale models. The production term measures the generation of small scale motions due to the shear of the average flow and, for this example, is expected to be positive throughout the domain, reaching a peak close to the wall, near . As an aside, the fact that this term is positive means that there is no backscatter in this problem.
(a) | (b) |
Figure 8: Channel flow – turbulence kinetic energy production for the Q-ASGS method. |
(a) | (b) |
Figure 9: Channel flow – turbulence kinetic energy production in the hexahedra case for the different small scale models. |
We observe that our results are in qualitative agreement with DNS data, but tend to predict a peak in production at larger (farther from the wall) than expected. This is most marked for the coarser tetrahedral mesh in Fig. 8a, while hexahedral meshes predict the peak closer to the expected position in general. It is worth noting that the curves obtained from our simulation have a jagged appearance when compared to DNS data. This is due to the choice of linear interpolation functions, which means that the simulated velocity gradient is constant within each finite element. This will also happen in any other results involving spatial gradients of finite element variables.
In terms of the different small scale models tested, we see that the dynamic models in Fig. 9b provide a better match to DNS data than the quasi-static models in Fig. 9a, suggesting that dynamic models do in fact provide a better description of turbulent phenomena compared to the simpler quasi-static models.
As a final remark, note that the hexahedra, Q-ASGS curve in Fig. 8b does not coincide with the Q-ASGS curve in Fig. 9a. The difference between the two curves is due to the pressure small scale, which was considered in the first case and neglected in the latter. It is interesting to observe that retaining it results in a better prediction of the production term, despite the fact that we saw in the previous pages that neglecting the pressure small scale results in a closer approximation of the average stream-wise velocity.
Term of Eq. 2.178, which corresponds to turbulent diffusion, is presented in Fig. 10 for the different meshes. Turbulent diffusion is expected to transfer energy from the intermediate region of the channel towards the wall, which means that it will act as a source of turbulence kinetic energy (positive values) close to the wall and as a drain (negative values) at large . We see that our results follow the expected distribution of values, closer when using hexahedral meshes. However, it is interesting to note that the positive peak, near , is underestimated in the finer simulations.
(a) | (b) |
Figure 10: Channel flow – turbulent diffusion for the Q-ASGS method. |
(a) | (b) |
Figure 11: Channel flow – turbulent diffusion in the hexahedra case for the different small scale models. |
The measured turbulent diffusion for the different small scale models is presented in Fig. 11 and shows the same type of dependence on the model that we observed for the production term. Again, dynamic subscales provide a better approximation to DNS data than quasi-static ones and, comparing Fig. 10b to Fig. 11a, using the pressure small scale in the Q-ASGS case provides a closer match than neglecting it.
Turning our attention to term , which represents pressure diffusion, we provide the results corresponding to different meshes in Fig. 12 and to the different small scale models in Fig. 13. This term corresponds to the relation between local pressure and velocity fluctuations and it has a qualitative behavior that is similar to that of turbulent diffusion, transporting energy closer to the wall, but a smaller magnitude in general. As in the previous term, we can observe that the obtained results tend to underestimate sharp peaks. However, in this case, we detect an unexpected behavior close to the wall for the finest hexahedral mesh, as can be seen in Fig. 12b, where the hexahedra curve shows a negative peak close to the wall. As a possible interpretation of this result, we note that elements are highly stretched in that region and that we are using an average element size to define our stabilization parameter. This could have unexpected effects on the consistency of the stabilization terms and might be adding some error in our calculations.
(a) | (b) |
Figure 12: Channel flow – pressure diffusion for the Q-ASGS method. |
(a) | (b) |
Figure 13: Channel flow – pressure diffusion in the hexahedra case for the different small scale models. |
The results obtained for term , representing viscous diffusion, are presented in Fig. 14 for the different meshes used and in Fig. 15 for the different small scale models. As the other two diffusive terms, viscous diffusion transports energy towards the wall but, compared to the the previous terms, it acts closer to the wall in general. This is consistent with the fact that viscous effects are predominant only in the smallest motions, which, for the turbulent channel flow, are significant only at a very close distance from the wall.
(a) | (b) |
Figure 14: Channel flow – viscous diffusion for the Q-ASGS method. |
(a) | (b) |
Figure 15: Channel flow – viscous diffusion in the hexahedra case for the different small scale models. |
The final term in Eq. 2.178, term , corresponds to viscous dissipation of turbulence kinetic energy. This term should be negative throughout the domain, as viscous dissipation is the only energy sink available in the problem, which can be verified in Fig. 16 for the different meshes and Fig. 17 for the different small scale models.
Viscous dissipation should predominantly occur close to the wall, where the smallest motions are concentrated, and we notice that our results follow this general trend, in agreement with DNS data. However, all our curves indicate a smaller (closer to zero) dissipation for any given distance to the wall, which seems to be generally in line with our interpretation of the average velocity results, indicating that dissipation is generally lower than expected.
In terms of the comparison between the different methods, the results obtained for dissipation are in agreement with the general trend observed for the previous terms. We notice that dynamic models, as shown in Fig. 17b, provide results that are slightly closer to DNS measurements than quasi-static models, which in this case is clear in the small step displayed by the different curves close to the wall, and that the Q-ASGS results in Fig. 16b, obtained using the pressure subscale, are slightly better than those in Fig 17a, obtained by neglecting it.
(a) | (b) |
Figure 16: Channel flow – turbulence kinetic energy dissipation for the Q-ASGS method. |
(a) | (b) |
Figure 17: Channel flow – turbulence kinetic energy dissipation in the hexahedra case for the different small scale models. |
As a final test, we simulated the same problem using the alternative model for the pressure subscale proposed in Section 2.6 and the coarser tetrahedral grid, comprising tetrahedra. We present the results in terms of the average stream-wise velocity profile and velocity variances in Fig. 18, where we compare them to DNS data and to the regular Q-ASGS formulation, either retaining () or neglecting () the pressure small scale. We observe that both neglecting the pressure small scale and using the proposed model result in a much closer agreement to DNS data compared to retaining . This allows us to obtain results that are much closer to those obtained using hexahedra, which were presented in Fig. 4, while using a tetrahedral mesh.
We devoted the present chapter to introduce VMS stabilized formulations for the incompressible Navier-Stokes equations and to expose the arguments that have been used to relate them to LES methods for turbulence modeling. Besides the classical VMS approach, we have discussed dynamic subscale models and the possibility of using the last known value of the complete velocity as the linearized advective velocity on the convective term. These two modifications to the basic formulation allow us to provide a stronger theoretical justification to the use of VMS methods as a type of turbulence modeling, similar to LES but using a projection to the mesh instead of spatial filtering to introduce scale separation. We have implemented a finite element solver based on dynamic subscale formulations and used it to simulate the well-known benchmark of the turbulent channel flow at .
We have investigated the effect of using either tetrahedral or hexahedral meshes for the simulation and the use of different small scale models. Motivated by results found on the literature, we decided to neglect the pressure subscale in some of the tests, in the hope of obtaining more accurate solutions. While it is true that neglecting the small scale pressure results in a better agreement to DNS data in terms of the average stream-wise velocity in the single direct comparison we have for this (the Q-ASGS model), we have also found that this choice results in a poorer prediction of the turbulence kinetic energy balance. We do not have a definitive answer to this apparent contradiction, but one possible explanation could be that the small scale pressure introduces an unexpected energy transfer mechanism, which we do not detect in our balance, since we are only measuring the (large scale part of) the terms in Eq. 2.178. Obviously, more tests are required before a definitive answer can be provided, and the first step would be repeating the analysis presented in Section 2.7 but now without neglecting the pressure subscale and measuring not only the large scale part of the energy balance, but also the contributions of the small scale velocities to the terms in Eq. 2.178.
This dependence of the results on the pressure small scale also motivated us to propose a new model for the pressure small scales, which we based on strengthening the enforcement of the incompressibility of the velocity solution via the use of an approximate interpolation space for the small scale pressure. While this new formulation produces improved results when compared to the classical approach on a tetrahedral mesh, we want to remark that the effect of the pressure small scale term seems to be problem-dependent (this can be seen for example in [27]), which means that this should be understood as the starting point of a wider investigation and not a definitive result.
In the same sense, in proposing the formulation we have made some arbitrary decisions, such as the choice of a discontinuous linear interpolation space or the zero-average condition used to invert the Laplacian in Eq. 2.171. These are by no means the only possibilities, and it would be interesting to know the impact of this choice compared to other alternatives.
In the present chapter we introduce a new stabilized finite element formulation for the simulation of incompressible flow problems based on the Finite Calculus (FIC) approach [53,54]. FIC is a general framework for the development of stabilized formulations, based on writing the balance equations of the problem for an arbitrarily small domain, instead of the usual point-wise partial differential equation (PDE). This results in a modified strong-form equation with additional terms that, once the problem is rewritten as a variational equation, have a stabilizing effect on the numerical formulation.
The FIC approach has been applied to incompressible flows at a range of Reynolds numbers in the past [14,13,55], but in the present document we intend to investigate the behavior of the formulation as an alternative to large eddy simulation (LES) in a finite element context, as we did for Variational Multiscale (VMS) based formulations in the previous chapter.
The main new feature of the FIC formulation presented here, compared to previous approaches, is the addition of a new dissipative term based on the velocity gradients. This term has an effect on the total dissipation introduced by the numerical formulation and will be shown to improve the accuracy of the solution for the turbulent flow examples considered.
We will start by presenting the general FIC approach in Section 3.2. This approach will be used to obtain a stabilized expression for the linear momentum balance in Section 3.3 and a stabilized continuity equation in Section 3.4. These two expressions will be combined to obtain a discrete formulation in Section 3.5. The presented formulation will then be used to simulate a turbulent channel in Section 3.6, the flow past a cylinder in Section 3.7 and a solar collector in Section 3.8. Finally, some concluding remarks are presented in Section 3.9.
Although our end goal is to apply the FIC formulation to the full Navier-Stokes equations, it is convenient to introduce it first on a simpler problem. We present the first order FIC balance following the approach of [56], by applying it to the advection-diffusion equation.
Figure 19: Fluxes in a domain. |
Consider a scalar quantity advected with a velocity through the domain shown in Fig. 19. The domain has a total length and diffusivity coefficient . The distribution of will be the solution of the convection-diffusion equation
|
(3.179) |
Furthermore, we can define the flux passing through a point on the domain as
|
(3.180) |
Consider the flux through the boundary of the domain. Given that the fluxes , entering and exiting it through its extremes must be in equilibrium, we can write
|
(3.181) |
The basic premise of the FIC approach is to write Eq. 3.181 in terms of the flux through an arbitrary point that lies in the interior of the domain. If the fluxes at and are expressed as a Taylor series expansion of the flux at , we can state
|
If we introduce these definitions in Eq. 3.181 we can rearrange the resulting expression to obtain
|
(3.182) |
where we used that . In FIC formulations, the quantity is defined as the characteristic length of the problem. Introducing the definition of the flux in Eq. 3.182 and neglecting third order derivatives we recover the expression
|
(3.183) |
where we have neglected the spatial variation of and .
As the position of point in the balance domain of Fig. 19 is arbitrary, Eq. 3.179 holds for any point within the analysis domain. Comparing Eq. 3.183 to the pointwise balance equation Eq. 3.179, we see that, by enforcing the balance of fluxes on the finite-sized domain , we introduce a modified diffusivity, which acts as an additional source of numerical diffusion as long as the characteristic size is chosen such that . This has a stabilizing effect on the resulting finite element formulation. Note that, in contrast to most stabilization frameworks (such as the VMS formulation presented in the previous chapter), the stabilizing terms appear as a result of a modification of the original PDE and not from a manipulation of the variational form.
The procedure used here to obtain the FIC formulation for the advection-diffusion equation can be extended to other problems and multiple dimensions, and is known in the FIC context as first order FIC balance in space. Defining the residual form of our problem as
|
(3.184) |
we can rearrange the terms in Eq. 3.183 as
|
(3.185) |
where we are once more neglecting the spatial variation of and and all third-order derivatives.
The same approach can be extended to multiple dimensions [54]. The vector form of the FIC equation reads
|
(3.186) |
where represents the characteristic length in the -th coordinate direction. We will use the notation to denote the vector of characteristic lengths in the different coordinate directions.
This procedure can be directly applied to the momentum equation. We will follow a slightly different approach for the mass conservation equation, originally introduced in [57], which retains higher order terms in the FIC balance to obtain a second order expression.
We present first the FIC stabilized form of the momentum equation. This equation was already introduced in the previous pages, but is stated in Eq. 3.187 for reference. Note that, as we did for the VMS formulation in Chapter 2, we follow the approach of [34] and use the skew-symmetric form of the convective term.
|
(3.187) |
For a Newtonian fluid, the stress tensor can be expressed in terms of the rate of strain tensor as
|
We can follow the procedure outlined in the previous section to develop FIC-based stabilized form of the momentum equation. We introduce Eq. 3.188 in Eq. 3.187 and rewrite it in residual form as
|
(3.190) |
Expressing the balance of linear momentum along each spatial direction and following the argument of the previous section we can obtain the FIC balance statement for the momentum equation as
|
(3.191) |
where represents the length used to write the balance along the -th coordinate direction. Note that, in principle, a different vector of characteristic lengths can be used in the balance equation for each momentum component .
We consider different possibilities to design . The first possibility is to define the characteristic lengths based on the finite element size along the streamlines of the flow, which results in a method similar to the SUPG formulation [36]. A second option is to base the characteristic length on the size of the element along the direction of the gradient of velocity. This acts as a source of additional diffusion, although the resulting formulation is not stable by itself. Finally, we consider the possibility of mixing both approaches by introducing a combination coefficient. Each approach will be presented in succession in the following pages.
Consider a characteristic length vector aligned on the direction of the flow velocity
|
(3.192) |
where is the projected length of a given element along the direction of flow, defined by the unit vector . Using this expression, we can rewrite Eq. 3.191 as
|
(3.193) |
We can use Eq. 3.193 as the starting point to write a stabilized formulation for the momentum equation. Multiplying by a test function and integrating over the fluid domain we obtain
|
(3.194) |
It is convenient to integrate by parts the second term in Eq. 3.194. Note that, as the length will be defined as a constant quantity on each element, the boundary integral that appears should be understood as an integral over elemental boundaries.
|
(3.195) |
We have neglected the elemental boundary integrals appearing in Eq. 3.195 in the present work. In practice, this is similar to consider that the small scales vanish over element boundaries on VMS formulations. At this point, we introduce the definition of the residual Eq. 3.190 and its gradient in Eq. 3.195. This gives
|
(3.196) |
where represents the -th component of the tractions imposed on the Neumann boundary .
Although Eq. 3.196 was developed using a FIC based approach, the final expression is analogous to a SUPG stabilized formulation, with (which has dimensions of time) playing the role of the SUPG stabilization parameter .
An alternate approach to Eq. 3.192 is to measure the characteristic length in the direction of the gradient of the -th component of velocity, , given by
|
(3.197) |
which, as before, can be used to write a FIC balance statement for each component of the momentum equation
|
(3.198) |
We can obtain a variational form of the FIC momentum balance equation given by Eq. 3.198 following the same procedure used for the streamline formulation. Multiplying by a test function and integrating over the fluid domain gives
|
The first integral in Eq. 3.200 is identical to the first term of Eq. 3.195 and can be developed as in the previous section. We direct our attention towards the second term in Eq. 3.200, which can be integrated by parts as follows
|
From the three terms in the last equality of Eq. 3.204, only the first one will be kept. The second one is neglected as it involves either spatial derivatives of the characteristic length or second derivatives of velocity. The last term can be transformed into a boundary integral using the divergence theorem, and is dropped for the same reasons we neglected the boundary terms in the streamline formulation. Finally, it is convenient to rewrite the remaining term as
|
(3.205) |
If we choose the characteristic length such that , Eq. 3.205 describes the discrete version of a non-isotropic Laplacian, where the diffusivity for each coordinate direction is different. The diffusivity coefficient in this case is proportional to the magnitude of the finite element residual on each coordinate direction and exhibits a similar structure to that of a shock-capturing formulation, such as [58]. The numerical diffusion added on each direction is defined by the tensor :
|
(3.206) |
Going back to Eq. 3.200, the weak form for the gradient diffusion formulation reads
|
(3.207) |
It must be noted that the formulation of Eq. 3.207 by itself is not sufficient to stabilize convection-dominated flows in general. Therefore, we consider the possibility of combining the present approach with the streamline-based characteristic length.
As a last possibility, we consider a combined approach including both the stabilizing terms of the streamline-diffusion formulation and the additional diffusion of the gradient formulation. The FIC expression for this case reads
|
(3.208) |
where is a combination parameter.
The development of the combined formulation follows the steps of each of its components as shown in the previous pages. Therefore, only the final expression for the weak form, obtained by combining Eq. 3.196 and Eq. 3.207, is given here:
|
(3.209) |
with given by Eq. 3.206.
Eq. 3.209 represents the basic formulation used for the momentum equation in the present chapter. To develop it, we introduced five free parameters (in ): the velocity characteristic length , one gradient characteristic length along each coordinate direction , and the combination parameter , which must be defined before the method can be implemented.
The characteristic length for the streamline diffusion terms is defined from the size of the element in the direction of velocity . Defining the unit vector in the direction of velocity as and representing the element edge joining nodes and with the vector , the element length is given by
|
(3.210) |
Figure 20: Definition of the element lenght for triangles and quadrilaterals. |
In practice, Eq. 3.210 is evaluated on the integration points of each element. In the case that velocity is (close to) zero on a given point for a given time step, is undefined and this expression can not be used. If this happens, an average element length is used instead. The characteristic length we used in this case will be introduced in Eq. 3.222 for the stabilization of the mass equation.
The characteristic element lengths for the gradient term are defined analogously to Eq. 3.210, but using the gradient of the -th component of velocity to define the direction of projection. The characteristic element length to be used for the -th coordinate direction is therefore defined as
|
(3.211) |
In principle, the combination parameter could take any value in the range . The limit case results in the classical FIC formulation for the momentum equation, used for example in [56] or [14]. This formulation is very close to the SUPG stabilization, but uses the stabilization parameter of Eq. 3.194, derived from FIC principles. On the other end of the range, implies using the gradient diffusion term exclusively and results in a formulation that is not numerically stable for convection-dominated problems. In the present work, we have found that values of are typically needed for the problem to be stable for all flow regimes, while values in the range typically give the best results.
In addition to defining the value of as a fixed quantity for the entire simulation, we have also experimented with the possibility of adjusting dynamically using the local features of the flow. In some simulations we have set a local value for depending on the directions of velocity and its gradient:
|
(3.212) |
where is a minimum value to prevent the loss of stability if the velocity becomes parallel to in some point. Note that the value of that is obtained using Eq. 3.212 is different for each coordinate direction . This means that, if this expression is used, both the streamline terms and the gradient terms in Eq. 3.209 are non-isotropic.
In order to obtain a stabilized formulation for the mass balance equation, the approach used in [57,55] will be followed. A similiar approach was also applied in [59] for a quasi-incompressible fluid. We introduce the following notation for the mass balance residual:
|
(3.213) |
which can be used to derive the second order FIC balance in space as
|
(3.214) |
The expression of second order mass balance was originally used to obtain a stabilized formulation for incompressible flows in [57], where it was derived by expressing the balance of mass within a rectangular domain. In this reference, it is shown that Eq. 3.214 can be obtained by writing the velocities along the boundaries of the rectangle as a Taylor series expansion of the velocity on its center and retaining terms up to third order.
Now the problem consists in obtaining an expression for that is useful for the calculation. To do so, we go back to the momentum balance as stated in Eq. 3.190. Assuming that we are in equilibrium, and therefore , and using the identity
|
(3.215) |
we can rearrange the terms in the momentum balance to read
|
(3.216) |
Moving all terms involving to the same side of the equality we obtain
|
(3.217) |
where we introduced the notation of for the right hand side of Eq. 3.217 for convenience. At this point it is helpful to write the first order FIC balance for the continuity equation
|
(3.218) |
and use it to express in terms of its derivative in Eq. 3.217
|
(3.219) |
We can introduce Eq. 3.219 in Eq. 3.214 to write
|
(3.220) |
Neglecting the spatial variation of the product , we take the coefficient that multiplies out of the derivative, obtaining
|
(3.221) |
Eq. 3.221 expresses the basic FIC mass balance statement used in the present work. We will simplify it slightly by using an average characteristic length as done in [59], which allows us to combine the two coefficients in Eq. 3.221 in a single isotropic stabilization parameter
|
(3.222) |
where we use the norm of the velocity and the average element length , which is calculated as the square root of the elemental area in or the cubic root of the elemental volume in .
Using we can write the final FIC balance statement for the incompressibility equation as
|
(3.223) |
We can multiply Eq. 3.223 by a test function and integrate over the fluid domain to obtain the weak form of the equation
|
(3.224) |
It is convenient to integrate by parts the second integral in Eq. 3.224 to reduce the order of the derivatives involved. As in the momentum equation, the boundary terms resulting from this operation are neglected in the present work, obtaining the expression
|
(3.225) |
Eq. 3.225 represents a stabilized formulation for the continuity equation, similar to that obtained in GLS formulations [37]. Note that the stabilization parameter , defined in Eq. 3.222, has the same structure as the classical SUPG or GLS characteristic time and the static version of the parameter used for the VMS formulation in Chapter 2.
In addition to the formulation given by Eq. 3.225, we have also tested a variant involving the projection of . Consider the following modified version of Eq. 3.223
|
(3.226) |
where represents the projection onto the finite element grid of , that is to say, the solution of
|
(3.227) |
This formulation results in the following weak form, again neglecting boundary terms, which substitutes Eq. 3.225.
|
(3.228) |
We will use Eq. 3.228 as the reference formulation in the following, with the understanding that any terms involving can be dropped to recover the formulation without projections.
Combining the stabilized momentum equation given by Eq. 3.209 and that of Eq. 3.228 for the continuity equation we obtain the complete stabilized weak form of the problem, which we used to develop a finite element formulation.
In the present work we restrict ourselves to linear finite elements, using triangular and quadrilateral elements in or tetrahedra and hexahedra in . This means that all terms involving second derivatives of velocity in Eqs. 3.209 and 3.228 will be neglected, as they are identically zero when using our interpolation. The full formulation, without second order terms, is given by
Momentum
|
(3.229) |
Mass balance
|
(3.230) |
with
|
We introduce a finite element discretization of the problem domain . Using this discrete representation, the problem variables and can be represented using a finite element interpolation as
|
(3.231) |
where represents the number of nodes in the finite element mesh, and are the variables evaluated at node , is the standard linear finite element function associated to node and
|
Furthermore, we introduce the notation , and to indicate the vectors of nodal values for velocity, acceleration and pressure, respectively. Given that the variational form of the problem, represented by Eqs. 3.229 and 3.230, must hold for all admissible test functions and that the set of finite element shape functions constitutes a basis of the interpolation space, we can obtain a system of equations by imposing that the variational form of the problem must hold for each basis function . This system can be expressed in matrix form as
|
(3.232) |
The different matrices in Eq. 3.232 represent the discrete form of the terms in Eqs. 3.229 and 3.230. Each of them can be built by the assembly of elemental contributions. For an element containing nodes, an elemental matrix can be defined using blocks , where and are local node indices. The individual blocks for the different matrices and vectors can be defined as
|
Introducing the strain rate-velocity matrix for node and the constitutive matrix
|
(3.239) |
|
(3.240) |
the viscosity term in Eq. 3.229 can be expressed in discrete form as the viscous stress matrix
|
(3.241) |
The stabilization terms in Eq. 3.229 and Eq. 3.230 give rise to the following matrices
|
In the following, Eq. 3.232 will be expressed using the compact notation
|
(3.252) |
If projections are used in the stabilization of the incompressibility equation, an additional system has to be solved to determine the nodal values of the projection variables . The equations for the projection can be obtained from the discrete version of Eq. 3.227, resulting in
|
(3.253) |
where is the array of nodal values for the projection variables and
|
Note that the assembly of elemental contributions given by Eq. 3.254 results in a dense matrix. In practice, the system matrix in Eq. 3.253 is approximated by a diagonal mass matrix for efficiency.
To solve the problem described by Eqs. 3.229 and 3.230, we first need introduce a time discretization to express the nodal accelerations in terms of the nodal velocities . As in Chapter 2, we use the Bossak scheme to obtain the time-discrete problem. Referring the reader to Section 2.5 for the details on the method, here we present only the final expression, which can be expressed as
|
(3.256) |
with , and
|
(3.257) |
The only step left to finalize the finite element solver is to introduce a linearization for Eq. 3.256. Both the system matrix and the right-hand side term contain sources of non-linearity in the form of terms that depend on the current values of the variables. This includes all terms involving the convective term , stabilization terms due to the dependence of the different stabilization coefficients on the local velocity and the gradient diffusion term, which involves both the momentum residual and the velocity gradients .
As in Chapter 2, we rewrite Eq. 3.256 in residual form and introduce a linearization so that the unknowns can be obtained by iteratively solving a linear system of equations. Defining the approximation to the value at time step after non-linear iterations as , the residual form of Eq. 3.256 is given by
|
(3.258) |
Our problem now consists in finding , such that . As before, using Picard iterations we obtain the iterative scheme
|
(3.259) |
this problem is solved iteratively until convergence in terms of the increments and or the residual vector .
Starting from the weak form described by Eq. 3.229 and Eq. 3.230, we have introduced a finite element discretization in space and a time discretization based on the Bossak method. Additionally, a Picard linearization has been used to obtain a linear system of equations to be solved iteratively, given by Eq. 3.259. To summarize, the complete FIC solution procedure is presented in compact form as Algorithm 2.
|
Algorithm. 2 FIC incompressible flow solver. |
This formulation has been implemented within the Kratos Multiphysics code [29], a software framework for the development of finite element solvers. The code is prepared to work in a parallel environment, as will be presented in Chapter 4. This has proved essential to perform the larger simulations in a reasonable time, which were run using the Gottfried cluster of the North-German Supercomputing Alliance (HLRN).
The flow in a plane turbulent channel is a classic turbulence benchmark and represents a challenging problem for LES formulations, due to the dependence of the vortex size to the distance to the wall [50]. It has been studied for a wide range of Reynolds numbers, but we direct our attention to the moderate value of . There is an extensive bibliography regarding this case, with a comprehensive set of statistical data obtained from direct numerical simulations by Moser et al. in [51] and different studies in which the problem was modelled using stabilized VMS-based formulations, both using classical finite elements such as in [45] or [27] and using isogeometric elements [21] or [23].
This Reynolds number is very convenient because it allows using a mesh size in the inertial subrange, even close to the wall, while keeping the computational cost under control. At higher Reynolds numbers, the number of elements required to have a grid size on the inertial subrange increases prohibitively and some type of wall model is usually preferred to reduce the required number of elements (see for example [60] or [61]).
The plane turbulent channel problem simulates a flow driven by a fixed pressure gradient between two parallel infinite walls. Defining the distance between the two walls as , the problem is formulated in terms of the wall friction and the friction velocity
|
(3.260) |
where is the imposed pressure gradient. Using the definitions of Eq. 3.260, the turbulent channel problem can be characterized by the friction Reynolds number , defined as
|
(3.261) |
which is set to for the present simulation. The results are presented in terms of the dimensionless distance to the wall .
To perform the simulation at the desired Reynolds number, we have selected the following parameters:
|
(3.262) |
We model a domain defined by in the stream-wise, wall-normal and cross-stream directions respectively, using the same domain as in [21]. Zero velocity Dirichlet conditions are assigned on the wall sides and periodic boundary conditions are used in the remaining directions.
The problem has been modeled using linear hexahedral and tetrahedral elements. In the first case, a grid of elements has been used. Mesh nodes were placed regularly along the stream-wise and cross-stream directions while, in the wall-normal direction, a weighting function is used to move the nodes closer to the wall. The location of the i-th node in the wall-normal direction is chosen as
|
(3.263) |
with for and for , chosen so that the first node in the mesh is always at a dimensionless distance to the wall . For the tetrahedral cases, a mesh with the same nodal positions is used, but each hexahedra is split into six tetrahedra.
The time step for the simulation is chosen as which, according to the analysis in [62], should be sufficient to reproduce the features of the flow. We use the expected average velocity profile as the initial condition, adding a random fluctuation to destabilize the solution. Once a fully turbulent flow develops, the flow is left to evolve until it reaches a statistically homogeneous solution. With this, different averages and correlations are calculated using the approach presented in Chapter 4. Statistical results were collected at the integration points of each element, averaging over time and over planes parallel to the walls.
We have performed multiple simulations using these settings to study the behaviour of different variants of the FIC formulation presented in the preceding pages. Note that all turbulent channel flow cases were run using the projections for the mass stabilization in Eq. 3.228.
The first simulations were performed using the FIC formulation with a fixed combination parameter, set to . The average stream-wise velocity , relative to the friction velocity , is shown in Fig. 21, compared to the DNS data of Moser et al. [51] for the same Reynolds number.
Figure 21: Channel flow – average stream-wise velocity profiles obtained using , compared to the DNS data of Moser et al. [51]. |
The velocity variances for the same simulation are shown in Fig. 22. In addition to the variances in each coordinate direction we also present the total turbulence kinetic energy, defined as
|
(3.264) |
Additionally, we measured the dissipation of average stream-wise linear momentum in the wall-normal direction. We know from studying the RANS momentum equation that the average shear stress in the plane can be written as (see for example [50] or [2])
|
(3.265) |
where the first term of the middle equality represents the Reynolds stresses in the plane and the second the viscous dissipation due to the average velocity. This decomposition is shown in Fig. 23 for the simulation performed using hexahedral elements. As the addition of the two terms is close to the expected straight line, we consider that the flow is in statistical equilibrium.
(a) Turbulence kinetic energy. | (b) Stream-wise velocity fluctuations . |
(c) Wall-normal velocity fluctuations . | (d) Cross-stream velocity fluctuations . |
Figure 22: Channel flow – turbulence kinetic energy and Reynolds stresses obtained using , compared to Moser et al. [51]. |
Figure 23: Channel flow – average stress profile obtained using hexahedra and fixed . |
We observe that the results obtained with linear hexahedra are closer to the expected values than those obtained with linear tetrahedra in all cases. This was to be expected, as hexahedra use trilinear shape functions, which define a richer interpolation than the linear functions used in tetrahedra.
In light of the fact that the formulation we are using has a free parameter, , which is set a priori, we are interested in studying how the solution is dependent of its value. To investigate this, we simulated the problem with the same settings, changing only the value of . The results obtained using a tetrahedral mesh with divisions along each coordinate direction are shown in Fig. 24, where the statistics obtained with and a tetrahedral mesh in the previous test, corresponding to the dashed curve in Fig. 21 and Fig. 22 are compared to those obtained with the same mesh and different values of . It is observed that there is not a large amount of variation between the different cases, although the case tends to display a lower level of velocity fluctuations in all directions. This suggests that small values of , which give more weight to the gradient diffusion term, result in a solution that is more diffusive overall.
The next set of tests was performed using Eq. 3.212 to assign a value to the combination parameter , while keeping the remaining simulation settings as in the fixed beta case. The minimum value of the coefficient was set to for the first tests, which produced the average velocity distribution presented in Fig. 25 and the velocity variances shown in Fig. 26, where we compare them to to the results obtained for a fixed coefficient in previous simulations.
Figure 25: Channel flow – average stream-wise velocity profiles using a fixed or dynamic combination parameter. |
(a) Turbulence kinetic energy. | (b) Stream-wise velocity fluctuations . |
(c) Wall-normal velocity fluctuations . | (d) Cross-stream velocity fluctuations . |
Figure 26: Channel flow – turbulence kinetic energy and Reynolds stresses using a fixed or dynamic combination parameter. See legend in Fig. 25. |
We can see in the figures that the average velocity profiles are generally lower to those obtained in the fixed cases and closer to those obtained from DNS data. Conversely, the velocity fluctuations measured in the stream-wise direction are somewhat lower than in the fixed simulations, resulting in a turbulence kinetic energy that is much closer to that obtained from DNS simulations.
As in the previous case, we are also interested in quantifying the impact that the choice of a limit value for the combination coefficient has in the obtained solution. To test its influence, we ran several simulations for tetrahedra (Fig. 27) and hexahedra (Fig. 28), changing the limit value for . We consider that the results show minor variations depending on the choice of parameter, at least for large values of .
We also studied the sensitivity of the solution to the choice of mesh size. The results obtained using a coarser mesh of hexhahedra or tetrahedra are compared in Fig. 29 to those obtained with the meshes used in the previous examples. As before, there is a clear difference in the behaviour of tetrahedra and hexahedra. In particular, it seems that the coarser tetrahedral mesh is insufficient to reproduce the features of the problem, resulting in a significantly larger average velocity.
As a final validation, we compared our results to those obtained using a GLS formulation on the same finite element mesh. The results of this test are shown in Fig. 30.
To conclude the analysis of the turbulent channel flow at test case we summarize the main results. A first general observation is that hexahedra produce much more accurate solutions than tetrahedra for a given mesh size. A difference in accuracy was expected, as the interpolation obtained using hexahedra is richer, but we have found it to be large in our mesh studies. An observation of Fig. 29 suggests that tetrahedra are required to obtain results comparable to hexahedra, which represents 48 times more elements in total. In spite of this, we will continue to use tetrahedra in the following examples, due to their flexibility in meshing complex geometries.
As the formulation we are proposing has a free parameter, the combination parameter , we wanted to study the sensitivity to its value. In the cases where the parameter was fixed throughout the simulation, the general trend is to obtain lower variances the smaller the coefficient, which corresponds to giving more weight to the gradient diffusion term (see Fig. 24). This suggests that the gradient diffusion term introduces a significant amount of numerical dissipation, producing more homogeneous solutions. However, it must be noted that the average velocity profile is much less sensitive to the choice of parameter, producing very similar results in all cases.
If the combination parameter is set on each element according to the local weighting function of Eq. 3.212, the obtained velocity profiles are generally lower than those obtained with a fixed parameter and measured variances show a better agreement with the DNS data, specially in the correlation, which is the larger contribution to the total turbulence kinetic energy (see Fig. 26). In this case, the only external parameter is the minimum admissible value of , but our experiments show that the results are not very sensitive to this parameter, at least if it is large enough, as can be observed in Fig. 27 for tetrahedra and Fig. 28 for hexahedra.
Finally, we compared our approach to using a standard GLS stabilization, which, for linear elements, is equivalent to the Q-ASGS formulation presented in Chapter 2. The results, shown in Fig. 30, suggest that the formulation we propose results in a closer approximation to DNS data than the reference for a given mesh size. We propose two reasons a justification for this result. On one hand, we introduce a new term, the gradient diffusion, which has been shown to introduce an additional source of dissipation. On the other, the formulation we propose, unlike GLS, does not include a div-div term, which was shown in [27] and in our own results in the previous chapter to have a negative impact in the turbulent channel case.
Based on the results obtained in this set of tests, we conclude that setting the combination parameter locally, limited to a minimum value of , is the variant that better approximates the reference solution. As a result, we will adopt this formulation for the remaining cases.
The flow over a circular cylinder is a classical problem in CFD simulations, which has been studied extensively, both experimentally and numerically, as can be verified for example in the review of [63]. Flow over circular cylinders exhibits a variable behavior depending on the Reynolds number, due to the different vortex shedding mechanisms that develop on the wake [64]. As a benchmark example for the FIC formulation, we studied the case corresponding to a Reynolds number based on the diameter of the cylinder and the inflow velocity. This case was studied experimentally in [65] and numerically in [66] or [67]. In this section, we will use a numerical set up similar to that of [66] and compare our results to those presented in that reference.
We simulated the flow over a cylinder with dimensionless diameter using a domain of , centered on the cylinder, in the plane normal to the cylinder's axis, and in the span-wise direction. The simulation is run for dimensionless time units (made dimensionless using the inflow velocity and the diameter ) with a dimensionless time step , which should provide sufficient resolution to capture the main vortex shedding frequency.
The domain for the problem is presented in Figure 31. Consider the axes , and , aligned in the stream-wise, cross-stream and span-wise directions respectively, and let , and , be the components of the flow velocity in each of the three coordinate directions. We are interested in measuring the velocity history in selected planes in the wake of the cylinder, chosen to coincide with those reported in the reference.
Figure 31: Flow around a cylinder – simulation domain and measurement planes. |
Linear tetrahedral elements have been used to mesh the domain, with sizes ranging between near the cylinder to in the far regions. This resulted in a total of million nodes and million elements. The velocity is fixed to a constant for the inlet and to zero on the cylinder surface. Periodic boundary conditions have been used in the span-wise direction, while a no-penetration condition has been imposed in the far sides on the cross-stream direction. The combination parameter for the FIC formulation is set locally for each element using the dynamic formulation, with a limit value of .
The instantaneous stream-wise velocity field on the central – plane at the end of the simulation is shown in Fig. 32. The velocities on the – plane for the same time instant are shown in Fig. 33. From the stream-wise velocity component in Fig 33a, the formation of a recirculation zone just after the cylinder can be observed. Similarly, in Fig. 33b, which shows the instantaneous cross-stream component of velocity , the alternating direction of the velocity suggests the formation of a vortex trail.
Figure 32: Flow around a cylinder – instantaneous stream-wise velocity on the – midplane. |
(a) Stream-wise velocity . | (b) Cross-stream velocity . |
(c) Span-wise velocity . | |
Figure 33: Flow around a cylinder – instantaneous velocities on the – midplane. |
While the instantaneous velocity distributions give us a qualitative idea of the flow, we are interested in studying the statistics of the cylinder wake, which can give us a more quantitative idea of the quality of the simulation. We computed the average velocity in the stream-wise and cross-stream directions on different – sections (that is, normal to the mean flow) on the wake of the cylinder. The results in terms of averages, compared to those of [66], are shown in Fig. 34 for the near wake and in Fig. 35 for the far wake.
Observing the results, we can see that we obtain a close agreement with the reference, although the formation of the wake is slightly delayed when compared to the reference. This can be seen by considering that the average velocity defect on the wake should start as a deep U-shaped trough just behind the cylinder, where the average flow in the recirculation zone is very small or negative on average, and become wider and shallower (closer to the inflow velocity ) as the wake develops. In general, our profiles are below the expected curve.
(a) Stream-wise velocity . | (b) Cross-stream velocity . |
Figure 34: Flow around a cylinder -- average velocities in the near wake. Reference , present work . From top to bottom: , , . |
In addition, we have also computed the variance of the stream-wise velocity , shown in Fig. 36a for the near wake and Fig. fig:fic_cyl_corr_far_uu for the far wake. The obtained variance is smaller in general than expected, which suggests a smoother flow and a more diffusive solution. The cross-correlation is shown in Fig. 36 on the same planes where it was reported in the reference. This result shows some irregularity, in our solution as well as in the reference, which might be reduced with a longer simulation time.
(a) correlation. | (b) correlation. |
Figure 36: Flow around a cylinder -- velocity correlations in the far wake. Reference , present work . From top to bottom: , , . |
Finally, we have computed the drag coefficient and the Strouhal number , which represents the dimensionless vortex shedding frequency, as given
|
(3.266) |
where is the average force applied by the fluid on the surface of the cylinder in the stream-wise direction and is the vortex-shedding frequency on the cylinder tail, which we have calculated from the lift force history . The results, compared to those reported in [66], are reported in Table 2.
Analysis | ||
Present simulation | ||
Numerical [66] | ||
Experimental (reported in [66]) |
The results obtained for this case show in general good agreement to reference values in terms of the average solution. Variances, while in qualitative agreement with the expected results in terms of spatial distribution, tend to be underestimated. This suggests that the obtained solution has larger dissipation than required, smoothing out peaks in the fluctuating solution. It would be interesting to repeat the same simulation with hexahedra or with a finer tetrahedral grid, to see which fraction of this dissipation is due to mesh resolution or to the formulation itself.
As a final example we wanted to test the capabilities of the formulation when applied to an industrial problem. For this, we simulated the wind flow around a parabolic trough solar collector and compared it to experimental data. A parabolic trough is an array of parabolic mirrors that concentrate solar rays in their focus, where the solar energy is collected and used to operate a steam turbine generator. The mirrors can be large structures (the one we are studying is a parabola with a 5 meter aperture) and are susceptible to damage due to strong winds. As such, there is interest in studying the wind load over the mirror, both numerically and experimentally.
We are using one of such experiments as a reference, where a 1:25 scale model of a single mirror was placed in a wind tunnel. This experiment was performed for Abengoa Research, which has given us access to the data, and was reported in [68,69]. Note that, as requested by the company, we are providing all our results in scaled form to protect intellectual property.
Due to the larger scale of the model compared to the previous examples, we will not attempt to reproduce the full boundary layer and the Werner-Wengle wall model [70] will be used to introduce the equivalent wall friction close to solid surfaces. Additionally, as we are trying to reproduce a wind tunnel experiment with a turbulent incoming flow, we need to generate a time-dependent inlet condition which bears a statistical resemblance to a real wind signal (see for example [71] or [72]).
The geometry of the collector is shown in Fig. 37 at full scale. To reproduce the different configurations of the collector as it rotates over its axis to follow the sun, the seven cases shown in Fig. 38 modifying the pitch of the mirror in increments of . The average wind is always assumed to reach the collector frontally, so that the mirror presents the maximum possible area to the flow.
Figure 37: Parabolic collector dimensions (full scale). |
(a) | (b) | (c) | (d) | (e) | (f) |
(g) | (h) | ||||
Figure 38: Solar collector – pitch angles considered in the simulation. Wind blows from the left. |
We simulated the collector at model scale (1:25), reproducing the wind tunnel experiment. The collector was placed on a fluid domain of at model scale in the stream-wise, cross-stream and vertical directions, respectively, at from the inlet.
The incoming wind is generated using the model of [71] to follow a Kaimal wind spectrum [73] with a reference stream-wise velocity at (corresponding to at full scale) and a wall roughness ( at full scale). The air is assumed to have density and viscosity , resulting on a Reynolds number calculated using and .
The calculation was performed with an unstructured tetrahedral mesh, with mesh sizes ranging from close to the mirror surface to on the far regions. This resulted in approximately nodes and elements for each simulation.
Instantaneous distributions of velocities and pressures close to the collector are shown in Fig. 39 for the case with pitch angle and in Fig. 40 for the case of as an example of the results. As can be seen in the figures, a vortex trail develops due to the presence of the collector.
(a) Velocity vectors. | (b) Pressure contours. |
Figure 39: Solar collector – instantaneous velocity and pressure fields for pitch angle . |
(a) Velocity vectors. | (b) Pressure contours. |
Figure 40: Solar collector – instantaneous velocity and pressure fields for pitch angle . |
(a) Average drag | (b) RMS drag |
(c) Average lift | (d) RMS lift |
(e) Average moment | (f) RMS moment |
Figure 41: Solar collector – average reactions. |
The simulation is performed for a sufficiently long time for the flow to become statistically steady and obtain a data set on this regime so that meaningful statistics can be obtained. The forces on the mirror are integrated at each time step and recorded over time. These results are used to compute the drag and lift coefficients and the moment , calculated around an axis placed on the base of the structure, as shown in Fig. 37. The reactions are made dimensionless using and the collector dimensions , as follows
|
(3.267) |
the resulting statistics for the different pitch angles considered are compared to the experiment in Fig. 41. The results are presented relative to the maximum value in each experimental curve as requested by Abengoa.
As was the general trend in the previous example, we achieve good accuracy in terms of the averages, while the results in terms of fluctuations (the RMS in this case) tend to be less accurate. In any case, we consider that this case serves as a proof of concept, showing that the formulation has potential to solve problems of practical interest in engineering, with complex geometries and variable inlet conditions.
In the present chapter we have introduced a new FIC-based formulation for incompressible flows. The main features of our method are the presence of a new term on the momentum equation, which introduces an additional non-isotropic dissipation in the direction of the velocity gradients, and a stabilized formulation for the mass equation which is based on a second order FIC balance in space and represents an incompressible Eulerian version of the method presented for quasi-incompressible flows in [59].
This method has a free parameter in the combination coefficient that defines the relative weights of the classical streamline diffusion and the new gradient diffusion term in the stabilization of the momentum equation. We have proposed a way to define this coefficient dynamically, with the intent of improving the results and reducing the dependence of the solution on the free parameter.
We have tested the method with several application examples. The first example presented is the turbulent channel flow at , where we have tested the different variants of the method. The main conclusions we extracted from the simulations can be summarized as follows:
Finally, the method was then applied to large turbulent flow simulations, first the flow around a cylinder and then an industrial-scale simulation of the wind flow over a parabolic solar collector. In this last case, due to the larger Reynolds number, the method was used in combination with the Werner-Wengle wall model to introduce the right dissipation on the walls without reproducing the full boundary layer.
The results show that the presented method is capable of reproducing the features of the flow and shows promise in the application of the method real world examples of industrial interest.
We have already remarked that one of the reasons why turbulent flow problems are challenging is that they involve fluid motions with very different characteristic sizes and, as a result, their numerical simulation requires very fine discretizations, both in space and in time. Even with the introduction of turbulence modeling, LES simulations for problems of practical interest in engineering require significant computational resources and are well beyond the range of what currently can be calculated in a reasonable time with a desktop computer.
Currently, the overwhelming majority of High Performance Computing (HPC) machines are distributed memory clusters (see for example the TOP500 list of the most powerful computer systems [74]), in which many individual processors work in parallel on different parts of the problem to be solved. Such machines are organized as groups of interconnected calculation nodes, where each node contains one or several processors and a block of memory. In this calculation framework, there exists a very clear distinction between local data, stored in the node's memory, which is readily available to the processor, and non-local data, stored in a different node, which has to be requested to that node requires many more computation cycles to access.
In the context of finite element simulations, large problems can be solved using a distributed memory approach by dividing the model domain into parallel subdomains, each containing a fraction of the finite element mesh, and assigning each of them to an individual processor. This requires careful design of the calculation software to solve the global problem while minimizing the exchange of information between the individual subdomains.
In this sense, a part of the programming work presented here represents a contribution to an ongoing work in our research group to improve the performance of Kratos Multiphysics in distributed HPC clusters. This chapter will be devoted to presenting some of the adaptations required for distributed memory simulations and to test the parallel performance of the resulting implementation.
We will focus our presentation on some aspects of parallelization that have required the most attention to achieve the goals of the present work. The first of these is the division of the original finite element mesh into parallel subdomains and the generation of a communication strategy to efficiently exchange information between them. To present this, we briefly describe in Section 4.2 how distributed data is organized in the code and how it can be shared among processes, while Section 4.3 deals with the generation of this distributed data from the complete problem.
The second aspect that will be considered is the parallel efficiency of the complete solver. We describe some details of the assembly and solution of the problem's linear system that require attention in a distributed memory context in Section 4.4 and evaluate the parallel performance of the complete solver in Section 4.5.
Finally, as we have seen in Chapters 2 and 3, in turbulent flow analysis the quantities of interest are frequently statistical results, obtained from spatial and/or temporal averaging. In the context of large data sets and HPC, the efficient calculation of statistical results requires careful consideration. This will be discussed in Section 4.6, where the approach we have followed will be described.
Some final thoughts and future lines of improvement are presented in Section 4.7.
While there are multiple strategies to distribute data for finite element problems, the approach of Kratos Multiphysics consists in dividing the mesh into discrete subdomains, such that each individual element is assigned to a given processor, as shown for an example problem in Fig. fig:pi_partition_elements. In this approach, some of the mesh nodes will appear in two or more different subdomains, as they belong to elements assigned to different partitions. Such nodes will be called interface nodes.
(a) Element partition. | (b) Node partition. |
Figure 42: Division into subdomains. |
It is critical to the solution of the problem that nodal data for interface nodes is consistent across the different partitions, which requires its synchronization given points of the solution procedure. To simplify this exchange of information, we found it convenient to also assign nodes to a given partition, which holds the reference values for nodal data. From the point of view of a calculation process, nodes which belong to its partition are defined as local nodes, while interface nodes which are known but are assigned to a different partition are called ghost nodes. An example of such partition is shown in Fig. fig:pi_partition_nodes, where local nodes are represented with a full circle in the color of the partition and ghost nodes are represented with empty circles. In the same figure, dashed lines represent inter-process communications which will be required during the solution procedure.
In a communication strategy, it is important to define not only which partitions have to share information with each other but also the order in which such communication is done. For example, the communication graph for the partition of Fig. 42 is shown in Fig. fig:pi_communication_all.
(a) All links. | (b) Optimal. |
Figure 43: Communication patterns for the partition of Fig. 42. |
The simplest approach would be transferring data in order, starting from one of the pairs and exchanging data one by one. This approach would have poor parallel performance as, while a given pair of processes exchanges information, the others are idle. Furthermore, the total number of exchanges required grows rapidly as the number of processes is increased, resulting in a significant fraction of the total calculation time spent waiting for communication.
A more efficient approach is to try to group communications in a way that processes are never idle, such as in Fig. fig:pi_communication_good, considering one first stage where process 1 communicates with 2 and 3 with 4, followed by a second phase where process 1 communicates with 4 and 2 with 3. Reducing the number of total communication stages and, in this case, keeping all processes busy at all times.
In the case of Kratos Multiphysics, an existing code which had to be adapted for parallel simulations, the existing data structure had to be adapted to work in a distributed memory context. While we won't go into the details of the Kratos structure here (the interested reader is directed to [75,28]), we will just say that all model data is stored in an entity known as ModelPart, which contains the definition of the mesh and the associated nodal or elemental data. In a parallel context, each process defines its own ModelPart, which in this case contains all elements in the subdomain assigned to that process and all nodes (both local and ghost) required to perform the simulation.
Data transfer across processes was achieved by adding an additional component in the ModelPart, the Communicator, which handles parallel communication [29]. This object stores the communication strategy (which process will I communicate with on each stage) and the lists of local and ghost nodes to be exchanged in each stage. When data transfer is required, the Communicator collects the nodal data to send on each stage and exchanges it with the corresponding process using Message Passing Interface (MPI) calls [76].
One of the advantages of this approach is that it allows to reuse a very significant part of the code between serial and parallel simulations. To do so, the code is programmed with the parallel implementation in mind, with all required data transfer performed through Communicator functions. Then, two different Communicator classes are implemented, one for parallel executions that works as defined above, and another for serial runs, which does nothing. With this approach, we have been able to significantly reduce code duplication, minimizing the maintenance problems related to keeping up to date a serial and a parallel version of the same code.
Once we have a data structure that can be used to hold and communicate distributed finite element data we need to be able to, given a simulation domain, generate a partition in as many subdomains as parallel processes will be used in the simulation and a communication strategy to transfer data between them. In Kratos Multiphysics, the usual situation is to have a single input file containing the entire simulation mesh, typically generated with GiD [77]. The partitioning procedure in this case constitutes one last step of the pre-process of the problem, generating separate inputs for each simulation domain.
The partitioning process should generate balanced partitions, that is, all partitions should contain a similar number of elements and nodes, to ensure that the computational load is homogeneous for the different processors. A poorly balanced partition means that the processes with lighter work loads have to wait for the other to finish, resulting in longer total calculation times. In addition, the partition should minimize the amount of communication required relative to the total calculation time. This is sometimes expressed by saying that the computational cost of the simulation is proportional to the number of elements, that is to say, to the volume of the partition, while the communication costs are proportional to its surface. Therefore, a good partitioning algorithm should minimize the surface to volume ratio for the partition.
We use a the capabilities provided by the METIS library [78], which generates a partition using a multi-level approach. Starting from a graph of nodal connectivities, multi-level methods are based in generating progressively coarser graphs by grouping close nodes together and generating an optimal partition of the coarsest graph. The partition is then refined by undoing the coarsening. Such approaches are considered to provide good quality partitions for unstructured meshes.
As mentioned, the approach of METIS is based on the nodal graph, and provides a partition of the nodes. While there are some capabilities in METIS to divide the elements, they work for homogeneous meshes, composed of a single type of element1. This was insufficient for our needs as, due to the way boundary integrals are implemented in Kratos Multiphysics, the meshes in the problems we are simulating are typically heterogeneous. A simulation, for example, may include tetrahedral volume elements, triangular faces used to apply Neumann boundary terms or wall laws, for example, and point-to-point links to apply periodic boundary conditions. All of these have to be taken into account when building the nodal graph and the latter in particular has a significant impact in the final partition, as it typically indicates a relation between two nodes that are geometrically far away.
Element partitioning is achieved by following some simple rules. First, if all nodes in the element belong to the same partition, the element is automatically assigned to that partition. If its nodes are assigned to different partitions, then the element is preferentially assigned to the partition that owns most of the nodes, but keeping into account load balance: if that partition already contains more elements than the others, the element will be assigned to one of the partitions that own the remaining nodes.
Once this initial distribution in done, partitions are checked again for isolated nodes. Due to the way the element distribution procedure works, it can happen that some domain has a node but no elements that contain it. This situation would generate unnecessary communication, as the partition would have to store and update the reference data for a node it never uses, so those nodes are reassigned to a partition that needs them.
With the partition complete, the next step is to generate a communication strategy. To achieve this, we start by building the domain graph, stored as a matrix where term is non-zero if there is an interface between partitions and . For example, the graph for the domain of Fig. 42 is
|
(4.268) |
The strategy to organize the communications is known as coloring, as the problem is equivalent to assigning a color to all edges in the graph such that no two edges of the same color reach the same node. Once this is done, communication is achieved by transferring data across all interfaces of the same color at the same time. To perform the coloring, we use a simple approach, always assigning the first available color as they are needed, presented as Algorithm 3. This has been shown to be sub-optimal, as in the worst case it can use up to twice as many colors as the number of partitions. However, in our experience, obtained solutions are not usually as bad. A more concerning issue is that it is significantly more computationally expensive than an approach such as [79], which would produce optimal strategies.
|
Algorithm. 3 A simple coloring procedure. |
For the partition of Fig. 42, this procedure results in the following color matrix, where each column corresponds to a color and unused columns have been omitted:
|
(4.269) |
If we take each row of as a parallel process and each column as a stage in the communication procedure, indicates which partition we have to communicate with at a given step. In this case, we recover the communication pattern of Fig. fig:pi_communication_good. Note that, for more complex cases, we may obtain a communication pattern where some processors are idle for some of the communication steps. If this happens, the corresponding positions in contain a .
The final step in the procedure is to write each partition and the associated communication data (local and ghost nodes and the communication strategy) to separate input files, one for each simulation process. Once this is done, the parallel solution procedure can start.
Taking into account all steps, the partition procedure can summarized as:
(1) More recent versions of METIS do provide the possibility of partitioning heterogeneous meshes, but at the time of implementation we were limited by the relatively old versions available in the clusters we had access to.
Once the problem domain is partitioned and a communication strategy has been determined the model is prepared for a parallel simulation. Compared to a serial solution, a distributed memory simulation introduces additional complications in the procedure. First, as the finite element mesh was divided into subdomains, the system matrix will also be distributed, with the contribution from each individual element being computed in the process that holds it. More importantly, once the system matrix has been assembled, it has to be solved using a distributed algorithm which can take full advantage of the parallel environment. In fact, the choice of a scalable parallel solver has a crucial impact on the parallel performance of the code. Finally, once the problem has been solved, the updated values for the variables are synchronized to ensure that nodal variables are consistent across the processors.
In terms of the parallel finite element assembly procedure, Kratos Multiphysics relies on the Trilinos library [80] to construct and manage the system of linear equations that has to be solved on each iteration. In particular, Trilinos' Epetra package provides an implementation of distributed memory sparse matrices and vectors that can be used to hold the system data and communicate it to other processes when needed.
Finite element matrices can typically be stored in a sparse format, since most of the terms in the system matrix are zero. Therefore, just as in the serial case, before constructing the system matrix and vector we need to determine the sparsity pattern and allocate the required memory. This is done based on the nodal graph: given that each matrix row (and column) corresponds to a given degree of freedom in the problem, an entry will be non-zero only if an element exists in the mesh connecting the nodes that the row and column degrees of freedom are associated to. Since the matrix implementation in Kratos Multiphysics is row-based, each row is considered local to the processor that owns the node associated to that row's degree of freedom. With this information we can generate the data structure that will hold the system data, which is ultimately an instance of Trilinos' Epetra_FECrsMatrix for the system matrix and an Epetra_FEVector for the right hand side vector.
The construction of the sparse data structure is a relatively time-consuming operation, but can be done once the first time the matrices have to be constructed and reused in subsequent iterations, as long as the mesh connectivity pattern is preserved. Note that this is true for the examples in the present chapter, as well as those in Chapters 2 and 3, but will not be the case for the adaptive mesh refinement simulations of Chapter 5.
Once the data structure is ready, we iterate over all elements in the model, calculating the elemental contribution to the problem and assembling it into the system matrix and vector. However, since each row receives contributions from all elements that contain the associated node, parallel communication is required to account for contributions coming from elements associated to a different processor. To minimize the amount of parallel communication required, the global matrix is assembled locally at first to add the contributions from all local elements. Once this is done, rows that receive contributions from multiple subdomains are assembled by adding the contributions from each and communicating the result to other partitions.
Once the system is solved, we encounter the inverse problem: the new nodal values have to be communicated from the process that stores that particular row to all processes that have a copy of the corresponding node. Again, this requires a communication step.
The (efficient and scalable) parallel solution of the system is, by itself, a different and very challenging problem, which will only be briefly presented here. Given the size of the systems to be solved, direct methods are not applicable due to their memory requirements and computational cost. A more adequate choice is to use parallel implementations of Krylov methods [81], which are very efficient solvers but are not designed as parallel algorithms and tend to require an increasing number of iterations to converge as more partitions are introduced. Alternatively, a variety of algorithms designed for parallelism exist, including Algebraic Multigrid (AMG) algorithms [82,83], which introduce a hierarchy of increasingly coarser versions of the original problem and use the coarser solutions to accelerate the convergence of the finer problem, solution strategies based on domain decomposition techniques, in which each domain is solved separately and its effect on its neighbors is felt through boundary terms and deflation techniques, which combine an aggressive coarsening with domain decomposition.
In Kratos Multiphysics, the usual approach has been to rely on the linear solvers provided by the Trilinos library, which includes both Krylov solvers on its Aztec package [84] and Multilevel algorithms through the ML [85] library. This approach was used for example to simulate the benchmarks presented in [29]. In the following pages we will use a different linear solver in combination with the incompressible flow formulation presented in Chapter 2. This solver is provided by the AMGCL library [86,87], currently under development, and is based on combining a deflated approach where the coarse problem is given by the MPI partition with an AMG solver within each subdomain.
To evaluate the performance of the parallel implementation of our solver we have performed some simulations of large test cases. Note that, unlike in the remainder of this work, here we are more interested in the performance of the algorithm than in the quality of the solution. Therefore, we simulate very short time spans, mainly to sample the computational costs associated to the procedure, and the resulting solutions can not be considered as an accurate representation of the real flow. These examples were simulated in the Gottfried cluster of the North-German Supercomputing Alliance (HLRN).
The first test case is adapted from a real simulation mesh courtesy of the uLites1 project team. This project was concerned with the design and construction of inflatable structures subjected to wind loads and included the comparison of numerical and wind tunnel experiments on the designed structure. Here we take one of the simulation meshes, representing the geometry of a rigid scale model that was used in wind tunnel tests and simulate the flow around it using the Q-ASGS formulation described in Chapter 2.
The model, presented in Figure 44, is composed of four cylindrical tubes with a diameter of folded into a semicircle with a radius of , measured from the tube centerline. The simulation domain, shown in Figure 45, measures in the streamwise, cross-stream and vertical directions, respectively, and the inlet is placed at of the axis of the module.
The incoming flow is modeled as air with density and viscosity flowing at , which corresponds to a Reynolds number of approximately relative to the radius of the module. Velocity is fixed to zero on the floor and the surface of the module, while a no-penetration condition is used on the sides of the calculation domain. Note that, given the mesh resolution, a wall law would be a more adequate boundary condition for the solid boundaries, but we will not use it here in order to concentrate our attention on the fluid solver.
(a) Top view. | (b) Side view. |
Figure 44: Inflatable structure model – geometry of the module. |
Figure 45: Inflatable structure model – dimensions of the simulation domain. |
We define two different simulation meshes. The first is an unstructured tetrahedral composed of around nodes and million elements, with sizes ranging from close to the surface of the module to in the far regions. The second is obtained by the bisection of the element edges of the first, obtaining 8 elements from each original tetrahedron, and contains a total of million nodes and million tetrahedra. The flow is simulated for five time steps, using a step size for the element mesh and for the million element case, halved to maintain the same Courant-Friedrichs-Lewy (CFL) number.
The time required to perform different parts of the procedure for the coarser mesh is summarized in Table 3. The solution of five complete time steps required a total of between and system solutions, which took between and seconds of wall clock time when going from to parallel processes. We notice that the simulation time is dominated by the solve phase, which is more expensive than the finite element assembly in all cases.
MPI processes | |||||
Assembly time | |||||
Solution time | |||||
Num. of iterations | |||||
Assembly time | |||||
Assembly speedup | |||||
Solution time | |||||
Solution speedup | |||||
Assembly time | |||||
Assembly speedup | |||||
Solution time | |||||
Solution speedup | |||||
Solution time | |||||
Num of iterations | |||||
Average solution | |||||
Solution speedup | |||||
Global speedup |
We also observe that the first iteration of the finite element assembly procedure takes more time than subsequent iterations, since it includes the calculation of the sparsity pattern for the system matrix and the allocation of the required memory. We notice that, far from showing parallel scalability, the time spent in the first iteration is in fact increased as more processors are used. We consider this to be consistent with the fact that the set-up phase requires abundant parallel communication to determine the shape and ownership of each matrix row, which takes more time as more processes are involved. In any case, we have not considered the time of the first iteration in calculating averages, since it involves more operations than the rest.
Finally, we remark that we have considered the last time step separately from the rest. The cause for this is that, for some of the cases, the first few system solutions stop due to the solver reaching the maximum allowed iterations instead of fulfilling the convergence requirements. This is due to the initial condition being a bad first guess of an equilibrium solution, which means that in the first few iterations the system is harder to solve and the algorithm fails to achieve the desired error tolerance.
We feel that comparing converged and non-converged iterations skews the scalability results, since we want to measure the time required to achieve a solution of a given quality, not the time it takes to perform an arbitrary number of iterations. For this reason we measured the time required to solve the last time step, where all system solutions converged in all cases, and present it separately for the different cases. Likewise, the values given as global speedup in the results have been computed considering one average system assembly plus the average time taken in solving a single linear system on the last time step.
The times measured for the finer test case, using a million element mesh, are presented in Table 4. The behavior of the method is qualitatively the same, and the same remarks about the additional cost of the first iteration are applicable.
MPI processes | ||||||
Assembly time | ||||||
Solution time | ||||||
Num. of iterations | ||||||
Assembly time | ||||||
Assembly speedup | ||||||
Solution time | ||||||
Solution speedup | ||||||
Assembly time | ||||||
Assembly speedup | ||||||
Solution time | ||||||
Solution speedup | ||||||
Solution time | ||||||
Num of iterations | ||||||
Avg. solution | ||||||
Solution speedup | ||||||
Global speedup |
The time costs of a single solution iteration are represented graphically in Fig. 46, where the first iteration is compared to a typical iteration, calculated using the average time for the build phase and the last time step average for the solve phase. Here again we see a different behavior for the first and a typical iteration, due to the cost of determining the structure of the system matrix and allocating the required memory. Once this is done, in subsequent iterations the computational cost is driven by the system solution, which takes considerably more time in all cases.
(a) 4 million element mesh. | (b) 35 million element mesh. |
Figure 46: Inflatable structure test – time costs of a single iteration. |
To measure the parallel performance of the procedure we have measured the strong scalability of the algorithm, that is, we have compared the required taken to solve the same problem with an increasing number of processors. This is presented graphically in Fig. 47 for the million element case. We can observe that the scalability behavior is basically driven by the system solution, which dominates the solution cost. The parallel efficiency of the finite element assembly is close to linear, taking times less time when using eight times more processors, although parallel performance degrades when the number of elements per processor is low. This is to be expected, since the communication cost increases when using more processors while the individual work loads decrease as the number of elements per processor is reduced, which means that the total cost for large enough numbers of processors is dictated by communication operations.
Figure 47: Inflatable structure test – parallel speedup for the million elements. |
The behavior of the solution phase is possibly more unexpected. The costs reported in Table 3 correspond to a better than linear scaling, which is a consequence of the design of the AMGCL solver, which requires less iterations for larger numbers of processors. In any case, we observe that parallel performance is good for smaller numbers of processors but stops being worthwhile for the last test, since doubling the number of processors from to only produces a modest reduction in calculation costs. Again, this is consistent with communication dominating the total cost of the procedure.
The same strong scalability study can be done for the million elements grid, producing the results presented in Fig. 48, and yields results that are qualitatively similar to those obtained for the million element case. Here, however, the larger problem size means that we can use more processes before communication costs dominate, obtaining better scalability results for a given number of processors.
Figure 48: Inflatable structure test – parallel speedup for the million elements. |
Finally, we can use the results we have to estimate the weak scalability of the algorithm. Weak scalability is calculated by comparing the cost of solving a problem with a given number of processors to that of solving a larger problem with a proportionally larger number of processors. In our case, the cost of assembly is proportional to the number of elements while the cost of the system solution is proportional of the number of degrees of freedom and therefore to the number of nodes. Refining the problem, we obtained a mesh that contains exactly times more elements while multiplying the number of nodes by approximately . We used this fact to estimate the weak scalability by comparing the time used to solve the million element problem with the time required to perform the same operation using 8 times more processors in the million element mesh. This is presented in Table 5, where we can see that, while the build phase does scale weakly, the fine problem takes up to four times as long to solve for the fine mesh.
Time ratio (fine problem/coarse problem) | ||
Average assembly time ratio | ||
Typical solution time ratio |
(1) Ultra-lightweight structures with integrated photovoltaic solar cells: design, analysis, testing and application to an emergency shelter prototype. EC project within the Seventh Framework Programme, Grant No. 314891.
The second example we used to benchmark the solver is the flow around a race car, using the geometry shown in Fig. 49, adapted from [88]. The car is long, wide and high and it is placed within a fluid domain measuring in the streamwise, cross-stream and vertical directions respectively. The problem being simulated consists in a flow of air (, ) at , which corresponds to a Reynolds number of .
Figure 49: Race car test – geometrical model. |
As in the previous case, the mesh is not designed for high-quality simulation (this would require a boundary layer mesh or at least a wall law) but to test the parallel capabilities of the solver. We test two different meshes: the first one contains million nodes and million tetrahedral elements with sizes ranging between close to the surface of the car and in the far regions, while the second one is obtained by the edge refinement of the first, which is composed of million nodes and million elements. Some details of the finest mesh used in the tests can be observed in Fig. 50.
(a) | (b) |
Figure 50: Race car test – details of the finer mesh. |
Again, five time steps are simulated, using a time step of . Between and processes were used for the tests. A summary of the times and iteration counts measured is presented in Table 6 for the million element mesh. As in the previous case, we observe a different behavior for the first iteration, due to the fact that it includes the time required to build and allocate the data structure of the system matrix and vector. In this case, the solution required less iterations to converge to the desired tolerance and, unlike in the previous case, no convergence problems were detected in the solution of the linear system. As a result, no distinction will be made between the results on the last time step and those on the previous ones. However, we do note that the first iteration requires significantly more time to solve the system than subsequent ones, specially for low process counts. As before, we consider this a consequence of the fact that the initial condition used is a bad approximation to an equilibrium solution.
MPI processes | ||||||
Assembly time | ||||||
Solution time | ||||||
Num. of iterations | ||||||
Assembly time | ||||||
Assembly speedup | ||||||
Solution time | ||||||
Solution speedup | ||||||
Assembly time | ||||||
Assembly speedup | ||||||
Solution time | ||||||
Solution speedup | ||||||
Global speedup |
The parallel efficiency, in terms of strong scalability, is presented in graphical form in Fig. 51. The finite element procedure shows good scalability up to processors, where increasing times the number of processors reduces the assembly time by a factor of . This simulation, which corresponds to around thousand elements per process, gives us an upper limit to the scalability of the current implementation since, from this point on, increasing the number of processes does not result in a reduction of the assembly time. The system solution follows a similar trend, since in this case the solution time is actually increased when the number of processors is doubled from to .
Figure 51: Race car test – parallel speedup for the million elements. |
The same test was simulated using the million element mesh and the measured times are reported in Table 7. Some snapshots of the obtained velocity field are shown in Fig. 52, to provide an idea of the mesh resolution and the nature of the solution after five time steps. We observe that, with a larger model, we do not reach the limit of the parallel implementation as in the previous case, although the parallel performance does drop slightly for the cases with more processors.
MPI processes | ||||||
Assembly time | ||||||
Solution time | ||||||
Num. of iterations | ||||||
Assembly time | ||||||
Assembly speedup | ||||||
Solution time | ||||||
Solution speedup | ||||||
Assembly time | ||||||
Assembly speedup | ||||||
Solution time | ||||||
Solution speedup | ||||||
Global speedup |
(a) | (b) |
Figure 52: Race car test – details of the velocity solution on the finer mesh. |
The relative costs of the finite element assembly and solution phases are shown in Fig. 53. As in the inflatable structure test, we see that the solution represents takes the lion's share of the computational time and will have the most impact on the overall performance of the code. Again, we see that the first solution step has a significantly increased cost due to the additional operations and poor scalability, although the drop in parallel performance is not so severe as in the previous example.
(a) 12 million element mesh. | (b) 102 million element mesh. |
Figure 53: Race car test – time costs of a single iteration. |
The strong scalability results of the million element case are presented in graphical form in Fig. 54. As was already mentioned, we do not observe the same drop in parallel performance as in the smaller model, due to the fact that here we have 8 times more elements per process. The assembly phase shows good performance up to the largest test, where the reduction in time is less than would correspond to the increase in processors, but the overall performance continues to be dictated by the system solution costs. The system solution shows good parallel performance in all cases.
Figure 54: Race car test – parallel speedup for the million elements. |
We also estimated the weak scalability in this case, keeping in mind that it is an optimistic estimate for the solve phase, since the increase in the number of processors is slightly larger than the increase in the number of nodes (which changes by a factor of in this case). The results are presented in Table 8 and coincide qualitatively with what was observed for the inflatable structure case. The build phase shows good weak scalability, close to one (although it drops somewhat in the vs. process comparison), while the solver has a poorer performance.
Time ratio (fine problem/coarse problem) | ||
Average assembly time ratio | ||
Typical solution time ratio |
In the present work it has often been necessary to record statistics of turbulent flows. Sometimes this has been challenging, due to the amount of data to be analysed and to the parallel environment in which the simulations have been run, which has made necessary the synchronization of data across processes.
To understand the problems posed by the calculation of statistical results, consider for example the unbiased estimator of the variance of a random variable obtained using samples, given by
|
(4.270) |
where is the estimate of the mean of obtained using samples,
|
(4.271) |
The naive approach to the computation of the variance of involves two loops over the data series: a first one using Eq. 4.271 to obtain and a second one to evaluate Eq. 4.270. To do so, one should store the entire dataset and analyse it as a post-process. Take as an example the turbulent channel flow simulations using linear hexahedral elements. To record statistical data on this problem, the different values of interest were sampled on the integration points of the mesh. Using second order Gaussian integration we have 8 Gauss points per element. With up to hexahedra, we obtain samples per variable and time step. Keeping in mind that we want to calculate statistics involving all three velocity components, pressures and their gradients, storing the entire data set soon becomes very expensive in terms of memory.
Even if that data was effectively collected, consider that we used it to compute plane averages. In a parallel environment, the integration points on a given plane will likely lie on multiple processes, so the entire data set for the plane has to be gathered on a single process in order to evaluate Eq. 4.270.
When calculating the variance, one might compute it without storing the entire data series by manipulating Eq. 4.270 to obtain
|
(4.272) |
which can be calculated in a single pass, thus avoiding the need to store the data series. Unfortunately, this expression runs into numerical roundoff errors if . This is easy to see if one considers that in this case, can be expected to be a small number for each individual term in the summation of Eq. 4.270, while both and will be large positive numbers, so their difference might have too few significant digits1.
Instead, we have followed the approach of [89], which provided formulas to compute the mean and variance of a data set given the means and variances of two sub-sets of the data. A similar procedure is presented for third and fourth order moments in [90] and generalized to arbitrary order moments in [91]. These formulas allowed us to calculate statistical results in a single pass, storing (and communicating across processes when needed) only a partial result for each statistic.
(1) There are ways around this issue. For example, one could use an auxiliary variable , where is a crude approximation of the mean, to reduce roundoff error.
Consider a set of samples divided into two arbitrary subsets , , containing and elements respectively, such that and . The means of , and are related by
|
|
defining we can write
|
(4.273) |
Eq. 4.273 can be introduced in Eq. 4.270 to obtain a single pass formula for variances. Introducing the intermediate result ,
|
(4.274) |
Now we can develop the first term on the last line
|
where we have used the definition of to say in the last step. The same reasoning can be used on the second term on the last line of Eq. 4.274 to obtain
|
Going back to Eq. 4.274, we can use the fact that to write
|
from here we can obtain the desired expression, given in [92], which is
|
(4.275) |
In practice, it is convenient to store the sum of all terms as an intermediate result instead of the mean. Defining , Eq. 4.275 can be rewritten as
|
It is useful to particularize this expression for the case , , which corresponds to adding a new measurement, , to the data set
|
We can keep track of as many partial results as needed by storing , and for each subset and using Eqs. 4.278 and 4.279 to update them. Once the calculation is finished and, for parallel simulations, any distributed data is gathered, the partial results can be combined using Eqs. 4.276 and 4.277 and the mean and variance of the complete record is recovered by
|
(4.280) |
The present approach was extended to covariances in [91]. The covariance of two random variables , with means , can be estimated from realizations of as
|
(4.281) |
which again requires a previous estimate of the mean of each variable.
We can obtain a single pass formula for the covariance using a similar procedure to that followed for variances in the previous section. We define the intermediate result and use Eq. 4.273 to write and in terms of the partial results in Eq. 4.281. After rearranging the resulting expression, we obtain
|
(4.282) |
which can be particularized for the case where , as
|
(4.283) |
The third order central moment of a distribution can be estimated from samples as
|
(4.284) |
It can also be calculated in a single pass by means of the following formula, taken from [90]:
|
(4.285) |
In the present work, we have not used third order central moments, but the turbulence energy budget involves correlations between three different variables (two velocity fluctuations and a gradient). Triple correlations can be estimated using the general expression
|
(4.286) |
which again can be transformed into a single-pass formula by using Eq. 4.273 to write the different means that appear in Eq. 4.286 in terms of the partial means in each subset. Rearranging the terms and introducing the partial result produces the final expression
|
(4.287) |
Using Eq. 4.287, we can evaluate any triple correlation in a single pass, provided that we also keep track of the pairwise covariances and individual averages of each variable involved in the calculation. Fortunately, in the present work we were already interested in these quantities, as they appear in other terms of the turbulence energy budget, and this did not suppose an additional cost.
Finally, the particular case , results in the following simplified expression
|
(4.288) |
The parallelization of an existing code is a challenging task and requires significant efforts, some of which we presented here. As a general remark, it is important to design the code to be parallel from the start, choosing algorithms that require a minimum amount of parallel communication by design, rather than just parallelizing existing algorithms. This is particularly important in the choice of linear solvers, both because of the large impact the solution has in the total cost of the problem and because traditional approaches such as direct or Krylov solvers tend to parallelize poorly due to their communication requirements. We saw another example of this in the techniques for the calculation of flow statistics the algorithms of Section 4.6, where a specially designed technique is much more appropriate than the naive approach.
From the point of view of the parallel design of the code, Kratos Multiphysics currently uses blocking communication operations, in which execution of the code stops while data is being transferred between processors. Newer versions of MPI allow non-blocking communication, in which the data to be sent is defined and calculations can continue while communication goes on in the background. This could allow significant time savings for all calculations that can be written in a way where sent data is not immediately required in the receiving process.
Another addition that is being considered is the use of hybrid parallelization, based on combining a distributed approach such as the one presented here with a shared memory implementation. This could be potentially useful in machines such as the Gottfried cluster we used for our tests, where each calculation node contains multiple processors with a shared memory. In this situation, hybrid parallelization would allow us to use MPI for inter-node communication and simpler shared memory parallelization for the processors within the node.
Finally, we have devoted some time to describe our approach to partitioning the calculation mesh in Section 4.3. While this effort is essential for the initial subdivision of the domain, it is not sufficient when the calculation mesh changes during the problem, something that will happen in Chapter 5. When this happens, an approach for dynamic re-balancing of the problem would be required, reassigning nodes and elements to ensure that the computational load on each process remains homogeneous during the entire simulation.
We want to remark that the techniques and results presented in this chapter represent some recent developments in the parallelization of the Kratos Multiphysics FEM framework and are a part of an ongoing work. In this sense, they should be understood as a snapshot of some recent developments rather than a finished result. This is particularly true for the numerical results presented in Section 4.5 as AMGCL, the solver library we are using, is still under active development.
One of the main advantages of finite elements is the possibility of using unstructured meshes, adapting the element size to the features of the problem and using finer resolutions near regions of interest. This requires a certain degree of familiarity with the problem being solved, as an insufficient mesh resolution can lead to missing important features such as boundary layers or sharp changes in the solution. In this sense, it would be desirable to have the ability to adaptively modify the mesh during the simulation, ensuring that its resolution is sufficient to represent the solution with a given accuracy at all times.
The first problem related to this strategy is how to quantify the error in the solution. One popular approach to this question are a posteriori error estimation techniques (see for example [93,94,95,96]), where the computed solution itself is used to assess its accuracy. We explore one of such methods, closely related to the VMS stabilized formulations introduced in Chapter 2, which was originally presented in [97] for convection-diffusion problems and has been applied to the Navier-Stokes equations in [98,99].
Once we are able to estimate the error and its distribution across the domain, we can modify the calculation grid to increase the overall accuracy. Many different mesh modification strategies have been proposed since the pioneering work in the late eighties [100,101,102], involving for example local mesh modifications [103], movement of mesh nodes through the solution of an auxiliary elasticity problem [104], mesh morphing techniques [105] or edge stretching [106]. However, mesh refinement, and meshing in general, is a particularly challenging problem in a distributed memory setting, as maintaining mesh quality over the entire domain and ensuring that the mesh is conforming is a very non-local problem, requiring communication across the different parallel subdomains. We propose a mesh refinement algorithm based on edge division that was designed with parallel performance as its main goal, requiring as little information that is not local to each element as possible.
Our mesh refinement strategy was originally conceived as a complement to the incompressible fluid solver of Chapter 2, with the goal of increasing the reliability of the solution and optimizing the number of elements for the simulation of large turbulent flow problems with meshes in the LES range. However, during the development of the present work, an opportunity appeared to use the same approach in the simulation of viscoplastic fluids.
Viscoplastic fluids are a class of non-Newtonian fluids that are rigid unless the applied shear stress is larger than a threshold, known as the yield stress. We concentrate our attention on Bingham fluids in which, once the material starts to flow, shear stress varies linearly with strain rate increments. Adaptive mesh refinement techniques, involving full remeshing of the domain, have been used in the past to simulate plane and axisymmetric Bingahm fows [107,108,109] and also to simulate depth-integrated free surface flows using a shallow water approximation [110]. We will apply our approach to the simulation of both plane and fully tri-dimensional cases.
The present chapter is organized as follows: first, the complete refinement procedure and its parallel implementation are presented in Section 5.2, followed by their application to incompressible flows in Section 5.3. Section 5.4 introduces the solver used for the simulation of non-Newtonian flows, which is applied to the simulation of Bingham fluids in Section 5.5. Some final remarks and conclusions are given in Section 5.6.
The refinement procedure we use is based on creating new elements by edge division. New nodes are inserted on edge mid-points of elements where the solution is considered to have a too large error. Once the new nodes have been added, the mesh is adapted to include the new nodes by subdivision of the existing elements. This approach involves several clearly differentiated components, acting in succession:
In some examples we have considered one additional step, using local mesh improvement techniques to minimize the distortion of the elements in the new mesh.
It is important to note that the error estimation and the mesh refinement technique are independent of each other. This would allow us to combine the error estimator we present with a completely different refinement strategy, such as a full remeshing using Delaunay triangulation. Conversely, the only input required by the mesh refinement strategy is knowing which elements must be divided. This means that it could be used in combination with a different error estimator. For example, by choosing an estimator not tied to VMS stabilization, we could use the same refinement technique in combination with the FIC solver presented in Chapter 3.
The error estimator we use is based on the ideas presented by Hauke et al. in [97] for fluid transport problems. The same approach was applied to the Navier-Stokes equations in [99] and in [98], where part of the material that constitutes this chapter was originally presented. This estimator is motivated by the scale separation introduced in VMS formulations, which we presented in Chapter 2 for Newtonian flows and will be used again in Section 5.5 to stabilize viscoplastic flows.
Considering that the large scale variables represent the part of the solution reproduced by the finite element mesh, and small scale variables represent the part that is not resolved, the later can be understood as a measure of the local error in the solution. Once the large scale flow has been solved, the small scale can be evaluated on chosen points in the domain and its magnitude can be used as an a posteriori error estimator, identifying regions where the mesh is too coarse.
Following this argument, we define the following estimate of the error in element , to be used in VMS stabilized formulations
|
(5.289) |
In the present chapter we are mainly concerned with the static versions of the ASGS and OSS methods, which will be briefly recalled. The small scale model for the static ASGS formulation was defined in Chapter 2 as
|
(5.290) |
while the corresponding model for the static OSS method was introduced as
|
(5.291) |
Replacing the small scale velocities in Eq. 5.289 by their definition we obtain the final expression for the estimator. Using Eq. 5.291, the OSS estimator can be expressed as
|
(5.292) |
On the other hand, for the ASGS formulation, we use the definition for the small scales given by Eq. 5.290. This leads to an expression that is equivalent to dropping the projection from Eq. 5.291.
To perform a refinement step we evaluate the error estimate on each element and identify those elements where the estimate is larger than a pre-defined tolerance. These elements are then split according to the algorithm described in the following section.
It is worth noting that multiple variants of a subscale based error estimator were presented in [97]. The version presented here corresponds to the case where no elemental boundary integrals are included in the indicator. We chose to do so to keep consistency with the actual small scale model we use in the calculations. The boundary terms in question appear when keeping the elemental boundary integrals in the derivation of the stabilized VMS formulation. Since we neglected these terms in our derivation (as was shown in Chapter 2), we will not take them into account here.
The mesh refinement strategy we use is based on the local subdivision of existing triangles or tetrahedra by edge division. The procedure was designed to require only a minimal amount of information that is not local to the elements to be refined, in order to simplify its implementation in a distributed memory environment. The main idea of the refinement algorithm is that, once an element has been identified as a candidate for refinement, it is divided into new elements created by splitting the edges of the original element in half. Neighboring elements are then refined by splitting some of their edges as required to maintain consistency. The main steps of this procedure are shown graphically in Figure 55 and can be described as follows:
Regarding the last step, the creation of new elements is done according to predefined subdivision patterns, based on which and how many edges of each triangle or tetrahedra were subdivided in Step 2.
The mesh refinement strategy described in the previous section is based on inserting nodes on edge midpoints and subdividing existing elements to include the new nodes. Unfortunately, knowing only which edges to split in each tetrahedron is not enough to ensure that the resulting mesh will be conforming. Consider for example the two elements in Fig. 56, where two new nodes are inserted. There are two possible ways in which the common face can be divided, corresponding to the two tetrahedra in Fig. 56c. To obtain a conforming mesh, the splitting strategy has to be designed in a way that ensures that the division of each element results in conforming faces.
(a) Original elements. | (b) Conforming division. | (c) Non-conforming division. |
Figure 56: Division of tetrahedra based on edge splitting. |
This restriction is problematic in a distributed memory environment, as the elements involved might belong to different partitions. In such situation, obtaining information from the neighbor element is not straightforward and involves communication between the partitions.
To solve this issue, we use an approach that is based exclusively in the numbering of the existing nodes, which is both available locally in the partition and known to be identical across partitions, avoiding all parallel communication. We start by assuming that all the edges of the element are split by their midpoints, resulting in four smaller elements in the case of a triangle or eight in a tetrahedra. If a given edge is not divided, at least one of the new elements touching that edge is eliminated. An example of this operation, which we call a collapse, is presented in Fig. 57, in which the four potential elements obtained by the full refinement of a triangle are reduced to three.
(a) | (b) | (c) |
Figure 57: Collapse operations on a triangle: (a) no collapse; (b) edge collapsed towards node or (c) collapsed towards node . |
To choose between the two possible outcomes of the collapse, the global node indexes of nodes and are compared. The partitioning in Fig. 57b is adopted if the index of node is smaller and the division of Fig. 57c is used otherwise. When subdividing two tetrahedra that share a face, using this criterion ensures that the subdivisions obtained from each element will be conforming. It must be noted that this approach has the obvious drawback of not taking the quality of the refined elements into account, but on the other hand it is purely local and therefore easily parallelizable.
Using this strategy we can determine the shape of the refined triangles or, in the case of a tetrahedron, the way in which its faces will be refined. For tetrahedra, the volume is then divided according to predefined patterns, depending on the shape of its faces.
The splitting operation defines three possible situations on each edge of the tetrahedron, corresponding to the three cases in Fig. 57. Given that there are six edges on each tetrahedron, up to potential face patterns can be defined. Each of those is matched to a division pattern using an utility1 distributed within Kratos Multiphyisics [29] which implements the local refinement operations. This tool, given an array containing the global indices for the nodes involved in the subdivision, divides the faces according to the collapse criterion and produces the connectivities for the new elements to be created. Note that, for some division patterns, a new node is added on the element's center of mass to improve the quality of the resulting elements. A very important point to be made here is to consider how this procedure affects mesh quality. If all edges of an element are divided, the refinement procedure ensures that its quality is preserved, as all new elements have the same angles as the original in this case. Unfortunately, this is not the case for elements where only some of the edges are refined, and mesh quality can be significantly degraded if this kind of partial refinement is performed repeatedly over the same patch of elements. To alleviate the problem, we improve the quality of the resulting mesh using local mesh improvement techniques. For simulations, we used the algorithm presented in [111], which is based on reconnecting the nodes of adjacent elements. For cases, we used the procedure presented in [112], which consists in analyzing clusters of adjacent elements and changing the local topology, adding or deleting nodes and reconnecting elements to improve mesh quality within the cluster. As these techniques were incorporated in the code on a late stage in the presented work, they were not used for the turbulent flow cases. However, we took full advantage of them to simulate the Bingham flow cases presented in Section 5.5.
(1) The source code that provides this functionality can be found in the address https://kratos.cimne.upc.es/projects/kratos/repository/changes/kratos/kratos/utilities/split_tetrahedra.h (retrieved on July 22, 2015).
The proposed mesh refinement strategy has been implemented for a distributed memory environment within the Kratos Multiphysics framework. This means that the domain partitioning model introduced in Chapter 4 is also used here. Individual elements are assigned to a single parallel subdomain and are completely unknown by the others. Nodes are also assigned to a subdomain, which holds the reference values for all data associated to that node, but might be also needed in neighboring domains if they are connected to elements lying on different partitions. When this happens, other partitions store a copy of the nodal data, which has to be updated at different points during the simulation. From the point of view of a given subdomain, nodes are said to be local nodes when that subdomain holds the reference values for their data or ghost nodes otherwise. Our implementation of the refinement strategy relies on an auxiliary sparse matrix that reproduces the edge connectivity pattern of the mesh. As in Chapter 4, we rely on the implementation of sparse distributed memory matrices provided by the Trilinos library [80] to define and store it. We consider a simplified scenario to clarify the presentation of the algorithm. Consider an initial finite element mesh containing nodes and elements divided in subdomains. The nodes are numbered consecutively in the range and ordered by subdomains, such that, if a node is local to subdomain , its index will be in the range . We remark that this is done to simplify the notation used to describe the implementation, but it does not represent a restriction on the actual implementation. In practice we only assume that the nodes are numbered sequentially as a whole, even if consecutive nodes are not in the same partition. Additionally, we denote the edges of finite elements in the mesh as pairs of node indices , with . We define a sparse matrix of size representing the edge connectivity pattern. Position can only be different from zero if there is some elemental edge joining nodes and . Note that, using our definition of the edge, only contains terms above its diagonal. Matrix is stored using compact storage by rows (CSR) notation and distributed, meaning that each parallel process stores non-zero terms for rows in the range . Note that the process will sometimes need to access rows outside this range, corresponding to ghost nodes in the partition, an operation that requires parallel communication. In the following we refer to the set including all local and ghost nodes known to partition as . The implementation of the refinement algorithm involves multiple tasks that can be grouped into the following steps:
|
Algorithm. 4 Initialization of the matrix of edge connectivities . |
|
Algorithm. 5 Identification of edges to refine. |
|
Algorithm. 6 Definition of temporary node ranges for process . |
|
Algorithm. 7 Definition of node ownership. |
|
Algorithm. 8 Creation of new nodes. |
|
Algorithm. 9 Creation of new elements. |
As a first test of the refinement algorithm and its parallel implementation we refined a tetrahedral mesh homogeneously. We define a cubic domain given by its corners and and generate an initial mesh composed of slightly over one million tetrahedra. This mesh, as all initial meshes used in later examples, has been generated using the pre-processing module of GiD [77]. The domain is fully refined in two passes, first splitting all elements to obtain about million tetrahedra and again for a total of million elements. The local mesh improvement strategy is not used in this case, as we are interested in testing the implementation of the refinement algorithm and its performance. Times required to complete this operation using different amounts of parallel processes is recorded in Table 9. Reported times were obtained using up to three Intel Xeon E5645 processors, each consisting in two six-core CPU at connected to RAM each. Communication between processors was done through an Infiniband connection. The results are also presented in graphical form in Fig. 58.
First step | Second step | |||
Num. procs. | Wall time (s) | Speedup | Wall time (s) | Speedup |
4 | 21.16 | 1.0 | 170.74 | 1.0 |
8 | 10.57 | 2.0 | 88.09 | 1.9 |
16 | 5.71 | 3.7 | 48.99 | 3.5 |
32 | 3.25 | 6.5 | 24.99 | 6.8 |
(a) Relative wall time. | (b) Parallel speedup. |
Figure 58: Homogeneous refinement test – parallel performance. |
While the test results show good parallel performance, it must be remarked that this experiment does not take into account an important aspect in practice: when refinement is not homogeneous, the number of elements in each subdomain changes and, without a load balancing strategy, parallel performance may degrade as different processors can have very different loads if refinement is concentrated on a few of the original subdomains.
We simulated a first set of cases combining the incompressible fluid solver presented in Chapter 2 with the refinement algorithm introduced in the previous pages. All simulations were performed with the static OSS method, coupled with the corresponding error estimator, given by Eq. 5.292. With these tests, our aim was to test the applicability of our refinement strategy on distributed memory simulations, rather than obtaining high quality solutions.
(a) Initial mesh. | (b) Parallel subdomains. |
Figure 59: Cylinder test – initial mesh and parallel partition. |
(a) Final mesh. | (b) Isolines of velocity magnitude. |
Figure 60: Cylinder test – final mesh and velocity isolines. |
From the point of view of load balancing, the element counts in Table 10 show that refinement is not homogeneous across subdomains and, at the end of the simulation, the largest domain has close to three times more elements than the smallest one. This suggests that the practical applicability of the method in a parallel context would be much greater if it included a dynamic load balancing strategy so that elements are always distributed evenly across subdomains.
Process | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Total |
Initial | 496 | 510 | 501 | 493 | 494 | 490 | 505 | 495 | 3984 |
Final | 1056 | 1871 | 836 | 740 | 1884 | 1694 | 1542 | 2043 | 11666 |
Additionally, we studied a realistic three-dimensional case in order to test the refinement strategy on a tetrahedral mesh. We chose to simulate the flow around the Silsoe cube, a benchmark problem for the flow over bluff bodies. This test case reproduces an experiment performed at the Silsoe Research Institute [113] in which a cube with meter sides was placed under incoming wind. We simulate the configuration where the average wind direction is perpendicular to one of the cube faces. The cube is placed at a distance of from the inlet, while the incoming wind is defined according to the logarithmic wind profile of Eq. 5.293 (see for example [2]).
|
(5.293) |
(a) Pressure distribution at , original mesh | (b) Pressure distribution at , refined mesh |
Figure 61: Silsoe cube – pressure results on the central plane and simulation meshes. |
We observe that the refined elements are concentrated near the cube and its immediate wake. In the front of the cube, they are roughly placed along the area where the flow starts to deviate due to the obstacle. Experimental results show that a horseshoe vortex should develop close to the ground in that zone, and the distribution of elements seems to follow it. On the wake region, the refined area develops progressively as vortices detach from the cube and travel downstream. If the simulation was run for a longer period, it should be expected that the refined area would advance towards the exit to obtain a fully refined wake, as happened previously in the cylinder example. Finally, we want to remark that this simulation was performed to test the refinement algorithm in a realistic setting and not to obtain precise results. The Silsoe cube problem was analyzed using the same solver (without adaptive mesh refinement) in [114], obtaining good agreement with the benchmark solutions.
The adaptive mesh refinement procedure presented in Section 5.2 can also be applied to the simulation of viscoplastic flows. For this we use a modified version of the VMS based solver presented in Chapter 2, adapted to the solution of the steady Navier-Stokes equations with non-Newtonian constitutive relations, which will be introduced here.
Defining the fluid's velocity and density , the stress tensor and the external forces , the conservation of linear momentum can be stated as
|
(5.294) |
and the conservation of mass implies that, for an incompressible fluid,
|
(5.295) |
The definition of the problem is completed by introducing a model domain with boundary and appropriate boundary conditions
|
where is the imposed velocity on the Dirichlet boundary , is the outwards unit normal on the Neumann boundary and are the imposed tractions. The stress tensor of Eq. 5.294 can be decomposed into a volumetric part involving the pressure and a deviatoric stress tensor :
|
(5.298) |
where is the second order identity tensor. A constitutive model is required to close the formulation, giving an expression for the deviatoric stresses . A broad class of fluid materials follow a generalized Newtonian law given by
|
(5.299) |
where the apparent viscosity is, in general, a variable that depends on the characteristics of the flow and is the strain rate tensor, defined as
|
(5.300) |
Additionally, it is convenient to introduce the following tensor invariants to measure the magnitude of the strain rate and deviatoric stresses
|
(5.301) |
In the present work, a regularized Bingham model will be used. A Bingham fluid [115,116] is a material that remains rigid while the applied shear stress is lower than its yield stress . Once this limit is reached, the material starts flowing with a constant viscosity , the plastic viscosity. This can be expressed using the notation of Eq. 5.299 if the apparent viscosity is defined as:
|
(5.302) |
Unfortunately, the discontinuous nature of the Bingham model introduces numerical difficulties, as the apparent viscosity is infinite for small strain rates that don't produce flow. As a way to prevent this issue, we have adopted the regularized equation proposed by Papanastasiou [117], replacing Eq. 5.302 with
|
(5.303) |
Figure 62: Bingham model. |
To introduce the variational form of the problem we define spaces and containing the exact values and , respectively, of the solution of the problem in . Additionally, we define the test functions , , where is defined as restricted to the zero Dirichlet condition on . The variational form of the problem can be obtained by multiplying Eqs. 5.294 and 5.295 by test functions , and integrating over the simulation domain :
|
where some terms have been integrated by parts. As seen in the previous chapters, the Galerkin weak form of the Navier-Stokes equations suffers from stability issues. In this case, we used the static versions of both the ASGS and OSS formulations to stabilize it. The choice of using a VMS based formulation has an added benefit: it allows us to use the error estimator presented in Section 5.2.1 without modification. We introduce the discrete solution as , , where and are the discrete spaces defined by the finite element interpolation. Given these definitions, the VMS approach is based in decomposing the problem variables into a large scale part, identified with the finite element solution, and a small scale part:
|
(5.306) |
where the small scale variables , represent the part of the continuous solution that is not resolved with the discrete interpolation. Next we introduce the scale separation of Eq. 5.306 in the variational problem given by Eqs. 5.304 and 5.305. Using test functions belonging to the discrete space , , we obtain
|
where represents a single element. Note that, to obtain this expression, we integrated by parts over individual finite element domains to ensure that the equations only involve the small scale values and not their spatial derivatives. In doing so, we neglected all integrals over element boundaries. Using ASGS stabilization, the model for the small scales is defined as
|
where and represent the residuals of Eqs. 5.294 and 5.295 respectively, evaluated using only the large scale part of the solution , . The stabilization parameters , are defined in terms of a characteristic element length as:
|
(5.312) |
When using OSS stabilization, only the part of the residuals and that is orthogonal to the finite element space is used to stabilize the solution. This results in the following modified model for the small scales:
|
where and are the projections of the residuals onto the finite element space, that is, the solution of the auxiliary projection problem
|
It is worth mentioning that the viscous term in Eqs. 5.310 and 5.313, as well as in the momentum projection in Eq. 5.315, cannot be evaluated using linear finite elements, as is the case of the formulation used in the present work. This is due to the fact that second order derivatives of velocity shape functions are identically zero within the elements. Therefore, this term will be neglected in the following. Introducing the OSS small scale model into the variational form of Eqs. 5.307 and 5.309, the following stabilized formulation is obtained:
|
(5.317) |
|
(5.318) |
Analogously, the ASGS stabilized formulation can be recovered by dropping all terms involving and in Eqs. 5.317 and 5.318.
At this point we can use the standard linear finite element functions to interpolate the large scale velocity and pressure solutions using nodal shape functions :
|
(5.319) |
where is the node index and the total number of nodes, represents the standard finite element functions for scalar variables and its matrix equivalent for vectorial quantities. Introducing the interpolation of Eq. 5.319 into Eqs. 5.317 and 5.318 and successively using the shape functions of each node as test functions , , we obtain the following system of equations
|
(5.323) |
where and represent the vectors of nodal values for velocity and pressure, respectively. The blocks that appear in the system matrix and the right hand side vector of Eq. 5.320 are obtained from the finite element assembly of the different integrals that appeared in the stabilized equations. If and represent node indices, the Galerkin terms in Eqs. 5.317 and 5.318 give rise to the following local matrices:
|
(5.324) |
Analogously, the discretization of the stabilization terms allows us to write
|
(5.325) |
The system in Eq. 5.320 contains multiple non-linear terms: the convective term is non-linear in the velocity, as are all terms involving either the apparent viscosity , the stabilization parameters , and, in the OSS formulation, the projections. To linearize it we use Picard iterations, evaluating all terms in the local contributions using the last known values of the variables and solving the system iteratively. In the case of OSS stabilization, an associated problem has to be solve to calculate the projections, given by the discrete form of Eqs. 5.315 and 5.316:
|
(5.326) |
where and represent the vectors of nodal values for the momentum and mass projections, respectively, and the different terms in the matrix and right hand side vector can be obtained by the finite element assembly of the following local contributions:
|
(5.327) |
Note that, as was done in previous chapters, we use the fact that the projection matrices and have the structure of a mass matrix to approximate them by the corresponding diagonal mass matrix. This avoids the solution of the linear system which would otherwise be required to obtain the projections.
The formulation introduced in the previous section can be combined with the adaptive mesh refinement procedure by introducing the small scale model of Eq. 5.310 for ASGS simulations, or Eq. 5.313 for OSS, in the error estimator of Eq. 5.289. We have used it to simulate several classical examples of Bingham flow problems. As in the previous examples, GiD is used to generate the initial mesh. Here all examples considered are small enough to be computed in a desktop computer and, as a result, the distributed memory capabilities are not relevant. In all examples but the Poiseuille flow, local mesh improvement is used to correct the refined mesh.
Figure 63: Poiseuille flow – geometry and boundary conditions. |
Figure 64: Poiseuille flow – initial mesh. |
(a) Newtonian fluid. | (b) Bingham fluid. |
Figure 65: Poiseuille flow – number of elements at the end of the simulation for different tolerances. |
(a) Newtonian fluid (ASGS). | (b) Newtonian fluid (OSS). |
(c) Bingham fluid (ASGS). | (d) Bingham fluid (OSS). |
Figure 66: Poiseuille flow – streamwise velocity profiles. |
Analyzing the results, we observe a different behavior for the two cases considered. In the Newtonian case, the number of elements in the final grid increases uniformly as the tolerance is reduced. This is in agreement with the expected behavior of the estimator used: consider the that analytical solution of the Newtonian Poiseuille flow is a parabolic velocity profile given by the expression
|
(5.328) |
where is the channel width and is the vertical distance to the lower wall. Consider the solution obtained using the ASGS stabilization. Assuming we obtained a nodally exact solution, the momentum error would be
|
(5.329) |
(a) Initial mesh. | (b) Newtonian fluid. | (c) Bingham fluid. |
Figure 67: Poiseuille flow – detail of the final meshes for the OSS case with tolerance . |
On the other hand, in the Bingham case the profile has an unyielded central area that moves as a block and two yielded regions close to the wall with a parabolic velocity profile. The central area, with constant velocity, can be solved with practically no error with a coarse mesh size, and most of the new elements are placed in the yielded regions. As the refinement is more localized, the overall number of elements is smaller. As a final remark, we can observe that, for small tolerances, the refinement fails to start if the mesh is too coarse to properly represent the flow. This can be seen in in Fig. 65b for the ASGS simulation with a tolerance of and for the OSS cases with tolerances and , where no new elements are added. These cases produce a solution where the yielded regions do not develop and the velocity is practically zero everywhere.
Figure 68: Plane extrusion – geometry and boundary conditions. |
Parameter | Value |
Fluid density | |
Yield stress | |
Fluid viscosity | |
Regularization coefficient |
As discussed in [121], using the present settings, with smooth walls and a very small plastic viscosity, the problem is analogue to a perfect plasticity problem. An exact solution for the plasticity problem, obtained using slip line theory, is reported by Lubliner in [124]. This solution predicts the formation of slip lines once the applied pressure reaches
|
(5.330) |
(a) . | (b) . | (c) . |
(d) . | (e) . | (f) . |
(g) . | (h) . | (i) . |
(j) . | (k) . | (l) . |
(m) . | (n) . | (o) . |
(p) . | ||
Figure 69: Plane extrusion (ASGS) – evolution of strain rate (left) and mesh (right). |
(a) . | (b) . | (c) . |
(d) . | (e) . | (f) . |
(g) . | (h) . | (i) . |
(j) . | (k) . | (l) . |
(m) . | (n) . | (o) . |
(p) . | ||
Figure 70: Plane extrusion (OSS) – evolution of strain rate (left) and mesh (right). |
(a) Number of elements. | (b) Number of nodes. |
Figure 71: Plane extrusion – evolution of the simulation mesh. |
Figure 72: Plane extrusion – applied pressure vs. inlet velocity. |
We can also observe in Fig. 72 that the OSS simulation predicts a slightly later plastification, corresponding to higher ram pressures, when compared to the ASGS method, while the latter is closer to the plasticity theory result. A possible explanation for this could be that the ASGS estimator produces a larger number of elements overall, as can be seen in Fig. 71, which provides a slightly better accuracy in the solution. As an attempt to quantify the effectiveness of the refinement procedure, we also simulated the problem using OSS and a uniform mesh containing elements, a similar amount as in the finest mesh obtained during the refinement, to use as a reference solution. The velocity–pressure relation for this simulation is also plotted in Fig. 72 and shows a delayed formation of the yielded region, which appears at higher ram pressures than expected. While using a uniform mesh would be a very naive approach in this case, the results show that the use of a refinement procedure results in an improved solution for a given number of elements in the mesh.
Figure 73: cavity flow – boundary conditions. |
The fluid density is set to and the dynamic viscosity for the yielded region is set to . We will simulate multiple cases with different yield stresses to test a range of values of the Bingham number, defined as
|
(5.331) |
(a) . | (b) . |
(c) . | (d) . |
(e) . | (f) . |
Figure 74: cavity flow – velocity streamlines and distribution of yielded (light) and unyielded (dark) regions. |
Figure 75: cavity flow – vertical position of the vortex center, compared to the results of [125]. |
(a) | (b) |
Figure 76: cavity flow – evolution of the number of elements. |
(a) cavity flow – geometry and velocity boundary conditions. | |
Figure 77: cavity flow – velocity streamlines and distribution of yielded (light) and unyielded (dark) regions. |
The flow is simulated in 10 solution steps, refining after each solution. Starting from a uniform tetrahedral mesh with divisions along each edge, containing approximately thousand nodes and thousand elements, a final mesh with thousand nodes and thousand elements is obtained. The final distribution of yielded and unyielded regions and velocity streamlines is shown in Fig. 77. The vortex center in this case is placed at a vertical position , in agreement with the results shown in Fig. 75.
Figure 78: Sudden expansion – geometry. |
Figure 79: Sudden expansion – simulation domains. |
The problem is solved for the case where both the Reynolds and Bingham numbers equal to one, calculated using as the reference length and a reference velocity defined in [127] as
|
(5.332) |
(a) Side view. | (b) – | (c) – | (d) – |
Figure 80: expansion – yielded (dark) and unyielded (light) regions. |
(a) Side view. | (b) – | (c) – | (d) – |
Figure 81: expansion – yielded (dark) and unyielded (light) regions. |
Figure 82: Sudden expansion – evolution of the number of elements during the simulation. |
(a) Initial mesh. | (b) Final mesh. |
Figure 83: expansion – side view of the calculation meshes. |
(a) Initial mesh. | (b) Final mesh. |
Figure 84: expansion – side view of the calculation meshes. |
The initial and final meshes are shown in Fig. 83 for the test and Fig. 84 for the case. It can be observed that refined areas coincide with yielded regions, where higher velocity gradients are generally found: close to the solid walls and just after the expansion section.
(a) Original domain. | (b) Coarse mesh. | (c) Refined mesh. |
Figure 85: Refinement of curved edges. |
The incompressible flow examples presented in Section 5.3 allow us to say that our approach correctly identifies the zones where refinement is required. However, regarding the parallel efficiency of the method, we found that dynamic load balancing is necessary to solve large scale examples efficiently, as local refinement can quickly unbalance the original partitioning of the model. Additionally, mesh coarsening would be a welcome addition to solve dynamic problems as, in our experience, the regions with larger error tend to follow moving vortices and this currently results in a complete refinement of turbulent wakes. Although our adaptive refinement strategy was originally designed to simulate turbulent flows, we found that it is also suited to the simulation of viscoplastic fluids. The fact that many problems of interest in this field are generally static and have sharp interfaces between yielded and unyielded regions plays to the strengths of our approach, as coarsening is rarely required. We found that our method was able to identify the regions where fluidification occurs even when starting from a uniform initial mesh. While the capabilities of the method have been demonstrated by the test cases presented in Section 5.5, there are some questions that could be addressed in the future. For example, how should the tolerance for the error estimator be set? Is it problem dependent? In our experience, the solution is sensitive to the tolerance set for the error estimator: a small tolerance produces very fine meshes, while a large tolerance can even prevent the refinement from starting if the original mesh is too coarse. This was shown to be the case in some of the Poiseuille flow examples presented in Section 5.5.1. Going back to turbulent flow, there is one interesting question regarding the chosen estimator. According to the arguments presented in Chapter 2, the small scale part of the solution can be understood as the basic ingredient of a VMS-based turbulence modeling. In this sense, imposing a restriction on its magnitude seems to be contradictory with our goal in previous chapters, which was to perform a LES-like simulation thanks to the contribution of the small scale terms, and seems to push the mesh size towards DNS simulations, which we discarded as prohibitively expensive for problems of engineering interest.
In the present work we have explored the capabilities of stabilized finite element formulations for the solution of turbulent flow problems. To achieve this goal, we have studied two families of methods: VMS and FIC formulations, applying them to the solution of different benchmark problems. In addition, we have studied numerical techniques relevant to the solution of large complex problems, in particular the parallel implementation of the code and the use of adaptive mesh refinement to improve the quality of the simulation mesh.
As a general observation for the different stabilized formulations considered, we noticed a notable difference between using linear tetrahedral or hexahedral finite elements in terms of the quality of the solution. While this was not unexpected, we were able to quantify the difference for the turbulent channel flow, where we see that, in general, we need an order of magnitude more tetrahedral elements to achieve the same quality in the solution as for hexahedra.
For VMS methods we have studied the behavior of classical formulations on the channel flow problem, in terms of velocity averages and variances and of the turbulence kinetic energy balance. Additionally, we have presented a new model for the pressure subscale based on the use of an approximate small scale space, which has been shown to provide a promising improvement in the quality of the solution for the channel flow test when compared to the usual approach. However, we want to remark that we consider this only a starting point, since the effect of the pressure small scale on the solution has been shown to be problem-dependent in the literature.
Regarding FIC formulations, introduced in Chapter 3, we have presented a new method that includes a diffusive term based on imposing the FIC balance in the direction of the gradients of each component of velocity, in addition to the usual streamline diffusion. Although this term is derived from the FIC balance (as opposed to a turbulence modeling argument), we have shown its presence allows us to obtain a more accurate solution in the turbulent channel flow benchmark. We have also applied the resulting formulation to more complex geometries, and in particular to the wind flow around a parabolic solar collector. While the simulation performed represents only a first approximation to the problem, as more tests and longer simulation times would be required to obtain a more reliable solution, they are encouraging in terms of the performance of the method.
In Chapter 4, the parallel performance of the solver was studied. We presented the measured calculation times in large simulations, measuring the parallel scalability when using up to 3072 processors. We observed that the solution time is dominated by the linear system solver, which is significantly more expensive than the finite element assembly procedure. While the parallel solution of linear systems is beyond the scope of the present work, we have concentrated our efforts in obtaining a good parallel performance in the parts of the solution where we have direct control, relying on external libraries for system solution.
Finally, in Chapter 5 we investigated the possibility of using adaptive mesh refinement to optimize the mesh during the simulation, which we applied both to turbulent and non-Newtonian flow examples. While the results show the potential of the method, we found that the applicability of our approach to turbulent flow problems is limited by the lack of a mesh coarsening procedure. Since turbulence is a highly dynamic problem, regions that required a finer resolution at a given step might be solvable with a much coarser grid at a later time but, without mesh coarsening, we are stuck with the finer resolution for all subsequent steps, greatly increasing the total number of elements. A second issue that was detected, in the case of distributed memory simulations, is that dynamic load balancing is crucial to maintain a good parallel performance during the entire solution. In spite of these limitations, the approach was found to be well-suited to laminar non-Newtonian flows, where finer resolutions are typically required along localized high-shear regions.
Parts of the work presented in this monograph have been published in scientific journals. In particular, some of the work related to the parallel implementation of the solver was included in
While the work in adaptive mesh refinement has been used to prepare the following publications
Articles related to the work contained in Chapters 2 and 3 are planned.
Finally, we want to note that an implementation of all formulations and techniques presented in this document is available within Kratos Multiphysics. In particular, the VMS methods introduced in Chapter 2 currently constitute the basis of the CFD module of Kratos Multiphyisics, both in the monolithic form which has been presented and used in the present work and as a fractional step implementation of the Q-OSS formulation. This solver has been used by other researchers, both in collaboration with the authors and in other groups, and in the elaboration of multiple Master theses, where students have used it for example to perform studies of the wind flow around bridge sections or to build an ALE-Chimera solver for CFD problems with moving parts.
The results obtained in the course of the present work suggest several possibilities for future investigation and improvement.
In terms of VMS formulations we are of the opinion that, while using scale separation and mesh projection is a valid option introduce a LES-like separation between the resolved and unresolved part of the solution, there is still work to do in understanding the practical behavior of the resulting method as a turbulence model. In particular, the behavior of the pressure small scale and its impact on the solution is still poorly understood. While we were able to compare the results obtained using different formulations, it is not always clear why a particular method provides a more accurate solution than the other. Additionally, for the proposed pressure subscale model, although the results in our test are encouraging, there is still work to do in understanding precisely why we obtained a better approximation and to verify if this result would hold for other problems.
A similar argument could be made in terms of the new FIC formulation: while the resulting formulation results in an improved accuracy, we did not provide a justification of why this happens. In this particular case, it is interesting to note that the gradient diffusion terms that constitute the main difference to the classical FIC approach have a similar structure to the family of LES methods known as gradient models such as the Clark model [132] or Modulated Gradient Diffusion [133]. Exploring its relation to such models could allow us to obtain a better understanding of the method in terms of its behavior in turbulent problems and motivate future improvements.
Regarding the development of parallel capabilities, the immediate work will be centered on continuing the integration of the AMGCL library as it is developed. Another possibility that will be explored is the addition of a hybrid implementation, combining shared and distributed memory capabilities. It could also be worthwhile to work on improving the partitioning procedure, using a more efficient coloring procedure and, most importantly, adding dynamic load balancing procedures to adjust the work load in each processor if the simulation mesh is changed. This would be a welcome addition in particular for the adaptive mesh refinement procedure presented in Chapter 5, as it would extend the range of applicability of the method.
[1] Simiu, Emil and Scanlan, Robert H. (1996) "Wind effects on structures: fundementals and applications to design". John Wiley & Sons, Ltd
[2] Pope, Stephen B. (2000) "Turbulent Flows". Cambridge University Press
[3] Kolmogorov, A. N. (1941) "The Local Structure of Turbulence in Incompressible Viscous Fluid for Very Large Reynolds Numbers", Volume 30. Doklady Akademiia Nauk SSSR 301–305
[4] Kolmogorov, A. N. (1991) "The Local Structure of Turbulence in Incompressible Viscous Fluid for Very Large Reynolds Numbers", Volume 434. Proceedings of the Royal Society of London. Series A: Mathematical and Physical Sciences 1890 9-13
[5] Spalart, P. R. and Allmaras, S. R. (1994) "A One-Equation Turbulence Model for Aerodynamic Flows", Volume 1. Recherche Aerospatiale 5–21
[6] Launder, B. E. and Sharma, B. I. (1974) "Application of the energy-dissipation model of turbulence to the calculation of flow near a spinning disc", Volume 1. Letters in Heat and Mass Transfer 2 131 - 137
[7] Chien, Kuei-Yuan. (1982) "Predictions of channel and boundary-layer flows with a low-Reynolds-number turbulence model", Volume 20. AIAA journal 1 33–38
[8] Wilcox, David C. (1998) "Turbulence Modeling for CFD". DCW industries
[9] Smagorinsky, J. (1963) "General circulation experiments with the primitive equations: I The basic equations", Volume 91. Monthly Weather Review 99–164
[10] Donea, Jean and Huerta, Antonio. (2003) "Finite Element Methods for Flow Problems". John Wiley & Sons, Ltd
[11] Andrés E. Tejada-Martínez and Kenneth E. Jansen. (2005) "On the interaction between dynamic model dissipation and numerical dissipation due to streamline upwind/Petrov-Galerkin stabilization", Volume 194. Computer Methods in Applied Mechanics and Engineering 9-11 1225 - 1248
[12] Alisa V. Trofimova and Andrés E. Tejada-Martínez and Kenneth E. Jansen and Richard T. Lahey Jr. (2009) "Direct numerical simulation of turbulent channel flows using a stabilized finite element method", Volume 38. Computers & Fluids 4 924 – 938
[13] Oñate, Eugenio and Valls, Aleix and García, Julio. (2007) "Computation of turbulent flows using a finite calculus-finite element formulation", Volume 54. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Fluids 6-8 609–637
[14] Oñate, Eugenio and Valls, Aleix and García, Julio. (2007) "Modeling incompressible flows at low and high Reynolds numbers via a finite calculus-finite element approach", Volume 224. Journal of Computational Physics 1 332 - 351
[15] Hughes, Thomas J. R. (1995) "Multiscale phenomena: Green's functions, the Dirichlet-to-Neumann formulation, subgrid scale models, bubbles and the origins of stabilized methods", Volume 127. Computer Methods in Applied Mechanics and Engineering 1-4 387–401
[16] Hughes, Thomas J. R. and Feijóo, Gonzalo R. and Mazzei, Luca and Quincy, Jean-Baptiste. (1998) "The variational multiscale method–a paradigm for computational mechanics", Volume 166. Computer Methods in Applied Mechanics and Engineering 1-2 3–24
[17] Hughes, Thomas J. R. and Mazzei, Luca and Jansen, Kenneth E. (2000) "Large Eddy Simulation and the variational multiscale method", Volume 3. Springer Berlin / Heidelberg. Computing and Visualization in Science 47–59
[18] Hughes, Thomas J. R. and Mazzei, Luca and Oberai, Assad A. and Wray, Alan A. (2001) "The multiscale formulation of large eddy simulation: Decay of homogeneous isotropic turbulence", Volume 13. Physics of Fluids 2 505–512
[19] Gravemeier, Volker. (2006) "The variational multiscale method for laminar and turbulent flow", Volume 13. Springer Netherlands. Archives of Computational Methods in Engineering 2 249-324
[20] Codina, Ramon and Príncipe, Javier and Guasch, Oriol and Badia, Santiago. (2007) "Time dependent subscales in the stabilized finite element approximation of incompressible flow problems", Volume 196. Computer Methods in Applied Mechanics and Engineering 21-24 2413-2430
[21] Y. Bazilevs and V.M. Calo and J.A. Cottrell and T.J.R. Hughes and A. Reali and G. Scovazzi. (2007) "Variational multiscale residual-based turbulence modeling for large eddy simulation of incompressible flows", Volume 197. Computer Methods in Applied Mechanics and Engineering 1-4 173 - 201
[22] Bazilevs, Y. and Michler, C. and Calo, V. M. and Hughes, T. J. R. (2007) "Weak Dirichlet boundary conditions for wall-bounded turbulent flows", Volume 196. Computer Methods in Applied Mechanics and Engineering 49-52 4853 – 4862
[23] Akkerman, I. and Bazilevs, Y. and Calo, V. and Hughes, T. and Hulshoff, S. (2008) "The role of continuity in residual-based variational multiscale modeling of turbulence", Volume 41. Springer Berlin / Heidelberg. Computational Mechanics 371–378
[24] Y. Bazilevs and C. Michler and V.M. Calo and T.J.R. Hughes. (2010) "Isogeometric variational multiscale modeling of wall-bounded turbulent flows with weakly enforced boundary conditions on unstretched meshes", Volume 199. Computer Methods in Applied Mechanics and Engineering 13-16 780–790
[25] Príncipe, Javier and Codina, Ramon and Henke, Florian. (2010) "The dissipative structure of variational multiscale methods for incompressible flows", Volume 199. Computer Methods in Applied Mechanics and Engineering 13-16 791-801
[26] Guasch, Oriol and Codina, Ramon. (2013) "Statistical behavior of the orthogonal subgrid scale stabilization terms in the finite element large eddy simulation of turbulent flows", Volume 261–262. Computer Methods in Applied Mechanics and Engineering 0 154 – 166
[27] Colomés, Oriol and Badia, Santiago and Codina, Ramon and Príncipe, Javier. (2015) "Assessment of variational multiscale models for the large eddy simulation of turbulent incompressible flows", Volume 285. Computer Methods in Applied Mechanics and Engineering 0 32 - 63
[28] Dadvand, Pooyan and Rossi, Riccardo and Oñate, Eugenio. (2010) "An object-oriented environment for developing finite element codes for multi-disciplinary applications", Volume 17. Archives of Computational Methods in Engineering 253-297
[29] Dadvand, Pooyan and Rossi, Riccardo and Gil, Marisa and Martorell, Xavier and Cotela-Dalmau, Jordi and Juanpere, Edgar and Idelsohn, Sergio R. and Oñate, Eugenio. (2013) "Migration of a Generic Multi-Physics Framework to HPC Environments", Volume 80. Computers & Fluids 301–309
[30] Codina, Ramon. (2002) "Stabilized finite element approximation of transient incompressible flows using orthogonal subscales", Volume 191. Computer Methods in Applied Mechanics and Engineering 39-40 4295-4321
[31] Ávila, Matías. (2012) "Nonlinear subgrid finite element models for low Mach number flows coupled with radiative heat transfer"
[32] Temam, Roger. (2001) "Navier-Stokes Equations: Theory and Numerical Analysis". American Mathematical Soc.
[33] Ern, Alexandre and Guermond, Jean-Luc. (2013) "Theory and practice of finite elements", Volume 159. Springer Science & Business Media
[34] Codina, Ramon and Principe, Javier and Ávila, Matías. (2010) "Finite element approximation of turbulent thermally coupled incompressible flows with numerical sub-grid scale modeling", Volume 20. International Journal for Numerical Methods for Heat & Fluid Flow 492–516
[35] Taylor, C. and Hood, P. (1973) "A numerical solution of the Navier-Stokes equations using the finite element technique", Volume 1. Computers & Fluids 1 73 - 100
[36] Hughes, Thomas J. R. and Mallet, Michel. (1986) "A new finite element formulation for computational fluid dynamics: III. The generalized streamline operator for multidimensional advective-diffusive systems", Volume 58. Computer Methods in Applied Mechanics and Engineering 3 305–328
[37] Hughes, Thomas J. R. and Franca, Leopoldo P. and Hulbert, Gregory M. (1989) "A new finite element formulation for computational fluid dynamics: VIII. The Galerkin/least-squares method for advective-diffusive equations", Volume 73. Computer Methods in Applied Mechanics and Engineering 2 173–189
[38] Hughes, Thomas J. R. and Stewart, James R. (1996) "A space-time formulation for multiscale phenomena", Volume 74. Journal of Computational and Applied Mathematics 1-2 217-229
[39] Codina, Ramon. (2001) "A stabilized finite element method for generalized stationary incompressible flows", Volume 190. Computer Methods in Applied Mechanics and Engineering 20-21 268–2706
[40] Codina, Ramon. (2000) "Stabilization of incompressibility and convection through orthogonal sub-scales in finite element methods", Volume 190. Computer Methods in Applied Mechanics and Engineering 13-14 1579–1599
[41] Gravemeier, Volker and Wall, Wolfgang A. and Ramm, Ekkehard. (2004) "A three-level finite element method for the instationary incompressible Navier-Stokes equations", Volume 193. Computer Methods in Applied Mechanics and Engineering 15-16 1323 - 1366
[42] Codina, Ramon. (2001) "Pressure stability in fractional step finite element methods for incompressible flows", Volume 170. Journal of Computational Physics 1 112–140
[43] Bochev, Pavel B. and Gunzburger, Max D. and Lehoucq, Richard B. (2007) "On stabilized finite element methods for the Stokes problem in the small time step limit", Volume 53. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Fluids 4 573-597
[44] Boris, J. P. and Grinstein, F. F. and Oran, E. S. and Kolbe, R. L. (1992) "New insights into large eddy simulation", Volume 10. Fluid Dynamics Research 4-6 199
[45] Gravemeier, Volker and Gee, Michael W. and Kronbichler, Martin and Wall, Wolfgang A. (2010) "An algebraic variational multiscale–multigrid method for large eddy simulation of turbulent flow", Volume 199. Computer Methods in Applied Mechanics and Engineering 13-16 853 - 864
[46] Oberai, A. A. and Wanderer, J. (2005) "A dynamic approach for evaluating parameters in a numerical method", Volume 62. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 1 50–71
[47] Oberai, A. A. and Wanderer, J. (2005) "Variational formulation of the Germano identity for the Navier–Stokes equations", Volume 6. Journal of Turbulence 1-17
[48] Hughes, Thomas J. R. (2000) "The Finite Element Method: Linear Static and Dynamic Finite Element Analysis". Dover Publications, Inc
[49] Ávila, Matías and Príncipe, Javier and Codina, Ramon. (2011) "A finite element dynamical nonlinear subscale approximation for the low Mach number flow equations", Volume 230. Journal of Computational Physics 22 7988 - 8009
[50] Tennekes, Hendrik and Lumley, John Leask. (1972) "A first course in turbulence". MIT Press
[51] Moser, Robert D. and Kim, John and Mansour, Nagi N. (1999) "Direct numerical simulation of turbulent channel flow up to ", Volume 11. Physics of Fluids 4 943–945
[52] Stull, Roland B. (1988) "An introduction to boundary layer meteorology". Springer
[53] Oñate, Eugenio. (1998) "Derivation of stabilized equations for numerical solution of advective-diffusive transport and fluid flow problems", Volume 151. Computer Methods in Applied Mechanics and Engineering 1 - 2 233 - 265
[54] Oñate, Eugenio. (2000) "A stabilized finite element method for incompressible viscous flows using a finite increment calculus formulation", Volume 182. Computer Methods in Applied Mechanics and Engineering 3-4 355 - 370
[55] Oñate, Eugenio and Nadukandi, Prashanth and Idelsohn, Sergio R. and García, Julio and Felippa, Carlos. (2011) "A family of residual-based stabilized finite element methods for Stokes flows", Volume 65. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Fluids 1-3 106–134
[56] Oñate, Eugenio. (2004) "Possibilities of finite calculus in computational mechanics", Volume 60. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 1 255–281
[57] Oñate, Eugenio and Idelsohn, Sergio R. and Felippa, Carlos A. (2011) "Consistent pressure Laplacian stabilization for incompressible continua via higher-order finite calculus", Volume 87. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 1-5 171–195
[58] Ramon Codina. (1993) "A discontinuity-capturing crosswind-dissipation for the finite element solution of the convection-diffusion equation", Volume 110. Computer Methods in Applied Mechanics and Engineering 3-4 325 - 342
[59] Oñate, Eugenio and Franci, Alessandro and Carbonell, Josep M. (2014) "Lagrangian formulation for finite element analysis of quasi-incompressible fluids with reduced mass losses", Volume 74. International Journal for Numerical Methods in Fluids 10 699–731
[60] Piomelli, U. and Balaras, E. (2002) "Wall-layer models for large-eddy simulations", Volume 34. ANNUAL REVIEWS. Annual Review of Fluid Mechanics 524XP 349-374
[61] Bou-Zeid, Elie and Meneveau, Charles and Parlange, Marc. (2005) "A scale-dependent Lagrangian dynamic model for large eddy simulation of complex turbulent flows", Volume 17. Physics of Fluids (1994-present) 2 025105
[62] Ham, F. E. and Lien, F.S. and Strong, A. B. (2002) "A Fully Conservative Second-Order Finite Difference Scheme for Incompressible Flow on Nonuniform Grids", Volume 177. Journal of Computational Physics 1 117 - 133
[63] Norberg, C. (2003) "Fluctuating lift on a circular cylinder: review and new measurements", Volume 17. Journal of Fluids and Structures 1 57–96
[64] Lienhard, John H. (1966) "Synopsis of lift, drag, and vortex frequency data for rigid circular cylinders". Washington State University
[65] Ong, L. and Wallace, J. (1996) "The velocity field of the turbulent very near wake of a circular cylinder", Volume 20. Springer Berlin / Heidelberg. Experiments in Fluids 441–453
[66] Kravchenko, Arthur G. and Moin, Parviz. (2000) "Numerical studies of flow over a circular cylinder at ", Volume 12. Physics of Fluids 2 403–417
[67] Beaudan, Patrick and Moin, Parviz. (1994) "Numerical Experiments on the Flow Past a Circular Cylinder at Sub-Critical Reynolds Number". Department of Mechanical Engineering, Stanford University TF-62
[68] M. Mier-Torrecilla and E. Herrera and M. Doblaré. (2014) "Numerical Calculation of Wind Loads over Solar Collectors", Volume 49. Energy Procedia 0 163 - 173
[69] Andre, Michael and Mier-Torrecilla, Monica and Wüchner, Roland. (2015) "Numerical simulation of wind loads on a parabolic trough solar collector using lattice Boltzmann and finite element methods", Volume 146. Journal of Wind Engineering and Industrial Aerodynamics 185 - 194
[70] Werner, H. and Wengle, H. (1993) "Large-Eddy Simulation of Turbulent Flow Over and Around a Cube in a Plate Channel". Springer Berlin Heidelberg 155-168
[71] Mann, Jakob. (1998) "Wind field simulation", Volume 13. Probabilistic Engineering Mechanics 4 269 - 282
[72] Rossi, Riccardo and Lazzari, Massimiliano and Vitaliani, Renato. (2004) "Wind field simulation for structural engineering purposes", Volume 61. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 5 738–763
[73] Kaimal, J. C. and Wyngaard, J. C. and Izumi, Y. and Coté, O. R. (1972) "Spectral characteristics of surface-layer turbulence", Volume 98. John Wiley & Sons, Ltd. Quarterly Journal of the Royal Meteorological Society 417 563–589
[74] Strohmaier, Erich and Dongarra, Jack and Simon, Horst and Meuer, Martin "TOP500 list"
[75] Dadvand, Pooyan. (2007) "A framework for developing finite element codes for multi-disciplinary applications.". PhD thesis: Universitat Politécnica de Cataluña
[76] Message Passing Interface Forum. (2008) "MPI: A Message Passing Interface Standard. Version 2.1"
[77] CIMNE "GiD, the personal pre and post processor"
[78] Karypis, George and Kumar, Vipin. (1998) "A Fast and High Quality Multilevel Scheme for Partitioning Irregular Graphs", Volume 20. SIAM Journal on Scientific Computing 1 359-392
[79] Misra, J. and Gries, David. (1992) "A constructive proof of Vizing's theorem", Volume 41. Information Processing Letters 3 131 - 133
[80] Heroux, Michael A. and Bartlett, Roscoe A. and Howle, Vicki E. and Hoekstra, Robert J. and Hu, Jonathan J. and Kolda, Tamara G. and Lehoucq, Richard B. and Long, Kevin R. and Pawlowski, Roger P. and Phipps, Eric T. and Salinger, Andrew G. and Thornquist, Heidi K. and Tuminaro, Ray S. and Willenbring, James M. and Williams, Alan and Stanley, Kendall S. (2005) "An overview of the Trilinos project", Volume 31. ACM Press. ACM Transactions on Mathematical Software 3 397–423
[81] Saad, Yousef. (2003) "Iterative methods for sparse linear systems". Siam
[82] Trottenberg, Ulrich and Oosterlee, Cornelius W. and Schuller, Anton. (2000) "Multigrid". Academic press
[83] Stüben, Krechel A. (2001) "A review of algebraic multigrid", Volume 128. Journal of Computational and Applied Mathematics 1–2 281 - 309
[84] Tuminaro, Ray S. and Heroux, Michael A. and Hutchinson, Scott A. and Shadid, John N. (1999) "Official Aztec Users's Guide Version 2.1". Sandia National Laboratories SAND99-8801J
[85] M.W. Gee and C.M. Siefert and J.J. Hu and R.S. Tuminaro and M.G. Sala. (2006) "ML 5.0 Smoothed Aggregation User's Guide". Sandia National Laboratories SAND2006-2649
[86] Demidov, Denis "AMGCL: a C++ library for solution of large sparse linear systems with algebraic multigrid method"
[87] Demidov, Denis and Rossi, Riccardo "Subdomain deflation and algebraic multigrid: combining multiscale with multilevel"
[88] Coll Sans, Abel. (2014) "Robust volume mesh generation for non-watertight geometries"
[89] Welford, B. P. (1962) "Note on a Method for Calculating Corrected Sums of Squares and Products", Volume 4. Technometrics 3 419-420
[90] Terriberry, Timothy P. (2008) "Computing higher-order moments online"
[91] Pébay, Philippe P. (2008) "Formulas for robust, one-pass parallel computation of covariances and arbitrary-order statistical moments". Sandia National Laboratories SAND2008-6212
[92] Chan, Tony F. and Golub, Gene H. and LeVeque, Randall J. (1979) "Updating formulae and a pairwise algorithm for computing sample variances". Department of Computer Science, Stanford University STAN-CS-79-773
[93] Ainsworth, Mark and Oden, J. Tinsley. (1997) "A posteriori error estimation in finite element analysis", Volume 142. Computer Methods in Applied Mechanics and Engineering 1–2 1 - 88
[94] Ainsworth, Mark and Oden, J. Tinsley. (2000) "A Posteriori Error Estimation in Finite Element Analysis". John Wiley & Sons, Ltd
[95] John, Volker. (2000) "A numerical study of a posteriori error estimators for convection-diffusion equations", Volume 190. Computer Methods in Applied Mechanics and Engineering 5-7 757 - 781
[96] Papastavrou, Areti and Verfürth, Rüdiger. (2000) "A posteriori error estimators for stationary convection-diffusion problems: a computational comparison", Volume 189. Computer Methods in Applied Mechanics and Engineering 2 449 - 462
[97] Hauke, Guillermo and Doweidar, Mohamed H. and Miana, Mario. (2006) "The multiscale approach to error estimation and adaptivity", Volume 195. Computer Methods in Applied Mechanics and Engineering 13-16 1573–1593
[98] Rossi, Riccardo and Cotela-Dalmau, Jordi and Lafontaine, Nelson M. and Dadvand, Pooyan and Idelsohn, Sergio R. (2013) "Parallel adaptive mesh refinement for incompressible flow problems", Volume 80. Computers & Fluids 324–355
[99] Hauke, Guillermo and Fuster, Daniel and Lizarraga, Fernando. (2015) "Variational multiscale a posteriori error estimation for systems: The Euler and Navier-Stokes equations", Volume 283. Computer Methods in Applied Mechanics and Engineering 1493 - 1524
[100] Peraire, J. and Vahdati, M. and Morgan, K. and Zienkiewicz, O. C. (1987) "Adaptive remeshing for compressible flow computations", Volume 72. Journal of Computational Physics 2 449 - 466
[101] Löhner, Rainald. (1989) "Adaptive remeshing for transient problems", Volume 75. Computer Methods in Applied Mechanics and Engineering 1–3 195 - 214
[102] Selmin, V. and Formaggia, L. (1992) "Simulation of hypersonic flows on unstructured grids", Volume 34. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 2 569–606
[103] Zienkiewicz, O. C. and Wu, J. (1994) "Automatic directional refinement in adaptive analysis of compressible flows", Volume 37. John Wiley & Sons, Ltd. International Journal for Numerical Methods in Engineering 13 2189–2210
[104] Chiandussi, G. and Bugeda, G. and Oñate, E. (2000) "A simple method for automatic update of finite element meshes", Volume 16. John Wiley & Sons, Ltd. Communications in Numerical Methods in Engineering 1 1–19
[105] Sieger, Daniel and Menzel, Stefan and Botsch, Mario. (2014) "RBF morphing techniques for simulation-based design optimization", Volume 30. Springer London. Engineering with Computers 2 161-174
[106] Hachem, Elie and Feghali, Stephanie and Codina, Ramon and Coupez, Thierry. (2013) "Anisotropic adaptive meshing and monolithic Variational Multiscale method for fluid-structure interaction", Volume 122. Computers & Structures 88 – 100
[107] Saramito, Pierre and Roquet, Nicolas. (2001) "An adaptive finite element method for viscoplastic fluid flows in pipes", Volume 190. Computer Methods in Applied Mechanics and Engineering 40–41 5391 - 5412
[108] Roquet, Nicolas and Saramito, Pierre. (2003) "An adaptive finite element method for Bingham fluid flows around a cylinder", Volume 192. Computer Methods in Applied Mechanics and Engineering 31-32 3317 - 3341
[109] Roquet, Nicolas and Saramito, Pierre. (2008) "An adaptive finite element method for viscoplastic flows in a square pipe with stick-slip at the wall", Volume 155. Journal of Non-Newtonian Fluid Mechanics 3 101 - 115
[110] Bernabeu, Noé and Saramito, Pierre and Smutek, Claude. (2014) "Numerical modeling of non-Newtonian viscoplastic flows: Part II. Viscoplastic fluids and general tridimensional topographies". International Journal of Numerical Analysis and Modeling
[111] Frey, Pascal Jean and George, Paul Luis. (2008) "Mesh Generation: Application to finite elements". John Wiley & Sons, Ltd, 2nd Edition
[112] D'Amato, Juan Pablo and Vénere, Marcelo. (2013) "A CPU–GPU framework for optimizing the quality of large meshes", Volume 73. Journal of Parallel and Distributed Computing 8 1127 - 1134
[113] Richards, P. J. and Hoxey, R. P. and Short, L. J. (2001) "Wind pressures on a 6m cube", Volume 89. Journal of Wind Engineering and Industrial Aerodynamics 14–15 1553–1564
[114] Steber, Gerhard. (2012) "Evaluation of the finite element method for turbulent flows with the open source software Kratos"
[115] Bingham, Eugene C. (1922) "Fluidity and Plasticity". McGraw-Hill
[116] Oldroyd, J. G. (1947) "A rational formulation of the equations of plastic flow for a Bingham solid", Volume 43. Mathematical Proceedings of the Cambridge Philosophical Society 100–105
[117] Papanastasiou, Tasos C. (1987) "Flows of Materials with Yield", Volume 31. Journal of Rheology (1978-present) 5 385-404
[118] Tanner, R. I. and Milthorpe, J. F. (1983) "Numerical simulation of the flow of fluids with yield stress". Pineridge Press 680-690
[119] Souza Mendes, Paulo R. and Dutra, Eduardo S. S. (2004) "Viscosity Function for Yield-Stress Liquids", Volume 14. Applied Rheology 6 296-302
[120] Mitsoulis, Evan. (2007) "Flows of viscoplastic materials: models and computations". British Society of Rheology
[121] Peric, D. and Slijepcevic, S. (2001) "Computational modelling of viscoplastic fluids based on a stabilised finite element method", Volume 18. Engineering Computations 3/4 577-591
[122] A. Larese. (2012) "A coupled Eulerian-PFEM model for the simulation of overtopping in rockfill dams". Phd thesis: Universitat Politecnica de Catalunya. UPC BarcelonaTech
[123] Moreno, Elvira and Cervera, Miguel. (2015) "Elementos finitos mixtos estabilizados para flujos confinados de Bingham y de Herschel-Bulkley Parte II: soluciones numéricas". Revista Internacional de Métodos Numéricos para Cálculo y Diseño en Ingeniería
[124] Lubliner, J. (1990) "Plasticity Theory". Macmillan Publishing Company
[125] Mitsoulis, Evan and Zisis, Th. (2001) "Flow of Bingham plastics in a lid-driven square cavity", Volume 101. Journal of Non-Newtonian Fluid Mechanics 1–3 173 - 180
[126] Elias, R.N. and Martins, M.A.D. and Coutinho, A.L.G.A. (2006) "Parallel edge-based solution of viscoplastic flows with the SUPG/PSPG formulation", Volume 38. Springer-Verlag. Computational Mechanics 4-5 365-381
[127] Burgos, Gilmer R. and Alexandrou, Andreas N. (1999) "Flow development of Herschel-Bulkley fluids in a sudden three-dimensional square expansion", Volume 43. Journal of Rheology 3 485-498
[128] Alexandrou, Andreas N. and McGilvreay, Timothy M. and Burgos, Gilmer. (2001) "Steady Herschel-Bulkley fluid flow in three-dimensional expansions", Volume 100. Journal of Non-Newtonian Fluid Mechanics 1-3 77 - 96
[129] Sheen, H. J. and Chen, W. J. and Wu, J. S. (1997) "Flow patterns for an annular flow over an axisymmetric sudden expansion", Volume 350. Journal of Fluid Mechanics 177–188
[130] Alleborn,N. and Nandakumar, K. and Raszillier, H. and Durst, F. (1997) "Further contributions on the two-dimensional flow in a sudden expansion", Volume 330. Journal of Fluid Mechanics 169–188
[131] Mitsoulis, Evan and Huilgol, R. R. (2004) "Entry flows of Bingham plastics in expansions", Volume 122. Journal of Non-Newtonian Fluid Mechanics 1–3 45 - 54
[132] Clark,Robert A. and Ferziger,Joel H. and Reynolds,W. C. (1979) "Evaluation of subgrid-scale models using an accurately simulated turbulent flow", Volume 91. Journal of Fluid Mechanics 1–16
[133] Lu, Hao and Porté-Agel, Fernando. (2010) "A modulated gradient model for large-eddy simulation: Application to a neutral atmospheric boundary layer", Volume 22. Physics of Fluids 1
Published on 01/01/2016
Licence: CC BY-NC-SA license
Are you one of the authors of this document?