From 704a409545ec912ed2ce1a2d864fc65846510bd8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Isler?= <joao.isler@gmail.com>
Date: Sat, 28 Sep 2024 10:01:25 +0000
Subject: [PATCH] Add synthetic turbulence generation for the compressible
 solver

---
 CHANGELOG.md                                  |   3 +
 docs/user-guide/xml/xml-forcing.tex           |  14 +-
 library/SolverUtils/CMakeLists.txt            |   2 +
 .../Forcing/ForcingSyntheticEddy.cpp          | 924 ++++++++++++++++++
 .../Forcing/ForcingSyntheticEddy.h            | 188 ++++
 solvers/CompressibleFlowSolver/CMakeLists.txt |   4 +
 .../Forcing/ForcingCFSSyntheticEddy.cpp       | 337 +++++++
 .../Forcing/ForcingCFSSyntheticEddy.h         | 106 ++
 .../Tests/ChanFlow3D_infTurbExpl.tst          |  27 +
 .../Tests/ChanFlow3D_infTurbExpl.xml          | 188 ++++
 .../Tests/ChanFlow3D_infTurbImpl.tst          |  27 +
 .../Tests/ChanFlow3D_infTurbImpl.xml          | 190 ++++
 solvers/IncNavierStokesSolver/CMakeLists.txt  |   3 +-
 .../Forcing/ForcingIncNSSyntheticEddy.cpp     | 850 +---------------
 .../Forcing/ForcingIncNSSyntheticEddy.h       | 109 +--
 .../Tests/ChanFlow3D_infTurb.tst              |  16 +-
 .../Tests/ChanFlow3D_infTurb.xml              |   4 +-
 17 files changed, 2029 insertions(+), 963 deletions(-)
 create mode 100644 library/SolverUtils/Forcing/ForcingSyntheticEddy.cpp
 create mode 100644 library/SolverUtils/Forcing/ForcingSyntheticEddy.h
 create mode 100644 solvers/CompressibleFlowSolver/Forcing/ForcingCFSSyntheticEddy.cpp
 create mode 100644 solvers/CompressibleFlowSolver/Forcing/ForcingCFSSyntheticEddy.h
 create mode 100644 solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbExpl.tst
 create mode 100644 solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbExpl.xml
 create mode 100644 solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbImpl.tst
 create mode 100644 solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbImpl.xml

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 03e0c4badb..5619303044 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,6 +29,9 @@ v5.7.0
 **ShallowWaterSolver**
 - Implement implicit time-discritization (!1784)
 
+**CompressibleSolver**
+- Add synthetic turbulence generator for the compressible solver (!1859)
+
 **NekMesh**
 - Added revolve module (!1825)
 
diff --git a/docs/user-guide/xml/xml-forcing.tex b/docs/user-guide/xml/xml-forcing.tex
index 70d088e1db..d108edc973 100644
--- a/docs/user-guide/xml/xml-forcing.tex
+++ b/docs/user-guide/xml/xml-forcing.tex
@@ -40,10 +40,10 @@ This force type specifies the name of a body forcing function expressed in the \
 </FORCE>
 \end{lstlisting}
 
-\subsection{IncNSSyntheticTurbulence}
+\subsection{Synthetic turbulence generator}
 This force type allows the user to apply synthetic turbulence generation in the flow field. The Synthetic Eddy Method is implemented. The approach developed here is based on a source term formulation. This formulation allows the user to apply synthetic turbulence generation in any specific area of the domain, not only in the boundary condition as most methodologies do. So that, after defining a synthetic eddy region (box of eddies), the user can randomly release eddies inside this box which are going to be convected downstream and will produce turbulence depending on the flow conditions. Each eddy  that leaves the synthetic eddy region is reintroduced in the inlet plane of the box, so this mechanism re-energise the system, roughly speaking. 
 
-Below it is shown how to define the Synthetic Eddy Method for a fully three-dimensional Navier-Stokes simulation. Note that this definition is under the \inltt{FORCING} tag. Firstly, in the \inltt{TYPE} entry, we define the force type as \texttt{IncNSSyntheticTurbulence}. In the \inltt{BoxOfEddies} tag, under the \inltt{FORCE} tag, the center plane of the synthetic eddy region is defined. The coordinates of its center are given by \texttt{x0, y0, z0} and lengths of its sides are \texttt{lyref}  and \texttt{lzref} in the $y$- and $z$-directions, respectively. In the \inltt{Sigma} tag, we define the standard deviation (\texttt{sigma}) of the Gaussian function with zero mean, which is used to compute the stochastic signal. After that, the bulk velocity (\texttt{Ub}) of the flow must be provided in the \inltt{BulkVelocity} tag. 
+Below it is shown how to define the Synthetic Eddy Method for a fully three-dimensional Navier-Stokes simulation. Note that this definition is under the \inltt{FORCING} tag. Firstly, in the \inltt{TYPE} entry, we define the force type as \texttt{IncNSSyntheticTurbulence} for the incompressible solver and \texttt{CFSSyntheticTurbulence} for the compressible solver. In the \inltt{BoxOfEddies} tag, under the \inltt{FORCE} tag, the center plane of the synthetic eddy region is defined. The coordinates of its center are given by \texttt{x0, y0, z0} and lengths of its sides are \texttt{lyref}  and \texttt{lzref} in the $y$- and $z$-directions, respectively. Note that the length in the x-direction is defined in the characteristic length scale function (see below), so that \inltt{l00}  defines the value of $l_{x}$. In the \inltt{Sigma} tag, we define the standard deviation (\texttt{sigma}) of the Gaussian function with zero mean, which is used to compute the stochastic signal. After that, the bulk velocity (\texttt{Ub}) of the flow must be provided in the \inltt{BulkVelocity} tag. 
 
 \begin{lstlisting}[style=XMLStyle] 
 <FORCE TYPE="IncNSSyntheticTurbulence">
@@ -59,12 +59,12 @@ In order to define the Reynolds stresses (\inltt{ReynoldsStresses} tag) and the
 
 \begin{lstlisting}[style=XMLStyle] 
 <FUNCTION NAME="ReynoldsStresses">
-    <E VAR="r00" VALUE="1e-6" />
-    <E VAR="r10" VALUE="10*y" />
+    <E VAR="r00" VALUE="1e-3" /> 
+    <E VAR="r10" VALUE="10*y+y^2+5*y^3" />
     <E VAR="r20" VALUE="0.0"  />
-    <E VAR="r11" VALUE="1e-6" />
+    <E VAR="r11" VALUE="1e-3" />
     <E VAR="r21" VALUE="0.0"  />
-    <E VAR="r22" VALUE="1e-6" />
+    <E VAR="r22" VALUE="1e-3" />
  </FUNCTION>
 \end{lstlisting}
 
@@ -84,7 +84,7 @@ Also, in the Synthetic Eddy Method implemented here, an isotropic or anisotropic
 </FUNCTION>
 \end{lstlisting}
 
-Note that the Synthetic Eddy Method is only supported for a fully three-dimensional Incompressible Navier-Stokes simulation.
+Note that the synthetic turbulence generator is only supported for fully three-dimensional simulations.
 
 \subsection{MovingReferenceFrame}
 This force type allows the solution of incompressilbe Navier-Stokes in moving frame of reference. The moving frame is attached the to body and can have translational, rotational or both motions. Although the Navier-Stokes equations are solved in a moving reference frame, our formulation is based on the absolute velocity and pressure (in inertial frame). However, note that these absolute velocities and any other vector quantities are expressed using the coordinate basis of the moving frame. Further, note that if you are using the FilterAeroForces, the force vector $\left(F_x, F_y, F_z\right)$ is automatically converted and output in the inertial frame (ground reference frame).
