diff --git a/docs/user-guide/solvers/compressible-flow.tex b/docs/user-guide/solvers/compressible-flow.tex index a65009ac6bdc7984fb9444ae4ca3c15de0570f77..f48a542d3ad1ed0fb5a6631c01b1169037fb356c 100644 --- a/docs/user-guide/solvers/compressible-flow.tex +++ b/docs/user-guide/solvers/compressible-flow.tex @@ -437,6 +437,7 @@ Compressible flow is characterised by abrupt changes in density within the flow $$\label{eq:sensor} S_e=\frac{||\rho^p_e-\rho^{p-1}_e||_{L_2}}{||\rho_e^p||_{L_2}}$$ +by default the comparison is made with the $p-1$ solution, but this can be changed by setting the parameter \inltt{SensorOffset}. An artificial diffusion term is introduced locally to the Euler equations to deal with flow discontinuity and the consequential numerical oscillations. Two models are implemented, a non-smooth and a smooth artificial viscosity model. \subsubsection{Non-smooth artificial viscosity model} For the non-smooth artificial viscosity model the added artificial viscosity is constant in each element and discontinuous between the elements. The Euler system is augmented by an added laplacian term on right hand side of equation \ref{eq:euler}. The diffusivity of the system is controlled by a variable viscosity coefficient $\epsilon$. The value of $\epsilon$ is dependent on $\epsilon_0$, which is the maximum viscosity that is dependent on the polynomial order ($p$), the mesh size ($h$) and the maximum wave speed and the local sensor value. Based on pre-defined sensor threshold values, the variable viscosity is set accordingly @@ -512,4 +513,53 @@ The polynomial order in each element can be adjusted based on the sensor value t For now, the threshold values $s_e$, $s_{ds}$, $s_{sm}$ and $s_{fl}$ are determined empirically by looking at the sensor distribution in the domain. Once these values are set, two .txt files are outputted, one that has the composites called VariablePComposites.txt and one with the expansions called VariablePExpansions.txt. These values have to copied into a new .xml file to create the adapted mesh. +\subsection{Quasi-1D nozzle flow} +A quasi-1D inviscid flow (flow with area variation) can be obtained using the +\inltt{Quasi1D} forcing in a 1D solution of the Euler equations: +\begin{lstlisting}[style=XMLStyle] + + + Area + + +\end{lstlisting} +in this case a function named \inltt{Area} must be specified in the \inltt{CONDITIONS} section of the session file. + +In this case, it is possible to prescribe the inflow conditions in terms of stagnation properties (density and pressure) +by using the following boundary condition +\begin{lstlisting}[style=XmlStyle] + + + + + + + +\end{lstlisting} + +\subsection{Axi-symmetric flow} +An axi-symmetric inviscid flow (with symmetry axis on x=0) can be obtained using +the \inltt{AxiSymmetric} forcing in a 2D solution of the Euler equations: +\begin{lstlisting}[style=XMLStyle] + + + + +\end{lstlisting} +The \inltt{StagnationInflow} boundary condition can also be used in this case. + +Also, by defining the geometry with \inltt{} (i.e. a two-dimensional +mesh in three-dimensional space) and adding the \inltt{rhow} variable, we obtain an axi-symmetric +flow with swirl, in which case the \inltt{StagnationInflow} boundary condition allows prescribing \inltt{rhow}: +\begin{lstlisting}[style=XmlStyle] + + + + + + + + + +\end{lstlisting} diff --git a/library/Collections/IProductWRTDerivBase.cpp b/library/Collections/IProductWRTDerivBase.cpp index f96f6241a3e084df9f349aa05a0bf7252da8cfd3..768d917345050bbf310f159f36e3bbac6f924ce3 100644 --- a/library/Collections/IProductWRTDerivBase.cpp +++ b/library/Collections/IProductWRTDerivBase.cpp @@ -147,7 +147,7 @@ class IProductWRTDerivBase_StdMat : public Operator { LibUtilities::PointsKeyVector PtsKey = m_stdExp->GetPointsKeys(); m_dim = PtsKey.size(); - m_coordim = m_stdExp->GetCoordim(); + m_coordim = pCollExp[0]->GetCoordim(); int nqtot = m_stdExp->GetTotPoints(); int nmodes = m_stdExp->GetNcoeffs(); diff --git a/library/LibUtilities/LinearAlgebra/ExplicitInstantiation.h b/library/LibUtilities/LinearAlgebra/ExplicitInstantiation.h index 9e94540a2bdc2517fb6a206565430638baa4428a..5d72d5dacca3aa6f1cfcff30a4ca51aa8b6ba15b 100644 --- a/library/LibUtilities/LinearAlgebra/ExplicitInstantiation.h +++ b/library/LibUtilities/LinearAlgebra/ExplicitInstantiation.h @@ -66,7 +66,7 @@ BOOST_PP_COMMA_IF(BOOST_PP_LESS(n, BOOST_PP_SUB(BOOST_PP_ARRAY_SIZE(data), 1))) #define NEKTAR_CREATE_EXPLICIT_INTSTANTIATION(z, n, data) \ - template LIB_UTILITIES_EXPORT \ + template LIB_UTILITIES_EXPORT COCKCOCK \ BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ARRAY_ELEM(2, data)) BOOST_PP_ARRAY_ELEM(0, data) BOOST_PP_LPAREN() \ BOOST_PP_REPEAT(BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_ELEM(3, data)), NEKTAR_PRINT_ARRAY, BOOST_PP_ARRAY_ELEM(3, data)) \ BOOST_PP_COMMA_IF(BOOST_PP_GREATER(BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_ELEM(3, data)), 0)) \ diff --git a/library/LibUtilities/TimeIntegration/TimeIntegrationScheme.cpp b/library/LibUtilities/TimeIntegration/TimeIntegrationScheme.cpp index a9e285600f306f1ee5047203b0f7fa93e087c752..07bf22ca0d49912b7d2db5af735586d6c052642f 100644 --- a/library/LibUtilities/TimeIntegration/TimeIntegrationScheme.cpp +++ b/library/LibUtilities/TimeIntegration/TimeIntegrationScheme.cpp @@ -1111,6 +1111,12 @@ namespace Nektar TimeIntegrationSolutionSharedPtr y_out = MemoryManager::AllocateSharedPtr(m_schemeKey,y_0,time,timestep); + if( GetIntegrationSchemeType() == eExplicit) + { + // ensure initial solution is in correct space + op.DoProjection(y_0,y_out->UpdateSolution(),time); + } + // calculate the initial derivative, if is part of the // solution vector of the current scheme if(m_numMultiStepDerivs) @@ -1573,8 +1579,12 @@ namespace Nektar } else if( type == eExplicit) { - // ensure solution is in correct space - op.DoProjection(m_Y,m_Y,m_T); + // Avoid projecting the same solution twice + if( ! ((i==0) && m_firstStageEqualsOldSolution) ) + { + // ensure solution is in correct space + op.DoProjection(m_Y,m_Y,m_T); + } op.DoOdeRhs(m_Y, m_F[i], m_T); } } diff --git a/library/LocalRegions/Expansion1D.cpp b/library/LocalRegions/Expansion1D.cpp index 7b14d92d8a5ccb144b11554083b6ad5515f76c5e..34b5820f0606046a2301004c8d21238444cdd04f 100644 --- a/library/LocalRegions/Expansion1D.cpp +++ b/library/LocalRegions/Expansion1D.cpp @@ -41,7 +41,21 @@ namespace Nektar { namespace LocalRegions { - + void Expansion1D::v_NegateVertexNormal(const int vertex) + { + m_negatedNormals[vertex] = true; + for (int i = 0; i < GetCoordim(); ++i) + { + Vmath::Neg(m_vertexNormals[vertex][i].num_elements(), + m_vertexNormals[vertex][i], 1); + } + } + + bool Expansion1D::v_VertexNormalNegated(const int vertex) + { + return m_negatedNormals[vertex]; + } + DNekMatSharedPtr Expansion1D::v_GenMatrix(const StdRegions::StdMatrixKey &mkey) { DNekMatSharedPtr returnval; diff --git a/library/LocalRegions/Expansion1D.h b/library/LocalRegions/Expansion1D.h index f59fa515496b29e741f7e9e2f7998bb6669fccd3..c4c506bd823b51c511f36a507fd8d471588199ae 100644 --- a/library/LocalRegions/Expansion1D.h +++ b/library/LocalRegions/Expansion1D.h @@ -98,6 +98,8 @@ namespace Nektar inline SpatialDomains::Geometry1DSharedPtr GetGeom1D() const; protected: + std::map m_negatedNormals; + virtual DNekMatSharedPtr v_GenMatrix( const StdRegions::StdMatrixKey &mkey); @@ -110,6 +112,10 @@ namespace Nektar const int vert, const Array &primCoeffs, Array &coeffs); + + virtual void v_NegateVertexNormal (const int vertex); + + virtual bool v_VertexNormalNegated(const int vertex); private: Expansion2DWeakPtr m_elementLeft; diff --git a/library/MultiRegions/DisContField1D.cpp b/library/MultiRegions/DisContField1D.cpp index 26733863dca53d9077a322dec549982701562e10..84355701738eb79b9b8be31448688bb390c11754 100644 --- a/library/MultiRegions/DisContField1D.cpp +++ b/library/MultiRegions/DisContField1D.cpp @@ -190,6 +190,31 @@ namespace Nektar SetUpPhysNormals(); + // Set up information for parallel and periodic problems. + for (int i = 0; i < m_trace->GetExpSize(); ++i) + { + LocalRegions::Expansion0DSharedPtr traceEl = + m_trace->GetExp(i)->as(); + + int offset = m_trace->GetPhys_Offset(i); + int traceGeomId = traceEl->GetGeom0D()->GetGlobalID(); + PeriodicMap::iterator pIt = m_periodicVerts.find(traceGeomId); + + if (pIt != m_periodicVerts.end() && !pIt->second[0].isLocal) + { + if (traceGeomId != min(pIt->second[0].id, traceGeomId)) + { + traceEl->GetLeftAdjacentElementExp()->NegateVertexNormal( + traceEl->GetLeftAdjacentElementVertex()); + } + } + else if (m_traceMap->GetTraceToUniversalMapUnique(offset) < 0) + { + traceEl->GetLeftAdjacentElementExp()->NegateVertexNormal( + traceEl->GetLeftAdjacentElementVertex()); + } + } + int cnt, n, e; // Identify boundary verts @@ -807,6 +832,13 @@ namespace Nektar { m_negatedFluxNormal[2*i+v] = false; } + + if(vertExp->GetLeftAdjacentElementExp()-> + VertexNormalNegated(vertExp->GetLeftAdjacentElementVertex())) + { + m_negatedFluxNormal[2*i+v] = + (!m_negatedFluxNormal[2*i+v]); + } } } diff --git a/library/MultiRegions/ExpList.cpp b/library/MultiRegions/ExpList.cpp index 89544f4f24b89f4a0f3a122aae3ec672881de4f1..c96cf668f42f6b9ab3ac09deeed621171d003642 100644 --- a/library/MultiRegions/ExpList.cpp +++ b/library/MultiRegions/ExpList.cpp @@ -654,6 +654,24 @@ namespace Nektar } } + void ExpList::ExponentialFilter( + Array &array, + const NekDouble alpha, + const NekDouble exponent, + const NekDouble cutoff) + { + Array e_array; + + for(int i = 0; i < (*m_exp).size(); ++i) + { + (*m_exp)[i]->ExponentialFilter( + e_array = array+m_phys_offset[i], + alpha, + exponent, + cutoff); + } + } + /** * The coefficients of the function to be acted upon * should be contained in the \param inarray. The diff --git a/library/MultiRegions/ExpList.h b/library/MultiRegions/ExpList.h index c1b0bef10ff081c5670c4b029071dd627c515c93..95f6c7615a13ea68cf9a7b695206f7db6e0a778b 100644 --- a/library/MultiRegions/ExpList.h +++ b/library/MultiRegions/ExpList.h @@ -254,6 +254,12 @@ namespace Nektar Array &outarray, CoeffState coeffstate = eLocal); + MULTI_REGIONS_EXPORT void ExponentialFilter( + Array &array, + const NekDouble alpha, + const NekDouble exponent, + const NekDouble cutoff); + /// This function elementally mulplies the coefficient space of /// Sin my the elemental inverse of the mass matrix. MULTI_REGIONS_EXPORT void MultiplyByElmtInvMass ( diff --git a/library/SolverUtils/Diffusion/DiffusionLDG.cpp b/library/SolverUtils/Diffusion/DiffusionLDG.cpp index 981e16a4778dc8884296fc025f23c05bf9bb1e50..0b8b740d14f3591110f186786e2053815a61244e 100644 --- a/library/SolverUtils/Diffusion/DiffusionLDG.cpp +++ b/library/SolverUtils/Diffusion/DiffusionLDG.cpp @@ -139,8 +139,8 @@ namespace Nektar { Array muvar(nPts, 0.0); m_ArtificialDiffusionVector(inarray, muvar); - - int numConvFields = nConvectiveFields; + + int numConvFields = nConvectiveFields; if (m_shockCaptureType == "Smooth") { diff --git a/library/StdRegions/StdExpansion.cpp b/library/StdRegions/StdExpansion.cpp index 46f9ff1a8f55724009e57ef4dc482d79ddc98735..93805cc8e94f45f0ac098bbd53092745b351cfab 100644 --- a/library/StdRegions/StdExpansion.cpp +++ b/library/StdRegions/StdExpansion.cpp @@ -1583,6 +1583,15 @@ namespace Nektar ASSERTL0(false, "This function is not defined in StdExpansion."); } + void StdExpansion::v_ExponentialFilter( + Array &array, + const NekDouble alpha, + const NekDouble exponent, + const NekDouble cutoff) + { + ASSERTL0(false, "This function is not defined in StdExpansion."); + } + void StdExpansion::v_ReduceOrderCoeffs(int numMin, const Array &inarray, Array &outarray) @@ -1720,6 +1729,17 @@ namespace Nektar ASSERTL0(false, "Cannot compute vertex normal for this expansion."); } + void StdExpansion::v_NegateVertexNormal(const int vertex) + { + ASSERTL0(false, "Not implemented."); + } + + bool StdExpansion::v_VertexNormalNegated(const int vertex) + { + ASSERTL0(false, "Not implemented."); + return false; + } + const NormalVector & StdExpansion::v_GetFaceNormal(const int face) const { ASSERTL0(false, "Cannot get face normals for this expansion."); diff --git a/library/StdRegions/StdExpansion.h b/library/StdRegions/StdExpansion.h index 3d2fb1bf6ae87ec94b8821af27f529700e75de9a..51f4d9008ca1da2538a57b0e020c81db83982bc2 100644 --- a/library/StdRegions/StdExpansion.h +++ b/library/StdRegions/StdExpansion.h @@ -1000,6 +1000,14 @@ namespace Nektar v_SVVLaplacianFilter(array,mkey); } + void ExponentialFilter( Array &array, + const NekDouble alpha, + const NekDouble exponent, + const NekDouble cutoff) + { + v_ExponentialFilter(array, alpha, exponent, cutoff); + } + void LaplacianMatrixOp(const int k1, const int k2, const Array &inarray, Array &outarray, @@ -1305,6 +1313,16 @@ namespace Nektar v_ComputeVertexNormal(vertex); } + void NegateVertexNormal(const int vertex) + { + v_NegateVertexNormal(vertex); + } + + bool VertexNormalNegated(const int vertex) + { + return v_VertexNormalNegated(vertex); + } + const NormalVector & GetFaceNormal(const int face) const { return v_GetFaceNormal(face); @@ -1793,6 +1811,12 @@ namespace Nektar STD_REGIONS_EXPORT virtual void v_SVVLaplacianFilter(Array &array, const StdMatrixKey &mkey); + STD_REGIONS_EXPORT virtual void v_ExponentialFilter( + Array &array, + const NekDouble alpha, + const NekDouble exponent, + const NekDouble cutoff); + STD_REGIONS_EXPORT virtual void v_ReduceOrderCoeffs( int numMin, const Array &inarray, @@ -1857,6 +1881,10 @@ namespace Nektar STD_REGIONS_EXPORT virtual void v_ComputeVertexNormal(const int vertex); + STD_REGIONS_EXPORT virtual void v_NegateVertexNormal(const int vertex); + + STD_REGIONS_EXPORT virtual bool v_VertexNormalNegated(const int vertex); + STD_REGIONS_EXPORT virtual const NormalVector & v_GetFaceNormal(const int face) const; STD_REGIONS_EXPORT virtual const NormalVector & v_GetSurfaceNormal(const int id) const; diff --git a/library/StdRegions/StdExpansion0D.cpp b/library/StdRegions/StdExpansion0D.cpp index 955d2d83fc094974377f0421bb532b3d1f369cad..d0d099b6e656889377ca07e7070c174e75b3e9b0 100644 --- a/library/StdRegions/StdExpansion0D.cpp +++ b/library/StdRegions/StdExpansion0D.cpp @@ -69,7 +69,7 @@ namespace Nektar { int nquad = GetTotPoints(); DNekMatSharedPtr D = m_base[0]->GetD(); - + if( inarray.data() == outarray.data()) { Array wsp(nquad); diff --git a/library/StdRegions/StdHexExp.cpp b/library/StdRegions/StdHexExp.cpp index 7549c8f28d237bcc7c7c5cc9ab9ab256c28ae95e..8a70253651c3ffb8c2984288414649e6208e6e03 100644 --- a/library/StdRegions/StdHexExp.cpp +++ b/library/StdRegions/StdHexExp.cpp @@ -1019,6 +1019,8 @@ namespace Nektar nummodesA = nummodes1; nummodesB = nummodes2; break; + default: + ASSERTL0(false,"fid must be between 0 and 5"); } bool CheckForZeroedModes = false; diff --git a/library/StdRegions/StdPointExp.cpp b/library/StdRegions/StdPointExp.cpp index 1f7c10bf9fe9b213767e94ec80f811b1eb47d4e2..6f9143c50ca4267e58c73a6e49b8b7c1209ffb15 100644 --- a/library/StdRegions/StdPointExp.cpp +++ b/library/StdRegions/StdPointExp.cpp @@ -97,7 +97,8 @@ namespace Nektar } else { - Blas::Dgemv('N',nquad,m_base[0]->GetNumModes(),1.0, (m_base[0]->GetBdata()).get(), + Blas::Dgemv('N',nquad,m_base[0]->GetNumModes(),1.0, + (m_base[0]->GetBdata()).get(), nquad,&inarray[0],1,0.0,&outarray[0],1); } } diff --git a/library/StdRegions/StdPrismExp.cpp b/library/StdRegions/StdPrismExp.cpp index ad8182e05b1738ff6826d22c2d70fb1c3642a41a..b62948eb229d2caae55273a5fcb93af75d01ee59 100644 --- a/library/StdRegions/StdPrismExp.cpp +++ b/library/StdRegions/StdPrismExp.cpp @@ -1074,6 +1074,8 @@ namespace Nektar nummodesA = m_base[1]->GetNumModes(); nummodesB = m_base[2]->GetNumModes(); break; + default: + ASSERTL0(false,"fid must be between 0 and 4"); } bool CheckForZeroedModes = false; diff --git a/library/StdRegions/StdPyrExp.cpp b/library/StdRegions/StdPyrExp.cpp index 3830aa967cb364e2cf8b5ccab8365ac3f80b24d2..c88aabf977868731171eb4f9a1faf3a9fd5ebc13 100644 --- a/library/StdRegions/StdPyrExp.cpp +++ b/library/StdRegions/StdPyrExp.cpp @@ -1047,6 +1047,8 @@ namespace Nektar nummodesA = order1; nummodesB = order2; break; + default: + ASSERTL0(false,"fid must be between 0 and 4"); } bool CheckForZeroedModes = false; diff --git a/library/StdRegions/StdQuadExp.cpp b/library/StdRegions/StdQuadExp.cpp index 6b9a1a58c64f5f90b34cf719eaa8841bfe081913..d4c7d55db18d36bbbbb7f40c87ef654785fc12ac 100644 --- a/library/StdRegions/StdQuadExp.cpp +++ b/library/StdRegions/StdQuadExp.cpp @@ -1177,6 +1177,9 @@ namespace Nektar case 1: case 3: numModes = order1; + break; + default: + ASSERTL0(false,"eid must be between 0 and 3"); } bool checkForZeroedModes = false; @@ -1632,6 +1635,58 @@ namespace Nektar } } + void StdQuadExp::v_ExponentialFilter( + Array &array, + const NekDouble alpha, + const NekDouble exponent, + const NekDouble cutoff) + { + // Generate an orthogonal expansion + int qa = m_base[0]->GetNumPoints(); + int qb = m_base[1]->GetNumPoints(); + int nmodesA = m_base[0]->GetNumModes(); + int nmodesB = m_base[1]->GetNumModes(); + int P = nmodesA - 1; + int Q = nmodesB - 1; + + // Declare orthogonal basis. + LibUtilities::PointsKey pa(qa,m_base[0]->GetPointsType()); + LibUtilities::PointsKey pb(qb,m_base[1]->GetPointsType()); + + LibUtilities::BasisKey Ba(LibUtilities::eOrtho_A, nmodesA, pa); + LibUtilities::BasisKey Bb(LibUtilities::eOrtho_A, nmodesB, pb); + StdQuadExp OrthoExp(Ba,Bb); + + // Cutoff + int Pcut = cutoff*P; + int Qcut = cutoff*Q; + + // Project onto orthogonal space. + Array orthocoeffs(OrthoExp.GetNcoeffs()); + OrthoExp.FwdTrans(array,orthocoeffs); + + // + NekDouble fac, fac1, fac2; + for(int i = 0; i < nmodesA; ++i) + { + for(int j = 0; j < nmodesB; ++j) + { + //to filter out only the "high-modes" + if(i > Pcut || j > Qcut) + { + fac1 = (NekDouble) (i - Pcut)/( (NekDouble)(P - Pcut) ); + fac2 = (NekDouble) (j - Qcut)/( (NekDouble)(Q - Qcut) ); + fac = max(fac1, fac2); + fac = pow(fac, exponent); + orthocoeffs[i*nmodesB+j] *= exp(-alpha*fac); + } + } + } + + // backward transform to physical space + OrthoExp.BwdTrans(orthocoeffs,array); + } + void StdQuadExp::v_ReduceOrderCoeffs( int numMin, const Array &inarray, diff --git a/library/StdRegions/StdQuadExp.h b/library/StdRegions/StdQuadExp.h index 3bece3095a51d4c7a2922c28beaef5fe13a8de9f..54a04407cfa9f22a9317fa132b8f649a169dc526 100644 --- a/library/StdRegions/StdQuadExp.h +++ b/library/StdRegions/StdQuadExp.h @@ -240,6 +240,11 @@ namespace Nektar STD_REGIONS_EXPORT virtual void v_SVVLaplacianFilter( Array &array, const StdMatrixKey &mkey); + STD_REGIONS_EXPORT virtual void v_ExponentialFilter( + Array &array, + const NekDouble alpha, + const NekDouble exponent, + const NekDouble cutoff); STD_REGIONS_EXPORT virtual void v_ReduceOrderCoeffs( int numMin, const Array &inarray, diff --git a/library/StdRegions/StdSegExp.cpp b/library/StdRegions/StdSegExp.cpp index f3183ffd2d68190a3e3b743fcf5f71ca622e6257..0a17f449a873dd5c33644757c3773a552b193940 100644 --- a/library/StdRegions/StdSegExp.cpp +++ b/library/StdRegions/StdSegExp.cpp @@ -228,19 +228,9 @@ namespace Nektar else { -#ifdef NEKTAR_USING_DIRECT_BLAS_CALLS - - Blas::Dgemv('N',nquad,m_base[0]->GetNumModes(),1.0, (m_base[0]->GetBdata()).get(), - nquad,&inarray[0],1,0.0,&outarray[0],1); - -#else //NEKTAR_USING_DIRECT_BLAS_CALLS - - NekVector in(m_ncoeffs,inarray,eWrapper); - NekVector out(nquad,outarray,eWrapper); - NekMatrix B(nquad,m_ncoeffs,m_base[0]->GetBdata(),eWrapper); - out = B * in; - -#endif //NEKTAR_USING_DIRECT_BLAS_CALLS + Blas::Dgemv('N',nquad,m_base[0]->GetNumModes(),1.0, + (m_base[0]->GetBdata()).get(), + nquad,&inarray[0],1,0.0,&outarray[0],1); } } @@ -574,6 +564,87 @@ namespace Nektar Blas::Daxpy(m_ncoeffs, mkey.GetConstFactor(eFactorLambda), wsp.get(), 1, outarray.get(), 1); } + void StdSegExp::v_SVVLaplacianFilter(Array &array, + const StdMatrixKey &mkey) + { + // Generate an orthogonal expansion + int nq = m_base[0]->GetNumPoints(); + int nmodes = m_base[0]->GetNumModes(); + // Declare orthogonal basis. + LibUtilities::PointsKey pKey(nq,m_base[0]->GetPointsType()); + + LibUtilities::BasisKey B(LibUtilities::eOrtho_A, nmodes, pKey); + StdSegExp OrthoExp(B); + + //SVV parameters loaded from the .xml case file + NekDouble SvvDiffCoeff = mkey.GetConstFactor(eFactorSVVDiffCoeff); + int cutoff = (int) (mkey.GetConstFactor(eFactorSVVCutoffRatio))*nmodes; + + Array orthocoeffs(OrthoExp.GetNcoeffs()); + + // project onto modal space. + OrthoExp.FwdTrans(array,orthocoeffs); + + // + for(int j = 0; j < nmodes; ++j) + { + if(j >= cutoff)//to filter out only the "high-modes" + { + orthocoeffs[j] *= + (SvvDiffCoeff*exp(-(j-nmodes)*(j-nmodes)/ + ((NekDouble)((j-cutoff+1)* + (j-cutoff+1))))); + } + else + { + orthocoeffs[j] *= 0.0; + } + } + + // backward transform to physical space + OrthoExp.BwdTrans(orthocoeffs,array); + } + + void StdSegExp::v_ExponentialFilter( + Array &array, + const NekDouble alpha, + const NekDouble exponent, + const NekDouble cutoff) + { + // Generate an orthogonal expansion + int nq = m_base[0]->GetNumPoints(); + int nmodes = m_base[0]->GetNumModes(); + int P = nmodes - 1; + // Declare orthogonal basis. + LibUtilities::PointsKey pKey(nq,m_base[0]->GetPointsType()); + + LibUtilities::BasisKey B(LibUtilities::eOrtho_A, nmodes, pKey); + StdSegExp OrthoExp(B); + + // Cutoff + int Pcut = cutoff*P; + + // Project onto orthogonal space. + Array orthocoeffs(OrthoExp.GetNcoeffs()); + OrthoExp.FwdTrans(array,orthocoeffs); + + // + NekDouble fac; + for(int j = 0; j < nmodes; ++j) + { + //to filter out only the "high-modes" + if(j > Pcut) + { + fac = (NekDouble) (j - Pcut) / ( (NekDouble) (P - Pcut) ); + fac = pow(fac, exponent); + orthocoeffs[j] *= exp(-alpha*fac); + } + } + + // backward transform to physical space + OrthoExp.BwdTrans(orthocoeffs,array); + } + //up to here void StdSegExp::v_MultiplyByStdQuadratureMetric( const Array &inarray, diff --git a/library/StdRegions/StdSegExp.h b/library/StdRegions/StdSegExp.h index b37e46529a62383c11ea71ee673329a6c7bf85b0..812bf0a7b5dd0635514b0f8b3b57424bc8c9447e 100644 --- a/library/StdRegions/StdSegExp.h +++ b/library/StdRegions/StdSegExp.h @@ -164,6 +164,16 @@ namespace Nektar Array &outarray, const StdMatrixKey &mkey); + STD_REGIONS_EXPORT virtual void v_SVVLaplacianFilter( + Array &array, + const StdMatrixKey &mkey); + + STD_REGIONS_EXPORT virtual void v_ExponentialFilter( + Array &array, + const NekDouble alpha, + const NekDouble exponent, + const NekDouble cutoff); + STD_REGIONS_EXPORT virtual void v_MultiplyByStdQuadratureMetric( const Array &inarray, Array &outarray); diff --git a/library/StdRegions/StdTetExp.cpp b/library/StdRegions/StdTetExp.cpp index 94d1e2c0ede808b81f746b9f8a9feec511e28c78..36d96223b115e71a25db403c246fb4dd24f6b68d 100644 --- a/library/StdRegions/StdTetExp.cpp +++ b/library/StdRegions/StdTetExp.cpp @@ -1269,6 +1269,8 @@ namespace Nektar nummodesA = m_base[1]->GetNumModes(); nummodesB = m_base[2]->GetNumModes(); break; + default: + ASSERTL0(false,"fid must be between 0 and 3"); } bool CheckForZeroedModes = false; diff --git a/library/StdRegions/StdTriExp.cpp b/library/StdRegions/StdTriExp.cpp index f285906ca309d194b9a2afaea83b6663f7a9ad1b..67c33a0f5a280305d555c644ea6f69cc2ed3de7e 100644 --- a/library/StdRegions/StdTriExp.cpp +++ b/library/StdRegions/StdTriExp.cpp @@ -928,6 +928,8 @@ namespace Nektar case 2: numModes = order1; break; + default: + ASSERTL0(false,"eid must be between 0 and 2"); } bool checkForZeroedModes = false; diff --git a/library/UnitTests/Collections/TestSegCollection.cpp b/library/UnitTests/Collections/TestSegCollection.cpp index 1c650318aacfb8b643e787bf8383533775f159b7..477f50740212cf4698b3ae791cf033291afda08a 100644 --- a/library/UnitTests/Collections/TestSegCollection.cpp +++ b/library/UnitTests/Collections/TestSegCollection.cpp @@ -50,15 +50,15 @@ namespace Nektar SpatialDomains::PointGeomSharedPtr v1) { SpatialDomains::PointGeomSharedPtr vertices[] = {v0, v1}; - SpatialDomains::SegGeomSharedPtr result(new SpatialDomains::SegGeom(id, 2, vertices)); + SpatialDomains::SegGeomSharedPtr result(new SpatialDomains::SegGeom(id, 1, vertices)); return result; } BOOST_AUTO_TEST_CASE(TestSegBwdTrans_StdMat_UniformP) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.0, -1.0, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -97,8 +97,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegBwdTrans_StdMat_UniformP_MultiElmt) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.0, -1.0, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -144,8 +144,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegBwdTrans_IterPerExp_UniformP) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.0, -1.0, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -184,8 +184,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegBwdTrans_SumFac_UniformP) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.0, -1.0, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -231,8 +231,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegBwdTrans_SumFac_UniformP_MultiElmt) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.0, -1.0, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -279,8 +279,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegIProductWRTBase_IterPerExp_UniformP_MultiElmt) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.5, -1.5, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -337,8 +337,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegIProductWRTBase_StdMat_UniformP_MultiElmt) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.5, -1.5, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -395,8 +395,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegIProductWRTBase_SumFac_UniformP_MultiElmt) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.5, -1.5, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -454,8 +454,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_IterPerExp_UniformP) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.5, -1.5, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -502,8 +502,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_IterPerExp_UniformP_MultiElmt) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.5, -1.5, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -563,8 +563,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_StdMat_UniformP) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.5, -1.5, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -611,8 +611,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_StdMat_UniformP_MultiElmt) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.5, -1.5, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -671,8 +671,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegPhysDeriv_SumFac_UniformP_MultiElmt) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.5, -1.5, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.5, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -732,8 +732,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_IterPerExp_UniformP) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.0, -1.0, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -787,8 +787,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_IterPerExp_UniformP_MultiElmt) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.0, -1.0, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -851,8 +851,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_StdMat_UniformP) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.0, -1.0, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -906,8 +906,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_StdMat_UniformP_MultiElmt) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.0, -1.0, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -970,8 +970,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_SumFac_UniformP) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.0, -1.0, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); @@ -1024,8 +1024,8 @@ namespace Nektar BOOST_AUTO_TEST_CASE(TestSegIProductWRTDerivBase_SumFac_UniformP_MultiElmt) { - SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(2u, 0u, -1.0, -1.0, 0.0)); - SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(2u, 1u, 1.0, -1.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v0(new SpatialDomains::PointGeom(1u, 0u, -1.0, 0.0, 0.0)); + SpatialDomains::PointGeomSharedPtr v1(new SpatialDomains::PointGeom(1u, 1u, 1.0, 0.0, 0.0)); SpatialDomains::SegGeomSharedPtr segGeom = CreateSegGeom(0, v0, v1); diff --git a/solvers/ADRSolver/Tests/Advection_m12_Order2.tst b/solvers/ADRSolver/Tests/Advection_m12_Order2.tst index 4affb40f47f816076d44eefb272eea883a1e829a..be8228270bd96053388264e35ee0cb74e3ad6ad7 100644 --- a/solvers/ADRSolver/Tests/Advection_m12_Order2.tst +++ b/solvers/ADRSolver/Tests/Advection_m12_Order2.tst @@ -11,7 +11,7 @@ 9.55749e-05 - 9.27095e-05 + 9.27096e-05 diff --git a/solvers/CompressibleFlowSolver/ArtificialDiffusion/ArtificialDiffusion.cpp b/solvers/CompressibleFlowSolver/ArtificialDiffusion/ArtificialDiffusion.cpp index fe3d5b6034612f57ac0a61dffe0741cafa6f86a0..4f2a7eb80d3494d0d6e4e059041ea348da2c4a9c 100644 --- a/solvers/CompressibleFlowSolver/ArtificialDiffusion/ArtificialDiffusion.cpp +++ b/solvers/CompressibleFlowSolver/ArtificialDiffusion/ArtificialDiffusion.cpp @@ -51,17 +51,8 @@ ArtificialDiffusion::ArtificialDiffusion( const Array& pFields, const int spacedim) : m_session(pSession), - m_fields(pFields) + m_fields(pFields) { - m_session->LoadParameter ("FL", m_FacL, 0.0); - m_session->LoadParameter ("FH", m_FacH, 0.0); - m_session->LoadParameter ("hFactor", m_hFactor, 1.0); - m_session->LoadParameter ("C1", m_C1, 3.0); - m_session->LoadParameter ("C2", m_C2, 5.0); - m_session->LoadParameter ("mu0", m_mu0, 1.0); - m_session->LoadParameter ("Skappa", m_Skappa, -2.048); - m_session->LoadParameter ("Kappa", m_Kappa, 0.0); - // Create auxiliary object to convert variables m_varConv = MemoryManager::AllocateSharedPtr( m_session, spacedim); diff --git a/solvers/CompressibleFlowSolver/ArtificialDiffusion/ArtificialDiffusion.h b/solvers/CompressibleFlowSolver/ArtificialDiffusion/ArtificialDiffusion.h index 902d11aa1ed5326ec631b6826b96ecb7aa040fa4..0cabf5bc1ff69a42bada038714776039c282e019 100644 --- a/solvers/CompressibleFlowSolver/ArtificialDiffusion/ArtificialDiffusion.h +++ b/solvers/CompressibleFlowSolver/ArtificialDiffusion/ArtificialDiffusion.h @@ -91,18 +91,9 @@ class ArtificialDiffusion /// LDG Diffusion operator SolverUtils::DiffusionSharedPtr m_diffusion; - /// Parameters - NekDouble m_FacL; - NekDouble m_FacH; - NekDouble m_hFactor; - NekDouble m_C1; - NekDouble m_C2; - NekDouble m_mu0; - NekDouble m_Skappa; - NekDouble m_Kappa; - /// Constructor - ArtificialDiffusion(const LibUtilities::SessionReaderSharedPtr& pSession, + ArtificialDiffusion( + const LibUtilities::SessionReaderSharedPtr& pSession, const Array& pFields, const int spacedim); diff --git a/solvers/CompressibleFlowSolver/ArtificialDiffusion/NonSmoothShockCapture.cpp b/solvers/CompressibleFlowSolver/ArtificialDiffusion/NonSmoothShockCapture.cpp index 670d88349f5ac619f162366d494bbb2ff3d56d1f..c352e34ce9faa71333e5706b75e23d81ef38c324 100644 --- a/solvers/CompressibleFlowSolver/ArtificialDiffusion/NonSmoothShockCapture.cpp +++ b/solvers/CompressibleFlowSolver/ArtificialDiffusion/NonSmoothShockCapture.cpp @@ -42,8 +42,8 @@ namespace Nektar std::string NonSmoothShockCapture::className = GetArtificialDiffusionFactory(). RegisterCreatorFunction("NonSmooth", - NonSmoothShockCapture::create, - "NonSmooth artificial diffusion for shock capture."); + NonSmoothShockCapture::create, + "NonSmooth artificial diffusion for shock capture."); NonSmoothShockCapture::NonSmoothShockCapture( const LibUtilities::SessionReaderSharedPtr& pSession, @@ -51,58 +51,17 @@ NonSmoothShockCapture::NonSmoothShockCapture( const int spacedim) : ArtificialDiffusion(pSession, pFields, spacedim) { + m_session->LoadParameter ("SensorOffset", m_offset, 1); } void NonSmoothShockCapture::v_GetArtificialViscosity( const Array > &physfield, Array &mu) { - const int nElements = m_fields[0]->GetExpSize(); - int PointCount = 0; - int nTotQuadPoints = m_fields[0]->GetTotPoints(); + int nTotPoints = m_fields[0]->GetTotPoints(); - Array Sensor (nTotQuadPoints, 0.0); - Array SensorKappa(nTotQuadPoints, 0.0); - - m_varConv->GetSensor(m_fields[0], physfield, Sensor, SensorKappa); - - for (int e = 0; e < nElements; e++) - { - // Threshold value specified in C. Biottos thesis. Based on a 1D - // shock tube problem S_k = log10(1/p^4). See G.E. Barter and - // D.L. Darmofal. Shock Capturing with PDE-based artificial - // diffusion for DGFEM: Part 1 Formulation, Journal of Computational - // Physics 229 (2010) 1810-1827 for further reference - - // Adjustable depending on the coarsness of the mesh. Might want to - // move this variable into the session file - - int nQuadPointsElement = m_fields[0]->GetExp(e)->GetTotPoints(); - - for (int n = 0; n < nQuadPointsElement; n++) - { - NekDouble mu_0 = m_mu0; - - if (Sensor[n+PointCount] < (m_Skappa-m_Kappa)) - { - mu[n+PointCount] = 0; - } - else if (Sensor[n+PointCount] >= (m_Skappa-m_Kappa) - && Sensor[n+PointCount] <= (m_Skappa+m_Kappa)) - { - mu[n+PointCount] = mu_0 * (0.5 * (1 + sin( - M_PI * (Sensor[n+PointCount] - - m_Skappa - m_Kappa) / - (2*m_Kappa)))); - } - else if (Sensor[n+PointCount] > (m_Skappa+m_Kappa)) - { - mu[n+PointCount] = mu_0; - } - } - - PointCount += nQuadPointsElement; - } + Array Sensor (nTotPoints, 0.0); + m_varConv->GetSensor(m_fields[0], physfield, Sensor, mu, m_offset); } } diff --git a/solvers/CompressibleFlowSolver/ArtificialDiffusion/NonSmoothShockCapture.h b/solvers/CompressibleFlowSolver/ArtificialDiffusion/NonSmoothShockCapture.h index c776c5199721e7b8c8a74d2c33324fa67c0838d9..ceb8a5c44458ca0d98df68d294c822ca556f5167 100644 --- a/solvers/CompressibleFlowSolver/ArtificialDiffusion/NonSmoothShockCapture.h +++ b/solvers/CompressibleFlowSolver/ArtificialDiffusion/NonSmoothShockCapture.h @@ -74,11 +74,15 @@ class NonSmoothShockCapture : public ArtificialDiffusion Array &mu); private: - NonSmoothShockCapture(const LibUtilities::SessionReaderSharedPtr& pSession, + NonSmoothShockCapture( + const LibUtilities::SessionReaderSharedPtr& pSession, const Array& pFields, const int spacedim); virtual ~NonSmoothShockCapture(void){}; + + /// Parameters + int m_offset; }; } diff --git a/solvers/CompressibleFlowSolver/ArtificialDiffusion/SmoothShockCapture.cpp b/solvers/CompressibleFlowSolver/ArtificialDiffusion/SmoothShockCapture.cpp index 6d765ab7b92450e965cc60dace543382af666d0e..88f55717de9dd855f3c17ae2ce38e947ae09e4c4 100644 --- a/solvers/CompressibleFlowSolver/ArtificialDiffusion/SmoothShockCapture.cpp +++ b/solvers/CompressibleFlowSolver/ArtificialDiffusion/SmoothShockCapture.cpp @@ -45,7 +45,8 @@ std::string SmoothShockCapture::className = GetArtificialDiffusionFactory(). SmoothShockCapture::create, "Smooth artificial diffusion for shock capture."); -SmoothShockCapture::SmoothShockCapture(const LibUtilities::SessionReaderSharedPtr& pSession, +SmoothShockCapture::SmoothShockCapture( + const LibUtilities::SessionReaderSharedPtr& pSession, const Array& pFields, const int spacedim) : ArtificialDiffusion(pSession, pFields, spacedim) @@ -53,6 +54,14 @@ SmoothShockCapture::SmoothShockCapture(const LibUtilities::SessionReaderSharedPt ASSERTL0(m_fields.num_elements() == spacedim + 3, "Not enough variables for smooth shock capturing; " "make sure you have added eps to variable list."); + + m_session->LoadParameter ("FL", m_FacL, 0.0); + m_session->LoadParameter ("FH", m_FacH, 0.0); + m_session->LoadParameter ("hFactor", m_hFactor, 1.0); + m_session->LoadParameter ("C1", m_C1, 3.0); + m_session->LoadParameter ("C2", m_C2, 5.0); + m_session->LoadParameter ("mu0", m_mu0, 1.0); + m_session->LoadParameter ("SensorOffset", m_offset, 1); } void SmoothShockCapture::v_DoArtificialDiffusion( @@ -127,19 +136,9 @@ void SmoothShockCapture::v_GetArtificialViscosity( Array &mu) { int nvariables = physfield.num_elements(); - int nPts = m_fields[0]->GetTotPoints(); - - Array sensor (nPts, 0.0); - Array SensorKappa(nPts, 0.0); - - // Calculate sensor - m_varConv->GetSensor(m_fields[0], physfield, sensor, SensorKappa); - NekDouble ThetaH = m_FacH; - NekDouble ThetaL = m_FacL; - - NekDouble Phi0 = (ThetaH+ThetaL)/2; - NekDouble DeltaPhi = ThetaH-Phi0; + NekDouble Phi0 = (m_FacH+m_FacL)/2; + NekDouble DeltaPhi = m_FacH-Phi0; for (int e = 0; e < mu.num_elements(); e++) { @@ -170,19 +169,19 @@ void SmoothShockCapture::GetForcingTerm( Array Sensor(nPts, 0.0); Array SensorKappa(nPts, 0.0); Array Lambda(nPts, 0.0); - Array Tau(nPts, 1.0); Array soundspeed(nPts, 0.0); Array pressure(nPts, 0.0); Array absVelocity(nPts, 0.0); + NekDouble tau, pOrder; + Array pOrderElmt = m_fields[0]->EvalBasisNumModesMaxPerExp(); - Array pOrder (nPts, 0.0); // Thermodynamic related quantities m_varConv->GetPressure(inarray, pressure); m_varConv->GetSoundSpeed(inarray, pressure, soundspeed); m_varConv->GetAbsoluteVelocity(inarray, absVelocity); - m_varConv->GetSensor(m_fields[0], inarray, Sensor, SensorKappa); + m_varConv->GetSensor(m_fields[0], inarray, Sensor, SensorKappa, m_offset); // Determine the maximum wavespeed Vmath::Vadd(nPts, absVelocity, 1, soundspeed, 1, Lambda, 1); @@ -197,15 +196,14 @@ void SmoothShockCapture::GetForcingTerm( for (int n = 0; n < nQuadPointsElement; n++) { - pOrder[n + PointCount] = pOrderElmt[e]; + pOrder = pOrderElmt[e]; // order 1.0e-06 - Tau[n + PointCount] = - 1.0 / (m_C1*pOrder[n + PointCount]*LambdaMax); + tau = 1.0 / (m_C1*pOrder*LambdaMax); outarrayForcing[nvariables-1][n + PointCount] = - 1 / Tau[n + PointCount] * (m_hFactor * LambdaMax / - pOrder[n + PointCount] * + 1 / tau * (m_hFactor * LambdaMax / + pOrder * SensorKappa[n + PointCount] - inarray[nvariables-1][n + PointCount]); } diff --git a/solvers/CompressibleFlowSolver/ArtificialDiffusion/SmoothShockCapture.h b/solvers/CompressibleFlowSolver/ArtificialDiffusion/SmoothShockCapture.h index a410888f56faa266a1115e0113d89a9102c4e980..bfa1890b37fb462b5062b284ea50eca4f2c34a49 100644 --- a/solvers/CompressibleFlowSolver/ArtificialDiffusion/SmoothShockCapture.h +++ b/solvers/CompressibleFlowSolver/ArtificialDiffusion/SmoothShockCapture.h @@ -86,6 +86,15 @@ class SmoothShockCapture : public ArtificialDiffusion void GetForcingTerm( const Array > &inarray, Array > outarrayForcing); + + /// Parameters + NekDouble m_FacL; + NekDouble m_FacH; + NekDouble m_hFactor; + NekDouble m_C1; + NekDouble m_C2; + NekDouble m_mu0; + int m_offset; }; } diff --git a/solvers/CompressibleFlowSolver/BoundaryConditions/StagnationInflowBC.cpp b/solvers/CompressibleFlowSolver/BoundaryConditions/StagnationInflowBC.cpp new file mode 100644 index 0000000000000000000000000000000000000000..92c4aa658fb48a33e1ddf7fb6d931719d11e11d6 --- /dev/null +++ b/solvers/CompressibleFlowSolver/BoundaryConditions/StagnationInflowBC.cpp @@ -0,0 +1,173 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File: StagnationInflowBC.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). +// +// License for the specific language governing rights and limitations under +// 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: Stagnation conditions inflow boundary condition +// +/////////////////////////////////////////////////////////////////////////////// + +#include "StagnationInflowBC.h" + +using namespace std; + +namespace Nektar +{ + +std::string StagnationInflowBC::className = GetCFSBndCondFactory(). + RegisterCreatorFunction("StagnationInflow", + StagnationInflowBC::create, + "Stagnation conditions inflow boundary condition."); + +StagnationInflowBC::StagnationInflowBC(const LibUtilities::SessionReaderSharedPtr& pSession, + const Array& pFields, + const Array >& pTraceNormals, + const int pSpaceDim, + const int bcRegion, + const int cnt) + : CFSBndCond(pSession, pFields, pTraceNormals, pSpaceDim, bcRegion, cnt) +{ + int nvariables = m_fields.num_elements(); + int expdim = pFields[0]->GetGraph()->GetMeshDimension(); + int spacedim = pFields[0]->GetGraph()->GetSpaceDimension(); + m_swirl = ((spacedim == 3) && (expdim == 2)); + // Loop over Boundary Regions for StagnationInflowBC + m_fieldStorage = Array > (nvariables); + + int numBCPts = m_fields[0]-> + GetBndCondExpansions()[m_bcRegion]->GetNpoints(); + for (int i = 0; i < nvariables; ++i) + { + m_fieldStorage[i] = Array(numBCPts, 0.0); + Vmath::Vcopy( + numBCPts, + m_fields[i]->GetBndCondExpansions()[m_bcRegion]->GetPhys(), 1, + m_fieldStorage[i], 1); + } +} + +void StagnationInflowBC::v_Apply( + Array > &Fwd, + Array > &physarray, + const NekDouble &time) +{ + int i, j; + int nTracePts = m_fields[0]->GetTrace()->GetNpoints(); + int numBCPts = m_fields[0]-> + GetBndCondExpansions()[m_bcRegion]->GetNpoints(); + int nVariables = physarray.num_elements(); + + const Array &traceBndMap + = m_fields[0]->GetTraceBndMap(); + + NekDouble gammaInv = 1.0 / m_gamma; + NekDouble gammaMinusOne = m_gamma - 1.0; + NekDouble gammaMinusOneInv = 1.0 / gammaMinusOne; + + // Get stagnation pressure (with zero swirl) + Array pStag (numBCPts); + if (m_swirl) + { + Array tmp (numBCPts); + Vmath::Vcopy(numBCPts, m_fieldStorage[3], 1, tmp, 1); + Vmath::Zero(numBCPts, m_fieldStorage[3], 1); + m_varConv->GetPressure(m_fieldStorage, pStag); + Vmath::Vcopy(numBCPts, tmp, 1, m_fieldStorage[3], 1); + } + else + { + m_varConv->GetPressure(m_fieldStorage, pStag); + } + + // Get Mach from Fwd + Array pressure (nTracePts); + Array soundSpeed(nTracePts); + Array Mach (nTracePts); + m_varConv->GetPressure(Fwd, pressure); + m_varConv->GetSoundSpeed(Fwd, pressure, soundSpeed); + m_varConv->GetMach(Fwd, soundSpeed, Mach); + + // Auxiliary variables + int e, id1, id2, npts, pnt; + NekDouble rho, p; + + // Loop on the m_bcRegion + for (e = 0; e < m_fields[0]->GetBndCondExpansions()[m_bcRegion]-> + GetExpSize(); ++e) + { + npts = m_fields[0]->GetBndCondExpansions()[m_bcRegion]-> + GetExp(e)->GetTotPoints(); + id1 = m_fields[0]->GetBndCondExpansions()[m_bcRegion]-> + GetPhys_Offset(e); + id2 = m_fields[0]->GetTrace()->GetPhys_Offset(traceBndMap[m_offset+e]); + + // Loop on points of m_bcRegion 'e' + for (i = 0; i < npts; i++) + { + pnt = id2 + i; + + // Pressure from stagnation pressure and Mach + p = pStag[id1+i] / + pow(1.0 + (gammaMinusOne)/2.0 * Mach[pnt]*Mach[pnt], + m_gamma/(gammaMinusOne)); + + // rho from isentropic relation: rho = rhoStag *(p/pStag)^1/Gamma + rho = m_fieldStorage[0][id1+i] * + pow(p/pStag[id1+i],gammaInv); + (m_fields[0]->GetBndCondExpansions()[m_bcRegion]-> + UpdatePhys())[id1+i] = rho; + + // Extrapolation for velocity and Kinetic energy calculation + int lim = m_swirl ? nVariables - 2 : nVariables - 1; + NekDouble Ek = 0.0; + for (j = 1; j < lim; ++j) + { + (m_fields[j]->GetBndCondExpansions()[m_bcRegion]-> + UpdatePhys())[id1+i] = Fwd[j][pnt]; + + Ek += 0.5 * (Fwd[j][pnt] * Fwd[j][pnt]) / Fwd[0][pnt]; + } + + if (m_swirl) + { + // Prescribed swirl + (m_fields[3]->GetBndCondExpansions()[m_bcRegion]-> + UpdatePhys())[id1+i] = m_fieldStorage[3][id1+i]; + Ek += 0.5 * (m_fieldStorage[3][id1+i] * + m_fieldStorage[3][id1+i]) / Fwd[0][pnt]; + } + + // Energy + (m_fields[nVariables-1]->GetBndCondExpansions()[m_bcRegion]-> + UpdatePhys())[id1+i] = p * gammaMinusOneInv + Ek; + } + } +} + +} diff --git a/solvers/CompressibleFlowSolver/BoundaryConditions/StagnationInflowBC.h b/solvers/CompressibleFlowSolver/BoundaryConditions/StagnationInflowBC.h new file mode 100644 index 0000000000000000000000000000000000000000..213a6d1b3e4bed39a4ca1003e5a840ee029c18f6 --- /dev/null +++ b/solvers/CompressibleFlowSolver/BoundaryConditions/StagnationInflowBC.h @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File: StagnationInflowBC.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). +// +// License for the specific language governing rights and limitations under +// 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: Stagnation conditions inflow boundary condition +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef NEKTAR_SOLVERS_COMPRESSIBLEFLOWSOLVER_BNDCOND_STAGINFLOWBC +#define NEKTAR_SOLVERS_COMPRESSIBLEFLOWSOLVER_BNDCOND_STAGINFLOWBC + +#include "CFSBndCond.h" + + +namespace Nektar +{ + +/** + * @brief Stagnation conditions inflow boundary conditions + * for compressible flow problems where the energy and density are prescribed + */ +class StagnationInflowBC : public CFSBndCond +{ + public: + + friend class MemoryManager; + + /// Creates an instance of this class + static CFSBndCondSharedPtr create( + const LibUtilities::SessionReaderSharedPtr& pSession, + const Array& pFields, + const Array >& pTraceNormals, + const int pSpaceDim, const int bcRegion, const int cnt) + { + CFSBndCondSharedPtr p = MemoryManager:: + AllocateSharedPtr(pSession, pFields, + pTraceNormals, pSpaceDim, bcRegion, cnt); + return p; + } + + ///Name of the class + static std::string className; + + protected: + + virtual void v_Apply( + Array > &Fwd, + Array > &physarray, + const NekDouble &time); + + private: + StagnationInflowBC(const LibUtilities::SessionReaderSharedPtr& pSession, + const Array& pFields, + const Array >& pTraceNormals, + const int pSpaceDim, + const int bcRegion, + const int cnt); + + virtual ~StagnationInflowBC(void){}; + + // Field storage for StagnationInflowBC + Array > m_fieldStorage; + + // Flag determining if we have an axi-symmetric case with swirl + bool m_swirl; +}; + +} + +#endif diff --git a/solvers/CompressibleFlowSolver/CMakeLists.txt b/solvers/CompressibleFlowSolver/CMakeLists.txt index a534e83630d03ee3c133f4b56f98e38408318588..bbf46212480db36f777b9ed18520c83c2acacff6 100644 --- a/solvers/CompressibleFlowSolver/CMakeLists.txt +++ b/solvers/CompressibleFlowSolver/CMakeLists.txt @@ -20,6 +20,7 @@ IF( NEKTAR_SOLVER_COMPRESSIBLE_FLOW ) ./BoundaryConditions/PressureOutflowNonReflectiveBC.cpp ./BoundaryConditions/RiemannInvariantBC.cpp ./BoundaryConditions/RinglebFlowBC.cpp + ./BoundaryConditions/StagnationInflowBC.cpp ./BoundaryConditions/SymmetryBC.cpp ./BoundaryConditions/TimeDependentBC.cpp ./BoundaryConditions/WallBC.cpp @@ -31,6 +32,8 @@ IF( NEKTAR_SOLVER_COMPRESSIBLE_FLOW ) ./EquationSystems/NavierStokesCFE.cpp ./EquationSystems/RinglebFlow.cpp ./Filters/FilterEnergy.cpp + ./Forcing/ForcingAxiSymmetric.cpp + ./Forcing/ForcingQuasi1D.cpp ./Misc/VariableConverter.cpp ./RiemannSolvers/AverageSolver.cpp ./RiemannSolvers/AUSM0Solver.cpp @@ -80,8 +83,8 @@ IF( NEKTAR_SOLVER_COMPRESSIBLE_FLOW ) #ADD_NEKTAR_TEST(Couette_FRDG_LFRDG_adiabatic) # disabled as fails on 32-bit linux -- cc #ADD_NEKTAR_TEST(CylinderSubsonic_NS_WeakDG_LDG_SEM LENGTHY) - ADD_NEKTAR_TEST(CylinderSubsonic_NS_WeakDG_LDG_GAUSS LENGTHY) - ADD_NEKTAR_TEST(CylinderSubsonic_NS_FRDG_LFRDG_GAUSS LENGTHY) + ADD_NEKTAR_TEST(CylinderSubsonic_NS_WeakDG_LDG_GAUSS LENGTHY) + ADD_NEKTAR_TEST(CylinderSubsonic_NS_FRDG_LFRDG_GAUSS LENGTHY) ADD_NEKTAR_TEST(CylinderSubsonic_NS_WeakDG_LDG_SEM_VariableMu) ADD_NEKTAR_TEST(Couette_WeakDG_LDG_SEM_3DHOMO1D_MVM) ADD_NEKTAR_TEST(CylinderSubsonic_NS_WeakDG_LDG_SEM_3DHomo1D_MVM) @@ -91,6 +94,9 @@ IF( NEKTAR_SOLVER_COMPRESSIBLE_FLOW ) ADD_NEKTAR_TEST(CylinderSubsonic_NS_FRHU_LFRHU_SEM_3DHOMO1D_MVM) ADD_NEKTAR_TEST(Couette_FRSD_LFRSD_MODIFIED_3DHOMO1D_MVM) ADD_NEKTAR_TEST(CylinderSubsonic_NS_FRSD_LFRSD_MODIFIED_3DHOMO1D_MVM) + ADD_NEKTAR_TEST(Nozzle_AxiSym_NoSwirl) + ADD_NEKTAR_TEST(Nozzle_AxiSym_Swirl) + ADD_NEKTAR_TEST(Nozzle_Quasi1D_P6) IF (NEKTAR_USE_MPI) #ADD_NEKTAR_TEST(Perturbation_M05_square_CBC_par LENGTHY) diff --git a/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.cpp b/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.cpp index 87c1740521cb6aecc92882a58ad0f807af8b9b20..ac88f2d7b04b5928fe3298e3190c86fc228dc0db 100755 --- a/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.cpp +++ b/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.cpp @@ -198,6 +198,25 @@ namespace Nektar // Shock capture m_session->LoadSolverInfo("ShockCaptureType", m_shockCaptureType, "Off"); + + // Load parameters for exponential filtering + m_session->MatchSolverInfo("ExponentialFiltering","True", + m_useFiltering, false); + if(m_useFiltering) + { + m_session->LoadParameter ("FilterAlpha", m_filterAlpha, 36); + m_session->LoadParameter ("FilterExponent", m_filterExponent, 16); + m_session->LoadParameter ("FilterCutoff", m_filterCutoff, 0); + } + + // Load CFL for local time-stepping (for steady state) + m_session->MatchSolverInfo("LocalTimeStep","True", + m_useLocalTimeStep, false); + if(m_useLocalTimeStep) + { + ASSERTL0(m_cflSafetyFactor != 0, + "Local time stepping requires CFL parameter."); + } } /** @@ -296,6 +315,30 @@ namespace Nektar { (*x)->Apply(m_fields, inarray, outarray, time); } + + if (m_useLocalTimeStep) + { + int nElements = m_fields[0]->GetExpSize(); + int nq, offset; + NekDouble fac; + Array tmp; + + Array tstep (nElements, 0.0); + GetElmtTimeStep(inarray, tstep); + + // Loop over elements + for(int n = 0; n < nElements; ++n) + { + nq = m_fields[0]->GetExp(n)->GetTotPoints(); + offset = m_fields[0]->GetPhys_Offset(n); + fac = tstep[n] / m_timestep; + for(i = 0; i < nvariables; ++i) + { + Vmath::Smul(nq, fac, outarray[i] + offset, 1, + tmp = outarray[i] + offset, 1); + } + } + } } /** @@ -320,6 +363,11 @@ namespace Nektar for(i = 0; i < nvariables; ++i) { Vmath::Vcopy(npoints, inarray[i], 1, outarray[i], 1); + if(m_useFiltering) + { + m_fields[i]->ExponentialFilter(outarray[i], m_filterAlpha, + m_filterExponent, m_filterCutoff); + } } SetBoundaryConditions(outarray, time); break; @@ -582,31 +630,32 @@ namespace Nektar const int nFields = m_fields.num_elements(); // Holds L2 errors. - Array L2 (nFields); - Array residual(nFields); + Array L2 (nFields); + Array residual (nFields); + Array reference(nFields); for (int i = 0; i < nFields; ++i) { - Array diff(nPoints); + Array tmp(nPoints); - Vmath::Vsub(nPoints, m_fields[i]->GetPhys(), 1, m_un[i], 1, diff, 1); - Vmath::Vmul(nPoints, diff, 1, diff, 1, diff, 1); - residual[i] = Vmath::Vsum(nPoints, diff, 1); + Vmath::Vsub(nPoints, m_fields[i]->GetPhys(), 1, m_un[i], 1, tmp, 1); + Vmath::Vmul(nPoints, tmp, 1, tmp, 1, tmp, 1); + residual[i] = Vmath::Vsum(nPoints, tmp, 1); + + Vmath::Vmul(nPoints, m_un[i], 1, m_un[i], 1, tmp, 1); + reference[i] = Vmath::Vsum(nPoints, tmp, 1); } - m_comm->AllReduce(residual, LibUtilities::ReduceSum); + m_comm->AllReduce(residual , LibUtilities::ReduceSum); + m_comm->AllReduce(reference, LibUtilities::ReduceSum); // L2 error - L2[0] = sqrt(residual[0]) / m_rhoInf; - - for (int i = 1; i < nFields-1; ++i) + for (int i = 0; i < nFields; ++i) { - L2[i] = sqrt(residual[i]) / m_UInf / m_rhoInf; + reference[i] = (reference[i] == 0) ? 1 : reference[i]; + L2[i] = sqrt(residual[i] / reference[i]); } - NekDouble Einf = m_pInf / (m_gamma-1.0) + 0.5 * m_rhoInf * m_UInf; - L2[nFields-1] = sqrt(residual[nFields-1]) / Einf; - if (m_comm->GetRank() == 0 && output) { // Output time @@ -645,16 +694,17 @@ namespace Nektar } /** - * @brief Calculate the maximum timestep subject to CFL restrictions. + * @brief Calculate the maximum timestep on each element + * subject to CFL restrictions. */ - NekDouble CompressibleFlowSystem::v_GetTimeStep( - const Array > &inarray) + void CompressibleFlowSystem::GetElmtTimeStep( + const Array > &inarray, + Array &tstep) { int n; int nElements = m_fields[0]->GetExpSize(); const Array ExpOrder = GetNumExpModesPerExp(); - Array tstep (nElements, 0.0); Array stdVelocity(nElements); // Get standard velocity to compute the time-step limit @@ -682,6 +732,18 @@ namespace Nektar / (stdVelocity[n] * cLambda * (ExpOrder[n] - 1) * (ExpOrder[n] - 1)); } + } + + /** + * @brief Calculate the maximum timestep subject to CFL restrictions. + */ + NekDouble CompressibleFlowSystem::v_GetTimeStep( + const Array > &inarray) + { + int nElements = m_fields[0]->GetExpSize(); + Array tstep (nElements, 0.0); + + GetElmtTimeStep(inarray, tstep); // Get the minimum time-step limit and return the time-step NekDouble TimeStep = Vmath::Vmin(nElements, tstep, 1); @@ -724,10 +786,10 @@ namespace Nektar InitializeSteadyState(); - if (dumpInitialConditions) + if (dumpInitialConditions && m_checksteps) { - // Dump initial conditions to file - Checkpoint_Output(0); + Checkpoint_Output(m_nchk); + m_nchk++; } } @@ -780,7 +842,9 @@ namespace Nektar { int nTotQuadPoints = GetTotPoints(); int n_element = m_fields[0]->GetExpSize(); - int nBCEdgePts = 0; + int expdim = m_fields[0]->GetGraph()->GetMeshDimension(); + int offset; + Array tmp; // Getting the velocity vector on the 2D normal space Array > velocity (m_spacedim); @@ -805,6 +869,8 @@ namespace Nektar for(int el = 0; el < n_element; ++el) { ptsKeys = m_fields[0]->GetExp(el)->GetPointsKeys(); + offset = m_fields[0]->GetPhys_Offset(el); + int nq = m_fields[0]->GetExp(el)->GetTotPoints(); // Possible bug: not multiply by jacobian?? const SpatialDomains::GeomFactorsSharedPtr metricInfo = @@ -813,32 +879,36 @@ namespace Nektar m_fields[0]->GetExp(el)->GetGeom()->GetMetricInfo() ->GetDerivFactors(ptsKeys); - int nq = m_fields[0]->GetExp(el)->GetTotPoints(); - if(metricInfo->GetGtype() == SpatialDomains::eDeformed) { // d xi/ dx = gmat = 1/J * d x/d xi - for (int i = 0; i < m_spacedim; ++i) + for (int i = 0; i < expdim; ++i) { - Vmath::Vmul(nq, gmat[i], 1, velocity[0], 1, - stdVelocity[i], 1); - for (int j = 1; j < m_spacedim; ++j) + Vmath::Vmul(nq, gmat[i], 1, + velocity[0] + offset, 1, + tmp = stdVelocity[i] + offset, 1); + for (int j = 1; j < expdim; ++j) { - Vmath::Vvtvp(nq, gmat[m_spacedim*j+i], 1, velocity[j], - 1, stdVelocity[i], 1, stdVelocity[i], 1); + Vmath::Vvtvp(nq, gmat[expdim*j+i], 1, + velocity[j] + offset, 1, + stdVelocity[i] + offset, 1, + tmp = stdVelocity[i] + offset, 1); } } } else { - for (int i = 0; i < m_spacedim; ++i) + for (int i = 0; i < expdim; ++i) { - Vmath::Smul(nq, gmat[i][0], velocity[0], 1, - stdVelocity[i], 1); - for (int j = 1; j < m_spacedim; ++j) + Vmath::Smul(nq, gmat[i][0], + velocity[0] + offset, 1, + tmp = stdVelocity[i] + offset, 1); + for (int j = 1; j < expdim; ++j) { - Vmath::Svtvp(nq, gmat[m_spacedim*j+i][0], velocity[j], - 1, stdVelocity[i], 1, stdVelocity[i], 1); + Vmath::Svtvp(nq, gmat[expdim*j+i][0], + velocity[j] + offset, 1, + stdVelocity[i] + offset, 1, + tmp = stdVelocity[i] + offset, 1); } } } @@ -846,16 +916,16 @@ namespace Nektar for (int i = 0; i < nq; ++i) { NekDouble pntVelocity = 0.0; - for (int j = 0; j < m_spacedim; ++j) + for (int j = 0; j < expdim; ++j) { - pntVelocity += stdVelocity[j][i]*stdVelocity[j][i]; + pntVelocity += stdVelocity[j][offset + i] * + stdVelocity[j][offset + i]; } - pntVelocity = sqrt(pntVelocity) + soundspeed[nBCEdgePts]; + pntVelocity = sqrt(pntVelocity) + soundspeed[offset + i]; if (pntVelocity > stdV[el]) { stdV[el] = pntVelocity; } - nBCEdgePts++; } } } @@ -936,7 +1006,11 @@ namespace Nektar m_varConv->GetPressure (tmp, pressure); m_varConv->GetSoundSpeed(tmp, pressure, soundspeed); m_varConv->GetMach (tmp, soundspeed, mach); - m_varConv->GetSensor (m_fields[0], tmp, sensor, SensorKappa); + + int sensorOffset; + m_session->LoadParameter ("SensorOffset", sensorOffset, 1); + m_varConv->GetSensor (m_fields[0], tmp, sensor, SensorKappa, + sensorOffset); Array pFwd(nCoeffs), sFwd(nCoeffs), mFwd(nCoeffs); Array sensFwd(nCoeffs); @@ -957,12 +1031,13 @@ namespace Nektar if (m_artificialDiffusion) { + Array sensorFwd(nCoeffs); // reuse pressure m_artificialDiffusion->GetArtificialViscosity(tmp, pressure); - m_fields[0]->FwdTrans_IterPerExp(pressure, pFwd); + m_fields[0]->FwdTrans_IterPerExp(pressure, sensorFwd); variables.push_back ("ArtificialVisc"); - fieldcoeffs.push_back(pFwd); + fieldcoeffs.push_back(sensorFwd); } } } diff --git a/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.h b/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.h index 940efc2e706d64797352622e6866f03d08836ccc..50f2bb415aadec56b483f244f650e3ee2cdd7cf1 100755 --- a/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.h +++ b/solvers/CompressibleFlowSolver/EquationSystems/CompressibleFlowSystem.h @@ -82,6 +82,15 @@ namespace Nektar NekDouble m_Cp; NekDouble m_Prandtl; + // Parameters for exponential filtering + NekDouble m_filterAlpha; + NekDouble m_filterExponent; + NekDouble m_filterCutoff; + bool m_useFiltering; + + // Parameters for local time-stepping + bool m_useLocalTimeStep; + // Auxiliary object to convert variables VariableConverterSharedPtr m_varConv; @@ -148,6 +157,10 @@ namespace Nektar const Array > &inarray, Array &stdV); + void GetElmtTimeStep( + const Array > &inarray, + Array &tstep); + virtual bool v_PostIntegrate(int step); bool CalcSteadyState(bool output); diff --git a/solvers/CompressibleFlowSolver/Forcing/ForcingAxiSymmetric.cpp b/solvers/CompressibleFlowSolver/Forcing/ForcingAxiSymmetric.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9cb9974e52475cc963374fd6c6daedccc090594c --- /dev/null +++ b/solvers/CompressibleFlowSolver/Forcing/ForcingAxiSymmetric.cpp @@ -0,0 +1,163 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File: ForcingAxiSymmetric.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). +// +// License for the specific language governing rights and limitations under +// 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: Forcing for axi-symmetric flow. +// +/////////////////////////////////////////////////////////////////////////////// + +#include + +using namespace std; + +namespace Nektar +{ +std::string ForcingAxiSymmetric::className = SolverUtils::GetForcingFactory(). + RegisterCreatorFunction("AxiSymmetric", + ForcingAxiSymmetric::create, + "Forcing for axi-symmetric flow (around x=0)"); + +ForcingAxiSymmetric::ForcingAxiSymmetric( + const LibUtilities::SessionReaderSharedPtr& pSession) + : Forcing(pSession) +{ +} + +void ForcingAxiSymmetric::v_InitObject( + const Array& pFields, + const unsigned int& pNumForcingFields, + const TiXmlElement* pForce) +{ + int spacedim = pFields[0]->GetGraph()->GetSpaceDimension(); + int nPoints = pFields[0]->GetTotPoints(); + + m_NumVariable = pNumForcingFields; + m_varConv = MemoryManager::AllocateSharedPtr( + m_session, spacedim); + + // Get coordinates + Array > coords(3); + for (int i = 0; i < 3; i++) + { + coords[i] = Array (nPoints); + } + pFields[0]->GetCoords(coords[0], coords[1], coords[2]); + + // Calculate fac = -1/r if r!=0, fac = 0 if r == 0 + m_geomFactor = Array (nPoints); + for (int i = 0; i < nPoints; ++i) + { + if (coords[0][i] < NekConstants::kNekZeroTol) + { + m_geomFactor[i] = 0; + } + else + { + m_geomFactor[i] = -1.0/coords[0][i]; + } + } + + m_Forcing = Array > (m_NumVariable); + for (int i = 0; i < m_NumVariable; ++i) + { + m_Forcing[i] = Array (pFields[0]->GetTotPoints(), 0.0); + } +} + +void ForcingAxiSymmetric::v_Apply( + const Array& pFields, + const Array >& inarray, + Array >& outarray, + const NekDouble& time) +{ + int nPoints = pFields[0]->GetTotPoints(); + + // Get (E+p) + Array tmp (nPoints, 0.0); + m_varConv->GetPressure(inarray, tmp); + Vmath::Vadd(nPoints, tmp, 1, + inarray[m_NumVariable-1], 1, tmp, 1); + + // F-rho = -1/r *rhou + Vmath::Vmul(nPoints, m_geomFactor, 1, + inarray[1], 1, m_Forcing[0], 1); + + // F-rhou_r = -1/r *rhou_r * u_r and F-rhou_y = -1/r *rhou_y * u_r + for (int i = 1; i < 3; ++i) + { + Vmath::Vmul(nPoints, inarray[1], 1, + inarray[i], 1, m_Forcing[i], 1); + Vmath::Vdiv(nPoints, m_Forcing[i], 1, + inarray[0], 1, m_Forcing[i], 1); + Vmath::Vmul(nPoints, m_Forcing[i], 1, + m_geomFactor, 1, m_Forcing[i], 1); + } + + // F-E = -1/r *(E+p)*u + Vmath::Vmul(nPoints, inarray[1], 1, + tmp, 1, m_Forcing[m_NumVariable-1], 1); + Vmath::Vdiv(nPoints, m_Forcing[m_NumVariable-1], 1, + inarray[0], 1, m_Forcing[m_NumVariable-1], 1); + Vmath::Vmul(nPoints, m_Forcing[m_NumVariable-1], 1, + m_geomFactor, 1, m_Forcing[m_NumVariable-1], 1); + + // Swirl + if (m_NumVariable == 5) + { + // F-rhou_r -= (-1/r) * rho * u_theta * u_theta + Vmath::Vmul(nPoints, inarray[3], 1, + inarray[3], 1, tmp, 1); + Vmath::Vdiv(nPoints, tmp, 1, + inarray[0], 1, tmp, 1); + Vmath::Vmul(nPoints, tmp, 1, + m_geomFactor, 1, tmp, 1); + Vmath::Vsub(nPoints, m_Forcing[1], 1, + tmp, 1, m_Forcing[1], 1); + + // F-rhou_theta = 2 * (-1/r *rhou_theta * u_r) + Vmath::Vmul(nPoints, inarray[1], 1, + inarray[3], 1, m_Forcing[3], 1); + Vmath::Vdiv(nPoints, m_Forcing[3], 1, + inarray[0], 1, m_Forcing[3], 1); + Vmath::Vmul(nPoints, m_Forcing[3], 1, + m_geomFactor, 1, m_Forcing[3], 1); + Vmath::Smul(nPoints, 2.0, + m_Forcing[3], 1, m_Forcing[3], 1); + } + + // Apply forcing + for (int i = 0; i < m_NumVariable; i++) + { + Vmath::Vadd(nPoints, outarray[i], 1, + m_Forcing[i], 1, outarray[i], 1); + } +} + +} diff --git a/solvers/CompressibleFlowSolver/Forcing/ForcingAxiSymmetric.h b/solvers/CompressibleFlowSolver/Forcing/ForcingAxiSymmetric.h new file mode 100644 index 0000000000000000000000000000000000000000..13d56ea7333c584e0077f2b0df66d892dd2f7cad --- /dev/null +++ b/solvers/CompressibleFlowSolver/Forcing/ForcingAxiSymmetric.h @@ -0,0 +1,91 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File: ForcingAxiSymmetric.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). +// +// License for the specific language governing rights and limitations under +// 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: Forcing for axi-symmetric flow. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef NEKTAR_SOLVERUTILS_FORCINGAXISYM +#define NEKTAR_SOLVERUTILS_FORCINGAXISYM + +#include +#include + +namespace Nektar +{ + +class ForcingAxiSymmetric : public SolverUtils::Forcing +{ + public: + + friend class MemoryManager; + + /// Creates an instance of this class + static SolverUtils::ForcingSharedPtr create( + const LibUtilities::SessionReaderSharedPtr& pSession, + const Array& pFields, + const unsigned int& pNumForcingFields, + const TiXmlElement* pForce) + { + SolverUtils::ForcingSharedPtr p = + MemoryManager:: + AllocateSharedPtr(pSession); + p->InitObject(pFields, pNumForcingFields, pForce); + return p; + } + + ///Name of the class + static std::string className; + + protected: + virtual void v_InitObject( + const Array& pFields, + const unsigned int& pNumForcingFields, + const TiXmlElement* pForce); + + virtual void v_Apply( + const Array& fields, + const Array >& inarray, + Array >& outarray, + const NekDouble& time); + + private: + + ForcingAxiSymmetric( + const LibUtilities::SessionReaderSharedPtr& pSession); + + Array m_geomFactor; + VariableConverterSharedPtr m_varConv; +}; + +} + +#endif diff --git a/solvers/CompressibleFlowSolver/Forcing/ForcingQuasi1D.cpp b/solvers/CompressibleFlowSolver/Forcing/ForcingQuasi1D.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6f8e6db25833f8a021a288de3dd4e0f18306f706 --- /dev/null +++ b/solvers/CompressibleFlowSolver/Forcing/ForcingQuasi1D.cpp @@ -0,0 +1,140 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File: ForcingQuasi1D.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). +// +// License for the specific language governing rights and limitations under +// 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: Forcing for quasi-1D nozzle flow. +// +/////////////////////////////////////////////////////////////////////////////// + +#include + +using namespace std; + +namespace Nektar +{ +std::string ForcingQuasi1D::className = SolverUtils::GetForcingFactory(). + RegisterCreatorFunction("Quasi1D", + ForcingQuasi1D::create, + "Quasi-1D nozzle Forcing"); + +ForcingQuasi1D::ForcingQuasi1D( + const LibUtilities::SessionReaderSharedPtr& pSession) + : Forcing(pSession) +{ +} + +void ForcingQuasi1D::v_InitObject( + const Array& pFields, + const unsigned int& pNumForcingFields, + const TiXmlElement* pForce) +{ + m_NumVariable = pNumForcingFields; + m_varConv = MemoryManager::AllocateSharedPtr( + m_session, 1); + + ASSERTL0( pFields[0]->GetGraph()->GetSpaceDimension() == 1, + "ForcingQuasi1D requires a 1D problem."); + + const TiXmlElement* funcNameElmt = pForce->FirstChildElement("AREAFCN"); + if(!funcNameElmt) + { + ASSERTL0(funcNameElmt, "Requires AREAFCN tag " + "specifying function name which prescribes nozzle area."); + } + + string funcName = funcNameElmt->GetText(); + ASSERTL0(m_session->DefinesFunction(funcName), + "Function '" + funcName + "' not defined."); + + // Evaluate geometrical term -Ax/A for forcing + m_geomFactor = Array (pFields[0]->GetTotPoints(), 0.0); + Array tmp (pFields[0]->GetTotPoints(), 0.0); + + std::string sFieldStr = m_session->GetVariable(0); + ASSERTL0(m_session->DefinesFunction(funcName, sFieldStr), + "Variable '" + sFieldStr + "' not defined."); + EvaluateFunction(pFields, m_session, sFieldStr, + m_geomFactor, funcName, 0.0); + pFields[0]->PhysDeriv(MultiRegions::DirCartesianMap[0], m_geomFactor, tmp); + Vmath::Vdiv(pFields[0]->GetTotPoints(), tmp, 1, + m_geomFactor, 1, + m_geomFactor, 1); + Vmath::Neg(pFields[0]->GetTotPoints(), m_geomFactor, 1); + + m_Forcing = Array > (m_NumVariable); + for (int i = 0; i < m_NumVariable; ++i) + { + m_Forcing[i] = Array (pFields[0]->GetTotPoints(), 0.0); + } +} + +void ForcingQuasi1D::v_Apply( + const Array& pFields, + const Array >& inarray, + Array >& outarray, + const NekDouble& time) +{ + int nPoints = pFields[0]->GetTotPoints(); + + // Get (E+p) + Array tmp (nPoints, 0.0); + m_varConv->GetPressure(inarray, tmp); + Vmath::Vadd(nPoints, tmp, 1, + inarray[2], 1, tmp, 1); + + // F-rho = -Ax/A *rhou + Vmath::Vmul(nPoints, m_geomFactor, 1, + inarray[1], 1, m_Forcing[0], 1); + + // F-rhou = -Ax/A *rhou*u + Vmath::Vmul(nPoints, m_geomFactor, 1, + inarray[1], 1, m_Forcing[1], 1); + Vmath::Vmul(nPoints, m_Forcing[1], 1, + inarray[1], 1, m_Forcing[1], 1); + Vmath::Vdiv(nPoints, m_Forcing[1], 1, + inarray[0], 1, m_Forcing[1], 1); + + // F-E = -Ax/A *(E+p)*u + Vmath::Vmul(nPoints, m_geomFactor, 1, + inarray[1], 1, m_Forcing[2], 1); + Vmath::Vmul(nPoints, m_Forcing[2], 1, + tmp, 1, m_Forcing[2], 1); + Vmath::Vdiv(nPoints, m_Forcing[2], 1, + inarray[0], 1, m_Forcing[2], 1); + + // Apply forcing + for (int i = 0; i < m_NumVariable; i++) + { + Vmath::Vadd(nPoints, outarray[i], 1, + m_Forcing[i], 1, outarray[i], 1); + } +} + +} diff --git a/solvers/CompressibleFlowSolver/Forcing/ForcingQuasi1D.h b/solvers/CompressibleFlowSolver/Forcing/ForcingQuasi1D.h new file mode 100644 index 0000000000000000000000000000000000000000..5333353c46d015c6ce596401c5f10e339130d91f --- /dev/null +++ b/solvers/CompressibleFlowSolver/Forcing/ForcingQuasi1D.h @@ -0,0 +1,91 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File: ForcingQuasi1D.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). +// +// License for the specific language governing rights and limitations under +// 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: Forcing for quasi-1D nozzle flow. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef NEKTAR_SOLVERUTILS_FORCINGQUASI1D +#define NEKTAR_SOLVERUTILS_FORCINGQUASI1D + +#include +#include + +namespace Nektar +{ + +class ForcingQuasi1D : public SolverUtils::Forcing +{ + public: + + friend class MemoryManager; + + /// Creates an instance of this class + static SolverUtils::ForcingSharedPtr create( + const LibUtilities::SessionReaderSharedPtr& pSession, + const Array& pFields, + const unsigned int& pNumForcingFields, + const TiXmlElement* pForce) + { + SolverUtils::ForcingSharedPtr p = + MemoryManager:: + AllocateSharedPtr(pSession); + p->InitObject(pFields, pNumForcingFields, pForce); + return p; + } + + ///Name of the class + static std::string className; + + protected: + virtual void v_InitObject( + const Array& pFields, + const unsigned int& pNumForcingFields, + const TiXmlElement* pForce); + + virtual void v_Apply( + const Array& fields, + const Array >& inarray, + Array >& outarray, + const NekDouble& time); + + private: + + ForcingQuasi1D( + const LibUtilities::SessionReaderSharedPtr& pSession); + + Array m_geomFactor; + VariableConverterSharedPtr m_varConv; +}; + +} + +#endif diff --git a/solvers/CompressibleFlowSolver/Misc/VariableConverter.cpp b/solvers/CompressibleFlowSolver/Misc/VariableConverter.cpp index 4c24ce4e6386e989c526bcde8cd2adeb743dc1e2..8d9df266707d8bbd9b1dc45d26c387d512e04211 100755 --- a/solvers/CompressibleFlowSolver/Misc/VariableConverter.cpp +++ b/solvers/CompressibleFlowSolver/Misc/VariableConverter.cpp @@ -335,129 +335,81 @@ namespace Nektar const MultiRegions::ExpListSharedPtr &field, const Array > &physarray, Array &Sensor, - Array &SensorKappa) + Array &SensorKappa, + int offset) { - int e, NumModesElement, nQuadPointsElement; - int nTotQuadPoints = field->GetTotPoints(); - int nElements = field->GetExpSize(); + Array tmp; - // Find solution (SolP) at p = P; - // The input array (physarray) is the solution at p = P; + Array expOrderElement = field->EvalBasisNumModesMaxPerExp(); - Array ExpOrderElement = field->EvalBasisNumModesMaxPerExp(); + Array solution = physarray[0]; - Array SolP (nTotQuadPoints, 0.0); - Array SolPmOne(nTotQuadPoints, 0.0); - Array SolNorm (nTotQuadPoints, 0.0); - - Vmath::Vcopy(nTotQuadPoints, physarray[0], 1, SolP, 1); - - int CoeffsCount = 0; - - for (e = 0; e < nElements; e++) + for (int e = 0; e < field->GetExpSize(); e++) { - NumModesElement = ExpOrderElement[e]; - int nQuadPointsElement = field->GetExp(e)->GetTotPoints(); - int nCoeffsElement = field->GetExp(e)->GetNcoeffs(); - int numCutOff = NumModesElement - 1; - - // Set-up of the Orthogonal basis for a Quadrilateral element which - // is needed to obtain thesolution at P = p - 1; - - Array SolPElementPhys (nQuadPointsElement, 0.0); - Array SolPElementCoeffs(nCoeffsElement, 0.0); - - Array SolPmOneElementPhys(nQuadPointsElement, 0.0); - Array SolPmOneElementCoeffs(nCoeffsElement, 0.0); - - // create vector the save the solution points per element at P = p; - - for (int i = 0; i < nQuadPointsElement; i++) - { - SolPElementPhys[i] = SolP[CoeffsCount+i]; - } - - field->GetExp(e)->FwdTrans(SolPElementPhys, - SolPElementCoeffs); + int numModesElement = expOrderElement[e]; + int nElmtPoints = field->GetExp(e)->GetTotPoints(); + int physOffset = field->GetPhys_Offset(e); + int nElmtCoeffs = field->GetExp(e)->GetNcoeffs(); + int numCutOff = numModesElement - offset; + + // create vector to save the solution points per element at P = p; + Array elmtPhys (nElmtPoints, solution+physOffset); + // Compute coefficients + Array elmtCoeffs(nElmtCoeffs, 0.0); + field->GetExp(e)->FwdTrans(elmtPhys, elmtCoeffs); // ReduceOrderCoeffs reduces the polynomial order of the solution // that is represented by the coeffs given as an inarray. This is // done by projecting the higher order solution onto the orthogonal // basis and padding the higher order coefficients with zeros. - + Array reducedElmtCoeffs(nElmtCoeffs, 0.0); field->GetExp(e)->ReduceOrderCoeffs(numCutOff, - SolPElementCoeffs, - SolPmOneElementCoeffs); - - field->GetExp(e)->BwdTrans(SolPmOneElementCoeffs, - SolPmOneElementPhys); + elmtCoeffs, + reducedElmtCoeffs); - for (int i = 0; i < nQuadPointsElement; i++) - { - SolPmOne[CoeffsCount+i] = SolPmOneElementPhys[i]; - } + Array reducedElmtPhys (nElmtPoints, 0.0); + field->GetExp(e)->BwdTrans(reducedElmtCoeffs, + reducedElmtPhys); - NekDouble SolPmeanNumerator = 0.0; - NekDouble SolPmeanDenumerator = 0.0; + NekDouble numerator = 0.0; + NekDouble denominator = 0.0; // Determining the norm of the numerator of the Sensor + Array difference (nElmtPoints, 0.0); + Vmath::Vsub(nElmtPoints, + elmtPhys, 1, + reducedElmtPhys, 1, + difference, 1); - Vmath::Vsub(nQuadPointsElement, - SolPElementPhys, 1, - SolPmOneElementPhys, 1, - SolNorm, 1); + numerator = Vmath::Dot(nElmtPoints, difference, difference); - Vmath::Vmul(nQuadPointsElement, - SolNorm, 1, - SolNorm, 1, - SolNorm, 1); + denominator = Vmath::Dot(nElmtPoints, elmtPhys, elmtPhys); - for (int i = 0; i < nQuadPointsElement; i++) + NekDouble elmtSensor = sqrt(numerator / denominator); + elmtSensor = log10(elmtSensor); + Vmath::Fill(nElmtPoints, elmtSensor, tmp = Sensor + physOffset, 1); + + NekDouble elmtSensorKappa; + if (numModesElement <= offset) { - SolPmeanNumerator += SolNorm[i]; - SolPmeanDenumerator += SolPElementPhys[i]; + elmtSensorKappa = 0; } - - for (int i = 0; i < nQuadPointsElement; ++i) + else if (elmtSensor < (m_Skappa-m_Kappa)) { - Sensor[CoeffsCount+i] = - sqrt(SolPmeanNumerator / nQuadPointsElement) / - sqrt(SolPmeanDenumerator / nQuadPointsElement); - - Sensor[CoeffsCount+i] = log10(Sensor[CoeffsCount+i]); + elmtSensorKappa = 0; } - CoeffsCount += nQuadPointsElement; - } - - CoeffsCount = 0.0; - - for (e = 0; e < nElements; e++) - { - NumModesElement = ExpOrderElement[e]; - NekDouble ThetaS = m_mu0; - NekDouble Phi0 = m_Skappa; - NekDouble DeltaPhi = m_Kappa; - nQuadPointsElement = field->GetExp(e)->GetTotPoints(); - - for (int i = 0; i < nQuadPointsElement; i++) + else if (elmtSensor > (m_Skappa+m_Kappa)) { - if (Sensor[CoeffsCount+i] <= (Phi0 - DeltaPhi)) - { - SensorKappa[CoeffsCount+i] = 0; - } - else if(Sensor[CoeffsCount+i] >= (Phi0 + DeltaPhi)) - { - SensorKappa[CoeffsCount+i] = ThetaS; - } - else if(abs(Sensor[CoeffsCount+i]-Phi0) < DeltaPhi) - { - SensorKappa[CoeffsCount+i] = - ThetaS / 2 * (1 + sin(M_PI * (Sensor[CoeffsCount+i] - - Phi0) / (2 * DeltaPhi))); - } + elmtSensorKappa = m_mu0; } - - CoeffsCount += nQuadPointsElement; + else + { + elmtSensorKappa = + 0.5 * m_mu0 * + (1 + sin(M_PI * (elmtSensor - m_Skappa) / (2*m_Kappa))); + } + Vmath::Fill(nElmtPoints, elmtSensorKappa, + tmp = SensorKappa + physOffset, 1); } } diff --git a/solvers/CompressibleFlowSolver/Misc/VariableConverter.h b/solvers/CompressibleFlowSolver/Misc/VariableConverter.h index c36e3aac8f7440b2642c43ee43b5afe209325aa4..8b919a849953830e3f88843adfdd766517083c00 100755 --- a/solvers/CompressibleFlowSolver/Misc/VariableConverter.h +++ b/solvers/CompressibleFlowSolver/Misc/VariableConverter.h @@ -98,7 +98,8 @@ namespace Nektar const MultiRegions::ExpListSharedPtr &field, const Array > &physarray, Array &Sensor, - Array &SensorKappa); + Array &SensorKappa, + int offset = 1); protected: LibUtilities::SessionReaderSharedPtr m_session; diff --git a/solvers/CompressibleFlowSolver/Tests/CylinderSubsonicMix.tst b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonicMix.tst index 67e8f27cb9f694fa2bd0df1527dad71bd23a3430..9eb08fd06a5ed45958e103a78b4e448a2c253708 100644 --- a/solvers/CompressibleFlowSolver/Tests/CylinderSubsonicMix.tst +++ b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonicMix.tst @@ -9,10 +9,10 @@ - 42.8503 - 4.28809 + 42.85 + 4.28803 0.0808728 - 5.24289 + 5.24283 1.32074 diff --git a/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_NS_WeakDG_LDG_SEM_VariableMu.tst b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_NS_WeakDG_LDG_SEM_VariableMu.tst index 4e0b10a9365c809a294694e1f7b78f6389927006..b57cbb9083c3e03bcfac215270b924e26c1c8265 100644 --- a/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_NS_WeakDG_LDG_SEM_VariableMu.tst +++ b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_NS_WeakDG_LDG_SEM_VariableMu.tst @@ -16,7 +16,7 @@ 0.530796 92.5827 - 58.1854 + 58.1854 346912 diff --git a/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_P3.tst b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_P3.tst index 823fb331c324bb0a4cc41e3992805ef370f8c363..d87a3e836af3a854597a9b05a86756e880cddab2 100644 --- a/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_P3.tst +++ b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_P3.tst @@ -9,10 +9,10 @@ - 42.8326 - 4.28538 - 0.081067 - 5.24021 + 42.8281 + 4.28471 + 0.0813374 + 5.23953 1.32134 diff --git a/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_P8.tst b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_P8.tst index 879eca7b9101c03c9b52f24cec17fd353bf9f127..3339a43298ae942687feaa970d03c8678ad8580e 100644 --- a/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_P8.tst +++ b/solvers/CompressibleFlowSolver/Tests/CylinderSubsonic_P8.tst @@ -9,16 +9,16 @@ - 42.7796 - 4.27885 - 0.114976 - 5.23226 + 42.7626 + 4.27691 + 0.128226 + 5.22974 - 1.3692 + 1.38497 0.198933 0.114663 - 0.172389 + 0.174425 diff --git a/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P3.tst b/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P3.tst index 9e5872d88fcf32c158e4bc3ba098e0257a52e584..f3d695d688a428c31e132a48fc5d6864866c21b7 100644 --- a/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P3.tst +++ b/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P3.tst @@ -8,16 +8,16 @@ - 0.00271826 - 0.00495649 - 0.00780554 - 0.0173238 + 0.00169229 + 0.00308706 + 0.00481169 + 0.0107409 - 0.00554565 - 0.00971562 - 0.0180984 - 0.0408197 + 0.00312134 + 0.00603793 + 0.0110506 + 0.0268249 diff --git a/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P3_GAUSS.tst b/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P3_GAUSS.tst index 9581c4ce043cb9d56639558fdab3d0da8bc343da..b814cff4468a9820143b261ccadd1adfbfb16298 100644 --- a/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P3_GAUSS.tst +++ b/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P3_GAUSS.tst @@ -8,16 +8,16 @@ - 0.00474302 - 0.00947318 - 0.00869843 - 0.0254323 + 0.00395533 + 0.00784074 + 0.00735103 + 0.0219855 - 0.00539172 - 0.0113971 - 0.0117187 - 0.0374887 + 0.00451892 + 0.0103558 + 0.0104917 + 0.033977 diff --git a/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P8.tst b/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P8.tst index 3100c8d1d842371aa2f861f9cbf44d6d639f4a14..9208b48714cb5f6b86af913a23d988ee656a3e71 100644 --- a/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P8.tst +++ b/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P8.tst @@ -8,16 +8,16 @@ - 2.77895e-08 - 7.39606e-08 - 1.19731e-07 - 4.11526e-07 + 1.71579e-08 + 4.58183e-08 + 7.40631e-08 + 2.55147e-07 - 1.23085e-07 - 2.24846e-07 - 5.57644e-07 - 1.32341e-06 + 6.68073e-08 + 1.54941e-07 + 3.17239e-07 + 8.13283e-07 diff --git a/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P8_GAUSS.tst b/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P8_GAUSS.tst index 544ce5d93d0a1605cde93c6446000e2d1e1e5d39..4dc9c3d8ab30393d55c2385ce0696657b1ed41c8 100644 --- a/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P8_GAUSS.tst +++ b/solvers/CompressibleFlowSolver/Tests/IsentropicVortex16_P8_GAUSS.tst @@ -8,16 +8,16 @@ - 1.77565e-07 - 4.54369e-07 - 4.83095e-07 - 1.56969e-06 + 1.34785e-07 + 3.43651e-07 + 3.63171e-07 + 1.2163e-06 - 5.00109e-07 - 1.63057e-06 - 1.72704e-06 - 6.46486e-06 + 3.6015e-07 + 1.29106e-06 + 1.3375e-06 + 4.99373e-06 diff --git a/solvers/CompressibleFlowSolver/Tests/Nozzle_AxiSym_NoSwirl.tst b/solvers/CompressibleFlowSolver/Tests/Nozzle_AxiSym_NoSwirl.tst new file mode 100644 index 0000000000000000000000000000000000000000..9298fff827b6647e3e59391f5db7fbddf9d226ce --- /dev/null +++ b/solvers/CompressibleFlowSolver/Tests/Nozzle_AxiSym_NoSwirl.tst @@ -0,0 +1,25 @@ + + + Euler, axi-symmetric nozzle without swirl + CompressibleFlowSolver + Nozzle_AxiSym_NoSwirl.xml + + Nozzle_AxiSym_NoSwirl.xml + + + + 3.08375 + 1.81859 + 85.4653 + 623440 + + + 1.26773 + 1.812 + 47.6855 + 262359 + + + + + diff --git a/solvers/CompressibleFlowSolver/Tests/Nozzle_AxiSym_NoSwirl.xml b/solvers/CompressibleFlowSolver/Tests/Nozzle_AxiSym_NoSwirl.xml new file mode 100644 index 0000000000000000000000000000000000000000..8736bbcfbec0b7442bfbc913f530c2321d7d681a --- /dev/null +++ b/solvers/CompressibleFlowSolver/Tests/Nozzle_AxiSym_NoSwirl.xml @@ -0,0 +1,141 @@ + + + + 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 + + + + Q[0-255] + E[3,27,44,61,78,95,112,129,146,163,180,197,214,231,248,265,282,299,316,333,350,367,384,401,418,435,452,469,486,503,520,537] + E[23,40,57,74,91,108,125,142,159,176,193,210,227,244,261,278,295,312,329,346,363,380,397,414,431,448,465,482,499,516,533,550] + E[0,4,7,10,13,16,19,22] + E[536,539,541,543,545,547,549,551] + + C[1] + + + + + + + + + + +

CFL = 0.8/2.784*0.2

+

TimeStep = 0.0

+

NumSteps = 100

+

IO_InfoSteps = 100

+

IO_CheckSteps = 0

+

+ +

Gamma = 1.4

+

GasConstant = 287.058

+ + +

pIn = 1e5

+

pOut = 0.83049*pIn

+

TIn = 288

+

MachIn = 0.239543

+ +

rhoIn = pIn/(GasConstant*TIn)

+

cIn = sqrt(Gamma*pIn/rhoIn)

+

vIn = MachIn*cIn

+

pStagIn = pIn * (1 + (Gamma-1)/2 * MachIn^2)^(Gamma/(Gamma-1))

+

rhoStagIn = rhoIn * (pStagIn/pIn)^(1/Gamma)

+ +

rhoInf = 1.225

+

pInf = pIn

+

vInf = 1

+

uInf = 0

+ + +

Skappa = -4.5

+

Kappa = 1.5

+

mu0 = 2

+

SensorOffset = 2

+ + +

FilterAlpha = 36

+

FilterCutoff = 0.0

+

FilterExponent = 16

+
+ + + + + + + + + + + + + rho + rhou + rhov + E + + + + C[2] + C[3] + C[4] + C[5] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +

CFL = 0.8/2.784*0.2

+

TimeStep = 0.0

+

NumSteps = 100

+

IO_InfoSteps = 100

+

IO_CheckSteps = 0

+

+ +

Gamma = 1.4

+

GasConstant = 287.058

+ + +

pIn = 1e5

+

pOut = 0.83049*pIn

+

TIn = 288

+

MachIn = 0.239543

+ +

rhoIn = pIn/(GasConstant*TIn)

+

cIn = sqrt(Gamma*pIn/rhoIn)

+

vIn = MachIn*cIn

+

pStagIn = pIn * (1 + (Gamma-1)/2 * MachIn^2)^(Gamma/(Gamma-1))

+

rhoStagIn = rhoIn * (pStagIn/pIn)^(1/Gamma)

+ +

rhoInf = 1.225

+

pInf = pIn

+

vInf = 1

+

uInf = 0

+

wInf = 0

+ + +

Skappa = -4.5

+

Kappa = 1.5

+

mu0 = 2

+

SensorOffset = 2

+ + +

FilterAlpha = 36

+

FilterCutoff = 0.0

+

FilterExponent = 16

+
+ + + + + + + + + + + + + rho + rhou + rhov + rhow + E + + + + C[2] + C[3] + C[4] + C[5] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ diff --git a/solvers/CompressibleFlowSolver/Tests/Nozzle_Quasi1D_P6.tst b/solvers/CompressibleFlowSolver/Tests/Nozzle_Quasi1D_P6.tst new file mode 100644 index 0000000000000000000000000000000000000000..77b5d581f3cafd39445a64307e7ad114fdf952fa --- /dev/null +++ b/solvers/CompressibleFlowSolver/Tests/Nozzle_Quasi1D_P6.tst @@ -0,0 +1,23 @@ + + + Euler, quasi 1D nozzle, stagnation inflow bc + CompressibleFlowSolver + Nozzle_Quasi1D_P6.xml + + Nozzle_Quasi1D_P6.xml + + + + 3.86343 + 27.0141 + 787959 + + + 1.26257 + 50.4078 + 260694 + + + + + diff --git a/solvers/CompressibleFlowSolver/Tests/Nozzle_Quasi1D_P6.xml b/solvers/CompressibleFlowSolver/Tests/Nozzle_Quasi1D_P6.xml new file mode 100644 index 0000000000000000000000000000000000000000..593002b11d9f88be4d6ad3dcde176cf8a1a4f59e --- /dev/null +++ b/solvers/CompressibleFlowSolver/Tests/Nozzle_Quasi1D_P6.xml @@ -0,0 +1,184 @@ + + + + + 0.000000E+00 0.000000E+00 0.000000E+00 + 3.125000E-01 0.000000E+00 0.000000E+00 + 6.250000E-01 0.000000E+00 0.000000E+00 + 9.375000E-01 0.000000E+00 0.000000E+00 + 1.250000E+00 0.000000E+00 0.000000E+00 + 1.562500E+00 0.000000E+00 0.000000E+00 + 1.875000E+00 0.000000E+00 0.000000E+00 + 2.187500E+00 0.000000E+00 0.000000E+00 + 2.500000E+00 0.000000E+00 0.000000E+00 + 2.812500E+00 0.000000E+00 0.000000E+00 + 3.125000E+00 0.000000E+00 0.000000E+00 + 3.437500E+00 0.000000E+00 0.000000E+00 + 3.750000E+00 0.000000E+00 0.000000E+00 + 4.062500E+00 0.000000E+00 0.000000E+00 + 4.375000E+00 0.000000E+00 0.000000E+00 + 4.687500E+00 0.000000E+00 0.000000E+00 + 5.000000E+00 0.000000E+00 0.000000E+00 + 5.312500E+00 0.000000E+00 0.000000E+00 + 5.625000E+00 0.000000E+00 0.000000E+00 + 5.937500E+00 0.000000E+00 0.000000E+00 + 6.250000E+00 0.000000E+00 0.000000E+00 + 6.562500E+00 0.000000E+00 0.000000E+00 + 6.875000E+00 0.000000E+00 0.000000E+00 + 7.187500E+00 0.000000E+00 0.000000E+00 + 7.500000E+00 0.000000E+00 0.000000E+00 + 7.812500E+00 0.000000E+00 0.000000E+00 + 8.125000E+00 0.000000E+00 0.000000E+00 + 8.437500E+00 0.000000E+00 0.000000E+00 + 8.750000E+00 0.000000E+00 0.000000E+00 + 9.062500E+00 0.000000E+00 0.000000E+00 + 9.375000E+00 0.000000E+00 0.000000E+00 + 9.687500E+00 0.000000E+00 0.000000E+00 + 1.000000E+01 0.000000E+00 0.000000E+00 + + + 0 1 + 1 2 + 2 3 + 3 4 + 4 5 + 5 6 + 6 7 + 7 8 + 8 9 + 9 10 + 10 11 + 11 12 + 12 13 + 13 14 + 14 15 + 15 16 + 16 17 + 17 18 + 18 19 + 19 20 + 20 21 + 21 22 + 22 23 + 23 24 + 24 25 + 25 26 + 26 27 + 27 28 + 28 29 + 29 30 + 30 31 + 31 32 + + + S[0-31] + V[0] + V[32] + + + C[0] + + + + + + + + + + + +

TimeStep = 1e-5

+

NumSteps = 100

+

IO_InfoSteps = 100

+

IO_CheckSteps = 0

+

+ + +

Gamma = 1.4

+

GasConstant = 287.058

+ + +

pIn = 1e5

+

pOut = 0.83049*pIn

+

TIn = 288

+

MachIn = 0.239543

+ +

rhoIn = pIn/(GasConstant*TIn)

+

cIn = sqrt(Gamma*pIn/rhoIn)

+

uIn = MachIn*cIn

+

pStagIn = pIn * (1 + (Gamma-1)/2 * MachIn^2)^(Gamma/(Gamma-1))

+

rhoStagIn = rhoIn * (pStagIn/pIn)^(1/Gamma)

+ +

rhoInf = 1.225

+

pInf = pIn

+

uInf = 1

+ + +

Skappa = -4.5

+

Kappa = 1.5

+

mu0 = 2

+

SensorOffset = 2

+ + +

FilterAlpha = 36

+

FilterCutoff = 0.0

+

FilterExponent = 16

+
+ + + + + + + + + + + + + rho + rhou + E + + + + C[1] + C[2] + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Area + + + +
+ diff --git a/solvers/CompressibleFlowSolver/Tests/RinglebFlow_P3.tst b/solvers/CompressibleFlowSolver/Tests/RinglebFlow_P3.tst index e6e1b5255ae72124047c0a5fd529d15bc5c61a67..5802e402481901696d46f2c8611a0c4e48c88507 100644 --- a/solvers/CompressibleFlowSolver/Tests/RinglebFlow_P3.tst +++ b/solvers/CompressibleFlowSolver/Tests/RinglebFlow_P3.tst @@ -9,16 +9,16 @@ - 0.000570231 - 0.0011389 - 0.000470153 - 0.00100199 + 0.00057015 + 0.00113888 + 0.000470218 + 0.00100229 - 0.00546575 - 0.0171883 - 0.00163612 - 0.00892688 + 0.00546578 + 0.0171878 + 0.00163611 + 0.00892701 diff --git a/solvers/CompressibleFlowSolver/Tests/RinglebFlow_P8.tst b/solvers/CompressibleFlowSolver/Tests/RinglebFlow_P8.tst index 8ccd644da9cc0d5eabf394163f0eb619acc344ec..a3c1a408985237c932e54379fdca37ea8e82d09a 100644 --- a/solvers/CompressibleFlowSolver/Tests/RinglebFlow_P8.tst +++ b/solvers/CompressibleFlowSolver/Tests/RinglebFlow_P8.tst @@ -9,16 +9,16 @@ - 0.000990679 - 0.00326405 - 0.000278182 - 0.00165514 + 0.000990533 + 0.00326406 + 0.000277781 + 0.00165499 - 0.0204462 - 0.0407718 - 0.00524202 - 0.0323808 + 0.0204531 + 0.0407677 + 0.00524062 + 0.0323795