From bd171141198afe01e71327dbd939e201caab569c Mon Sep 17 00:00:00 2001
From: Chi Hin Chan <cc219@ic.ac.uk>
Date: Fri, 6 Sep 2024 13:16:09 +0000
Subject: [PATCH] Fixed L2norm for FilterError

---
 CHANGELOG.md                                  |   1 +
 library/SolverUtils/EquationSystem.cpp        |  19 +++
 library/SolverUtils/Filters/FilterError.cpp   |   8 -
 solvers/IncNavierStokesSolver/CMakeLists.txt  |   1 +
 .../Tests/3DH1D_L2ErrorFilter.tst             |  18 ++
 .../Tests/3DH1D_L2ErrorFilter.xml             | 155 ++++++++++++++++++
 6 files changed, 194 insertions(+), 8 deletions(-)
 create mode 100644 solvers/IncNavierStokesSolver/Tests/3DH1D_L2ErrorFilter.tst
 create mode 100644 solvers/IncNavierStokesSolver/Tests/3DH1D_L2ErrorFilter.xml

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 83716c0fe2..3ba97fbb72 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@ v5.7.0
 - Fix AdaptiveSFD for MPI (!1821)
 - Fix IterativeStaticCond when using absolute tolerance (!1850)
 - Fix deadlock by scotch with multi-threading support (!1853)
+- Fixed L2norm for FilterError (!1871)
 
 **IncNavierStokesSolver**
 - Fix initial and boundary conditions in the moving reference frame (!1692, !1820)
diff --git a/library/SolverUtils/EquationSystem.cpp b/library/SolverUtils/EquationSystem.cpp
index f2ed9ccee2..976c1be897 100644
--- a/library/SolverUtils/EquationSystem.cpp
+++ b/library/SolverUtils/EquationSystem.cpp
@@ -804,6 +804,16 @@ NekDouble EquationSystem::v_L2Error(unsigned int field,
                                       m_fields[field]->UpdatePhys());
         }
 