diff --git a/library/SolverUtils/CMakeLists.txt b/library/SolverUtils/CMakeLists.txt
index 8a8282e0c7..07fdedf0a7 100644
--- a/library/SolverUtils/CMakeLists.txt
+++ b/library/SolverUtils/CMakeLists.txt
@@ -55,6 +55,7 @@ SET(SOLVER_UTILS_SOURCES
   Forcing/ForcingMovingReferenceFrame.cpp
   Forcing/ForcingNoise.cpp
   Forcing/ForcingProgrammatic.cpp
+  Forcing/ForcingSyntheticEddy.cpp
 )
 
 SET(SOLVER_UTILS_HEADERS
@@ -116,6 +117,7 @@ SET(SOLVER_UTILS_HEADERS
   Forcing/ForcingMovingReferenceFrame.h
   Forcing/ForcingNoise.h
   Forcing/ForcingProgrammatic.h
+  Forcing/ForcingSyntheticEddy.h
 )
 
 IF (NEKTAR_USE_ARPACK)
diff --git a/library/SolverUtils/Forcing/ForcingSyntheticEddy.cpp b/library/SolverUtils/Forcing/ForcingSyntheticEddy.cpp
new file mode 100644
index 0000000000..bf36921621
--- /dev/null
+++ b/library/SolverUtils/Forcing/ForcingSyntheticEddy.cpp
@@ -0,0 +1,924 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// File: ForcingSyntheticEddy.cpp
+//
+// For more information, please see: http://www.nektar.info
+//
+// The MIT License
+//
+// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
+// Department of Aeronautics, Imperial College London (UK), and Scientific
+// Computing and Imaging Institute, University of Utah (USA).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+//
+// Description: Derived base class - Synthetic turbulence generation.
+//              This code implements the Synthetic Eddy Method (SEM).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <SolverUtils/Forcing/ForcingSyntheticEddy.h>
+#include <ctime>
+#include <fstream>
+#include <iomanip>
+
+namespace Nektar::SolverUtils
+{
+
+std::string ForcingSyntheticEddy::className =
+    GetForcingFactory().RegisterCreatorFunction(
+        "SyntheticTurbulence", ForcingSyntheticEddy::create,
+        "Synthetic Eddy Turbulence Method");
+
+ForcingSyntheticEddy::ForcingSyntheticEddy(
+    const LibUtilities::SessionReaderSharedPtr &pSession,
+    const std::weak_ptr<EquationSystem> &pEquation)
+    : Forcing(pSession, pEquation)
+{
+}
+
+/**
+ * @brief Read input from xml file and initialise the class members.
+ *        The main parameters are the characteristic lengths, Reynolds
+ *        stresses and the synthetic eddy region (box of eddies).
+ *
+ * @param pFields           Pointer to fields.
+ * @param pNumForcingField  Number of forcing fields.
+ * @param pForce            Xml element describing the mapping.
+ */
+void ForcingSyntheticEddy::v_InitObject(
+    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+    [[maybe_unused]] const unsigned int &pNumForcingFields,
+    [[maybe_unused]] const TiXmlElement *pForce)
+{
+    // Space dimension
+    m_spacedim = pFields[0]->GetGraph()->GetMeshDimension();
+
+    if (m_spacedim != 3)
+    {
+        NEKERROR(Nektar::ErrorUtil::efatal,
+                 "Sythetic eddy method "
+                 "only supports fully three-dimensional simulations");
+    }
+
+    // Get gamma parameter
+    m_session->LoadParameter("Gamma", m_gamma, 1.4);
+
+    const TiXmlElement *elmtInfTurb;
+
+    // Reynolds Stresses
+    elmtInfTurb = pForce->FirstChildElement("ReynoldsStresses");
+    ASSERTL0(elmtInfTurb, "Requires ReynoldsStresses tag specifying function "
+                          "name which prescribes the reynodls stresses.");
+
+    std::string reyStressesFuncName = elmtInfTurb->GetText();
+    ASSERTL0(m_session->DefinesFunction(reyStressesFuncName),
+             "Function '" + reyStressesFuncName +
+                 "' is not defined in the session.");
+
+    // Reynolds stresses variables. Do not change the order of the variables.
+    std::vector<std::string> reyStressesVars = {"r00", "r10", "r20",
+                                                "r11", "r21", "r22"};
+
+    for (size_t i = 0; i < reyStressesVars.size(); ++i)
+    {
+        std::string varStr = reyStressesVars[i];
+        if (m_session->DefinesFunction(reyStressesFuncName, varStr))
+        {
+            m_R[i] = m_session->GetFunction(reyStressesFuncName, varStr);
+        }
+        else
+        {
+            NEKERROR(Nektar::ErrorUtil::efatal,
+                     "Missing parameter '" + varStr +
+                         "' in the FUNCTION NAME = " + reyStressesFuncName +
+                         ".");
+        }
+    }
+
+    // Characteristic length scales
+    elmtInfTurb = pForce->FirstChildElement("CharLengthScales");
+    ASSERTL0(elmtInfTurb, "Requires CharLengthScales tag specifying function "
+                          "name which prescribes the characteristic "
+                          "length scales.");
+
+    std::string charLenScalesFuncName = elmtInfTurb->GetText();
+    ASSERTL0(m_session->DefinesFunction(charLenScalesFuncName),
+             "Function '" + charLenScalesFuncName +
+                 "' is not defined in the session.");
+
+    // Characteristic length scale variables
+    // Do not change the order of the variables
+    std::vector<std::string> lenScalesVars = {"l00", "l10", "l20", "l01", "l11",
+                                              "l21", "l02", "l12", "l22"};
+    LibUtilities::EquationSharedPtr clsAux;
+    m_l = Array<OneD, NekDouble>(m_spacedim * m_spacedim, 0.0);
+
+    for (size_t i = 0; i < lenScalesVars.size(); ++i)
+    {
+        std::string varStr = lenScalesVars[i];
+        if (m_session->DefinesFunction(charLenScalesFuncName, varStr))
+        {
+            clsAux = m_session->GetFunction(charLenScalesFuncName, varStr);
+            m_l[i] = (NekDouble)clsAux->Evaluate();
+        }
+        else
+        {
+            NEKERROR(Nektar::ErrorUtil::efatal,
+                     "Missing parameter '" + varStr +
+                         "' in the FUNCTION NAME = " + charLenScalesFuncName +
+                         ".");
+        }
+    }
+
+    // Read box of eddies parameters
+    m_rc = Array<OneD, NekDouble>(m_spacedim, 0.0);
+    // Array<OneD, NekDouble> m_lyz(m_spacedim - 1, 0.0);
+    m_lyz       = Array<OneD, NekDouble>(m_spacedim - 1, 0.0);
+    elmtInfTurb = pForce->FirstChildElement("BoxOfEddies");
+    ASSERTL0(elmtInfTurb,
+             "Unable to find BoxOfEddies tag. in SyntheticTurbulence forcing");
+
+    if (elmtInfTurb)
+    {
+        std::stringstream boxStream;
+        std::string boxStr = elmtInfTurb->GetText();
+        boxStream.str(boxStr);
+        size_t countVar = 0;
+        for (size_t i = 0; i < (2 * m_spacedim - 1); ++i)
+        {
+            boxStream >> boxStr;
+            if (i < m_spacedim)
+            {
+                m_rc[i] = boost::lexical_cast<NekDouble>(boxStr);
+            }
+            else
+            {
+                m_lyz[i - m_spacedim] = boost::lexical_cast<NekDouble>(boxStr);
+            }
+            countVar += 1;
+        }
+        if (countVar != (2 * m_spacedim - 1))
+        {
+            NEKERROR(Nektar::ErrorUtil::efatal,
+                     "Missing parameter in the BoxOfEddies tag");
+        }
+    }
+
+    // Read sigma
+    elmtInfTurb = pForce->FirstChildElement("Sigma");
+    ASSERTL0(elmtInfTurb,
+             "Unable to find Sigma tag. in SyntheticTurbulence forcing");
+    std::string sigmaStr = elmtInfTurb->GetText();
+    m_sigma              = boost::lexical_cast<NekDouble>(sigmaStr);
+
+    // Read bulk velocity
+    elmtInfTurb = pForce->FirstChildElement("BulkVelocity");
+    ASSERTL0(elmtInfTurb,
+             "Unable to find BulkVelocity tag. in SyntheticTurbulence forcing");
+    std::string bVelStr = elmtInfTurb->GetText();
+    m_Ub                = boost::lexical_cast<NekDouble>(bVelStr);
+
+    // Read flag to check if the run is a test case
+    elmtInfTurb          = pForce->FirstChildElement("TestCase");
+    const char *tcaseStr = (elmtInfTurb) ? elmtInfTurb->GetText() : "NoName";
+    m_tCase              = (strcmp(tcaseStr, "ChanFlow3D") == 0) ? true : false;
+
+    // Set Cholesky decomposition of the Reynolds Stresses in the domain
+    SetCholeskyReyStresses(pFields);
+    // Compute reference lengths
+    ComputeRefLenghts();
+    // Compute Xi maximum
+    ComputeXiMax();
+    // Set Number of Eddies
+    SetNumberOfEddies();
+    // Set mask
+    SetBoxOfEddiesMask(pFields);
+    // Set Forcing for each eddy
+    InitialiseForcingEddy(pFields);
+    // Check for test case
+    if (!m_tCase)
+    {
+        // Compute initial location of the eddies in the box
+        ComputeInitialRandomLocationOfEddies();
+    }
+    else
+    {
+        // Compute initial location of the eddies for the test case
+        ComputeInitialLocationTestCase();
+    }
+
+    // Seed to generate random positions for the eddies
+    srand(time(nullptr));
+
+    // Initialise member from the base class
+    m_Forcing = Array<OneD, Array<OneD, NekDouble>>(pFields.size());
+    for (int i = 0; i < pFields.size(); ++i)
+    {
+        m_Forcing[i] = Array<OneD, NekDouble>(pFields[0]->GetTotPoints(), 0.0);
+    }
+
+    // Initialise eddies ID vector
+    for (size_t n = 0; n < m_N; ++n)
+    {
+        m_eddiesIDForcing.push_back(n);
+    }
+}
+
+/**
+ * @brief Apply forcing term if an eddy left the box of eddies and
+ *        update the eddies positions.
+ *
+ * @param pFields   Pointer to fields.
+ * @param inarray   Given fields. The fields are in in physical space.
+ * @param outarray  Calculated solution after forcing term being applied
+ *                  in physical space.
+ * @param time      time.
+ */
+void ForcingSyntheticEddy::v_Apply(
+    [[maybe_unused]] const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+    [[maybe_unused]] const Array<OneD, Array<OneD, NekDouble>> &inarray,
+    [[maybe_unused]] Array<OneD, Array<OneD, NekDouble>> &outarray,
+    [[maybe_unused]] const NekDouble &time)
+{
+}
+
+/**
+ * @brief Apply forcing term if an eddy left the box of eddies and
+ *        update the eddies positions.
+ *
+ * @param pFields   Pointer to fields.
+ * @param inarray   Given fields. The fields are in in physical space.
+ * @param outarray  Calculated solution after forcing term being applied
+ *                  in coefficient space.
+ * @param time      time.
+ */
+void ForcingSyntheticEddy::v_ApplyCoeff(
+    [[maybe_unused]] const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+    [[maybe_unused]] const Array<OneD, Array<OneD, NekDouble>> &inarray,
+    [[maybe_unused]] Array<OneD, Array<OneD, NekDouble>> &outarray,
+    [[maybe_unused]] const NekDouble &time)
+{
+}
+
+/**
+ * @brief Compute characteristic convective turbulent time.
+ *
+ * @param pFields  Pointer to fields.
+ */
+Array<OneD, Array<OneD, NekDouble>> ForcingSyntheticEddy::
+    ComputeCharConvTurbTime(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
+{
+    // Total number of quadrature points
+    int nqTot = pFields[0]->GetTotPoints();
+    // Characteristic convective turbulent time
+    Array<OneD, Array<OneD, NekDouble>> convTurbTime(m_spacedim);
+
+    for (size_t k = 0; k < m_spacedim; ++k)
+    {
+        convTurbTime[k] = Array<OneD, NekDouble>(nqTot, 0.0);
+        for (size_t i = 0; i < nqTot; ++i)
+        {
+            NekDouble convTurbLength = m_xiMaxMin * m_lref[0];
+            // 3*k because of the structure of the m_l parameter
+            // to obtain lxk.
+            if ((m_l[3 * k] > m_xiMaxMin * m_lref[0]) && (m_mask[i]))
+            {
+                convTurbLength = m_l[3 * k];
+            }
+            convTurbTime[k][i] = convTurbLength / m_Ub;
+        }
+    }
+
+    return convTurbTime;
+}
+
+/**
+ * @brief Compute smoothing factor to avoid strong variations
+ *        of the source term across the domain.
+ *
+ * @param pFields       Pointer to fields.
+ * @param convTurbTime  Convective turbulent time.
+ */
+Array<OneD, Array<OneD, NekDouble>> ForcingSyntheticEddy::
+    ComputeSmoothingFactor(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        Array<OneD, Array<OneD, NekDouble>> convTurbTime)
+{
+    // Total number of quadrature points
+    int nqTot = pFields[0]->GetTotPoints();
+    // Number of elements
+    int nElmts = pFields[0]->GetNumElmts();
+    // Total number of quadrature points of each element
+    int nqe;
+    // Characteristic convective turbulent time
+    Array<OneD, Array<OneD, NekDouble>> smoothFac(m_spacedim);
+    // Counter
+    int count = 0;
+    // module
+    NekDouble mod;
+    // Create Array with zeros
+    for (size_t i = 0; i < m_spacedim; ++i)
+    {
+        smoothFac[i] = Array<OneD, NekDouble>(nqTot, 0.0);
+    }
+
+    for (size_t e = 0; e < nElmts; ++e)
+    {
+        nqe = pFields[0]->GetExp(e)->GetTotPoints();
+
+        Array<OneD, NekDouble> coords0(nqe, 0.0);
+        Array<OneD, NekDouble> coords1(nqe, 0.0);
+        Array<OneD, NekDouble> coords2(nqe, 0.0);
+
+        pFields[0]->GetExp(e)->GetCoords(coords0, coords1, coords2);
+
+        for (size_t i = 0; i < nqe; ++i)
+        {
+            if (m_mask[count + i])
+            {
+                mod = (coords0[i] - m_rc[0] + m_lref[0]) *
+                      (coords0[i] - m_rc[0] + m_lref[0]);
+
+                smoothFac[0][count + i] =
+                    exp((-0.5 * M_PI * mod) /
+                        (convTurbTime[0][count + i] *
+                         convTurbTime[0][count + i] * m_Ub * m_Ub));
+                smoothFac[1][count + i] =
+                    exp((-0.5 * M_PI * mod) /
+                        (convTurbTime[1][count + i] *
+                         convTurbTime[1][count + i] * m_Ub * m_Ub));
+                smoothFac[2][count + i] =
+                    exp((-0.5 * M_PI * mod) /
+                        (convTurbTime[2][count + i] *
+                         convTurbTime[2][count + i] * m_Ub * m_Ub));
+            }
+        }
+        count += nqe;
+    }
+
+    return smoothFac;
+}
+
+/**
+ * @brief Calculate velocity fluctuation for the source term
+ *
+ * @param pFields           Pointer to fields.
+ * @param stochasticSignal  Stochastic signal.
+ * @return                  Velocity fluctuation.
+ */
+Array<OneD, Array<OneD, NekDouble>> ForcingSyntheticEddy::
+    ComputeVelocityFluctuation(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        Array<OneD, Array<OneD, NekDouble>> stochasticSignal)
+{
+    // Total number of quadrature points
+    int nqTot = pFields[0]->GetTotPoints();
+    // Velocity fluctuation vector
+    Array<OneD, Array<OneD, NekDouble>> velFluc(m_N);
+    // Control loop for the m_Cholesky (Cholesky decomposition matrix)
+    int l;
+
+    for (auto &n : m_eddiesIDForcing)
+    {
+        velFluc[n] = Array<OneD, NekDouble>(nqTot * m_spacedim, 0.0);
+        for (size_t k = 0; k < m_spacedim; ++k)
+        {
+            for (size_t j = 0; j < k + 1; ++j)
+            {
+                for (size_t i = 0; i < nqTot; ++i)
+                {
+                    if (m_mask[i])
+                    {
+                        l = k + j * (2 * m_spacedim - j - 1) * 0.5;
+                        velFluc[n][k * nqTot + i] +=
+                            m_Cholesky[i][l] *
+                            stochasticSignal[n][j * nqTot + i];
+                    }
+                }
+            }
+        }
+    }
+
+    return velFluc;
+}
+
+/**
+ * @brief Compute stochastic signal.
+ *
+ * @param pFields  Pointer to fields.
+ * @return         Stochastic signal.
+ */
+Array<OneD, Array<OneD, NekDouble>> ForcingSyntheticEddy::
+    ComputeStochasticSignal(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
+{
+    // Total number of quadrature points
+    int nqTot = pFields[0]->GetTotPoints();
+    // Number of elements
+    int nElmts = pFields[0]->GetNumElmts();
+    // Total number of quadrature points of each element
+    int nqe;
+    // Stochastic Signal vector
+    Array<OneD, Array<OneD, NekDouble>> stochasticSignal(m_N);
+    // Random numbers: -1 and 1
+    Array<OneD, Array<OneD, int>> epsilonSign;
+
+    // Generate only for the new eddies after the first time step
+    epsilonSign = GenerateRandomOneOrMinusOne();
+
+    // Calculate the stochastic signal for the eddies
+    for (auto &n : m_eddiesIDForcing)
+    {
+        stochasticSignal[n] = Array<OneD, NekDouble>(nqTot * m_spacedim, 0.0);
+
+        // Evaluate the function at interpolation points for each component
+        for (size_t j = 0; j < m_spacedim; ++j)
+        {
+            // Count the number of quadrature points
+            int nqeCount = 0;
+
+            for (size_t e = 0; e < nElmts; ++e)
+            {
+                nqe = pFields[0]->GetExp(e)->GetTotPoints();
+
+                Array<OneD, NekDouble> coords0(nqe, 0.0);
+                Array<OneD, NekDouble> coords1(nqe, 0.0);
+                Array<OneD, NekDouble> coords2(nqe, 0.0);
+
+                pFields[0]->GetExp(e)->GetCoords(coords0, coords1, coords2);
+
+                // i: degrees of freedom, j: direction, n: eddies
+                for (size_t i = 0; i < nqe; ++i)
+                {
+                    if (m_mask[nqeCount + i])
+                    {
+                        stochasticSignal[n][j * nqTot + nqeCount + i] =
+                            epsilonSign[j][n] *
+                            ComputeGaussian((coords0[i] - m_eddyPos[n][0]) /
+                                                m_lref[0],
+                                            m_xiMax[j * m_spacedim + 0],
+                                            ComputeConstantC(0, j)) *
+                            ComputeGaussian((coords1[i] - m_eddyPos[n][1]) /
+                                                m_lref[1],
+                                            m_xiMax[j * m_spacedim + 1],
+                                            ComputeConstantC(1, j)) *
+                            ComputeGaussian((coords2[i] - m_eddyPos[n][2]) /
+                                                m_lref[2],
+                                            m_xiMax[j * m_spacedim + 2],
+                                            ComputeConstantC(2, j));
+                    }
+                }
+                nqeCount += nqe;
+            }
+        }
+    }
+
+    return stochasticSignal;
+}
+
+/**
+ * @brief Update the position of the eddies for every time step.
+ */
+void ForcingSyntheticEddy::UpdateEddiesPositions()
+{
+    NekDouble dt = m_session->GetParameter("TimeStep");
+
+    for (size_t n = 0; n < m_N; ++n)
+    {
+        // Check if any eddy went through the outlet plane (box)
+        if ((m_eddyPos[n][0] + m_Ub * dt) < (m_rc[0] + m_lref[0]))
+        {
+            m_eddyPos[n][0] = m_eddyPos[n][0] + m_Ub * dt;
+        }
+        else
+        {
+            // Generate a new one in the inlet plane
+            m_eddyPos[n][0] = m_rc[0] - m_lref[0];
+            // Check if test case
+            if (!m_tCase)
+            {
+                m_eddyPos[n][1] =
+                    (m_rc[1] - 0.5 * m_lyz[0]) +
+                    (NekSingle(std::rand()) / NekSingle(RAND_MAX)) * (m_lyz[0]);
+                m_eddyPos[n][2] =
+                    (m_rc[2] - 0.5 * m_lyz[1] + 0.5 * m_lref[2]) +
+                    (NekSingle(std::rand()) / NekSingle(RAND_MAX)) * (m_lyz[1]);
+            }
+            else
+            {
+                // same place (center) for the test case
+                m_eddyPos[n][1] = m_rc[1];
+                m_eddyPos[n][2] = m_rc[2];
+            }
+            m_eddiesIDForcing.push_back(n);
+            m_calcForcing = true;
+        }
+    }
+}
+
+/**
+ * @brief Remove eddy from forcing term
+ *
+ * @param pFields  Pointer to fields.
+ */
+void ForcingSyntheticEddy::RemoveEddiesFromForcing(
+    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
+{
+    // Total number of quadrature points
+    int nqTot = pFields[0]->GetTotPoints();
+    // Number of Variables
+    int nVars = pFields.size();
+
+    for (auto &n : m_eddiesIDForcing)
+    {
+        for (size_t j = 0; j < nVars; ++j)
+        {
+            for (size_t i = 0; i < nqTot; ++i)
+            {
+                m_Forcing[j][i] -= m_ForcingEddy[n][j][i];
+            }
+        }
+    }
+}
+
+/**
+ * @brief Calculate distribution of eddies in the box.
+ */
+void ForcingSyntheticEddy::ComputeInitialRandomLocationOfEddies()
+{
+    m_eddyPos = Array<OneD, Array<OneD, NekDouble>>(m_N);
+
+    for (size_t n = 0; n < m_N; ++n)
+    {
+        m_eddyPos[n] = Array<OneD, NekDouble>(m_spacedim);
+        // Generate randomly eddies inside the box
+        m_eddyPos[n][0] =
+            (m_rc[0] - m_lref[0]) +
+            (NekSingle(std::rand()) / NekSingle(RAND_MAX)) * 2 * m_lref[0];
+        m_eddyPos[n][1] =
+            (m_rc[1] - 0.5 * m_lyz[0]) +
+            (NekSingle(std::rand()) / NekSingle(RAND_MAX)) * m_lyz[0];
+        m_eddyPos[n][2] =
+            (m_rc[2] - 0.5 * m_lyz[1]) +
+            (NekSingle(std::rand()) / NekSingle(RAND_MAX)) * m_lyz[1];
+    }
+}
+
+/**
+ * @brief Compute standard Gaussian with zero mean.
+ *
+ * @param coord  Coordianate.
+ * @return       Gaussian value for the coordinate.
+ */
+NekDouble ForcingSyntheticEddy::ComputeGaussian(NekDouble coord,
+                                                NekDouble xiMaxVal,
+                                                NekDouble constC)
+{
+    NekDouble epsilon = 1e-6;
+    if (abs(coord) <= (xiMaxVal + epsilon))
+    {
+        return ((1.0 / (m_sigma * sqrt(2.0 * M_PI * constC))) *
+                exp(-0.5 * (coord / m_sigma) * (coord / m_sigma)));
+    }
+    else
+    {
+        return 0.0;
+    }
+}
+
+/**
+ * @brief Compute constant C for the gaussian funcion.
+ *
+ * @param row  index for the rows of the matrix.
+ * @param col  index for the columns of the matrix.
+ * @return     Value of C.
+ */
+NekDouble ForcingSyntheticEddy::ComputeConstantC(int row, int col)
+{
+    NekDouble sizeLenScale = m_xiMax[col * m_spacedim + row];
+
+    // Integration
+    NekDouble sum  = 0.0;
+    NekDouble step = 0.025;
+    NekDouble xi0  = -1;
+    NekDouble xif  = 1;
+    while (xi0 < xif)
+    {
+        sum += (ComputeGaussian(xi0 + step, sizeLenScale) *
+                    ComputeGaussian(xi0 + step, sizeLenScale) +
+                ComputeGaussian(xi0, sizeLenScale) *
+                    ComputeGaussian(xi0, sizeLenScale));
+        xi0 += step;
+    }
+
+    return (0.5 * 0.5 * step * sum);
+}
+
+/**
+ * @brief Generate random 1 or -1 values to be use to compute
+ *        the stochastic signal.
+ * @return ramdom 1 or -1 values.
+ */
+Array<OneD, Array<OneD, int>> ForcingSyntheticEddy::
+    GenerateRandomOneOrMinusOne()
+{
+    Array<OneD, Array<OneD, int>> epsilonSign(m_spacedim);
+
+    // j: component of the stochastic signal
+    // n: eddy
+    for (size_t j = 0; j < m_spacedim; ++j)
+    {
+        epsilonSign[j] = Array<OneD, int>(m_N, 0.0);
+        for (auto &n : m_eddiesIDForcing)
+        {
+            // Convert to -1 or to 1
+            // Check if test case
+            if (!m_tCase)
+            {
+                epsilonSign[j][n] =
+                    ((NekSingle(std::rand()) / NekSingle(RAND_MAX)) <= 0.5) ? -1
+                                                                            : 1;
+            }
+            else
+            {
+                // Positive values only for the test case
+                epsilonSign[j][n] = 1;
+            }
+        }
+    }
+
+    return epsilonSign;
+}
+
+/**
+ * @brief Set box of eddies mask to be used to seprate the
+ *        degrees of freedom (coordinates) inside and outside
+ *        the box of eddies.
+ *
+ * @param pFields  Pointer to fields.
+ */
+void ForcingSyntheticEddy::SetBoxOfEddiesMask(
+    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
+{
+    // Total number of quadrature points
+    int nqTot = pFields[0]->GetTotPoints();
+    // Number of elements
+    int nElmts = pFields[0]->GetNumElmts();
+    // Total number of quadrature points of each element
+    int nqe;
+    // Mask
+    m_mask = Array<OneD, int>(nqTot, 0); // 0 for ouside, 1 for inside
+    // Counter
+    int count = 0;
+
+    for (size_t e = 0; e < nElmts; ++e)
+    {
+        nqe = pFields[0]->GetExp(e)->GetTotPoints();
+
+        Array<OneD, NekDouble> coords0(nqe, 0.0);
+        Array<OneD, NekDouble> coords1(nqe, 0.0);
+        Array<OneD, NekDouble> coords2(nqe, 0.0);
+
+        pFields[0]->GetExp(e)->GetCoords(coords0, coords1, coords2);
+
+        for (size_t i = 0; i < nqe; ++i)
+        {
+            if (InsideBoxOfEddies(coords0[i], coords1[i], coords2[i]))
+            {
+                // 0 for outside, 1 for inside
+                m_mask[count + i] = 1;
+            }
+        }
+        count += nqe;
+    }
+}
+
+/**
+ * @brief Initialise Forcing term for each eddy.
+ */
+void ForcingSyntheticEddy::InitialiseForcingEddy(
+    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
+{
+    // Total number of quadrature points
+    int nqTot = pFields[0]->GetTotPoints();
+    // Number of Variables
+    int nVars     = pFields.size();
+    m_ForcingEddy = Array<OneD, Array<OneD, Array<OneD, NekDouble>>>(m_N);
+
+    for (size_t i = 0; i < m_N; ++i)
+    {
+        m_ForcingEddy[i] = Array<OneD, Array<OneD, NekDouble>>(nVars);
+        for (size_t j = 0; j < nVars; ++j)
+        {
+            m_ForcingEddy[i][j] = Array<OneD, NekDouble>(nqTot);
+            for (size_t k = 0; k < nqTot; ++k)
+            {
+                m_ForcingEddy[i][j][k] = 0.0;
+            }
+        }
+    }
+}
+
+/**
+ * @brief Check it point is inside the box of eddies.
+ *
+ * @param coord0  coordinate in the x-direction.
+ * @param coord1  coordinate in the y-direction.
+ * @param coord2  coordinate in the z-direction.
+ * @return        true or false
+ */
+bool ForcingSyntheticEddy::InsideBoxOfEddies(NekDouble coord0, NekDouble coord1,
+                                             NekDouble coord2)
+{
+    NekDouble tol = 1e-6;
+    if ((coord0 >= (m_rc[0] - m_lref[0] - m_lref[0])) &&
+        (coord0 <= (m_rc[0] + m_lref[0] + tol)) &&
+        (coord1 >= (m_rc[1] - 0.5 * m_lyz[0] - tol)) &&
+        (coord1 <= (m_rc[1] + 0.5 * m_lyz[0] + tol)) &&
+        (coord2 >= (m_rc[2] - 0.5 * m_lyz[1] - tol)) &&
+        (coord2 <= (m_rc[2] + 0.5 * m_lyz[1] + tol)))
+    {
+        return true;
+    }
+
+    return false;
+}
+
+/**
+ * @brief Calculates the reference lenghts
+ */
+void ForcingSyntheticEddy::ComputeRefLenghts()
+{
+    m_lref    = Array<OneD, NekDouble>(m_spacedim, 0.0);
+    m_lref[0] = m_l[0];
+    m_lref[1] = m_l[1];
+    m_lref[2] = m_l[2];
+
+    // The l_{x}^{ref}, l_{y}^{ref} and l_{z}^{ref}
+    // are the maximum among the velocity components
+    // over the domain.
+    for (size_t i = 0; i < m_spacedim; ++i)
+    {
+        for (size_t j = 1; j < m_spacedim; ++j)
+        {
+            if (m_l[m_spacedim * j + i] > m_lref[i])
+            {
+                m_lref[i] = m_l[m_spacedim * j + i];
+            }
+        }
+    }
+}
+
+/**
+ * @brief Calculates the \f$\xi_{max}\f$.
+ */
+void ForcingSyntheticEddy::ComputeXiMax()
+{
+    NekDouble value;
+    m_xiMax = Array<OneD, NekDouble>(m_spacedim * m_spacedim, 0.0);
+
+    for (size_t i = 0; i < m_spacedim; i++)
+    {
+        for (size_t j = 0; j < m_spacedim; j++)
+        {
+            value = (m_l[m_spacedim * j + i] / m_lref[i]);
+            if (value > m_xiMaxMin)
+            {
+                m_xiMax[m_spacedim * j + i] = value;
+            }
+            else
+            {
+                m_xiMax[m_spacedim * j + i] = m_xiMaxMin;
+            }
+        }
+    }
+}
+
+/**
+ * @brief Calculates the Cholesky decomposition of the Reynolds Stresses
+ *        in each degree of freedom of the mesh.
+ *
+ * @param pFields  Pointer to fields.
+ */
+void ForcingSyntheticEddy::SetCholeskyReyStresses(
+    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
+{
+    // Total number of quadrature points
+    int nqTot = pFields[0]->GetTotPoints();
+    // Total number of quadrature points of each element
+    int nqe;
+    // Number of elements
+    int nElmts = pFields[0]->GetNumElmts();
+    // Count the degrees of freedom
+    int nqeCount = 0;
+    // Block diagonal size
+    int diagSize = m_spacedim * (m_spacedim + 1) * 0.5;
+    // Cholesky decomposition matrix for the synthetic eddy region (box)
+    m_Cholesky = Array<OneD, Array<OneD, NekDouble>>(nqTot);
+
+    for (size_t e = 0; e < nElmts; ++e)
+    {
+        nqe = pFields[0]->GetExp(e)->GetTotPoints();
+
+        Array<OneD, NekDouble> coords0(nqe, 0.0);
+        Array<OneD, NekDouble> coords1(nqe, 0.0);
+        Array<OneD, NekDouble> coords2(nqe, 0.0);
+
+        // Coordinates (for each degree of freedom) for the element k.
+        pFields[0]->GetExp(e)->GetCoords(coords0, coords1, coords2);
+
+        // Evaluate Cholesky decomposition
+        for (size_t i = 0; i < nqe; ++i)
+        {
+            int l = 0;
+            // Size of Cholesky decomposition matrix - aux vector
+            Array<OneD, NekDouble> A(diagSize, 0.0);
+
+            while (l < diagSize)
+            {
+                // Variable to compute the Cholesky decomposition for each
+                // degree of freedom
+                A[l] = m_R[l]->Evaluate(coords0[i], coords1[i], coords2[i]);
+                l++;
+            }
+            int info = 0;
+            Lapack::Dpptrf('L', m_spacedim, A.get(), info);
+            if (info < 0)
+            {
+                std::string message =
+                    "ERROR: The " + std::to_string(-info) +
+                    "th parameter had an illegal parameter for dpptrf";
+                NEKERROR(ErrorUtil::efatal, message.c_str());
+            }
+            m_Cholesky[nqeCount + i] = Array<OneD, NekDouble>(diagSize);
+            for (size_t l = 0; l < diagSize; ++l)
+            {
+                m_Cholesky[nqeCount + i][l] = A[l];
+            }
+        }
+        nqeCount += nqe;
+    }
+}
+
+/**
+ * @brief Calculate the number of eddies that are going to be
+ *        injected in the synthetic eddy region (box).
+ */
+void ForcingSyntheticEddy::SetNumberOfEddies()
+{
+    m_N = int((m_lyz[0] * m_lyz[1]) /
+              (4 * m_lref[m_spacedim - 2] * m_lref[m_spacedim - 1])) +
+          1;
+}
+
+/**
+ * @brief Place eddies in specific locations in the test case
+ *        geometry for consistency and comparison.
+ *
+ *        This function was design for a three-dimensional
+ *        channel flow test case (ChanFlow3d_infTurb).
+ *        It is only called for testing purposes (unit test).
+ */
+void ForcingSyntheticEddy::ComputeInitialLocationTestCase()
+{
+    m_N       = 3; // Redefine number of eddies
+    m_eddyPos = Array<OneD, Array<OneD, NekDouble>>(m_N);
+
+    // First eddy (center)
+    m_eddyPos[0]    = Array<OneD, NekDouble>(m_spacedim);
+    m_eddyPos[0][0] = (m_rc[0] - m_lref[0]) + 0.2 * 2 * m_lref[0];
+    m_eddyPos[0][1] = m_rc[1];
+    m_eddyPos[0][2] = m_rc[2];
+
+    // Second eddy (top)
+    m_eddyPos[1]    = Array<OneD, NekDouble>(m_spacedim);
+    m_eddyPos[1][0] = (m_rc[0] - m_lref[0]) + 0.3 * 2 * m_lref[0];
+    m_eddyPos[1][1] = (m_rc[1] - 0.5 * m_lyz[0]) + 0.9 * m_lyz[0];
+    m_eddyPos[1][2] = m_rc[2];
+
+    // Third eddy (bottom)
+    m_eddyPos[2]    = Array<OneD, NekDouble>(m_spacedim);
+    m_eddyPos[2][0] = (m_rc[0] - m_lref[0]) + 0.4 * 2 * m_lref[0];
+    m_eddyPos[2][1] = (m_rc[1] - 0.5 * m_lyz[0]) + 0.1 * m_lyz[0];
+    m_eddyPos[2][2] = m_rc[2];
+}
+
+} // namespace Nektar::SolverUtils
diff --git a/library/SolverUtils/Forcing/ForcingSyntheticEddy.h b/library/SolverUtils/Forcing/ForcingSyntheticEddy.h
new file mode 100644
index 0000000000..c0982b9162
--- /dev/null
+++ b/library/SolverUtils/Forcing/ForcingSyntheticEddy.h
@@ -0,0 +1,188 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// File:  ForcingSyntheticEddy.h
+//
+// For more information, please see: http://www.nektar.info
+//
+// The MIT License
+//
+// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
+// Department of Aeronautics, Imperial College London (UK), and Scientific
+// Computing and Imaging Institute, University of Utah (USA).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+//
+// Description: Derived base class - Synthetic turbulence generation.
+//              This code implements the Synthetic Eddy Method (SEM).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef NEKTAR_SOLVERUTILS_FORCINGSYNTHETICEDDY
+#define NEKTAR_SOLVERUTILS_FORCINGSYNTHETICEDDY
+
+#include <SolverUtils/Forcing/Forcing.h>
+#include <string>
+
+namespace Nektar::SolverUtils
+{
+
+class ForcingSyntheticEddy : virtual public SolverUtils::Forcing
+{
+public:
+    friend class MemoryManager<ForcingSyntheticEddy>;
+
+    /// Creates an instance of this class
+    SOLVER_UTILS_EXPORT static ForcingSharedPtr create(
+        const LibUtilities::SessionReaderSharedPtr &pSession,
+        const std::weak_ptr<EquationSystem> &pEquation,
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        const unsigned int &pNumForcingFields, const TiXmlElement *pForce)
+    {
+        ForcingSharedPtr p =
+            MemoryManager<ForcingSyntheticEddy>::AllocateSharedPtr(pSession,
+                                                                   pEquation);
+        p->InitObject(pFields, pNumForcingFields, pForce);
+        return p;
+    }
+
+    /// Name of the class
+    SOLVER_UTILS_EXPORT static std::string className;
+
+protected:
+    // Initial object
+    SOLVER_UTILS_EXPORT void v_InitObject(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        const unsigned int &pNumForcingFields,
+        const TiXmlElement *pForce) override;
+    // Apply forcing term
+    SOLVER_UTILS_EXPORT void v_Apply(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        const Array<OneD, Array<OneD, NekDouble>> &inarray,
+        Array<OneD, Array<OneD, NekDouble>> &outarray,
+        const NekDouble &time) override;
+    // Apply forcing term
+    SOLVER_UTILS_EXPORT void v_ApplyCoeff(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        const Array<OneD, Array<OneD, NekDouble>> &inarray,
+        Array<OneD, Array<OneD, NekDouble>> &outarray,
+        const NekDouble &time) override;
+    // Set Cholesky decomposition of the Reynolds Stresses in the domain
+    SOLVER_UTILS_EXPORT void SetCholeskyReyStresses(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
+    /// Set the Number of the Eddies in the box
+    SOLVER_UTILS_EXPORT void SetNumberOfEddies();
+    /// Set reference lengths
+    SOLVER_UTILS_EXPORT void ComputeRefLenghts();
+    /// Set Xi max
+    SOLVER_UTILS_EXPORT void ComputeXiMax();
+    /// Compute Random 1 or -1 value
+    SOLVER_UTILS_EXPORT Array<OneD, Array<OneD, int>> GenerateRandomOneOrMinusOne();
+    /// Compute Constant C
+    SOLVER_UTILS_EXPORT NekDouble ComputeConstantC(int row, int col);
+    /// Compute Gaussian
+    SOLVER_UTILS_EXPORT NekDouble ComputeGaussian(NekDouble coord,
+                                                  NekDouble xiMaxVal,
+                                                  NekDouble constC = 1.0);
+    /// Check if point is inside the box of eddies
+    SOLVER_UTILS_EXPORT bool InsideBoxOfEddies(NekDouble coord0,
+                                               NekDouble coord1,
+                                               NekDouble coord2);
+    /// Compute Stochastic Signal
+    SOLVER_UTILS_EXPORT Array<OneD, Array<OneD, NekDouble>> ComputeStochasticSignal(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
+    /// Compute Velocity Fluctuation
+    SOLVER_UTILS_EXPORT Array<OneD, Array<OneD, NekDouble>>
+    ComputeVelocityFluctuation(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        Array<OneD, Array<OneD, NekDouble>> stochasticSignal);
+    /// Compute Characteristic Convective Turbulent Time
+    SOLVER_UTILS_EXPORT Array<OneD, Array<OneD, NekDouble>> ComputeCharConvTurbTime(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
+    /// Compute Smoothing Factor
+    SOLVER_UTILS_EXPORT Array<OneD, Array<OneD, NekDouble>> ComputeSmoothingFactor(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        Array<OneD, Array<OneD, NekDouble>> convTurb);
+    /// Set box of eddies mask
+    SOLVER_UTILS_EXPORT void SetBoxOfEddiesMask(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
+    /// Initialise forcing term for each eddy
+    SOLVER_UTILS_EXPORT void InitialiseForcingEddy(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
+    /// Compute the initial position of the eddies inside the box
+    SOLVER_UTILS_EXPORT void ComputeInitialRandomLocationOfEddies();
+    /// Update positions of the eddies inside the box
+    SOLVER_UTILS_EXPORT void UpdateEddiesPositions();
+    /// Remove eddy from forcing term
+    SOLVER_UTILS_EXPORT void RemoveEddiesFromForcing(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
+    /// Compute the initial location of the eddies for the test case
+    SOLVER_UTILS_EXPORT void ComputeInitialLocationTestCase();
+
+    // Members
+    // Expressions (functions) of the prescribed Reynolds stresses
+    std::map<int, LibUtilities::EquationSharedPtr> m_R;
+    /// Cholesky decomposition of the Reynolds Stresses
+    /// for all points in the mesh
+    Array<OneD, Array<OneD, NekDouble>> m_Cholesky;
+    /// Bulk velocity
+    NekDouble m_Ub;
+    /// Standard deviation
+    NekDouble m_sigma;
+    /// Inlet length in the y-direction and z-direction
+    Array<OneD, NekDouble> m_lyz;
+    /// Center of the inlet plane
+    Array<OneD, NekDouble> m_rc;
+    /// Number of eddies in the box
+    int m_N;
+    /// Characteristic lenght scales
+    Array<OneD, NekDouble> m_l;
+    /// Reference lenghts
+    Array<OneD, NekDouble> m_lref;
+    /// Xi max
+    Array<OneD, NekDouble> m_xiMax;
+    // XiMaxMin - Value form Giangaspero et al. 2022
+    NekDouble m_xiMaxMin = 0.4;
+    /// Space dimension
+    int m_spacedim;
+    /// Ration of specific heats
+    NekDouble m_gamma;
+    /// Box of eddies mask
+    Array<OneD, int> m_mask;
+    /// Eddy position
+    Array<OneD, Array<OneD, NekDouble>> m_eddyPos;
+    /// Check when the forcing should be applied
+    bool m_calcForcing{true};
+    /// Eddies that add to the domain
+    std::vector<unsigned int> m_eddiesIDForcing;
+    /// Current time
+    NekDouble m_currTime;
+    /// Check for test case
+    bool m_tCase;
+    /// Forcing for each eddy
+    Array<OneD, Array<OneD, Array<OneD, NekDouble>>> m_ForcingEddy;
+
+    SOLVER_UTILS_EXPORT ForcingSyntheticEddy(
+        const LibUtilities::SessionReaderSharedPtr &pSession,
+        const std::weak_ptr<EquationSystem> &pEquation);
+    SOLVER_UTILS_EXPORT ~ForcingSyntheticEddy(void) override = default;
+};
+
+} // namespace Nektar::SolverUtils
+
+#endif
diff --git a/solvers/CompressibleFlowSolver/CMakeLists.txt b/solvers/CompressibleFlowSolver/CMakeLists.txt
index aafce34da4..9cb9335b2d 100644
--- a/solvers/CompressibleFlowSolver/CMakeLists.txt
+++ b/solvers/CompressibleFlowSolver/CMakeLists.txt
@@ -38,6 +38,7 @@ IF( NEKTAR_SOLVER_COMPRESSIBLE_FLOW )
         EquationSystems/NavierStokesCFEAxisym.cpp
         EquationSystems/NavierStokesImplicitCFE.cpp
         Forcing/ForcingAxiSymmetric.cpp
+        Forcing/ForcingCFSSyntheticEddy.cpp
         Forcing/ForcingQuasi1D.cpp
        )
 
@@ -95,6 +96,7 @@ IF( NEKTAR_SOLVER_COMPRESSIBLE_FLOW )
         EquationSystems/NavierStokesCFE.h
         EquationSystems/NavierStokesImplicitCFE.h
         Forcing/ForcingAxiSymmetric.h
+        Forcing/ForcingCFSSyntheticEddy.h
         Forcing/ForcingQuasi1D.h
         Misc/EquationOfState.h
         Misc/IdealGasEoS.h
@@ -151,6 +153,8 @@ IF( NEKTAR_SOLVER_COMPRESSIBLE_FLOW )
     ADD_NEKTAR_TEST(IsentropicVortex_WeakDG_HexDeformed)
     ADD_NEKTAR_TEST(RinglebFlow_P3)
     ADD_NEKTAR_TEST(RinglebFlow_P8 LENGTHY)
+    ADD_NEKTAR_TEST(ChanFlow3D_infTurbExpl)
+    ADD_NEKTAR_TEST(ChanFlow3D_infTurbImpl)
     #ADD_NEKTAR_TEST(Couette_WeakDG_LDG_MODIFIED)
     ADD_NEKTAR_TEST(Couette_WeakDG_IP_MODIFIED_IM)
     #ADD_NEKTAR_TEST(Couette_WeakDG_LDGNS_MODIFIED_IM)
diff --git a/solvers/CompressibleFlowSolver/Forcing/ForcingCFSSyntheticEddy.cpp b/solvers/CompressibleFlowSolver/Forcing/ForcingCFSSyntheticEddy.cpp
new file mode 100644
index 0000000000..82f1d447a7
--- /dev/null
+++ b/solvers/CompressibleFlowSolver/Forcing/ForcingCFSSyntheticEddy.cpp
@@ -0,0 +1,337 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// File: ForcingCFSSyntheticEddy.cpp
+//
+// For more information, please see: http://www.nektar.info
+//
+// The MIT License
+//
+// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
+// Department of Aeronautics, Imperial College London (UK), and Scientific
+// Computing and Imaging Institute, University of Utah (USA).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+//
+// Description: Derived base class - Synthetic turbulence forcing for the
+//              Compressible solver.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <CompressibleFlowSolver/Forcing/ForcingCFSSyntheticEddy.h>
+
+namespace Nektar::SolverUtils
+{
+
+std::string ForcingCFSSyntheticEddy::className =
+    GetForcingFactory().RegisterCreatorFunction(
+        "CFSSyntheticTurbulence", ForcingCFSSyntheticEddy::create,
+        "Compressible Synthetic Eddy Turbulence Forcing (Generation)");
+
+ForcingCFSSyntheticEddy::ForcingCFSSyntheticEddy(
+    const LibUtilities::SessionReaderSharedPtr &pSession,
+    const std::weak_ptr<EquationSystem> &pEquation)
+    : Forcing(pSession, pEquation), ForcingSyntheticEddy(pSession, pEquation)
+{
+}
+
+/**
+ * @brief Apply forcing term if an eddy left the box of eddies and
+ *        update the eddies positions.
+ *
+ * @param pFields   Pointer to fields.
+ * @param inarray   Given fields. The fields are in in physical space.
+ * @param outarray  Calculated solution after forcing term being applied
+ *                  in physical space.
+ * @param time      time.
+ */
+void ForcingCFSSyntheticEddy::v_Apply(
+    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+    [[maybe_unused]] const Array<OneD, Array<OneD, NekDouble>> &inarray,
+    Array<OneD, Array<OneD, NekDouble>> &outarray,
+    [[maybe_unused]] const NekDouble &time)
+{
+    // Number of Variables
+    int nVars = pFields.size();
+    // Total number of coefficients
+    unsigned int nqTot = pFields[0]->GetTotPoints();
+
+    // Only calculates the forcing in the first time step and when an eddy
+    // leaves the synthetic eddy region (box).
+    if (m_calcForcing)
+    {
+        CalculateForcing(pFields);
+        m_calcForcing = false;
+    }
+
+    for (size_t i = 0; i < nVars; ++i)
+    {
+        Vmath::Vadd(nqTot, m_Forcing[i], 1, outarray[i], 1, outarray[i], 1);
+    }
+
+    // Update eddies position inside the box.
+    UpdateEddiesPositions();
+}
+
+/**
+ * @brief Apply forcing term if an eddy left the box of eddies and
+ *        update the eddies positions.
+ *
+ * @param pFields   Pointer to fields.
+ * @param inarray   Given fields. The fields are in in physical space.
+ * @param outarray  Calculated solution after forcing term being applied
+ *                  in coeficient space.
+ * @param time      time.
+ */
+void ForcingCFSSyntheticEddy::v_ApplyCoeff(
+    const Array<OneD, MultiRegions::ExpListSharedPtr> &fields,
+    [[maybe_unused]] const Array<OneD, Array<OneD, NekDouble>> &inarray,
+    Array<OneD, Array<OneD, NekDouble>> &outarray, const NekDouble &time)
+{
+    // Number of Variables
+    int nVars = fields.size();
+    // Total number of coefficients
+    unsigned int nCoeff = fields[0]->GetNcoeffs();
+
+    // Only calculates the forcing in the first time step and when an eddy
+    // leaves the box
+    if (m_calcForcing)
+    {
+        CalculateForcing(fields);
+        m_calcForcing = false;
+    }
+
+    Array<OneD, NekDouble> forcingCoeff(nCoeff);
+    for (size_t i = 0; i < nVars; ++i)
+    {
+        fields[i]->FwdTrans(m_Forcing[i], forcingCoeff);
+        Vmath::Vadd(nCoeff, forcingCoeff, 1, outarray[i], 1, outarray[i], 1);
+    }
+
+    // Check for update: implicit solver
+    if (m_currTime != time)
+    {
+        UpdateEddiesPositions();
+        m_currTime = time;
+    }
+}
+
+/**
+ * @brief Calculate forcing term.
+ *
+ * @param pFfields  Pointer to fields.
+ */
+void ForcingCFSSyntheticEddy::CalculateForcing(
+    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
+{
+    // Total number of quadrature points
+    int nqTot = pFields[0]->GetTotPoints();
+    // Number of Variables
+    int nVars = pFields.size();
+    // Define parameters
+    Array<OneD, NekDouble> rho(nqTot), temperature(nqTot), pressure(nqTot);
+    // Velocity fluctuation module
+    NekDouble velFlucMod;
+    // Variable converter
+    m_varConv = MemoryManager<VariableConverter>::AllocateSharedPtr(m_session,
+                                                                    m_spacedim);
+
+    // Compute Stochastic Signal
+    Array<OneD, Array<OneD, NekDouble>> stochasticSignal;
+    stochasticSignal = ComputeStochasticSignal(pFields);
+
+    // Compute rho and mach mean inside the box of eddies
+    std::pair<NekDouble, NekDouble> rhoMachMean;
+    rhoMachMean = ComputeRhoMachMean(pFields);
+
+    // Compute velocity fluctuation
+    Array<OneD, Array<OneD, NekDouble>> velFluc;
+    velFluc = ComputeVelocityFluctuation(pFields, stochasticSignal);
+
+    // Compute density fluctuation
+    Array<OneD, Array<OneD, NekDouble>> rhoFluc;
+    rhoFluc = ComputeDensityFluctuation(pFields, velFluc, rhoMachMean);
+
+    // Compute characteristic convective turbulent time
+    Array<OneD, Array<OneD, NekDouble>> convTurbTime;
+    convTurbTime = ComputeCharConvTurbTime(pFields);
+
+    // Compute smoothing factor
+    Array<OneD, Array<OneD, NekDouble>> smoothFac;
+    smoothFac = ComputeSmoothingFactor(pFields, convTurbTime);
+
+    // Get physical data
+    Array<OneD, Array<OneD, NekDouble>> physFields(nVars);
+    for (size_t i = 0; i < nVars; ++i)
+    {
+        physFields[i] = pFields[i]->GetPhys();
+    }
+
+    // Calculate parameters
+    m_varConv->GetTemperature(physFields, temperature);
+    m_varConv->GetPressure(physFields, pressure);
+    m_varConv->GetRhoFromPT(pressure, temperature, rho);
+
+    // Check if eddies left the box (reinjected). Note that the member
+    // m_eddiesIDForcing is populate with the eddies that left the box.
+    // If any left it is going to be empty.
+    if (!m_eddiesIDForcing.empty())
+    {
+        // Forcing must stop applying for eddies that left the box
+        RemoveEddiesFromForcing(pFields);
+
+        // Update Forcing term which are going to be applied until
+        // the eddy leave the leave the domain
+        // Select the eddies to apply the forcing. Superposition.
+        for (auto &n : m_eddiesIDForcing)
+        {
+            for (size_t i = 0; i < nqTot; ++i)
+            {
+                if (m_mask[i])
+                {
+                    // density term
+                    m_ForcingEddy[n][0][i] =
+                        (rhoFluc[n][i] * smoothFac[0][i]) / convTurbTime[0][i];
+                    // Update forcing
+                    m_Forcing[0][i] += m_ForcingEddy[n][0][i];
+                    //  velocity term
+                    for (size_t j = 0; j < m_spacedim; ++j)
+                    {
+                        m_ForcingEddy[n][j + 1][i] =
+                            (rho[i] * velFluc[n][j * nqTot + i] *
+                             smoothFac[j][i]) /
+                            convTurbTime[j][i];
+                        // Update forcing
+                        m_Forcing[j + 1][i] += m_ForcingEddy[n][j + 1][i];
+                    }
+                    // energy term
+                    velFlucMod =
+                        velFluc[n][i] * velFluc[n][i] +
+                        velFluc[n][nqTot + i] * velFluc[n][nqTot + i] +
+                        velFluc[n][2 * nqTot + i] * velFluc[n][2 * nqTot + i];
+
+                    m_ForcingEddy[n][nVars - 1][i] =
+                        (0.5 * rho[i] * velFlucMod * smoothFac[0][i]) /
+                        convTurbTime[0][i];
+                    // Update forcing
+                    m_Forcing[nVars - 1][i] += m_ForcingEddy[n][nVars - 1][i];
+                }
+            }
+        }
+        // delete eddies
+        m_eddiesIDForcing.erase(m_eddiesIDForcing.begin(),
+                                m_eddiesIDForcing.end());
+    }
+    else
+    {
+        NEKERROR(ErrorUtil::efatal, "Failed: Eddies ID vector is empty.");
+    }
+}
+
+/**
+ * @brief Compute density fluctuation for the source term
+ *
+ * @param pFfields  Pointer to fields.
+ */
+Array<OneD, Array<OneD, NekDouble>> ForcingCFSSyntheticEddy::
+    ComputeDensityFluctuation(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        const Array<OneD, Array<OneD, NekDouble>> &velFluc,
+        std::pair<NekDouble, NekDouble> rhoMachMean)
+{
+    // Total number of quadrature points
+    int nqTot = pFields[0]->GetTotPoints();
+    // Density fluctuation
+    Array<OneD, Array<OneD, NekDouble>> rhoFluc(m_N);
+
+    for (auto &n : m_eddiesIDForcing)
+    {
+        rhoFluc[n] = Array<OneD, NekDouble>(nqTot, 0.0);
+
+        for (size_t i = 0; i < nqTot; ++i)
+        {
+            if (m_mask[i])
+            {
+                // only need velocity fluctation in the x-direction
+                rhoFluc[n][i] = rhoMachMean.first * (m_gamma - 1) *
+                                rhoMachMean.second * rhoMachMean.second *
+                                (velFluc[n][i] / m_Ub);
+            }
+        }
+    }
+
+    return rhoFluc;
+}
+
+/**
+ * @brief Calculate the density and mach number mean
+ *        inside the box of eddies.
+ *
+ * @param  pFfields  Pointer to fields.
+ * @return           Pair with density and mach nember means.
+ */
+std::pair<NekDouble, NekDouble> ForcingCFSSyntheticEddy::ComputeRhoMachMean(
+    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
+{
+    // Total number of quadrature points
+    int nqTot = pFields[0]->GetTotPoints();
+    // Number of Variables
+    int nVars = pFields.size();
+    // <rho> and <mach>^{2}
+    NekDouble rhoMean = 0.0, machMean = 0.0;
+    // Counter for the mean
+    int count = 0;
+
+    // Get physical field
+    Array<OneD, Array<OneD, NekDouble>> physFields(nVars);
+    for (size_t i = 0; i < nVars; ++i)
+    {
+        physFields[i] = pFields[i]->GetPhys();
+    }
+
+    // Define parameters
+    Array<OneD, NekDouble> soundSpeed(nqTot), mach(nqTot), rho(nqTot),
+        temperature(nqTot), pressure(nqTot);
+    // Calculate parameters
+
+    m_varConv->GetTemperature(physFields, temperature);
+    m_varConv->GetPressure(physFields, pressure);
+    m_varConv->GetRhoFromPT(pressure, temperature, rho);
+    m_varConv->GetSoundSpeed(physFields, soundSpeed);
+    m_varConv->GetMach(physFields, soundSpeed, mach);
+
+    // Sum
+    for (size_t i = 0; i < nqTot; ++i)
+    {
+        if (m_mask[i])
+        {
+            rhoMean += rho[i];
+            machMean += mach[i];
+            count += 1;
+        }
+    }
+
+    // Density mean
+    rhoMean = rhoMean / count;
+    // Mach number mean
+    machMean = machMean / count;
+
+    return std::make_pair(rhoMean, machMean);
+}
+
+} // namespace Nektar::SolverUtils
diff --git a/solvers/CompressibleFlowSolver/Forcing/ForcingCFSSyntheticEddy.h b/solvers/CompressibleFlowSolver/Forcing/ForcingCFSSyntheticEddy.h
new file mode 100644
index 0000000000..a6c838024f
--- /dev/null
+++ b/solvers/CompressibleFlowSolver/Forcing/ForcingCFSSyntheticEddy.h
@@ -0,0 +1,106 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// File:  ForcingCFSSyntheticEddy.h
+//
+// For more information, please see: http://www.nektar.info
+//
+// The MIT License
+//
+// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
+// Department of Aeronautics, Imperial College London (UK), and Scientific
+// Computing and Imaging Institute, University of Utah (USA).
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+//
+// Description: Derived base class - Synthetic turbulence forcing for the
+//              Compressible solver.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef NEKTAR_SOLVERUTILS_FORCINGCFSSYNTHETICEDDY
+#define NEKTAR_SOLVERUTILS_FORCINGCFSSYNTHETICEDDY
+
+#include <CompressibleFlowSolver/Misc/VariableConverter.h>
+#include <SolverUtils/Forcing/Forcing.h>
+#include <SolverUtils/Forcing/ForcingSyntheticEddy.h>
+#include <string>
+
+namespace Nektar::SolverUtils
+{
+
+class ForcingCFSSyntheticEddy : virtual public SolverUtils::Forcing,
+                                virtual public SolverUtils::ForcingSyntheticEddy
+{
+public:
+    friend class MemoryManager<ForcingCFSSyntheticEddy>;
+
+    /// Creates an instance of this class
+    static ForcingSharedPtr create(
+        const LibUtilities::SessionReaderSharedPtr &pSession,
+        const std::weak_ptr<EquationSystem> &pEquation,
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        const unsigned int &pNumForcingFields, const TiXmlElement *pForce)
+    {
+        ForcingSharedPtr p =
+            MemoryManager<ForcingCFSSyntheticEddy>::AllocateSharedPtr(
+                pSession, pEquation);
+        p->InitObject(pFields, pNumForcingFields, pForce);
+        return p;
+    }
+
+    /// Name of the class
+    static std::string className;
+
+protected:
+    // Apply forcing term
+    void v_Apply(const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+                 const Array<OneD, Array<OneD, NekDouble>> &inarray,
+                 Array<OneD, Array<OneD, NekDouble>> &outarray,
+                 const NekDouble &time) override;
+    // Apply forcing term
+    void v_ApplyCoeff(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        const Array<OneD, Array<OneD, NekDouble>> &inarray,
+        Array<OneD, Array<OneD, NekDouble>> &outarray,
+        const NekDouble &time) override;
+    /// Calculate Forcing
+    void CalculateForcing(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
+    /// Compute Velocity Fluctuation
+    Array<OneD, Array<OneD, NekDouble>> ComputeDensityFluctuation(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
+        const Array<OneD, Array<OneD, NekDouble>> &velFLuc,
+        std::pair<NekDouble, NekDouble> rhoMachMean);
+    /// Compute rho and mach mean
+    std::pair<NekDouble, NekDouble> ComputeRhoMachMean(
+        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
+
+    /// Auxiliary object to convert variables
+    VariableConverterSharedPtr m_varConv;
+
+private:
+    ForcingCFSSyntheticEddy(
+        const LibUtilities::SessionReaderSharedPtr &pSession,
+        const std::weak_ptr<EquationSystem> &pEquation);
+    ~ForcingCFSSyntheticEddy(void) override = default;
+};
+
+} // namespace Nektar::SolverUtils
+
+#endif
diff --git a/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbExpl.tst b/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbExpl.tst
new file mode 100644
index 0000000000..bc52b70908
--- /dev/null
+++ b/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbExpl.tst
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<test>
+    <description>Fully 3D Compressible Channel Flow. Synthetic turbulence generation is introduced in the flow field using forcing tag. This test case uses the explicit solver. </description>
+    <executable>CompressibleFlowSolver</executable>
+    <parameters>ChanFlow3D_infTurbExpl.xml</parameters>
+    <files>
+        <file description="Session File">ChanFlow3D_infTurbExpl.xml</file>
+    </files>
+    <metrics>
+        <metric type="L2" id="1">
+            <value variable="rho"  tolerance="1e-7">0.0496262</value>
+            <value variable="rhou" tolerance="1e-7">0.0510315</value>
+            <value variable="rhov" tolerance="1e-8">0.00044049</value>
+            <value variable="rhow" tolerance="1e-9">0.000513142</value>
+            <value variable="E"    tolerance="1e-5">8.88794</value>
+        </metric>
+        <metric type="Linf" id="2">
+            <value variable="rho"  tolerance="1e-7">0.0142084</value>
+            <value variable="rhou" tolerance="1e-7">0.0220761</value>
+            <value variable="rhov" tolerance="1e-8">0.00487243</value>
+            <value variable="rhow" tolerance="1e-8">0.00275159</value>
+            <value variable="E"    tolerance="1e-5">2.55629</value>
+        </metric>
+    </metrics>
+</test>
+
+
diff --git a/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbExpl.xml b/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbExpl.xml
new file mode 100644
index 0000000000..64b2e08972
--- /dev/null
+++ b/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbExpl.xml
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<NEKTAR>
+    <GEOMETRY DIM="3" SPACE="3">
+        <VERTEX COMPRESSED="B64Z-LittleEndian" BITSIZE="64">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</VERTEX>
+        <EDGE COMPRESSED="B64Z-LittleEndian" BITSIZE="64">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</EDGE>
+        <FACE>
+            <T COMPRESSED="B64Z-LittleEndian" BITSIZE="64">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</T>
+            <Q COMPRESSED="B64Z-LittleEndian" BITSIZE="64">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</Q>
+        </FACE>
+        <ELEMENT>
+            <H COMPRESSED="B64Z-LittleEndian" BITSIZE="64">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</H>
+            <R COMPRESSED="B64Z-LittleEndian" BITSIZE="64">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</R>
+        </ELEMENT>
+        <COMPOSITE>
+            <C ID="1"> F[1269,1260,1230,1251,406,1242,156,415,851,433,833,394,1051,1021,207,424,171,183,615,624,642,195,812,842,603,824,633,1033,1042,1060] </C>
+            <C ID="2"> F[1276,1270,1220,1197,445,434,384,870,437,1273,208,358,108,452,1281,1194,103,649,646,361,654,212,216,802,227,867,1285,222,231,570,593,1011,658,661,440,1288,776,779,449,852,855,643,858,863,1079,139,988,985,1061,1064,1067,1076,1072,567] </C>
+            <C ID="3"> F[472,1299,672,463,219,454,881,1108,442,1278,270,890,481,258,1081,234,246,1290,690,663,872,651,899,1308,860,1090,1317,1069,681,1099] </C>
+            <C ID="4"> F[1324,1318,1240,1147,1146,1115,519,493,485,404,1120,1233,900,1321,275,4,284,279,1109,1237,482,694,159,728,271,39,397,520,164,911,1024,1112,310,168,488,606,610,613,1031,691,697,40,702,311,401,729,815,819,906,1028,822,903,937-938] </C>
+            <C ID="100"> R[0-41,72-113,144-185,216-257,288-329,360-401] </C>
+            <C ID="101"> H[42-71,114-143,186-215,258-287,330-359,402-431] </C>
+            <C ID="103"> F[43,152,266,34,187,278,113,118,111,104,99,133,154,182,58,136,51,63,11,75,121,31,274,55,90,218,29,24,140,21,82,245,233,224,16,38,107,7,125,150,86,129,72,46,257,238,161,166,215,170,175,179,69,94,250,194,203,211,229,191,269,242,199,143,155,65,206,254,3,78,262,148] </C>
+            <C ID="104"> F[1148,1228,1316,1141,1257,1325,1200,1203,1198,1193,1189,1214,1229,1254,1160,1216,1154,1163,1125,1172,1206,1140,1323,1157,1183,1282,1138,1135,1219,1132,1176,1302,1293,1286,1128,1144,1196,1121,1208,1227,1179,1211,1170,1151,1311,1296,1238,1241,1277,1245,1248,1250,1167,1186,1305,1263,1268,1275,1289,1259,1320,1298,1266,1222,1234,1165,1272,1307,1118,1173,1314,1225] </C>
+        </COMPOSITE>
+        <DOMAIN>
+            <D ID="0"> C[100-101] </D>
+        </DOMAIN>
+    </GEOMETRY>
+
+    <EXPANSIONS>
+        <E COMPOSITE="C[100,101]" NUMMODES="3" FIELDS="rho,rhou,rhov,rhow,E" TYPE="MODIFIED" />
+    </EXPANSIONS>
+
+    <CONDITIONS>
+        <SOLVERINFO>
+            <I PROPERTY="EQType"                VALUE="NavierStokesCFE" />
+            <I PROPERTY="Projection"            VALUE="DisContinuous"       />
+            <I PROPERTY="AdvectionType"         VALUE="WeakDG"              />
+            <I PROPERTY="DiffusionType"         VALUE="InteriorPenalty"     />
+            <I PROPERTY="TimeIntegrationMethod" VALUE="ForwardEuler"          />
+            <I PROPERTY="UpwindType"            VALUE="Roe"                 />
+            <I PROPERTY="ProblemType"           VALUE="General"             />
+            <I PROPERTY="ViscosityType"         VALUE="Constant"            />
+            <I PROPERTY="OutputExtraFields"     VALUE="True"                />
+        </SOLVERINFO>
+
+        <PARAMETERS>
+            <P> TimeStep      = 0.001           </P>
+            <P> NumSteps      = 850             </P>
+            <P> IO_CheckSteps = 0               </P>
+            <P> IO_InfoSteps  = 1               </P>
+            <P> IO_CFLSteps   = 1               </P>
+            <P> tauw          = 5.92464e-05     </P>
+            <P> rhom          = 0.014           </P>
+            <P> Lx            = 2.0  </P>
+            <P> delta         = 1.0             </P>
+
+            <!-- Compressible Setup -->
+            <P> Gamma       = 1.4                                  </P>
+            <P> Pr          = 0.72                                 </P>
+            <P> mu          = 5.05967e-06                          </P>
+            <P> vInf        = 0.0                                  </P>
+            <P> wInf        = 0.0                                  </P>
+            <P> rhoInf      = rhom                                 </P>
+            <P> pInf        = 1.0                                  </P>
+            <P> pOut        = pInf - ((Lx*tauw) / delta)    </P>
+
+            <P> GasConstant           = 287.058                    </P>
+            <P> TInf                  = pInf / (rhom*GasConstant)  </P>
+            <P> Twall                 = TInf                       </P>
+
+            <!-- Incomplete interior penalty -->
+            <P> IPSymmFluxCoeff       = 0.0                                     </P>
+
+            <!-- Timer Level -->
+            <P> IO_Timer_Level        = 2                                       </P>
+
+            <!-- Preconditioners -->
+            <P> PreconMatFreezNumb        = 500                                 </P>
+            <P> NonlinIterTolRelativeL2   = 1.0E-3                              </P>
+            <P> LinSysRelativeTolInNonlin = 5.0E-2                              </P>
+            <P> NekLinSysMaxIterations    = 30                                  </P>
+            <P> PreconItsStep             = 7                                   </P>
+        </PARAMETERS>
+
+        <VARIABLES>
+            <V ID="0"> rho  </V>
+            <V ID="1"> rhou </V>
+            <V ID="2"> rhov </V>
+            <V ID="3"> rhow </V>
+            <V ID="4"> E    </V>
+        </VARIABLES>
+
+        <BOUNDARYREGIONS>
+            <B ID="0"> C[1] </B>    <!-- lower wall -->
+            <B ID="1"> C[2] </B>    <!-- outlet -->
+            <B ID="2"> C[3] </B>    <!-- upper wall -->
+            <B ID="3"> C[4] </B>    <!-- inlet -->
+            <B ID="4"> C[103] </B>  <!-- side z=0 -->
+            <B ID="5"> C[104] </B>  <!-- side z=Lz-->
+        </BOUNDARYREGIONS>
+
+        <BOUNDARYCONDITIONS>
+            <REGION REF="3">
+                <D VAR="rho"  VALUE="rhoInf" />
+                <D VAR="rhou" VALUE="rhoInf * (1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0)" />
+                <D VAR="rhov" VALUE="rhoInf * vInf" />
+                <D VAR="rhow" VALUE="rhoInf * wInf" />
+                <D VAR="E"    VALUE="pInf/(Gamma-1) + 0.5*rhoInf*((1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0)*(1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0) + vInf*vInf + wInf*wInf)" />
+            </REGION>
+            <REGION REF="1">
+                <D VAR="rho"  USERDEFINEDTYPE="PressureOutflow" VALUE="0" />
+                <D VAR="rhou" USERDEFINEDTYPE="PressureOutflow" VALUE="0" />
+                <D VAR="rhov" USERDEFINEDTYPE="PressureOutflow" VALUE="0" />
+                <D VAR="rhow" USERDEFINEDTYPE="PressureOutflow" VALUE="0" />
+                <D VAR="E"    USERDEFINEDTYPE="PressureOutflow" VALUE="pOut"/>
+            </REGION>
+            <REGION REF="0">
+                <D VAR="rho"  USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhou" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhov" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhow" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="E"    USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+            </REGION>
+            <REGION REF="2">
+                <D VAR="rho"  USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhou" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhov" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhow" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="E"    USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+            </REGION>
+            <REGION REF="4"> <!-- side z=0 -->
+                <P VAR="rho"  VALUE="[5]" />
+                <P VAR="rhou" VALUE="[5]" />
+                <P VAR="rhov" VALUE="[5]" />
+                <P VAR="rhow" VALUE="[5]" />
+                <P VAR="E"    VALUE="[5]" />
+            </REGION>
+            <REGION REF="5"> <!-- side z=Lz -->
+                <P VAR="rho"  VALUE="[4]" />
+                <P VAR="rhou" VALUE="[4]" />
+                <P VAR="rhov" VALUE="[4]" />
+                <P VAR="rhow" VALUE="[4]" />
+                <P VAR="E"    VALUE="[4]" />
+            </REGION>
+        </BOUNDARYCONDITIONS>
+
+        <FUNCTION NAME="InitialConditions">
+            <E VAR="rho"  VALUE="rhoInf" />
+            <E VAR="rhou" VALUE="rhoInf * (1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0)" />
+            <E VAR="rhov" VALUE="rhoInf * vInf" />
+            <E VAR="rhow" VALUE="rhoInf * wInf" />
+            <E VAR="E"    VALUE="pInf/(Gamma-1) + 0.5*rhoInf*((1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0)*(1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0) + vInf*vInf + wInf*wInf)" />
+        </FUNCTION>
+
+        <FUNCTION NAME="ReyStresses">
+            <E VAR="r00"   VALUE="(+2194869.72*(1-abs(y))^14-15843749.2*(1-abs(y))^13+51288368.6*(1-abs(y))^12-98280270.7*(1-abs(y))^11+123921817.0*(1-abs(y))^10-108083933.0*(1-abs(y))^9+66700892.4*(1-abs(y))^8-29258748.2*(1-abs(y))^7+9017078.56*(1-abs(y))^6-1889548.13*(1-abs(y))^5+250183.446*(1-abs(y))^4-17029.8457*(1-abs(y))^3+1.26582088*(1-abs(y))^2+68.7492352*(1-abs(y))^1-0.0148027907*(1-abs(y))^0)^2*(tauw/rhom)"     />
+            <E VAR="r11"   VALUE="(+115374.19*(1-abs(y))^14-835012.705*(1-abs(y))^13+2718672.87*(1-abs(y))^12-5262526.56*(1-abs(y))^11+6743594.93*(1-abs(y))^10-6028822.18*(1-abs(y))^9+3861137.61*(1-abs(y))^8-1790967.72*(1-abs(y))^7+601467.524*(1-abs(y))^6-144772.848*(1-abs(y))^5+24433.5085*(1-abs(y))^4-2749.69383*(1-abs(y))^3+170.501429*(1-abs(y))^2+1.19079597*(1-abs(y))^1-0.00240344727*(1-abs(y))^0)^2*(tauw/rhom)"     />
+            <E VAR="r22"   VALUE="(-467724.204*(1-abs(y))^14+3358371.37*(1-abs(y))^13-10821834.7*(1-abs(y))^12+20672126.8*(1-abs(y))^11-26050692.2*(1-abs(y))^10+22809003.9*(1-abs(y))^9-14237511.6*(1-abs(y))^8+6400502.89*(1-abs(y))^7-2069981.91*(1-abs(y))^6+476610.822*(1-abs(y))^5-76731.1913*(1-abs(y))^4+8464.95414*(1-abs(y))^3-638.190408*(1-abs(y))^2+33.7641881*(1-abs(y))^1+0.00362081709*(1-abs(y))^0)^2*(tauw/rhom)"     />
+            <E VAR="r10"   VALUE="(y>0)*(-y*(+143887.186*(1-abs(y))^14-924421.506*(1-abs(y))^13+2558324.72*(1-abs(y))^12-3912224.86*(1-abs(y))^11+3423219.44*(1-abs(y))^10-1362528.94*(1-abs(y))^9-423777.124*(1-abs(y))^8+908513.536*(1-abs(y))^7-583322.471*(1-abs(y))^6+215251.323*(1-abs(y))^5-49187.1036*(1-abs(y))^4+6726.52324*(1-abs(y))^3-466.587078*(1-abs(y))^2+5.87033236*(1-abs(y))^1-0.0123273856*(1-abs(y))^0))*(tauw/rhom)  +  (y<0)*(y*(+143887.186*(1-abs(y))^14-924421.506*(1-abs(y))^13+2558324.72*(1-abs(y))^12-3912224.86*(1-abs(y))^11+3423219.44*(1-abs(y))^10-1362528.94*(1-abs(y))^9-423777.124*(1-abs(y))^8+908513.536*(1-abs(y))^7-583322.471*(1-abs(y))^6+215251.323*(1-abs(y))^5-49187.1036*(1-abs(y))^4+6726.52324*(1-abs(y))^3-466.587078*(1-abs(y))^2+5.87033236*(1-abs(y))^1-0.0123273856*(1-abs(y))^0))*(tauw/rhom)"     />
+            <E VAR="r20"   VALUE="0.0"     />
+            <E VAR="r21"   VALUE="0.0"     />
+        </FUNCTION>
+
+        <FUNCTION NAME="LenScales">
+            <E VAR="l00"   VALUE="0.4"    />
+            <E VAR="l10"   VALUE="0.085"   />
+            <E VAR="l20"   VALUE="0.125"   />
+            <E VAR="l01"   VALUE="0.3"     />
+            <E VAR="l11"   VALUE="0.085"   />
+            <E VAR="l21"   VALUE="0.125"   />
+            <E VAR="l02"   VALUE="0.3"     />
+            <E VAR="l12"   VALUE="0.170"   />
+            <E VAR="l22"   VALUE="0.25"    />
+        </FUNCTION>
+    </CONDITIONS>
+
+    <FORCING>
+        <FORCE TYPE="CFSSyntheticTurbulence">
+            <ReynoldsStresses> ReyStresses                                 </ReynoldsStresses>
+            <CharLengthScales> LenScales                                   </CharLengthScales>
+            <BoxOfEddies> 1.0 0.0 1.5707963267948966 2.0 3.141592653589793 </BoxOfEddies>
+            <Sigma> 0.7                                                    </Sigma>
+            <BulkVelocity> 1.0                                             </BulkVelocity>
+            <TestCase> ChanFlow3D                                          </TestCase>
+        </FORCE>
+    </FORCING>
+
+</NEKTAR>
diff --git a/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbImpl.tst b/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbImpl.tst
new file mode 100644
index 0000000000..d07ae8a2f4
--- /dev/null
+++ b/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbImpl.tst
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<test>
+    <description>Fully 3D Compressible Channel Flow. Synthetic turbulence generation is introduced in the flow field using forcing tag. This test cases uses the implicit solver. </description>
+    <executable>CompressibleFlowSolver</executable>
+    <parameters>ChanFlow3D_infTurbImpl.xml</parameters>
+    <files>
+        <file description="Session File">ChanFlow3D_infTurbImpl.xml</file>
+    </files>
+    <metrics>
+        <metric type="L2" id="1">
+            <value variable="rho"  tolerance="1e-7">0.0496262</value>
+            <value variable="rhou" tolerance="1e-7">0.0510306</value>
+            <value variable="rhov" tolerance="1e-8">0.000247923</value>
+            <value variable="rhow" tolerance="1e-8">0.000463459</value>
+            <value variable="E"    tolerance="1e-5">8.88793</value>
+        </metric>
+        <metric type="Linf" id="2">
+            <value variable="rho"  tolerance="1e-7">0.0140256</value>
+            <value variable="rhou" tolerance="1e-7">0.0188351</value>
+            <value variable="rhov" tolerance="1e-8">0.00117766</value>
+            <value variable="rhow" tolerance="1e-8">0.00196196</value>
+            <value variable="E"    tolerance="1e-5"> 2.51336</value>
+        </metric>
+    </metrics>
+</test>
+
+
diff --git a/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbImpl.xml b/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbImpl.xml
new file mode 100644
index 0000000000..f46194c275
--- /dev/null
+++ b/solvers/CompressibleFlowSolver/Tests/ChanFlow3D_infTurbImpl.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<NEKTAR>
+    <GEOMETRY DIM="3" SPACE="3">
+        <VERTEX COMPRESSED="B64Z-LittleEndian" BITSIZE="64">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</VERTEX>
+        <EDGE COMPRESSED="B64Z-LittleEndian" BITSIZE="64">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</EDGE>
+        <FACE>
+            <T COMPRESSED="B64Z-LittleEndian" BITSIZE="64">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</T>
+            <Q COMPRESSED="B64Z-LittleEndian" BITSIZE="64">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</Q>
+        </FACE>
+        <ELEMENT>
+            <H COMPRESSED="B64Z-LittleEndian" BITSIZE="64">eJxd2WWUVWUDxfGZe+8g3TEMJaIoMEN3N4gKUoJ0Yyvd3R0qBjV0d4MBKoqidHeXASqKooAf5r9d6+z3y2/d593HtRfK3fecUzAq6X8zcRbOxjk4FxOxEM6z3HxcgAtxEcbjYsstwWS4FJdhAi7HFbgSV1nv1VgY11huLa6z3uuxCG6w3EZMY703YVHcjFtwK26z3tuxGO6w3Cf4qfX+DIvj55bbiXHWexeWwC/wS/wKd1vvr7EkfmO5Pfit9f4OS+Fey32PTa33D1ga9+F+PIAHrfchLIOHLXcEj1rvY1gWj1vuBLaz3iexHJ7C03gGz+I5PI/l8YLlLuIlvIxXsAJetdw1nIbX8QZWxJt4C3/En6z3z1gJf7HcbbxjvX/Fyvib5X7Hwdb7LlbBP/BPvId/We+/sSret9w/+K/1foDV8KHlHuEY6x0VnUR1feRzCMMYiQ72juFzDT4ns9xjmDw62DsFn2vyOaXlUqH+vNU7Nee1+JyGz2kxHaa33hmwNtdltFwmzGy9s2AdrstquWyoHVDvWOzOeSKO53wCTsRJOBl7kNfOKDcFp+I0nI49yWtnlHsXc+N7+D72Iq+dmcH5B/ih9f4Ie5PXzij3Mc603rOwD3ntjHKzMZ/1noN9yWtn5nKeiPOs93zsR147o9wCXGi9F2F/8toZ5RZjgvVeggPIa2eWcr4Ml1vvFTiQvHZGuZW4ynqvxkHktTPKrcHm1nst6vtKO7OO8/W4wXpvxCHktTPKbcLN1nsLDiWvnVFuK7az3ttwGHntzHbOd+An+Cl+hsPJa2eU+xx34i78AkeQ184o9yWOxK9wt87Ja2e+5vwb3GO9v8VR5LUzyn2He6339ziavHZGuR/099N670N9/2tn9nN+AA9a70M4lrx2RrnDeMR6H8Vx5KMsd0z//Vrv4ziey7QzJ/AknrLep/U9xXUpLHcGz1rvcziR61Jb7jzWtd4XcBLXaWcu4iW8bL2v4GSuy2K5q3jNel/HKVwXa7kbWN5630R9b2pnWoaSbIWtsQ22Rf2O184o1w7bYwfsiPrdrJ1RrhPe5rwzn7ugfvdrZ7py/gq+ar1fQ32/a2eUex3fsN5vou43tDPKvYV3o4O938adXKedeYfzbtjdevdA7Yl2Rrme2Mt690bd32hnlOuDD6ODvfui7oe0M/04748DrPdA1H2Idka5QTjYeg9B3Uf9vzOcD8UC1nsYai+1M8M5H4Ejrfco1P2bdka50TjGeo9F3S9pZ5Qbh8Ws93jU/Z52ZgLnE3ESTsYpqF3Xzig3FafhdHwXdZ+pnVHuPWyK7+MM1H2dduYDzj/Ej6z3x6jfEdoZ5WbiLOs9G3Vfq51Rbg7Wsd5zUffB2plEzufhfOu9AHXfrJ1RbiEust6LUffP2hnllmB9670U9TtJO7OM8+W4wnqvRN23a2eUW4Wrrfca1P29dka5tZjdeq9D3edrZ9ZzvgE3Wu9NqN9z2hnlNuMW670V9XxBO6PcNkxlvbej7i+1M/HhJBOwMBbBoqj7Ou2McsWwOJbAkqj7Uu2McqVwJ+el+VwG9ftDO1OW83JY3npXQN0Pa2eUq4iVrHdl1P2ndka5Krg7FOxdFXX/rJ2pxnl1rGG9a6J+J2lnlKuFta13HdR9u3ZGubq4PxTs/SzqPlk7U4/z5/B56/0C6neZdka5+tjAer+Iek6gnVGuId4PBXs3Qj1X0M405rwJNrXeL6GeQ2hnlGuGza33y6jnEdoZ5VpgyHq3RP3u1M604rw1tsG22A71HEQ7o1x77IAdsRPqeYl2RrnOmB+7YFfUcxPtzCucv4qvWe/XUb+PtTPKvYFvWu+3UM9rtDPKvY2x1vsd1HMd7Uw3zrtjD+vdU/88rtPOKNcLe1vvPpid67QzyvXFPNa7H8ZxnXamP+cDcKD1HoQ5uE47o9xgHGK9h2JOrtPOKDcMb4WCvYdjLq7TzozgfCSOst6jUc+rtDPKjcGx1nuc/rx0vxMK5sbjGf3u5PMErMd12pkH+BAfYVQkiWh8jutKWi7E/x/GCMbg81ynnVEuGU7THvA5Ob7AddqZFJynxFSRYO/UfK7PddoZ5dJg2kiwdzpswHXaGeXS44xwsHcGfJHrtDMZOc+Ema13FmzIddoZ5bJiNusdi424TjujXHZM1Pcsn+OwMddpZ3JwnhNzWe/c2ITrtDPK5cHHrXdebMp12hnlnsC9+l7gcz58ieu0M09y/hTmt95PYzOu084o9wwWsN4FUc8NtTPKFcLD4WDveHyZ67QzCZwXxiJYFIthC91nh4O54lgCS2IpbKnnBOFgrjTe47wMn8tiK67TzpTjvDxWsN4VsbXus8PBXCWsbL2rYBs9JwgHc1XxZjjYuxq25TrtTHXOa2BN610L9TxVO6Ncbaxjvetiez0nCAdzz+KdcLB3Peyg53n6XaTvOX1vWe/62JHrtDPKNdD3iPVuiJ30nCAczDXCHeFg78bYmeu0M03091J/z6x3M+zCddoZ5Zrrv3vr3QK76jlBOJhriavCwd6tUM/btDP7cD8ewIN4CPXeJMZyh/EIHsVjqPdCyS13XP9+8QSeRD3f086cwtN4xnqfRb1nSme5c3jeel9Avd/JYLmL+vO23pdQ76e0M5fxCl613tdQzyFjLXcdb1jvm6j3SXGWu4XdrPePqPdh2pmf8Gf8xXrfRj33zGu5O/ir9f4N/3/vZrnf9c+13ndRz0u1M3/gn3jPev+Fem9X0HJ/433r/Q/qfVm85f7Fhdb7Aep9n3bmIT7CqJgkojGEeq5bynJhjGAMJkO9n9POKPcY7uE8OZ9ToN4vamdScp4KU8cEe6fhs54ja2eUS4vprHd61PtA7YxyGXB7JNg7I+r5s3YmE+eZMYv1zop6D6qdUS4bxlrv7Kj3j9oZ5eJwVyTYOwfq/al2JifnuTC39c6Dek6unVHuccxrvZ9Ave/UziiXDydGgr2fRL2v1c48xXl+fNp6P4N6Lq+dUa4AFrTehVDvV7UzysXj4EiwdwL+BwV1dJQA</H>
+            <R COMPRESSED="B64Z-LittleEndian" BITSIZE="64">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</R>
+        </ELEMENT>
+        <COMPOSITE>
+            <C ID="1"> F[1269,1260,1230,1251,406,1242,156,415,851,433,833,394,1051,1021,207,424,171,183,615,624,642,195,812,842,603,824,633,1033,1042,1060] </C>
+            <C ID="2"> F[1276,1270,1220,1197,445,434,384,870,437,1273,208,358,108,452,1281,1194,103,649,646,361,654,212,216,802,227,867,1285,222,231,570,593,1011,658,661,440,1288,776,779,449,852,855,643,858,863,1079,139,988,985,1061,1064,1067,1076,1072,567] </C>
+            <C ID="3"> F[472,1299,672,463,219,454,881,1108,442,1278,270,890,481,258,1081,234,246,1290,690,663,872,651,899,1308,860,1090,1317,1069,681,1099] </C>
+            <C ID="4"> F[1324,1318,1240,1147,1146,1115,519,493,485,404,1120,1233,900,1321,275,4,284,279,1109,1237,482,694,159,728,271,39,397,520,164,911,1024,1112,310,168,488,606,610,613,1031,691,697,40,702,311,401,729,815,819,906,1028,822,903,937-938] </C>
+            <C ID="100"> R[0-41,72-113,144-185,216-257,288-329,360-401] </C>
+            <C ID="101"> H[42-71,114-143,186-215,258-287,330-359,402-431] </C>
+            <C ID="103"> F[43,152,266,34,187,278,113,118,111,104,99,133,154,182,58,136,51,63,11,75,121,31,274,55,90,218,29,24,140,21,82,245,233,224,16,38,107,7,125,150,86,129,72,46,257,238,161,166,215,170,175,179,69,94,250,194,203,211,229,191,269,242,199,143,155,65,206,254,3,78,262,148] </C>
+            <C ID="104"> F[1148,1228,1316,1141,1257,1325,1200,1203,1198,1193,1189,1214,1229,1254,1160,1216,1154,1163,1125,1172,1206,1140,1323,1157,1183,1282,1138,1135,1219,1132,1176,1302,1293,1286,1128,1144,1196,1121,1208,1227,1179,1211,1170,1151,1311,1296,1238,1241,1277,1245,1248,1250,1167,1186,1305,1263,1268,1275,1289,1259,1320,1298,1266,1222,1234,1165,1272,1307,1118,1173,1314,1225] </C>
+        </COMPOSITE>
+        <DOMAIN>
+            <D ID="0"> C[100-101] </D>
+        </DOMAIN>
+    </GEOMETRY>
+
+    <EXPANSIONS>
+        <E COMPOSITE="C[100,101]" NUMMODES="3" FIELDS="rho,rhou,rhov,rhow,E" TYPE="MODIFIED" />
+    </EXPANSIONS>
+
+    <CONDITIONS>
+        <SOLVERINFO>
+            <I PROPERTY="EQType"                VALUE="NavierStokesImplicitCFE" />
+            <I PROPERTY="Projection"            VALUE="DisContinuous"       />
+            <I PROPERTY="AdvectionType"         VALUE="WeakDG"              />
+            <I PROPERTY="DiffusionType"         VALUE="InteriorPenalty"     />
+            <I PROPERTY="TimeIntegrationMethod" VALUE="DIRKOrder2"          />
+            <I PROPERTY="AdvectionAdvancement"  VALUE="Implicit"            />
+            <I PROPERTY="DiffusionAdvancement"  VALUE="Implicit"            />
+            <I PROPERTY="UpwindType"            VALUE="Roe"                 />
+            <I PROPERTY="ProblemType"           VALUE="General"             />
+            <I PROPERTY="ViscosityType"         VALUE="Constant"            />
+            <I PROPERTY="OutputExtraFields"     VALUE="True"                />
+        </SOLVERINFO>
+
+        <PARAMETERS>
+            <P> TimeStep      = 0.01            </P>
+            <P> NumSteps      = 85              </P>
+            <P> IO_CheckSteps = 0               </P>
+            <P> IO_InfoSteps  = 1               </P>
+            <P> IO_CFLSteps   = 1               </P>
+            <P> tauw          = 5.92464e-05     </P>
+            <P> rhom          = 0.014           </P>
+            <P> Lx            = 2.0  </P>
+            <P> delta         = 1.0             </P>
+
+            <!-- Compressible Setup -->
+            <P> Gamma       = 1.4                                  </P>
+            <P> Pr          = 0.72                                 </P>
+            <P> mu          = 5.05967e-06                          </P>
+            <P> vInf        = 0.0                                  </P>
+            <P> wInf        = 0.0                                  </P>
+            <P> rhoInf      = rhom                                 </P>
+            <P> pInf        = 1.0                                  </P>
+            <P> pOut        = pInf - ((Lx*tauw) / delta)    </P>
+
+            <P> GasConstant           = 287.058                    </P>
+            <P> TInf                  = pInf / (rhom*GasConstant)  </P>
+            <P> Twall                 = TInf                       </P>
+
+            <!-- Incomplete interior penalty -->
+            <P> IPSymmFluxCoeff       = 0.0                                     </P>
+
+            <!-- Timer Level -->
+            <P> IO_Timer_Level        = 2                                       </P>
+
+            <!-- Preconditioners -->
+            <P> PreconMatFreezNumb        = 500                                 </P>
+            <P> NonlinIterTolRelativeL2   = 1.0E-3                              </P>
+            <P> LinSysRelativeTolInNonlin = 5.0E-2                              </P>
+            <P> NekLinSysMaxIterations    = 30                                  </P>
+            <P> PreconItsStep             = 7                                   </P>
+        </PARAMETERS>
+
+        <VARIABLES>
+            <V ID="0"> rho  </V>
+            <V ID="1"> rhou </V>
+            <V ID="2"> rhov </V>
+            <V ID="3"> rhow </V>
+            <V ID="4"> E    </V>
+        </VARIABLES>
+
+        <BOUNDARYREGIONS>
+            <B ID="0"> C[1] </B>    <!-- lower wall -->
+            <B ID="1"> C[2] </B>    <!-- outlet -->
+            <B ID="2"> C[3] </B>    <!-- upper wall -->
+            <B ID="3"> C[4] </B>    <!-- inlet -->
+            <B ID="4"> C[103] </B>  <!-- side z=0 -->
+            <B ID="5"> C[104] </B>  <!-- side z=Lz-->
+        </BOUNDARYREGIONS>
+
+        <BOUNDARYCONDITIONS>
+            <REGION REF="3">
+                <D VAR="rho"  VALUE="rhoInf" />
+                <D VAR="rhou" VALUE="rhoInf * (1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0)" />
+                <D VAR="rhov" VALUE="rhoInf * vInf" />
+                <D VAR="rhow" VALUE="rhoInf * wInf" />
+                <D VAR="E"    VALUE="pInf/(Gamma-1) + 0.5*rhoInf*((1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0)*(1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0) + vInf*vInf + wInf*wInf)" />
+            </REGION>
+            <REGION REF="1">
+                <D VAR="rho"  USERDEFINEDTYPE="PressureOutflow" VALUE="0" />
+                <D VAR="rhou" USERDEFINEDTYPE="PressureOutflow" VALUE="0" />
+                <D VAR="rhov" USERDEFINEDTYPE="PressureOutflow" VALUE="0" />
+                <D VAR="rhow" USERDEFINEDTYPE="PressureOutflow" VALUE="0" />
+                <D VAR="E"    USERDEFINEDTYPE="PressureOutflow" VALUE="pOut"/>
+            </REGION>
+            <REGION REF="0">
+                <D VAR="rho"  USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhou" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhov" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhow" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="E"    USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+            </REGION>
+            <REGION REF="2">
+                <D VAR="rho"  USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhou" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhov" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="rhow" USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+                <D VAR="E"    USERDEFINEDTYPE="WallAdiabatic" VALUE="0" />
+            </REGION>
+            <REGION REF="4"> <!-- side z=0 -->
+                <P VAR="rho"  VALUE="[5]" />
+                <P VAR="rhou" VALUE="[5]" />
+                <P VAR="rhov" VALUE="[5]" />
+                <P VAR="rhow" VALUE="[5]" />
+                <P VAR="E"    VALUE="[5]" />
+            </REGION>
+            <REGION REF="5"> <!-- side z=Lz -->
+                <P VAR="rho"  VALUE="[4]" />
+                <P VAR="rhou" VALUE="[4]" />
+                <P VAR="rhov" VALUE="[4]" />
+                <P VAR="rhow" VALUE="[4]" />
+                <P VAR="E"    VALUE="[4]" />
+            </REGION>
+        </BOUNDARYCONDITIONS>
+
+        <FUNCTION NAME="InitialConditions">
+            <E VAR="rho"  VALUE="rhoInf" />
+            <E VAR="rhou" VALUE="rhoInf * (1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0)" />
+            <E VAR="rhov" VALUE="rhoInf * vInf" />
+            <E VAR="rhow" VALUE="rhoInf * wInf" />
+            <E VAR="E"    VALUE="pInf/(Gamma-1) + 0.5*rhoInf*((1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0)*(1.36346011e+05*(1-abs(y))^14-1.00157155e+06*(1-abs(y))^13+3.30835371e+06*(1-abs(y))^12-6.49079211e+06*(1-abs(y))^11+8.41556333e+06*(1-abs(y))^10-7.58969284e+06*(1-abs(y))^9+4.87934144e+06*(1-abs(y))^8-2.25289875e+06*(1-abs(y))^7+7.41903706e+05*(1-abs(y))^6-1.70090684e+05*(1-abs(y))^5+2.56967948e+04*(1-abs(y))^4-2.21227945e+03*(1-abs(y))^3+4.33607541e+01*(1-abs(y))^2+1.10361842e+01*(1-abs(y))^1+3.28951994e-04*(1-abs(y))^0) + vInf*vInf + wInf*wInf)" />
+        </FUNCTION>
+
+        <FUNCTION NAME="ReyStresses">
+            <E VAR="r00"   VALUE="(+2194869.72*(1-abs(y))^14-15843749.2*(1-abs(y))^13+51288368.6*(1-abs(y))^12-98280270.7*(1-abs(y))^11+123921817.0*(1-abs(y))^10-108083933.0*(1-abs(y))^9+66700892.4*(1-abs(y))^8-29258748.2*(1-abs(y))^7+9017078.56*(1-abs(y))^6-1889548.13*(1-abs(y))^5+250183.446*(1-abs(y))^4-17029.8457*(1-abs(y))^3+1.26582088*(1-abs(y))^2+68.7492352*(1-abs(y))^1-0.0148027907*(1-abs(y))^0)^2*(tauw/rhom)"     />
+            <E VAR="r11"   VALUE="(+115374.19*(1-abs(y))^14-835012.705*(1-abs(y))^13+2718672.87*(1-abs(y))^12-5262526.56*(1-abs(y))^11+6743594.93*(1-abs(y))^10-6028822.18*(1-abs(y))^9+3861137.61*(1-abs(y))^8-1790967.72*(1-abs(y))^7+601467.524*(1-abs(y))^6-144772.848*(1-abs(y))^5+24433.5085*(1-abs(y))^4-2749.69383*(1-abs(y))^3+170.501429*(1-abs(y))^2+1.19079597*(1-abs(y))^1-0.00240344727*(1-abs(y))^0)^2*(tauw/rhom)"     />
+            <E VAR="r22"   VALUE="(-467724.204*(1-abs(y))^14+3358371.37*(1-abs(y))^13-10821834.7*(1-abs(y))^12+20672126.8*(1-abs(y))^11-26050692.2*(1-abs(y))^10+22809003.9*(1-abs(y))^9-14237511.6*(1-abs(y))^8+6400502.89*(1-abs(y))^7-2069981.91*(1-abs(y))^6+476610.822*(1-abs(y))^5-76731.1913*(1-abs(y))^4+8464.95414*(1-abs(y))^3-638.190408*(1-abs(y))^2+33.7641881*(1-abs(y))^1+0.00362081709*(1-abs(y))^0)^2*(tauw/rhom)"     />
+            <E VAR="r10"   VALUE="(y>0)*(-y*(+143887.186*(1-abs(y))^14-924421.506*(1-abs(y))^13+2558324.72*(1-abs(y))^12-3912224.86*(1-abs(y))^11+3423219.44*(1-abs(y))^10-1362528.94*(1-abs(y))^9-423777.124*(1-abs(y))^8+908513.536*(1-abs(y))^7-583322.471*(1-abs(y))^6+215251.323*(1-abs(y))^5-49187.1036*(1-abs(y))^4+6726.52324*(1-abs(y))^3-466.587078*(1-abs(y))^2+5.87033236*(1-abs(y))^1-0.0123273856*(1-abs(y))^0))*(tauw/rhom)  +  (y<0)*(y*(+143887.186*(1-abs(y))^14-924421.506*(1-abs(y))^13+2558324.72*(1-abs(y))^12-3912224.86*(1-abs(y))^11+3423219.44*(1-abs(y))^10-1362528.94*(1-abs(y))^9-423777.124*(1-abs(y))^8+908513.536*(1-abs(y))^7-583322.471*(1-abs(y))^6+215251.323*(1-abs(y))^5-49187.1036*(1-abs(y))^4+6726.52324*(1-abs(y))^3-466.587078*(1-abs(y))^2+5.87033236*(1-abs(y))^1-0.0123273856*(1-abs(y))^0))*(tauw/rhom)"     />
+            <E VAR="r20"   VALUE="0.0"     />
+            <E VAR="r21"   VALUE="0.0"     />
+        </FUNCTION>
+
+        <FUNCTION NAME="LenScales">
+            <E VAR="l00"   VALUE="0.4"    />
+            <E VAR="l10"   VALUE="0.085"   />
+            <E VAR="l20"   VALUE="0.125"   />
+            <E VAR="l01"   VALUE="0.3"     />
+            <E VAR="l11"   VALUE="0.085"   />
+            <E VAR="l21"   VALUE="0.125"   />
+            <E VAR="l02"   VALUE="0.3"     />
+            <E VAR="l12"   VALUE="0.170"   />
+            <E VAR="l22"   VALUE="0.25"    />
+        </FUNCTION>
+    </CONDITIONS>
+
+    <FORCING>
+        <FORCE TYPE="CFSSyntheticTurbulence">
+            <ReynoldsStresses> ReyStresses                                 </ReynoldsStresses>
+            <CharLengthScales> LenScales                                   </CharLengthScales>
+            <BoxOfEddies> 1.0 0.0 1.5707963267948966 2.0 3.141592653589793 </BoxOfEddies>
+            <Sigma> 0.7                                                    </Sigma>
+            <BulkVelocity> 1.0                                             </BulkVelocity>
+            <TestCase> ChanFlow3D                                          </TestCase>
+        </FORCE>
+    </FORCING>
+
+</NEKTAR>
diff --git a/solvers/IncNavierStokesSolver/CMakeLists.txt b/solvers/IncNavierStokesSolver/CMakeLists.txt
index 0a2d5addf9..8ddd1baed3 100644
--- a/solvers/IncNavierStokesSolver/CMakeLists.txt
+++ b/solvers/IncNavierStokesSolver/CMakeLists.txt
@@ -34,7 +34,7 @@ IF( NEKTAR_SOLVER_INCNAVIERSTOKES )
         ./Filters/FilterReynoldsStresses.cpp
         ./Filters/FilterMovingBody.cpp
         ./Filters/FilterAeroForcesSPM.cpp
-	./Forcing/ForcingIncNSSyntheticEddy.cpp
+        ./Forcing/ForcingIncNSSyntheticEddy.cpp
         ./Forcing/ForcingMovingBody.cpp
         ./Forcing/ForcingStabilityCoupledLNS.cpp
         ./BoundaryConditions/IncBoundaryConditions.cpp
@@ -71,6 +71,7 @@ IF( NEKTAR_SOLVER_INCNAVIERSTOKES )
             Filters/FilterAeroForcesSPM.h
             Filters/FilterMovingBody.h
             Filters/FilterReynoldsStresses.h
+            Forcing/ForcingIncNSSyntheticEddy.h
             Forcing/ForcingMovingBody.h
             Forcing/ForcingStabilityCoupledLNS.h
             BoundaryConditions/IncBoundaryConditions.h
diff --git a/solvers/IncNavierStokesSolver/Forcing/ForcingIncNSSyntheticEddy.cpp b/solvers/IncNavierStokesSolver/Forcing/ForcingIncNSSyntheticEddy.cpp
index 7b57c6582d..4b9903907f 100644
--- a/solvers/IncNavierStokesSolver/Forcing/ForcingIncNSSyntheticEddy.cpp
+++ b/solvers/IncNavierStokesSolver/Forcing/ForcingIncNSSyntheticEddy.cpp
@@ -28,14 +28,12 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 //
-// Description: Derived base class - Synthetic turbulence forcing
+// Description: Derived base class - Synthetic turbulence forcing for the
+//              Incompressible solver.
 //
 ///////////////////////////////////////////////////////////////////////////////
 
 #include <IncNavierStokesSolver/Forcing/ForcingIncNSSyntheticEddy.h>
-#include <ctime>
-#include <fstream>
-#include <iomanip>
 
 namespace Nektar::SolverUtils
 {
@@ -48,199 +46,10 @@ std::string ForcingIncNSSyntheticEddy::className =
 ForcingIncNSSyntheticEddy::ForcingIncNSSyntheticEddy(
     const LibUtilities::SessionReaderSharedPtr &pSession,
     const std::weak_ptr<EquationSystem> &pEquation)
-    : Forcing(pSession, pEquation)
+    : Forcing(pSession, pEquation), ForcingSyntheticEddy(pSession, pEquation)
 {
 }
 
-/**
- * @brief Read input from xml file and initialise the class members.
- *        The main parameters are the characteristic lengths, Reynolds
- *        stresses and the synthetic eddy region (box of eddies).
- *
- * @param pFields           Pointer to fields.
- * @param pNumForcingField  Number of forcing fields.
- * @param pForce            Xml element describing the mapping.
- */
-void ForcingIncNSSyntheticEddy::v_InitObject(
-    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
-    [[maybe_unused]] const unsigned int &pNumForcingFields,
-    [[maybe_unused]] const TiXmlElement *pForce)
-{
-    // Space dimension
-    m_spacedim = pFields[0]->GetGraph()->GetMeshDimension();
-
-    if (m_spacedim != 3)
-    {
-        NEKERROR(Nektar::ErrorUtil::efatal,
-                 "Sythetic eddy method "
-                 "only supports fully three-dimensional simulations");
-    }
-
-    // Get gamma parameter
-    m_session->LoadParameter("Gamma", m_gamma, 1.4);
-
-    const TiXmlElement *elmtInfTurb;
-
-    // Reynolds Stresses
-    elmtInfTurb = pForce->FirstChildElement("ReynoldsStresses");
-    ASSERTL0(elmtInfTurb, "Requires ReynoldsStresses tag specifying function "
-                          "name which prescribes the reynodls stresses.");
-
-    std::string reyStressesFuncName = elmtInfTurb->GetText();
-    ASSERTL0(m_session->DefinesFunction(reyStressesFuncName),
-             "Function '" + reyStressesFuncName +
-                 "' is not defined in the session.");
-
-    // Reynolds stresses variables. Do not change the order of the variables.
-    std::vector<std::string> reyStressesVars = {"r00", "r10", "r20",
-                                                "r11", "r21", "r22"};
-
-    for (size_t i = 0; i < reyStressesVars.size(); ++i)
-    {
-        std::string varStr = reyStressesVars[i];
-        if (m_session->DefinesFunction(reyStressesFuncName, varStr))
-        {
-            m_R[i] = m_session->GetFunction(reyStressesFuncName, varStr);
-        }
-        else
-        {
-            NEKERROR(Nektar::ErrorUtil::efatal,
-                     "Missing parameter '" + varStr +
-                         "' in the FUNCTION NAME = " + reyStressesFuncName +
-                         ".");
-        }
-    }
-
-    // Characteristic length scales
-    elmtInfTurb = pForce->FirstChildElement("CharLengthScales");
-    ASSERTL0(elmtInfTurb, "Requires CharLengthScales tag specifying function "
-                          "name which prescribes the characteristic "
-                          "length scales.");
-
-    std::string charLenScalesFuncName = elmtInfTurb->GetText();
-    ASSERTL0(m_session->DefinesFunction(charLenScalesFuncName),
-             "Function '" + charLenScalesFuncName +
-                 "' is not defined in the session.");
-
-    // Characteristic length scale variables
-    // Do not change the order of the variables
-    std::vector<std::string> lenScalesVars = {"l00", "l10", "l20", "l01", "l11",
-                                              "l21", "l02", "l12", "l22"};
-    LibUtilities::EquationSharedPtr clsAux;
-    m_l = Array<OneD, NekDouble>(m_spacedim * m_spacedim, 0.0);
-
-    for (size_t i = 0; i < lenScalesVars.size(); ++i)
-    {
-        std::string varStr = lenScalesVars[i];
-        if (m_session->DefinesFunction(charLenScalesFuncName, varStr))
-        {
-            clsAux = m_session->GetFunction(charLenScalesFuncName, varStr);
-            m_l[i] = (NekDouble)clsAux->Evaluate();
-        }
-        else
-        {
-            NEKERROR(Nektar::ErrorUtil::efatal,
-                     "Missing parameter '" + varStr +
-                         "' in the FUNCTION NAME = " + charLenScalesFuncName +
-                         ".");
-        }
-    }
-
-    // Read box of eddies parameters
-    m_rc = Array<OneD, NekDouble>(m_spacedim, 0.0);
-    // Array<OneD, NekDouble> m_lyz(m_spacedim - 1, 0.0);
-    m_lyz       = Array<OneD, NekDouble>(m_spacedim - 1, 0.0);
-    elmtInfTurb = pForce->FirstChildElement("BoxOfEddies");
-    ASSERTL0(elmtInfTurb,
-             "Unable to find BoxOfEddies tag. in SyntheticTurbulence forcing");
-
-    if (elmtInfTurb)
-    {
-        std::stringstream boxStream;
-        std::string boxStr = elmtInfTurb->GetText();
-        boxStream.str(boxStr);
-        size_t countVar = 0;
-        for (size_t i = 0; i < (2 * m_spacedim - 1); ++i)
-        {
-            boxStream >> boxStr;
-            if (i < m_spacedim)
-            {
-                m_rc[i] = std::stod(boxStr);
-            }
-            else
-            {
-                m_lyz[i - m_spacedim] = std::stod(boxStr);
-            }
-            countVar += 1;
-        }
-        if (countVar != (2 * m_spacedim - 1))
-        {
-            NEKERROR(Nektar::ErrorUtil::efatal,
-                     "Missing parameter in the BoxOfEddies tag");
-        }
-    }
-
-    // Read sigma
-    elmtInfTurb = pForce->FirstChildElement("Sigma");
-    ASSERTL0(elmtInfTurb,
-             "Unable to find Sigma tag. in SyntheticTurbulence forcing");
-    std::string sigmaStr = elmtInfTurb->GetText();
-    m_sigma              = std::stod(sigmaStr);
-
-    // Read bulk velocity
-    elmtInfTurb = pForce->FirstChildElement("BulkVelocity");
-    ASSERTL0(elmtInfTurb,
-             "Unable to find BulkVelocity tag. in SyntheticTurbulence forcing");
-    std::string bVelStr = elmtInfTurb->GetText();
-    m_Ub                = std::stod(bVelStr);
-
-    // Read flag to check if the run is a test case
-    elmtInfTurb          = pForce->FirstChildElement("TestCase");
-    const char *tcaseStr = (elmtInfTurb) ? elmtInfTurb->GetText() : "NoName";
-    m_tCase              = (strcmp(tcaseStr, "ChanFlow3D") == 0) ? true : false;
-
-    // Set Cholesky decomposition of the Reynolds Stresses in the domain
-    SetCholeskyReyStresses(pFields);
-    // Compute reference lengths
-    ComputeRefLenghts();
-    // Compute Xi maximum
-    ComputeXiMax();
-    // Set Number of Eddies
-    SetNumberOfEddies();
-    // Set mask
-    SetBoxOfEddiesMask(pFields);
-    // Set Forcing for each eddy
-    InitialiseForcingEddy(pFields);
-
-    // Check for test case
-    if (!m_tCase)
-    {
-        // Compute initial location of the eddies in the box
-        ComputeInitialRandomLocationOfEddies();
-    }
-    else
-    {
-        // Compute initial location of the eddies for the test case
-        ComputeInitialLocationTestCase();
-    }
-
-    // Seed to generate random positions for the eddies
-    srand(time(nullptr));
-
-    // Initialise member from the base class
-    m_Forcing = Array<OneD, Array<OneD, NekDouble>>(pFields.size());
-    for (int i = 0; i < pFields.size(); ++i)
-    {
-        m_Forcing[i] = Array<OneD, NekDouble>(pFields[0]->GetTotPoints(), 0.0);
-    }
-
-    // Initialise eddies ID vector
-    for (size_t n = 0; n < m_N; ++n)
-    {
-        m_eddiesIDForcing.push_back(n);
-    }
-}
-
 /**
  * @brief Apply forcing term if an eddy left the box of eddies and
  *        update the eddies positions.
@@ -310,14 +119,14 @@ void ForcingIncNSSyntheticEddy::CalculateForcing(
 
     // Check if eddies left the box. Note that the member m_eddiesIDForcing
     // is populate with the eddies that left the box. If any left it is going
-    // to be empty
+    // to be empty.
     if (!m_eddiesIDForcing.empty())
     {
-        // Forcing must stop applying for eddies that left the box
+        // Forcing must stop applying for eddies that left the box.
         RemoveEddiesFromForcing(pFields);
 
         // Update Forcing term which are going to be applied until
-        // the eddy leave the leave the domain
+        // the eddy leave the domain.
         // Select the eddies to apply the forcing. Superposition.
         for (auto &n : m_eddiesIDForcing)
         {
@@ -347,649 +156,4 @@ void ForcingIncNSSyntheticEddy::CalculateForcing(
     }
 }
 
-/**
- * @brief Compute characteristic convective turbulent time.
- *
- * @param pFields  Pointer to fields.
- */
-Array<OneD, Array<OneD, NekDouble>> ForcingIncNSSyntheticEddy::
-    ComputeCharConvTurbTime(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
-{
-    // Total number of quadrature points
-    int nqTot = pFields[0]->GetTotPoints();
-    // Characteristic convective turbulent time
-    Array<OneD, Array<OneD, NekDouble>> convTurbTime(m_spacedim);
-
-    for (size_t k = 0; k < m_spacedim; ++k)
-    {
-        convTurbTime[k] = Array<OneD, NekDouble>(nqTot, 0.0);
-        for (size_t i = 0; i < nqTot; ++i)
-        {
-            NekDouble convTurbLength = m_xiMaxMin * m_lref[0];
-            // 3*k because of the structure of the m_l parameter
-            // to obtain lxk.
-            if ((m_l[3 * k] > m_xiMaxMin * m_lref[0]) && (m_mask[i]))
-            {
-                convTurbLength = m_l[3 * k];
-            }
-            convTurbTime[k][i] = convTurbLength / m_Ub;
-        }
-    }
-
-    return convTurbTime;
-}
-
-/**
- * @brief Compute smoothing factor to avoid strong variations
- *        of the source term across the domain.
- *
- * @param pFields       Pointer to fields.
- * @param convTurbTime  Convective turbulent time.
- */
-Array<OneD, Array<OneD, NekDouble>> ForcingIncNSSyntheticEddy::
-    ComputeSmoothingFactor(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
-        Array<OneD, Array<OneD, NekDouble>> convTurbTime)
-{
-    // Total number of quadrature points
-    int nqTot = pFields[0]->GetTotPoints();
-    // Number of elements
-    int nElmts = pFields[0]->GetNumElmts();
-    // Total number of quadrature points of each element
-    int nqe;
-    // Characteristic convective turbulent time
-    Array<OneD, Array<OneD, NekDouble>> smoothFac(m_spacedim);
-    // Counter
-    int count = 0;
-    // module
-    NekDouble mod;
-    // Create Array with zeros
-    for (size_t i = 0; i < m_spacedim; ++i)
-    {
-        smoothFac[i] = Array<OneD, NekDouble>(nqTot, 0.0);
-    }
-
-    for (size_t e = 0; e < nElmts; ++e)
-    {
-        nqe = pFields[0]->GetExp(e)->GetTotPoints();
-
-        Array<OneD, NekDouble> coords0(nqe, 0.0);
-        Array<OneD, NekDouble> coords1(nqe, 0.0);
-        Array<OneD, NekDouble> coords2(nqe, 0.0);
-
-        pFields[0]->GetExp(e)->GetCoords(coords0, coords1, coords2);
-
-        for (size_t i = 0; i < nqe; ++i)
-        {
-            if (m_mask[count + i])
-            {
-                mod = (coords0[i] - m_rc[0] + m_lref[0]) *
-                      (coords0[i] - m_rc[0] + m_lref[0]);
-
-                smoothFac[0][count + i] =
-                    exp((-0.5 * M_PI * mod) /
-                        (convTurbTime[0][count + i] *
-                         convTurbTime[0][count + i] * m_Ub * m_Ub));
-                smoothFac[1][count + i] =
-                    exp((-0.5 * M_PI * mod) /
-                        (convTurbTime[1][count + i] *
-                         convTurbTime[1][count + i] * m_Ub * m_Ub));
-                smoothFac[2][count + i] =
-                    exp((-0.5 * M_PI * mod) /
-                        (convTurbTime[2][count + i] *
-                         convTurbTime[2][count + i] * m_Ub * m_Ub));
-            }
-        }
-        count += nqe;
-    }
-
-    return smoothFac;
-}
-
-/**
- * @brief Calculate velocity fluctuation for the source term
- *
- * @param pFields           Pointer to fields.
- * @param stochasticSignal  Stochastic signal.
- * @return                  Velocity fluctuation.
- */
-Array<OneD, Array<OneD, NekDouble>> ForcingIncNSSyntheticEddy::
-    ComputeVelocityFluctuation(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
-        Array<OneD, Array<OneD, NekDouble>> stochasticSignal)
-{
-    // Total number of quadrature points
-    int nqTot = pFields[0]->GetTotPoints();
-    // Velocity fluctuation vector
-    Array<OneD, Array<OneD, NekDouble>> velFluc(m_N);
-    // Control loop for the m_Cholesky (Cholesky decomposition matrix)
-    int l;
-
-    for (auto &n : m_eddiesIDForcing)
-    {
-        velFluc[n] = Array<OneD, NekDouble>(nqTot * m_spacedim, 0.0);
-        for (size_t k = 0; k < m_spacedim; ++k)
-        {
-            for (size_t j = 0; j < k + 1; ++j)
-            {
-                for (size_t i = 0; i < nqTot; ++i)
-                {
-                    if (m_mask[i])
-                    {
-                        l = k + j * (2 * m_spacedim - j - 1) * 0.5;
-                        velFluc[n][k * nqTot + i] +=
-                            m_Cholesky[i][l] *
-                            stochasticSignal[n][j * nqTot + i];
-                    }
-                }
-            }
-        }
-    }
-
-    return velFluc;
-}
-
-/**
- * @brief Compute stochastic signal.
- *
- * @param pFields  Pointer to fields.
- * @return         Stochastic signal.
- */
-Array<OneD, Array<OneD, NekDouble>> ForcingIncNSSyntheticEddy::
-    ComputeStochasticSignal(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
-{
-    // Total number of quadrature points
-    int nqTot = pFields[0]->GetTotPoints();
-    // Number of elements
-    int nElmts = pFields[0]->GetNumElmts();
-    // Total number of quadrature points of each element
-    int nqe;
-    // Stochastic Signal vector
-    Array<OneD, Array<OneD, NekDouble>> stochasticSignal(m_N);
-    // Random numbers: -1 and 1
-    Array<OneD, Array<OneD, int>> epsilonSign;
-
-    // Generate only for the new eddies after the first time step
-    epsilonSign = GenerateRandomOneOrMinusOne();
-
-    // Calculate the stochastic signal for the eddies
-    for (auto &n : m_eddiesIDForcing)
-    {
-        stochasticSignal[n] = Array<OneD, NekDouble>(nqTot * m_spacedim, 0.0);
-
-        // Evaluate the function at interpolation points for each component
-        for (size_t j = 0; j < m_spacedim; ++j)
-        {
-            // Count the number of quadrature points
-            int nqeCount = 0;
-
-            for (size_t e = 0; e < nElmts; ++e)
-            {
-                nqe = pFields[0]->GetExp(e)->GetTotPoints();
-
-                Array<OneD, NekDouble> coords0(nqe, 0.0);
-                Array<OneD, NekDouble> coords1(nqe, 0.0);
-                Array<OneD, NekDouble> coords2(nqe, 0.0);
-
-                pFields[0]->GetExp(e)->GetCoords(coords0, coords1, coords2);
-
-                // i: degrees of freedom, j: direction, n: eddies
-                for (size_t i = 0; i < nqe; ++i)
-                {
-                    if (m_mask[nqeCount + i])
-                    {
-                        stochasticSignal[n][j * nqTot + nqeCount + i] =
-                            epsilonSign[j][n] *
-                            ComputeGaussian((coords0[i] - m_eddyPos[n][0]) /
-                                                m_lref[0],
-                                            m_xiMax[j * m_spacedim + 0],
-                                            ComputeConstantC(0, j)) *
-                            ComputeGaussian((coords1[i] - m_eddyPos[n][1]) /
-                                                m_lref[1],
-                                            m_xiMax[j * m_spacedim + 1],
-                                            ComputeConstantC(1, j)) *
-                            ComputeGaussian((coords2[i] - m_eddyPos[n][2]) /
-                                                m_lref[2],
-                                            m_xiMax[j * m_spacedim + 2],
-                                            ComputeConstantC(2, j));
-                    }
-                }
-                nqeCount += nqe;
-            }
-        }
-    }
-
-    return stochasticSignal;
-}
-
-/**
- * @brief Update the position of the eddies for every time step.
- */
-void ForcingIncNSSyntheticEddy::UpdateEddiesPositions()
-{
-    NekDouble dt = m_session->GetParameter("TimeStep");
-
-    for (size_t n = 0; n < m_N; ++n)
-    {
-        // Check if any eddy went through the outlet plane (box)
-        if ((m_eddyPos[n][0] + m_Ub * dt) < (m_rc[0] + m_lref[0]))
-        {
-            m_eddyPos[n][0] = m_eddyPos[n][0] + m_Ub * dt;
-        }
-        else
-        {
-            // Generate a new one in the inlet plane
-            m_eddyPos[n][0] = m_rc[0] - m_lref[0];
-            // Check if test case
-            if (!m_tCase)
-            {
-                m_eddyPos[n][1] =
-                    (m_rc[1] - 0.5 * m_lyz[0]) +
-                    (NekSingle(std::rand()) / NekSingle(RAND_MAX)) * (m_lyz[0]);
-                m_eddyPos[n][2] =
-                    (m_rc[2] - 0.5 * m_lyz[1] + 0.5 * m_lref[2]) +
-                    (NekSingle(std::rand()) / NekSingle(RAND_MAX)) * (m_lyz[1]);
-            }
-            else
-            {
-                // same place (center) for the test case
-                m_eddyPos[n][1] = m_rc[1];
-                m_eddyPos[n][2] = m_rc[2];
-            }
-            m_eddiesIDForcing.push_back(n);
-            m_calcForcing = true;
-        }
-    }
-}
-
-/**
- * @brief Remove eddy from forcing term
- *
- * @param pFields  Pointer to fields.
- */
-void ForcingIncNSSyntheticEddy::RemoveEddiesFromForcing(
-    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
-{
-    // Total number of quadrature points
-    int nqTot = pFields[0]->GetTotPoints();
-    // Number of Variables
-    int nVars = pFields.size();
-
-    for (auto &n : m_eddiesIDForcing)
-    {
-        for (size_t j = 0; j < nVars; ++j)
-        {
-            for (size_t i = 0; i < nqTot; ++i)
-            {
-                m_Forcing[j][i] -= m_ForcingEddy[n][j][i];
-            }
-        }
-    }
-}
-
-/**
- * @brief Initialise Forcing term for each eddy.
- */
-void ForcingIncNSSyntheticEddy::InitialiseForcingEddy(
-    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
-{
-    // Total number of quadrature points
-    int nqTot = pFields[0]->GetTotPoints();
-    // Number of Variables
-    int nVars     = pFields.size();
-    m_ForcingEddy = Array<OneD, Array<OneD, Array<OneD, NekDouble>>>(m_N);
-
-    for (size_t i = 0; i < m_N; ++i)
-    {
-        m_ForcingEddy[i] = Array<OneD, Array<OneD, NekDouble>>(nVars);
-        for (size_t j = 0; j < nVars; ++j)
-        {
-            m_ForcingEddy[i][j] = Array<OneD, NekDouble>(nqTot);
-            for (size_t k = 0; k < nqTot; ++k)
-            {
-                m_ForcingEddy[i][j][k] = 0.0;
-            }
-        }
-    }
-}
-
-/**
- * @brief Calculate distribution of eddies in the box.
- */
-void ForcingIncNSSyntheticEddy::ComputeInitialRandomLocationOfEddies()
-{
-    m_eddyPos = Array<OneD, Array<OneD, NekDouble>>(m_N);
-
-    for (size_t n = 0; n < m_N; ++n)
-    {
-        m_eddyPos[n] = Array<OneD, NekDouble>(m_spacedim);
-        // Generate randomly eddies inside the box
-        m_eddyPos[n][0] =
-            (m_rc[0] - m_lref[0]) +
-            (NekSingle(std::rand()) / NekSingle(RAND_MAX)) * 2 * m_lref[0];
-        m_eddyPos[n][1] =
-            (m_rc[1] - 0.5 * m_lyz[0]) +
-            (NekSingle(std::rand()) / NekSingle(RAND_MAX)) * m_lyz[0];
-        m_eddyPos[n][2] =
-            (m_rc[2] - 0.5 * m_lyz[1]) +
-            (NekSingle(std::rand()) / NekSingle(RAND_MAX)) * m_lyz[1];
-    }
-}
-
-/**
- * @brief Compute standard Gaussian with zero mean.
- *
- * @param coord  Coordianate.
- * @return       Gaussian value for the coordinate.
- */
-NekDouble ForcingIncNSSyntheticEddy::ComputeGaussian(NekDouble coord,
-                                                     NekDouble xiMaxVal,
-                                                     NekDouble constC)
-{
-    NekDouble epsilon = 1e-6;
-    if (abs(coord) <= (xiMaxVal + epsilon))
-    {
-        return ((1.0 / (m_sigma * sqrt(2.0 * M_PI * constC))) *
-                exp(-0.5 * (coord / m_sigma) * (coord / m_sigma)));
-    }
-    else
-    {
-        return 0.0;
-    }
-}
-
-/**
- * @brief Compute constant C for the gaussian funcion.
- *
- * @param row  index for the rows of the matrix.
- * @param col  index for the columns of the matrix.
- * @return     Value of C.
- */
-NekDouble ForcingIncNSSyntheticEddy::ComputeConstantC(int row, int col)
-{
-    NekDouble sizeLenScale = m_xiMax[col * m_spacedim + row];
-
-    // Integration
-    NekDouble sum  = 0.0;
-    NekDouble step = 0.01;
-    NekDouble xi0  = -1;
-    NekDouble xif  = 1;
-    while (xi0 < xif)
-    {
-        sum += (ComputeGaussian(xi0 + step, sizeLenScale) *
-                    ComputeGaussian(xi0 + step, sizeLenScale) +
-                ComputeGaussian(xi0, sizeLenScale) *
-                    ComputeGaussian(xi0, sizeLenScale));
-        xi0 += step;
-    }
-
-    return (0.5 * 0.5 * step * sum);
-}
-
-/**
- * @brief Generate random 1 or -1 values to be use to compute
- *        the stochastic signal.
- * @return ramdom 1 or -1 values.
- */
-Array<OneD, Array<OneD, int>> ForcingIncNSSyntheticEddy::
-    GenerateRandomOneOrMinusOne()
-{
-    Array<OneD, Array<OneD, int>> epsilonSign(m_spacedim);
-
-    // j: component of the stochastic signal
-    // n: eddy
-    for (size_t j = 0; j < m_spacedim; ++j)
-    {
-        epsilonSign[j] = Array<OneD, int>(m_N, 0.0);
-        for (auto &n : m_eddiesIDForcing)
-        {
-            // Convert to -1 or to 1
-            // Check if test case
-            if (!m_tCase)
-            {
-                epsilonSign[j][n] =
-                    ((NekSingle(std::rand()) / NekSingle(RAND_MAX)) <= 0.5) ? -1
-                                                                            : 1;
-            }
-            else
-            {
-                // Positive values only for the test case
-                epsilonSign[j][n] = 1;
-            }
-        }
-    }
-
-    return epsilonSign;
-}
-
-/**
- * @brief Set box of eddies mask to be use to seprate the
- *        degrees of freedom (coordinates) inside and outside
- *        the box of eddies.
- *
- * @param pFields  Pointer to fields.
- */
-void ForcingIncNSSyntheticEddy::SetBoxOfEddiesMask(
-    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
-{
-    // Total number of quadrature points
-    int nqTot = pFields[0]->GetTotPoints();
-    // Number of elements
-    int nElmts = pFields[0]->GetNumElmts();
-    // Total number of quadrature points of each element
-    int nqe;
-    // Mask
-    m_mask = Array<OneD, int>(nqTot, 0); // 0 for ouside, 1 for inside
-    // Counter
-    int count = 0;
-
-    for (size_t e = 0; e < nElmts; ++e)
-    {
-        nqe = pFields[0]->GetExp(e)->GetTotPoints();
-
-        Array<OneD, NekDouble> coords0(nqe, 0.0);
-        Array<OneD, NekDouble> coords1(nqe, 0.0);
-        Array<OneD, NekDouble> coords2(nqe, 0.0);
-
-        pFields[0]->GetExp(e)->GetCoords(coords0, coords1, coords2);
-
-        for (size_t i = 0; i < nqe; ++i)
-        {
-            if (InsideBoxOfEddies(coords0[i], coords1[i], coords2[i]))
-            {
-                // 0 for outside, 1 for inside
-                m_mask[count + i] = 1;
-            }
-        }
-        count += nqe;
-    }
-}
-
-/**
- * @brief Check it point is inside the box of eddies.
- *
- * @param coord0  coordinate in the x-direction.
- * @param coord1  coordinate in the y-direction.
- * @param coord2  coordinate in the z-direction.
- * @return        true or false
- */
-bool ForcingIncNSSyntheticEddy::InsideBoxOfEddies(NekDouble coord0,
-                                                  NekDouble coord1,
-                                                  NekDouble coord2)
-{
-    NekDouble tol = 1e-6;
-    if ((coord0 >= (m_rc[0] - m_lref[0] - m_lref[0])) &&
-        (coord0 <= (m_rc[0] + m_lref[0] + tol)) &&
-        (coord1 >= (m_rc[1] - 0.5 * m_lyz[0] - tol)) &&
-        (coord1 <= (m_rc[1] + 0.5 * m_lyz[0] + tol)) &&
-        (coord2 >= (m_rc[2] - 0.5 * m_lyz[1] - tol)) &&
-        (coord2 <= (m_rc[2] + 0.5 * m_lyz[1] + tol)))
-    {
-        return true;
-    }
-
-    return false;
-}
-
-/**
- * @brief Calculates the reference lenghts ...
- */
-void ForcingIncNSSyntheticEddy::ComputeRefLenghts()
-{
-    m_lref    = Array<OneD, NekDouble>(m_spacedim, 0.0);
-    m_lref[0] = m_l[0];
-    m_lref[1] = m_l[1];
-    m_lref[2] = m_l[2];
-
-    // The l_{x}^{ref}, l_{y}^{ref} and l_{z}^{ref}
-    // are the maximum among the velocity components
-    // over the domain.
-    for (size_t i = 0; i < m_spacedim; ++i)
-    {
-        for (size_t j = 1; j < m_spacedim; ++j)
-        {
-            if (m_l[m_spacedim * j + i] > m_lref[i])
-            {
-                m_lref[i] = m_l[m_spacedim * j + i];
-            }
-        }
-    }
-}
-
-/**
- * @brief Calculates the \f$\xi_{max}\f$.
- */
-void ForcingIncNSSyntheticEddy::ComputeXiMax()
-{
-    NekDouble value;
-    m_xiMax = Array<OneD, NekDouble>(m_spacedim * m_spacedim, 0.0);
-
-    for (size_t i = 0; i < m_spacedim; i++)
-    {
-        for (size_t j = 0; j < m_spacedim; j++)
-        {
-            value = (m_l[m_spacedim * j + i] / m_lref[i]);
-            if (value > m_xiMaxMin)
-            {
-                m_xiMax[m_spacedim * j + i] = value;
-            }
-            else
-            {
-                m_xiMax[m_spacedim * j + i] = m_xiMaxMin;
-            }
-        }
-    }
-}
-
-/**
- * @brief Calculates the Cholesky decomposition of the Reynolds Stresses
- *        in each degree of freedom of the mesh.
- *
- * @param pFields  Pointer to fields.
- */
-void ForcingIncNSSyntheticEddy::SetCholeskyReyStresses(
-    const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields)
-{
-    // Total number of quadrature points
-    int nqTot = pFields[0]->GetTotPoints();
-    // Total number of quadrature points of each element
-    int nqe;
-    // Number of elements
-    int nElmts = pFields[0]->GetNumElmts();
-    // Count the degrees of freedom
-    int nqeCount = 0;
-    // Block diagonal size
-    int diagSize = m_spacedim * (m_spacedim + 1) * 0.5;
-    // Cholesky decomposition matrix for the synthetic eddy region (box)
-    m_Cholesky = Array<OneD, Array<OneD, NekDouble>>(nqTot);
-
-    for (size_t e = 0; e < nElmts; ++e)
-    {
-        nqe = pFields[0]->GetExp(e)->GetTotPoints();
-
-        Array<OneD, NekDouble> coords0(nqe, 0.0);
-        Array<OneD, NekDouble> coords1(nqe, 0.0);
-        Array<OneD, NekDouble> coords2(nqe, 0.0);
-
-        // Coordinates (for each degree of freedom) for the element k.
-        pFields[0]->GetExp(e)->GetCoords(coords0, coords1, coords2);
-
-        // Evaluate Cholesky decomposition
-        for (size_t i = 0; i < nqe; ++i)
-        {
-            int l = 0;
-            // Size of Cholesky decomposition matrix - aux vector
-            Array<OneD, NekDouble> A(diagSize, 0.0);
-
-            while (l < diagSize)
-            {
-                // Variable to compute the Cholesky decomposition for each
-                // degree of freedom
-                A[l] = m_R[l]->Evaluate(coords0[i], coords1[i], coords2[i]);
-                l++;
-            }
-            int info = 0;
-            Lapack::Dpptrf('L', m_spacedim, A.get(), info);
-            if (info < 0)
-            {
-                std::string message =
-                    "ERROR: The " + std::to_string(-info) +
-                    "th parameter had an illegal parameter for dpptrf";
-                NEKERROR(ErrorUtil::efatal, message.c_str());
-            }
-            m_Cholesky[nqeCount + i] = Array<OneD, NekDouble>(diagSize);
-            for (size_t l = 0; l < diagSize; ++l)
-            {
-                m_Cholesky[nqeCount + i][l] = A[l];
-            }
-        }
-        nqeCount += nqe;
-    }
-}
-
-/**
- * @brief Calculate the number of eddies that are going to be
- *        injected in the synthetic eddy region (box).
- */
-void ForcingIncNSSyntheticEddy::SetNumberOfEddies()
-{
-    m_N = int((m_lyz[0] * m_lyz[1]) /
-              (4 * m_lref[m_spacedim - 2] * m_lref[m_spacedim - 1])) +
-          1;
-}
-
-/**
- * @brief Place eddies in specific locations in the test case
- *        geometry for consistency and comparison.
- *
- *        This function was design for a three-dimensional
- *        channel flow test case (ChanFlow3d_infTurb).
- *        It is only called for testing purposes (unit test).
- */
-void ForcingIncNSSyntheticEddy::ComputeInitialLocationTestCase()
-{
-    m_N       = 3; // Redefine number of eddies
-    m_eddyPos = Array<OneD, Array<OneD, NekDouble>>(m_N);
-
-    // First eddy (center)
-    m_eddyPos[0]    = Array<OneD, NekDouble>(m_spacedim);
-    m_eddyPos[0][0] = (m_rc[0] - m_lref[0]) + 0.2 * 2 * m_lref[0];
-    m_eddyPos[0][1] = m_rc[1];
-    m_eddyPos[0][2] = m_rc[2];
-
-    // Second eddy (top)
-    m_eddyPos[1]    = Array<OneD, NekDouble>(m_spacedim);
-    m_eddyPos[1][0] = (m_rc[0] - m_lref[0]) + 0.3 * 2 * m_lref[0];
-    m_eddyPos[1][1] = (m_rc[1] - 0.5 * m_lyz[0]) + 0.9 * m_lyz[0];
-    m_eddyPos[1][2] = m_rc[2];
-
-    // Third eddy (bottom)
-    m_eddyPos[2]    = Array<OneD, NekDouble>(m_spacedim);
-    m_eddyPos[2][0] = (m_rc[0] - m_lref[0]) + 0.4 * 2 * m_lref[0];
-    m_eddyPos[2][1] = (m_rc[1] - 0.5 * m_lyz[0]) + 0.1 * m_lyz[0];
-    m_eddyPos[2][2] = m_rc[2];
-}
-
-} // namespace Nektar::SolverUtils
\ No newline at end of file
+} // namespace Nektar::SolverUtils
diff --git a/solvers/IncNavierStokesSolver/Forcing/ForcingIncNSSyntheticEddy.h b/solvers/IncNavierStokesSolver/Forcing/ForcingIncNSSyntheticEddy.h
index 2fde3932cb..a39672699e 100644
--- a/solvers/IncNavierStokesSolver/Forcing/ForcingIncNSSyntheticEddy.h
+++ b/solvers/IncNavierStokesSolver/Forcing/ForcingIncNSSyntheticEddy.h
@@ -28,7 +28,8 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 //
-// Description: Derived base class - Synthetic turbulence forcing
+// Description: Derived base class - Synthetic turbulence forcing for the
+//              Incompressible solver
 //
 ///////////////////////////////////////////////////////////////////////////////
 
@@ -36,12 +37,14 @@
 #define NEKTAR_SOLVERUTILS_FORCINGINCNSSYNTHETICEDDY
 
 #include <SolverUtils/Forcing/Forcing.h>
+#include <SolverUtils/Forcing/ForcingSyntheticEddy.h>
 #include <string>
 
 namespace Nektar::SolverUtils
 {
-
-class ForcingIncNSSyntheticEddy : public SolverUtils::Forcing
+class ForcingIncNSSyntheticEddy
+    : virtual public SolverUtils::Forcing,
+      virtual public SolverUtils::ForcingSyntheticEddy
 {
 public:
     friend class MemoryManager<ForcingIncNSSyntheticEddy>;
@@ -64,112 +67,14 @@ public:
     static std::string className;
 
 protected:
-    void v_InitObject(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
-        const unsigned int &pNumForcingFields,
-        const TiXmlElement *pForce) override;
-
+    // Apply forcing term
     void v_Apply(const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
                  const Array<OneD, Array<OneD, NekDouble>> &inarray,
                  Array<OneD, Array<OneD, NekDouble>> &outarray,
                  const NekDouble &time) override;
-
-    // Set Cholesky decomposition of the Reynolds Stresses in the domain
-    void SetCholeskyReyStresses(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
-    /// Set the Number of the Eddies in the box
-    void SetNumberOfEddies();
-    /// Set reference lengths
-    void ComputeRefLenghts();
-    /// Set Xi max
-    void ComputeXiMax();
-    /// Compute Random 1 or -1 value
-    Array<OneD, Array<OneD, int>> GenerateRandomOneOrMinusOne();
-    /// Compute Constant C
-    NekDouble ComputeConstantC(int row, int col);
-    /// Compute Gaussian
-    NekDouble ComputeGaussian(NekDouble coord, NekDouble xiMaxVal,
-                              NekDouble constC = 1.0);
-    /// Check if point is inside the box of eddies
-    bool InsideBoxOfEddies(NekDouble coord0, NekDouble coord1,
-                           NekDouble coord2);
-    /// Compute Stochastic Signal
-    Array<OneD, Array<OneD, NekDouble>> ComputeStochasticSignal(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
-    /// Compute Velocity Fluctuation
-    Array<OneD, Array<OneD, NekDouble>> ComputeVelocityFluctuation(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
-        Array<OneD, Array<OneD, NekDouble>> stochasticSignal);
-    /// Compute Characteristic Convective Turbulent Time
-    Array<OneD, Array<OneD, NekDouble>> ComputeCharConvTurbTime(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
-    /// Compute Smoothing Factor
-    Array<OneD, Array<OneD, NekDouble>> ComputeSmoothingFactor(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields,
-        Array<OneD, Array<OneD, NekDouble>> convTurb);
-    /// Set box of eddies mask
-    void SetBoxOfEddiesMask(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
-    /// Compute the initial position of the eddies inside the box
-    void ComputeInitialRandomLocationOfEddies();
-    /// Update positions of the eddies inside the box
-    void UpdateEddiesPositions();
     /// Calculate Forcing
     void CalculateForcing(
         const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
-    /// Compute the initial location of the eddies for the test case
-    void ComputeInitialLocationTestCase();
-    /// Remove eddy from forcing term
-    void RemoveEddiesFromForcing(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
-    /// Initialise forcing term for each eddy
-    void InitialiseForcingEddy(
-        const Array<OneD, MultiRegions::ExpListSharedPtr> &pFields);
-
-    // Members
-    // Expressions (functions) of the prescribed Reynolds stresses
-    std::map<int, LibUtilities::EquationSharedPtr> m_R;
-    /// Cholesky decomposition of the Reynolds Stresses
-    /// for all points in the mesh
-    Array<OneD, Array<OneD, NekDouble>> m_Cholesky;
-    /// Bulk velocity
-    NekDouble m_Ub;
-    /// Standard deviation
-    NekDouble m_sigma;
-    /// Inlet length in the y-direction and z-direction
-    Array<OneD, NekDouble> m_lyz;
-    /// Center of the inlet plane
-    Array<OneD, NekDouble> m_rc;
-    /// Number of eddies in the box
-    int m_N;
-    /// Characteristic lenght scales
-    Array<OneD, NekDouble> m_l;
-    /// Reference lenghts
-    Array<OneD, NekDouble> m_lref;
-    /// Xi max
-    Array<OneD, NekDouble> m_xiMax;
-    // XiMaxMin - Value form Giangaspero et al. 2022
-    NekDouble m_xiMaxMin = 0.4;
-    /// Space dimension
-    int m_spacedim;
-    /// Ration of specific heats
-    NekDouble m_gamma;
-    /// Box of eddies mask
-    Array<OneD, int> m_mask;
-    /// Eddy position
-    Array<OneD, Array<OneD, NekDouble>> m_eddyPos;
-    /// Check when the forcing should be applied
-    bool m_calcForcing{true};
-    /// Eddies that add to the domain
-    std::vector<unsigned int> m_eddiesIDForcing;
-    /// Current time
-    NekDouble m_currTime;
-    /// Keep applying force during GMRES iteration
-    bool m_implicitForcing{false};
-    /// Check for test case
-    bool m_tCase;
-    /// Forcing for each eddy
-    Array<OneD, Array<OneD, Array<OneD, NekDouble>>> m_ForcingEddy;
 
 private:
     ForcingIncNSSyntheticEddy(
diff --git a/solvers/IncNavierStokesSolver/Tests/ChanFlow3D_infTurb.tst b/solvers/IncNavierStokesSolver/Tests/ChanFlow3D_infTurb.tst
index 8eec9be05d..52f9e7796a 100644
--- a/solvers/IncNavierStokesSolver/Tests/ChanFlow3D_infTurb.tst
+++ b/solvers/IncNavierStokesSolver/Tests/ChanFlow3D_infTurb.tst
@@ -8,16 +8,16 @@
     </files>
     <metrics>
         <metric type="L2" id="1">
-            <value variable="u" tolerance="1e-5">3.64539</value>
-            <value variable="v" tolerance="1e-7">0.0268234</value>
-            <value variable="w" tolerance="1e-6">0.030717</value>
-            <value variable="p" tolerance="1e-7">0.0224162</value>
+            <value variable="u" tolerance="1e-5">3.64585</value>
+            <value variable="v" tolerance="1e-7">0.0316134</value>
+            <value variable="w" tolerance="1e-7">0.0361575</value>
+            <value variable="p" tolerance="1e-7">0.0214355</value>
         </metric>
         <metric type="Linf" id="2">
-            <value variable="u" tolerance="1e-5">1.40919</value>
-            <value variable="v" tolerance="1e-6">0.145714</value>
-            <value variable="w" tolerance="1e-6">0.119218</value>
-            <value variable="p" tolerance="1e-7">0.0906175</value>
+            <value variable="u" tolerance="1e-5">1.46953</value>
+            <value variable="v" tolerance="1e-6">0.183361</value>
+            <value variable="w" tolerance="1e-6">0.160353</value>
+            <value variable="p" tolerance="1e-7">0.0869825</value>
         </metric>
     </metrics>
 </test>
diff --git a/solvers/IncNavierStokesSolver/Tests/ChanFlow3D_infTurb.xml b/solvers/IncNavierStokesSolver/Tests/ChanFlow3D_infTurb.xml
index 5ca7af7a24..04e263575a 100644
--- a/solvers/IncNavierStokesSolver/Tests/ChanFlow3D_infTurb.xml
+++ b/solvers/IncNavierStokesSolver/Tests/ChanFlow3D_infTurb.xml
@@ -41,7 +41,7 @@
 
         <PARAMETERS>
             <P> TimeStep      = 0.01            </P>
-            <P> NumSteps      = 75              </P>
+            <P> NumSteps      = 85              </P>
             <P> IO_CheckSteps = 0               </P>
             <P> IO_InfoSteps  = 1               </P>
             <P> IO_CFLSteps   = 1               </P>
@@ -118,7 +118,7 @@
             <E VAR="r00"   VALUE="(+2194869.72*(1-abs(y))^14-15843749.2*(1-abs(y))^13+51288368.6*(1-abs(y))^12-98280270.7*(1-abs(y))^11+123921817.0*(1-abs(y))^10-108083933.0*(1-abs(y))^9+66700892.4*(1-abs(y))^8-29258748.2*(1-abs(y))^7+9017078.56*(1-abs(y))^6-1889548.13*(1-abs(y))^5+250183.446*(1-abs(y))^4-17029.8457*(1-abs(y))^3+1.26582088*(1-abs(y))^2+68.7492352*(1-abs(y))^1-0.0148027907*(1-abs(y))^0)^2*(tauw/rhom)"     />
             <E VAR="r11"   VALUE="(+115374.19*(1-abs(y))^14-835012.705*(1-abs(y))^13+2718672.87*(1-abs(y))^12-5262526.56*(1-abs(y))^11+6743594.93*(1-abs(y))^10-6028822.18*(1-abs(y))^9+3861137.61*(1-abs(y))^8-1790967.72*(1-abs(y))^7+601467.524*(1-abs(y))^6-144772.848*(1-abs(y))^5+24433.5085*(1-abs(y))^4-2749.69383*(1-abs(y))^3+170.501429*(1-abs(y))^2+1.19079597*(1-abs(y))^1-0.00240344727*(1-abs(y))^0)^2*(tauw/rhom)"     />
             <E VAR="r22"   VALUE="(-467724.204*(1-abs(y))^14+3358371.37*(1-abs(y))^13-10821834.7*(1-abs(y))^12+20672126.8*(1-abs(y))^11-26050692.2*(1-abs(y))^10+22809003.9*(1-abs(y))^9-14237511.6*(1-abs(y))^8+6400502.89*(1-abs(y))^7-2069981.91*(1-abs(y))^6+476610.822*(1-abs(y))^5-76731.1913*(1-abs(y))^4+8464.95414*(1-abs(y))^3-638.190408*(1-abs(y))^2+33.7641881*(1-abs(y))^1+0.00362081709*(1-abs(y))^0)^2*(tauw/rhom)"     />
-            <E VAR="r10"   VALUE="(y>0)*(-y*(+143887.186*(1-abs(y))^14-924421.506*(1-abs(y))^13+2558324.72*(1-abs(y))^12-3912224.86*(1-abs(y))^11+3423219.44*(1-abs(y))^10-1362528.94*(1-abs(y))^9-423777.124*(1-abs(y))^8+908513.536*(1-abs(y))^7-583322.471*(1-abs(y))^6+215251.323*(1-abs(y))^5-49187.1036*(1-abs(y))^4+6726.52324*(1-abs(y))^3-466.587078*(1-abs(y))^2+5.87033236*(1-abs(y))^1-0.0123273856*(1-abs(y))^0))*(tauw/rhom)  +  (y<0)*(y*(+143887.186*(1-abs(y))^14-924421.506*(1-abs(y))^13+2558324.72*(1-abs(y))^12-3912224.86*(1-abs(y))^11+3423219.44*(1-abs(y))^10-1362528.94*(1-abs(y))^9-423777.124*(1-abs(y))^8+908513.536*(1-abs(y))^7-583322.471*(1-abs(y))^6+215251.323*(1-abs(y))^5-49187.1036*(1-abs(y))^4+6726.52324*(1-abs(y))^3-466.587078*(1-abs(y))^2+5.87033236*(1-abs(y))^1-0.0123273856*(1-abs(y))^0))*(tauw/rhom)"     />
+            <E VAR="r10"   VALUE="(y>0)*(-1.0*(+143887.186*(1-abs(y))^14-924421.506*(1-abs(y))^13+2558324.72*(1-abs(y))^12-3912224.86*(1-abs(y))^11+3423219.44*(1-abs(y))^10-1362528.94*(1-abs(y))^9-423777.124*(1-abs(y))^8+908513.536*(1-abs(y))^7-583322.471*(1-abs(y))^6+215251.323*(1-abs(y))^5-49187.1036*(1-abs(y))^4+6726.52324*(1-abs(y))^3-466.587078*(1-abs(y))^2+5.87033236*(1-abs(y))^1-0.0123273856*(1-abs(y))^0))*(tauw/rhom)  +  (y<0)*(1.0*(+143887.186*(1-abs(y))^14-924421.506*(1-abs(y))^13+2558324.72*(1-abs(y))^12-3912224.86*(1-abs(y))^11+3423219.44*(1-abs(y))^10-1362528.94*(1-abs(y))^9-423777.124*(1-abs(y))^8+908513.536*(1-abs(y))^7-583322.471*(1-abs(y))^6+215251.323*(1-abs(y))^5-49187.1036*(1-abs(y))^4+6726.52324*(1-abs(y))^3-466.587078*(1-abs(y))^2+5.87033236*(1-abs(y))^1-0.0123273856*(1-abs(y))^0))*(tauw/rhom)"     />
             <E VAR="r20"   VALUE="0.0"     />
             <E VAR="r21"   VALUE="0.0"     />
         </FUNCTION>
-- 
GitLab