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