+        // Transform from (phys, wave) -> (phys, phys), for 2.5D
+        bool physwavetrans = false;
+        if (m_fields[field]->GetWaveSpace() == true)
+        {
+            m_fields[field]->HomogeneousBwdTrans(
+                m_fields[field]->GetTotPoints(), m_fields[field]->GetPhys(),
+                m_fields[field]->UpdatePhys());
+            physwavetrans = true;
+        }
+
         if (exactsoln.size())
         {
             L2error =
@@ -831,6 +841,15 @@ NekDouble EquationSystem::v_L2Error(unsigned int field,
             NekDouble Vol = m_fields[field]->Integral(one);
             L2error       = sqrt(L2error * L2error / Vol);
         }
+
+        // Transform from (phys, phys) -> (phys, wave), for 2.5D
+        if (physwavetrans == true)
+        {
+            m_fields[field]->HomogeneousFwdTrans(
+                m_fields[field]->GetTotPoints(), m_fields[field]->GetPhys(),
+                m_fields[field]->UpdatePhys());
+            physwavetrans = false;
+        }
     }
     else
     {
diff --git a/library/SolverUtils/Filters/FilterError.cpp b/library/SolverUtils/Filters/FilterError.cpp
index 106415ec4b..9f1e5276a3 100644
--- a/library/SolverUtils/Filters/FilterError.cpp
+++ b/library/SolverUtils/Filters/FilterError.cpp
@@ -149,14 +149,6 @@ void FilterError::v_Update(
         Array<OneD, NekDouble> exactsoln(pFields[i]->GetTotPoints(), 0.0);
         equationSys->EvaluateExactSolution(i, exactsoln, time);
 
-        // If homogeneous expansion is used, transform the solution to
-        // Fourier (Wave) space
-        if (m_homogeneous)
-        {
-            pFields[i]->HomogeneousFwdTrans(pFields[i]->GetTotPoints(),
-                                            exactsoln, exactsoln);
-        }
-
         NekDouble vL2Error   = equationSys->L2Error(i, exactsoln);
         NekDouble vLinfError = equationSys->LinfError(i, exactsoln);
 
diff --git a/solvers/IncNavierStokesSolver/CMakeLists.txt b/solvers/IncNavierStokesSolver/CMakeLists.txt
index 7406d9f5f3..0a2d5addf9 100644
--- a/solvers/IncNavierStokesSolver/CMakeLists.txt
+++ b/solvers/IncNavierStokesSolver/CMakeLists.txt
@@ -219,6 +219,7 @@ IF( NEKTAR_SOLVER_INCNAVIERSTOKES )
     ADD_NEKTAR_TEST(CylFlow3DH1D_SPM)
     ADD_NEKTAR_TEST(manufactured_3DH1D)
     ADD_NEKTAR_TEST(PlungingAirfoil_2D)
+    ADD_NEKTAR_TEST(3DH1D_L2ErrorFilter)
 
     IF(NEKTAR_USE_SCOTCH)
         # This tests exhibits sensitivity to the choice of DirectStaticCond vs.
diff --git a/solvers/IncNavierStokesSolver/Tests/3DH1D_L2ErrorFilter.tst b/solvers/IncNavierStokesSolver/Tests/3DH1D_L2ErrorFilter.tst
new file mode 100644
index 0000000000..7ccfc248d5
--- /dev/null
+++ b/solvers/IncNavierStokesSolver/Tests/3DH1D_L2ErrorFilter.tst
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<test>
+    <description>Computes L2norm for 3DH1D expansions</description>
+    <executable>IncNavierStokesSolver</executable>
+    <parameters>3DH1D_L2ErrorFilter.xml</parameters>
+    <files>
+        <file description="Session File">3DH1D_L2ErrorFilter.xml</file>
+    </files>
+    <metrics>
+        <metric type="L2" id="1">
+            <value variable="u" tolerance="1e-11">3.14159e+00</value>
+            <value variable="v" tolerance="1e-11">3.14159e+00</value>
+            <value variable="w" tolerance="1e-11">3.14159e+00</value>
+            <value variable="theta" tolerance="1e-11">3.14159e+00</value>
+            <value variable="p" tolerance="1e-09">0.000000e+00</value>
+        </metric>
+    </metrics>
+</test>
diff --git a/solvers/IncNavierStokesSolver/Tests/3DH1D_L2ErrorFilter.xml b/solvers/IncNavierStokesSolver/Tests/3DH1D_L2ErrorFilter.xml
new file mode 100644
index 0000000000..2471eba600
--- /dev/null
+++ b/solvers/IncNavierStokesSolver/Tests/3DH1D_L2ErrorFilter.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<NEKTAR>
+    <EXPANSIONS>
+        <E COMPOSITE="C[5]" NUMMODES="2" TYPE="MODIFIED" FIELDS="u,v,w,theta,p" />
+    </EXPANSIONS>
+
+    <CONDITIONS>
+
+        <SOLVERINFO>
+            <I PROPERTY="SolverType"                    VALUE="VelocityCorrectionScheme"/>
+            <I PROPERTY="EQTYPE"                        VALUE="UnsteadyNavierStokes"    />
+            <I PROPERTY="EvolutionOperator"             VALUE="Nonlinear"               />
+            <I PROPERTY="Projection"                    VALUE="Galerkin"                />
+            <I PROPERTY="GlobalSysSoln"                 VALUE="IterativeStaticCond"     />
+            <I PROPERTY="TimeIntegrationMethod"         VALUE="IMEXOrder2"              />
+            <I PROPERTY="Driver"                        VALUE="Standard"                />
+            <I PROPERTY="SpectralHPDealiasing"          VALUE="True"                    />
+            <I PROPERTY="Homogeneous"                   VALUE="1D"                      />
+        </SOLVERINFO>
+
+        <PARAMETERS>
+            <!-- Need to pick Delta t strategically, dont want CFL number to be too large! -->
+            <P> TimeStep       = 0.01             </P>
+
+            <!--  Final time -->
+            <P> TFinal         = 0.00             </P>
+            <P> NumSteps       = TFinal/TimeStep  </P>
+            <P> IO_CheckSteps  = 1/TimeStep       </P>
+            <P> IO_InfoSteps   = 1/TimeStep       </P>
+            <P> IO_CFLSteps    = 1/TimeStep	      </P>
+
+            <!-- Reynolds number -->
+            <P> Pr             = 1                </P>
+            <P> Kinvis         = Pr               </P>
+
+            <P> HomModesZ      = 8                </P>
+            <P> LZ             = PI               </P>
+
+            <!-- Heating parameters  -->
+            <P> Ra            = 0                 </P>
+
+            <P> kdim          = 512               </P>
+            <P> nvec          = 2                 </P>
+            <P> evtol         = 1e-6              </P>
+
+        </PARAMETERS>
+
+        <VARIABLES>
+            <V ID="0">u</V>
+            <V ID="1">v</V>
+            <V ID="2">w</V>
+            <V ID="3">theta</V>
+            <V ID="4">p</V>
+        </VARIABLES>
+
+        <BOUNDARYREGIONS>
+            <B ID="0"> C[1]   </B>   <!-- Inlet    -->
+            <B ID="1"> C[2]   </B>   <!-- Outlet    -->
+            <B ID="2"> C[3]   </B>   <!-- UWall    -->
+            <B ID="3"> C[4]   </B>   <!-- Lwall    -->
+        </BOUNDARYREGIONS>
+
+        <BOUNDARYCONDITIONS>
+            <REGION REF="0">
+                <P VAR="u"  VALUE="[1]" />
+                <P VAR="v" VALUE="[1]" />
+                <P VAR="w" VALUE="[1]" />
+                <P VAR="theta" VALUE="[1]" />
+                <P VAR="p" VALUE="[1]" />
+            </REGION>
+            <REGION REF="1">
+                <P VAR="u" VALUE="[0]" />
+                <P VAR="v" VALUE="[0]" />
+                <P VAR="w" VALUE="[0]" />
+                <P VAR="theta" VALUE="[0]" />
+                <P VAR="p" VALUE="[0]" />
+            </REGION>
+            <REGION REF="2">
+                <D VAR="u"     VALUE="cos(2*PI*z / LZ)" />
+                <D VAR="v"     VALUE="cos(2*PI*z / LZ)" />
+                <D VAR="w"     VALUE="cos(2*PI*z / LZ)" />
+                <D VAR="theta" VALUE="cos(2*PI*z / LZ)" />
+                <N VAR="p" VALUE="0" USERDEFINEDTYPE="H" />
+            </REGION>
+            <REGION REF="3">
+                <D VAR="u"     VALUE="cos(2*PI*z / LZ)" />
+                <D VAR="v"     VALUE="cos(2*PI*z / LZ)" />
+                <D VAR="w"     VALUE="cos(2*PI*z / LZ)" />
+                <D VAR="theta" VALUE="cos(2*PI*z / LZ)" />
+                <N VAR="p" VALUE="0" USERDEFINEDTYPE="H" />
+            </REGION>
+
+        </BOUNDARYCONDITIONS>
+        <FUNCTION NAME="DiffusionCoefficient" >
+            <E VAR="theta" VALUE="1" />
+        </FUNCTION>
+
+        <FUNCTION NAME="BodyForce">
+            <E VAR="u"     VALUE="0"                 EVARS="u v w theta" />
+            <E VAR="w"     VALUE="0"                 EVARS="u v w theta" />
+            <E VAR="v"     VALUE="Ra * theta * Pr"   EVARS="u v w theta" />
+            <E VAR="theta" VALUE="0"                 EVARS="u v w theta"/>
+        </FUNCTION>
+
+        <FUNCTION NAME="InitialConditions">
+            <E VAR="u"          VALUE="cos(2*PI*z / LZ)" />
+            <E VAR="v"          VALUE="cos(2*PI*z / LZ)" />
+            <E VAR="w"          VALUE="cos(2*PI*z / LZ)" />
+            <E VAR="theta"      VALUE="cos(2*PI*z / LZ)"/>
+            <E VAR="p"          VALUE="0" />
+        </FUNCTION>
+
+    </CONDITIONS>
+
+    <FORCING>
+        <FORCE TYPE="Body">
+            <BODYFORCE>BodyForce</BODYFORCE>
+        </FORCE>
+    </FORCING>
+
+    <FILTERS>
+        <FILTER TYPE="Error">
+            <PARAM NAME="OutputFile">L2File</PARAM>
+            <PARAM NAME="OutputFrequency">1</PARAM>
+            <PARAM NAME="ConsoleOutput">1</PARAM>
+        </FILTER>
+    </FILTERS>
+    <GEOMETRY DIM="2" SPACE="2">
+        <VERTEX COMPRESSED="B64Z-LittleEndian" BITSIZE="64">eJxjYMAGPuyHsRihtISuS8hvRU4HdHkm7PL2MHlm7ObD5QGhKgpH</VERTEX>
+        <EDGE COMPRESSED="B64Z-LittleEndian" BITSIZE="64">eJxjYIAARgZUAOMz4eAz4+AzoPEBAzAAEwAA</EDGE>
+        <ELEMENT>
+            <Q COMPRESSED="B64Z-LittleEndian" BITSIZE="64">eJxjYEAFjFCaCUozQ2kAAHgABwAA</Q>
+        </ELEMENT>
+        <COMPOSITE>
+            <C ID="1"> E[3] </C>
+            <C ID="2"> E[1] </C>
+            <C ID="3"> E[2] </C>
+            <C ID="4"> E[0] </C>
+            <C ID="5"> Q[0] </C>
+        </COMPOSITE>
+        <DOMAIN>
+            <D ID="0"> C[5] </D>
+        </DOMAIN>
+    </GEOMETRY>
+    <Metadata>
+        <Provenance>
+            <GitBranch>refs/heads/fix/ImportFldSinglemodeExpansion</GitBranch>
+            <GitSHA1>45028fc647d421db87fb98b666286855b3fa9946</GitSHA1>
+            <Hostname>chanbuntu</Hostname>
+            <NektarVersion>5.3.0</NektarVersion>
+            <Timestamp>17-May-2023 16:29:20</Timestamp>
+        </Provenance>
+        <NekMeshCommandLine>-m peralign:surf1=1:surf2=2:dir=x Nx1-Ny1-Lx1.xml Nx1-Ny1-Lx1.xml </NekMeshCommandLine>
+    </Metadata>
+</NEKTAR>
-- 
GitLab