Skip to content

Commit

Permalink
adding documentation Refs idaholab#29846
Browse files Browse the repository at this point in the history
  • Loading branch information
tanoret committed Feb 9, 2025
1 parent 986d9a3 commit b5f948e
Show file tree
Hide file tree
Showing 11 changed files with 278 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ As Navier-Stokes Finite Volume solvers continue to evolve in MOOSE, many new sol
| ------------------ | ------------------------- | ---------- | ----------------------------------------------------------- | ------------------------------------------------------------ | ---------------------- |
| Transient | -- | Yes | Yes | Yes | Yes |
| Turbulence | Mixing length | Yes | Yes | Yes | |
| | $k-\epsilon$ | | Yes | Yes | under development |
| | $k-\epsilon$ | | Yes | Yes | Yes |
| | $k-\omega$ SST | | | in [PR #28151](https://github.com/idaholab/moose/pull/28151) | |
| Two-phase | Mixture model | Yes | Yes | Yes | in [PR #29614](https://github.com/idaholab/moose/pull/29614) |
| | Eulerian-Eulerian | | | Yes | |
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
# LinearFVTKEDSourceSink

This kernel implements a version of [`INSFVTKEDSourceSink`](INSFVTKEDSourceSink.md) for a linear kernel.
The documentation is repeated down here for completeness.

The object computes the turbulent source and sink term for the turbulent kinetic energy dissipation rate equation.

Two terms are computed: `destruction` and `production` and the term `destruction - production` is
passed to the residual.
A different treatment is used for the bulk and the near wall regions.

## Bulk formulation:

The production of turbulent kinetic energy dissipation $G_\epsilon$ is modeled as follows:

\begin{equation}
G_{\epsilon} = C_{1,\epsilon} \frac{\epsilon}{k} G_k \,,
\end{equation}

where:

- $C_{1,\epsilon} = 1.44$ is a closure parameter,
- $G_k$ is the limited turbulent kinetic energy production. For more details please refer to [LinearFVTKESourceSink](LinearFVTKESourceSink.md).

The destruction of the turbulent kinetic energy dissipation rate is modeled as follows:

\begin{equation}
\epsilon_{\epsilon} = \frac{C_{2,\epsilon} \rho \epsilon}{t_k} \,,
\end{equation}

where:

- $C_{2,\epsilon} = 1.92$ is a closure parameter,
- $\epsilon$ is the solution variable, i.e., the dissipation rate of the turbulent kinetic energy,
- $k$ is the turbulent kinetic energy,
- $t_k = \frac{k}{\epsilon}$ is the turbulent time scale; if the [!param](/LinearFVKernels/LinearFVTKEDSourceSink/linearized_model) is `true`, this timescale is computed from the previous iteration; if [!param](/LinearFVKernels/LinearFVTKEDSourceSink/linearized_model) is `false`, in a nonlinear solve, this timescale is aded to the Jacobian.

## Wall formulation:

All cells in contact with a boundary identified in the [!param](/LinearFVKernels/LinearFVTKEDSourceSink/walls) list are applied a different
treatment in which the equilibrium value for the $\epsilon = \epsilon_{eq}$ is set.
A separate formulation is used for the `sub-laminar` and `logarithmic` boundary layers.
The determination of whether the near-wall cell lies in the laminar or logarithmic region
is performed via the non-dimensional wall distance $y^+$.
The non-dimensional wall distance can be defined differently according to the
[!param](/LinearFVKernels/LinearFVTKEDSourceSink/wall_treatment) parameter.

The four formulations are described in more detail in [INSFVTurbulentViscosityWallFunction.md].

If an equilibrium [!param](/LinearFVKernels/LinearFVTKEDSourceSink/wall_treatment) is defined, i.e. `eq_newton`,`eq_incremental` or `eq_linearized`, the standard wall function formulations are used in which $y^+$ is found:

\begin{equation}
y^+ = \frac{\rho y_p u_{\tau}}{\mu} \,,
\end{equation}

where:

- $\rho$ is the density,
- $y_p$ is the distance from the wall to the centroid of the next-to-wall cell,
- $u_{\tau}$ is the friction velocity, defined as $u_{\tau} = \sqrt{\frac{\tau_w}{\rho}}$ with $\tau_w$ the shear stress at the wall for which the condition is applied,
- $\mu$ is the dynamic molecular viscosity.

If a non-equilibrium [!param](/LinearFVKernels/LinearFVTKEDSourceSink/wall_treatment) is defined, i.e. `neq`,
the $y^+$ is defined non-iteratively as follows:

\begin{equation}
y^+ = \frac{y_p \sqrt{\sqrt{C_{\mu}}k}}{\mu} \,,
\end{equation}

!alert note
Using non-equilibrium wall functions is recommended for problems with recirculations and boundary layer detachment. However, using non-equilibrium wall functions will deteriorate results for standard problems such as flow developing over walls.

The cells with $y^+ < 11.25$ belong to `sub-laminar` boundary layer.
The ones belonging to the `logarithmic` boundary layer are those for which $y^+ \ge 11.25$.

A different value is used for $\epsilon_{eq}$ in each of the two regions.
For the `sub-laminar` boundary layer, the equilibrium value is determined as follows:

\begin{equation}
\epsilon_{eq} = 2 \frac{k \mu}{y_p^2}\,,
\end{equation}

where:

- $\mu_t$ is the turbulent dynamic viscosity.

For the `logarithmic` boundary layer, the value is determined as follows:

\begin{equation}
\epsilon_{eq} = \frac{C_{\mu}^{0.75} \rho k^{1.5}}{\kappa y_p}\,,
\end{equation}

where:

- $\kappa = 0.4187$ is the von Kármán constant.

!alert note
When using wall functions, since the equilibrium value for $\epsilon$ is set in the cells near the wall, the user is recommended to deactivate advection and diffusion for those near wall cells.

!alert note
When the wall treatment is specified in this kernel, any boundary condition for $\epsilon$ will be ignored.
In other words, there is no need to impose boundary conditions for $\epsilon$ when the wall treatment
is specified in his kernel.

!alert note
When using near-wall treatment, we assume that the $\mu_t$ functor is computed by an object
that performs near-wall treatment. Otherwise, the results obtained won't be physically correct.

!syntax parameters /LinearFVKernels/LinearFVTKEDSourceSink

!syntax inputs /LinearFVKernels/LinearFVTKEDSourceSink

!syntax children /LinearFVKernels/LinearFVTKEDSourceSink
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
# LinearFVTKESourceSink

This kernel implements a version of [`INSFVTKESourceSink`](INSFVTKESourceSink.md) for a linear kernel.
The documentation is repeated down here for completeness.

The object computes the turbulent source and sink term for the turbulent kinetic energy equation.

Two terms are computed `destruction` = $\epsilon$ and `production` = $G_k$ and the term $\epsilon - G_k$ is
passed to the residual.
A different treatment is used for the bulk and the near wall regions.

## Bulk formulation:

The turbulent production $G_k$ is modeled as:

\begin{equation}
G_k = \mu_t S^2 \,,
\end{equation}

where:

- $\mu_t$ is the turbulent dynamic viscosity,
- $S$ is the shear strain tensor internal norm, defined as $S = \sqrt{2\mathbf{S}:\mathbf{S}}$ with the shear strain tensor defined as $\mathbf{S} = \frac{1}{2} [\nabla \vec{u} + (\nabla \vec{u})^T]$.

The turbulent kinetic energy dissipation rate $\epsilon$ is generally coming from a coupled
transport equation for $\epsilon$.
However, for canonical or measured cases, e.g., isotropic decaying turbulence,
the user can utilize predefined fields through functors in MOOSE.

To avoid the overproduction of turbulent kinetic energy in stagnation zones \cite{durbin1996k}, a production limiter is imposed in relation to the dissipation using the formulation in \cite{menter1994two}:

\begin{equation}
G_k = min \left( G_k , C_{PL} \rho \epsilon \right) \,,
\end{equation}

where:

- $C_{PL}$ it the limiter constant, and set by default to a recommended value of 10 \cite{durbin1996k}.

## Wall formulation:

All cells in contact with a boundary identified in the [!param](/LinearFVKernels/LinearFVTKESourceSink/walls) list are applied a different
treatment for production and destruction.
A different formulation is used for the `sub-laminar` and `logarithmic` boundary layers.
The determination of whether the near-wall cell lies in the laminar or logarithmic region
is performed via the non-dimensional wall distance $y^+$.
The non-dimensional wall distance is defined as

\begin{equation}
y^+ = \frac{\rho y_p u_{\tau}}{\mu} \,,
\end{equation}

where:

- $\rho$ is the density,
- $y_p$ is the distance to the wall to the centroid of the next-to-wall cell,
- $u_{\tau}$ is the friction velocity, defined as $u_{\tau} = \sqrt{\frac{\tau_w}{\rho}}$ with $\tau_w$ the shear stress at the wall for which the condition is applied,
- $\mu$ is the dynamic molecular viscosity.

For every next-to-wall cell and every iteration step, $y^+$ is found via an
incremental fixed-point search algorithm.
The cells belonging to the `sub-laminar` boundary layers are defined as those
for which $y^+ < 11.25$.
The ones belonging to the `logarithmic` boundary layer are those for which $y^+ \ge 11.25$.
The imposed threshold of $y^+ = 11.25$ is given by the value of $y^+$ at which the `sub-laminar`
and `logarithmic` boundary profiles intersect.

In the `sub-laminar` region production of turbulent kinetic energy is negligible, therefore, if $y^+ \lt 11.25$:

\begin{equation}
G_k = 0.0 \,,
\end{equation}

In the `logarithmic` boundary layers the production term is no longer negligible and is defined as:

\begin{equation}
G_k = \tau_w ||\nabla \vec{u}|| = \mu_w ||\nabla \vec{u}|| \frac{ C_{\mu}^{0.25} \sqrt(k)}{\kappa y_p} \,,
\end{equation}

where:

- $C_{\mu} = 0.09$ is a closure parameter,
- $k$ is the turbulent kinetic energy,
- $||\nabla \vec{u}||$ is the near wall velocity gradient norm, which is defined as $||\nabla \vec{u}|| = (\nabla \vec{u} \cdot \hat{n}) \cdot \hat{n}$,
- $\kappa = 0.41$ is the von Kármán constant.

The formulation assumes that the near wall value is already imposed in the $\mu_t$ functor.

When solving a linear problem, instead of the nonlinear formulation, the production term is formulated as:

\begin{equation}
G_k = \mu_w ||\nabla \vec{u}|| \frac{ C_{\mu}^{0.25} k}{\sqrt{k_{old}} \kappa y_p} \,.
\end{equation}

where:

- $k_{old}$ is the value of the turbulent kinetic energy in the previous iteration.

For the destruction, formulation is different for the `sub-laminar` and `logarithmic` layers.
For the `sub-laminar` layer, the destruction is defined as follows:

\begin{equation}
\epsilon = \frac{2 \mu k}{y_p ^2} \,.
\end{equation}

For the `logarithmic` layer, the destruction is defined as follows:

\begin{equation}
\epsilon = C_{\mu}^{0.75} \frac{\rho k^{\frac{3}{2}}}{\kappa y_p} \,.
\end{equation}

!alert note
When the wall treatment is specified in this kernel, any boundary condition for $k$ will be ignored.
In other words, there is no need to impose boundary conditions for $k$ when the wall treatment
is specified in his kernel.

!alert note
When using near-wall treatment, we assume that the $\mu_t$ functor is computed by an object
that performs near-wall treatment.
Otherwise, the results obtained won't not physically correct

!syntax parameters /LinearFVKernels/LinearFVTKESourceSink

!syntax inputs /LinearFVKernels/LinearFVTKESourceSink

!syntax children /LinearFVKernels/LinearFVTKESourceSink
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# LinearFVTurbulentLimitedAdvection

This object adds a $\nabla \cdot \vec u \phi$ term for an arbitrary scalar field
$\phi$, where $\phi$ corresponds to the nonlinear variable that this kernel acts
on. This kernel acts in a linear solve.
The linear `variable` can be of type `MooseLinearVariableFVReal`.

The particularity of this kernel is that it allows us to skip computing advection
for near-wall elements. The key for this skip are the boundaries identified in
the [!param](/LinearFVKernels/LinearFVTurbulentLimitedAdvection/walls) list.
For any element that is in contact with a boundary identified
in the [!param](/LinearFVKernels/LinearFVTurbulentLimitedAdvection/walls) list,
advection will be skipped for that element over all faces.

!syntax parameters /LinearFVKernels/LinearFVTurbulentLimitedAdvection

!syntax inputs /LinearFVKernels/LinearFVTurbulentLimitedAdvection

!syntax children /LinearFVKernels/LinearFVTurbulentLimitedAdvection
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# LinearFVTurbulentLimitedDiffusion

This object extends [`LinearFVDiffusion`](LinearFVDiffusion.md) to allow diffusion to be skipped
at certain boundaries.

The particularity of this kernel is that it allows us to skip computing diffusion
for near-wall elements. The key for this skip are the boundaries identified in
the [!param](/LinearFVKernels/LinearFVTurbulentLimitedDiffusion/walls) list.
For any element that is in contact with a boundary identified
in the [!param](/LinearFVKernels/LinearFVTurbulentLimitedDiffusion/walls) list,
diffusion contributions will be skipped for that element over all faces.

!syntax parameters /LinearFVKernels/LinearFVTurbulentLimitedDiffusion

!syntax inputs /LinearFVKernels/LinearFVTurbulentLimitedDiffusion

!syntax children /LinearFVKernels/LinearFVTurbulentLimitedDiffusion
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ wall_treatment = 'eq_newton' # Options: eq_newton, eq_incremental, eq_linearize
print_fields = false
continue_on_max_its = true
dt = 1.0
num_steps = 10
num_steps = 2
[]

[Outputs]
Expand Down
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
detail = 'and pass debugging checks.'
abs_zero = 5e-6
rel_err = 5e-6
cli_args = 'Executioner/dt=1.0 Executioner/num_steps=1 Outputs/exodus/file_base=channel_ERCOFTAC_short'
cli_args = 'Executioner/dt=1.0 Executioner/num_steps=1 Outputs/file_base=channel_ERCOFTAC_short'
[]
[]
[]

0 comments on commit b5f948e

Please sign in to comment.