From 5a77f4b1c5efb2d7b80bf8e4392e45ac2398aeb9 Mon Sep 17 00:00:00 2001 From: Dave Moxey <d.moxey@imperial.ac.uk> Date: Sun, 17 Nov 2024 01:33:48 +0000 Subject: [PATCH] Add fix for triangles with Lagrange basis --- CHANGELOG.md | 1 + library/LocalRegions/NodalTriExp.cpp | 60 +++++++++++++ library/LocalRegions/NodalTriExp.h | 6 ++ solvers/IncNavierStokesSolver/CMakeLists.txt | 1 + .../Tests/ChanFlow_Tri_Lagrange.tst | 21 +++++ .../Tests/ChanFlow_Tri_Lagrange.xml | 90 +++++++++++++++++++ 6 files changed, 179 insertions(+) create mode 100644 solvers/IncNavierStokesSolver/Tests/ChanFlow_Tri_Lagrange.tst create mode 100644 solvers/IncNavierStokesSolver/Tests/ChanFlow_Tri_Lagrange.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index c29685ffbb..71a062baad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ v5.8.0 - Add FieldConvert module to perform local stability analysis for compressible flows (!1319) - Remove get() accessor from Array data structure (!1937) - Fix issue with `StdTetExp::v_LocCollapsedToLocCoord` (!1946) +- Fix issue with `NodalTriExp::v_GetTracePhysVals` (!1951) **CI** -- fix CubeAllElements performance test tolerance (!1943) diff --git a/library/LocalRegions/NodalTriExp.cpp b/library/LocalRegions/NodalTriExp.cpp index 852ed6c38d..480eadf24d 100644 --- a/library/LocalRegions/NodalTriExp.cpp +++ b/library/LocalRegions/NodalTriExp.cpp @@ -683,4 +683,64 @@ void NodalTriExp::v_ComputeTraceNormal(const int edge) } } +void NodalTriExp::v_GetTracePhysVals( + const int edge, const StdRegions::StdExpansionSharedPtr &EdgeExp, + const Array<OneD, const NekDouble> &inarray, + Array<OneD, NekDouble> &outarray, StdRegions::Orientation orient) +{ + int nquad0 = m_base[0]->GetNumPoints(); + int nquad1 = m_base[1]->GetNumPoints(); + int nt = 0; + // Extract in Cartesian direction because we have to deal with + // e.g. Gauss-Radau points. + switch (edge) + { + case 0: + Vmath::Vcopy(nquad0, &(inarray[0]), 1, &(outarray[0]), 1); + nt = nquad0; + break; + case 1: + Vmath::Vcopy(nquad1, &(inarray[0]) + (nquad0 - 1), nquad0, + &(outarray[0]), 1); + nt = nquad1; + break; + case 2: + Vmath::Vcopy(nquad1, &(inarray[0]), nquad0, &(outarray[0]), 1); + nt = nquad1; + break; + default: + ASSERTL0(false, "edge value (< 3) is out of range"); + break; + } + + ASSERTL1(EdgeExp->GetBasis(0)->GetPointsType() == + LibUtilities::eGaussLobattoLegendre, + "Edge expansion should be GLL"); + + // Interpolate if required + if (m_base[edge ? 1 : 0]->GetPointsKey() != + EdgeExp->GetBasis(0)->GetPointsKey()) + { + Array<OneD, NekDouble> outtmp(max(nquad0, nquad1)); + + Vmath::Vcopy(nt, outarray, 1, outtmp, 1); + + LibUtilities::Interp1D(m_base[edge ? 1 : 0]->GetPointsKey(), outtmp, + EdgeExp->GetBasis(0)->GetPointsKey(), outarray); + } + + if (orient == StdRegions::eNoOrientation) + { + orient = GetTraceOrient(edge); + } + + // Reverse data if necessary + if (orient == StdRegions::eBackwards) + { + Vmath::Reverse(EdgeExp->GetNumPoints(0), &outarray[0], 1, &outarray[0], + 1); + } +} + + } // namespace Nektar::LocalRegions diff --git a/library/LocalRegions/NodalTriExp.h b/library/LocalRegions/NodalTriExp.h index 37bcee221a..fe0c7fc224 100644 --- a/library/LocalRegions/NodalTriExp.h +++ b/library/LocalRegions/NodalTriExp.h @@ -369,6 +369,12 @@ private: } void v_ComputeTraceNormal(const int edge) override; + + void v_GetTracePhysVals( + const int edge, const StdRegions::StdExpansionSharedPtr &EdgeExp, + const Array<OneD, const NekDouble> &inarray, + Array<OneD, NekDouble> &outarray, StdRegions::Orientation orient) + override; }; typedef std::shared_ptr<NodalTriExp> NodalTriExpSharedPtr; diff --git a/solvers/IncNavierStokesSolver/CMakeLists.txt b/solvers/IncNavierStokesSolver/CMakeLists.txt index 8ddd1baed3..6bd71141fd 100644 --- a/solvers/IncNavierStokesSolver/CMakeLists.txt +++ b/solvers/IncNavierStokesSolver/CMakeLists.txt @@ -119,6 +119,7 @@ IF( NEKTAR_SOLVER_INCNAVIERSTOKES ) ADD_NEKTAR_TEST(ChanFlow_m8_BodyForce) ADD_NEKTAR_TEST(ChanFlow_m8_singular) ADD_NEKTAR_TEST(ChanFlow_V8P7_Avg) + ADD_NEKTAR_TEST(ChanFlow_Tri_Lagrange) ADD_NEKTAR_TEST(Channel_Flow_3modes_rad) ADD_NEKTAR_TEST(channelTemp) ADD_NEKTAR_TEST(channelFlow_Heating_FlowRate) diff --git a/solvers/IncNavierStokesSolver/Tests/ChanFlow_Tri_Lagrange.tst b/solvers/IncNavierStokesSolver/Tests/ChanFlow_Tri_Lagrange.tst new file mode 100644 index 0000000000..3da4446133 --- /dev/null +++ b/solvers/IncNavierStokesSolver/Tests/ChanFlow_Tri_Lagrange.tst @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" ?> +<test> + <description>Channel Flow P=8</description> + <executable>IncNavierStokesSolver</executable> + <parameters>ChanFlow_Tri_Lagrange.xml</parameters> + <files> + <file description="Session File">ChanFlow_Tri_Lagrange.xml</file> + </files> + <metrics> + <metric type="L2" id="1"> + <value variable="u" tolerance="1e-12">2.44199e-12</value> + <value variable="v" tolerance="1e-12">4.18302e-13</value> + <value variable="p" tolerance="1e-8">3.31598e-11</value> + </metric> + <metric type="Linf" id="2"> + <value variable="u" tolerance="1e-12">1.24133e-11</value> + <value variable="v" tolerance="1e-12">2.05103e-12</value> + <value variable="p" tolerance="1e-8">5.98182e-10</value> + </metric> + </metrics> +</test> diff --git a/solvers/IncNavierStokesSolver/Tests/ChanFlow_Tri_Lagrange.xml b/solvers/IncNavierStokesSolver/Tests/ChanFlow_Tri_Lagrange.xml new file mode 100644 index 0000000000..0366b065e5 --- /dev/null +++ b/solvers/IncNavierStokesSolver/Tests/ChanFlow_Tri_Lagrange.xml @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="utf-8" ?> +<NEKTAR> + <GEOMETRY DIM="2" SPACE="2"> + <VERTEX COMPRESSED="B64Z-LittleEndian" BITSIZE="64">eJxjYMAPGKF0KBhctUeXZ0KTR1fHjKYeXZ4Fq/6ncHlWrPoR8mxYzf0Al2fH6iuEPAcOc2GAE00e3f1cWOUR5nBjNR9hPw8Od8EAL5o8uv18WOUR9vNjNR9hDwDiLzuR</VERTEX> + <EDGE COMPRESSED="B64Z-LittleEndian" BITSIZE="64">eJx1kMsSgjAQBIOCIgoqCigv+f+v9JI+0FXJZaunZmFnQti/LDEPick7SodzMa+QH98psXeWzn4pxn9JfLcSs3eVzv9uYvx1nPTDHY2YO+5i9h7S6eMpnbtbMf6XdHK/pZOzE+PvpdPHECe56OUjppevmL1ROvkm6fQ4i/Ev0sm3Sqf3nxj/Jp3cfzdUA+4A</EDGE> + <ELEMENT> + <T COMPRESSED="B64Z-LittleEndian" BITSIZE="64">eJx1z8EOgjAQhGFAQEALVVFQUHj/p/Tyz4FJ2suXmTSb3Sw7vhyLRD5hmegrrK1XPmNjc9S32Nk85QtebW7AHgebqxxRdzXW3/Bu+yg/EnupH/Fp+yq/bK7umHDGNwbLH+xN9QuuOFj+ou6M1v9ws3/KO+rOPw99A+wA</T> + </ELEMENT> + <COMPOSITE> + <C ID="0"> T[0-17] </C> + <C ID="1"> E[0,13,23] </C> + <C ID="2"> E[24,27,30] </C> + <C ID="3"> E[11,22,32] </C> + <C ID="4"> E[4,8,12] </C> + </COMPOSITE> + <DOMAIN> + <D ID="0"> C[0] </D> + </DOMAIN> + </GEOMETRY> + <EXPANSIONS> + <E COMPOSITE="C[0]" NUMMODES="7" FIELDS="u,v,p" TYPE="GLL_LAGRANGE" /> + </EXPANSIONS> + <CONDITIONS> + <SOLVERINFO> + <I PROPERTY="SolverType" VALUE="VelocityCorrectionScheme" /> + <I PROPERTY="EQTYPE" VALUE="UnsteadyNavierStokes" /> + <I PROPERTY="AdvectionForm" VALUE="Convective" /> + <I PROPERTY="Projection" VALUE="Galerkin" /> + <I PROPERTY="TimeIntegrationMethod" VALUE="IMEXOrder1" /> + </SOLVERINFO> + + <PARAMETERS> + <P> TimeStep = 0.001 </P> + <P> NumSteps = 1000 </P> + <P> IO_CheckSteps = 1000 </P> + <P> IO_InfoSteps = 1000 </P> + <P> Kinvis = 1 </P> + </PARAMETERS> + + <VARIABLES> + <V ID="0"> u </V> + <V ID="1"> v </V> + <V ID="2"> p </V> + </VARIABLES> + + <BOUNDARYREGIONS> + <B ID="0"> C[1,3] </B> + <B ID="1"> C[4] </B> + <B ID="2"> C[2] </B> + </BOUNDARYREGIONS> + + <BOUNDARYCONDITIONS> + <REGION REF="0"> + <D VAR="u" VALUE="0" /> + <D VAR="v" VALUE="0" /> + <N VAR="p" USERDEFINEDTYPE="H" VALUE="0" /> + </REGION> + <REGION REF="1"> + <D VAR="u" VALUE="y*(1-y)" /> + <D VAR="v" VALUE="0" /> + <N VAR="p" USERDEFINEDTYPE="H" VALUE="0" /> + </REGION> + <REGION REF="2"> + <N VAR="u" VALUE="0" /> + <N VAR="v" VALUE="0" /> + <D VAR="p" VALUE="0" /> + </REGION> + </BOUNDARYCONDITIONS> + + <FUNCTION NAME="InitialConditions"> + <E VAR="u" VALUE="0" /> + <E VAR="v" VALUE="0" /> + <E VAR="p" VALUE="0" /> + </FUNCTION> + + <FUNCTION NAME="ExactSolution"> + <E VAR="u" VALUE="y*(1-y)" /> + <E VAR="v" VALUE="0" /> + <E VAR="p" VALUE="-2*Kinvis*(x-1)" /> + </FUNCTION> + </CONDITIONS> + <Metadata> + <Provenance> + <Hostname>aegir.lan</Hostname> + <NektarVersion>5.7.0</NektarVersion> + <Timestamp>15-Nov-2024 19:13:25</Timestamp> + </Provenance> + <NekMeshCommandLine>square-tris.msh ChanFlow_Lagrange_Tri.xml </NekMeshCommandLine> + </Metadata> +</NEKTAR> -- GitLab