diff --git a/library/LibUtilities/BasicUtils/SessionReader.cpp b/library/LibUtilities/BasicUtils/SessionReader.cpp index 3cc8baf397edc9837f50f7aba6ec8b2a886a6f12..8245c23ed127d43297db0d675ae0c05bfb63d47c 100644 --- a/library/LibUtilities/BasicUtils/SessionReader.cpp +++ b/library/LibUtilities/BasicUtils/SessionReader.cpp @@ -842,7 +842,7 @@ namespace Nektar m_comm = GetCommFactory().CreateInstance(vCommModule,argc,argv); - // If running in parallel change the default global sys soln type + //If running in parallel change the default global sys soln type if (m_comm->GetSize() > 1) { m_solverInfoDefaults["GLOBALSYSSOLN"] = "IterativeStaticCond"; diff --git a/library/LocalRegions/HexExp.cpp b/library/LocalRegions/HexExp.cpp index cc26474f4af36daecdbcb0ab3cddf055a9f5bfa8..edee5acf897fbe9534a2c8d24e946c8df0e4482a 100644 --- a/library/LocalRegions/HexExp.cpp +++ b/library/LocalRegions/HexExp.cpp @@ -521,12 +521,18 @@ namespace Nektar */ NekDouble HexExp::v_PhysEvaluate( const Array<OneD, const NekDouble> &coord) + { + v_PhysEvaluate(coord,m_phys); + } + + NekDouble HexExp::v_PhysEvaluate( + const Array<OneD, const NekDouble> &coord, const Array<OneD, const NekDouble> & physvals) { Array<OneD,NekDouble> Lcoord = Array<OneD,NekDouble>(3); ASSERTL0(m_geom,"m_geom not defined"); m_geom->GetLocCoords(coord,Lcoord); - return StdHexExp::v_PhysEvaluate(Lcoord); + return StdHexExp::v_PhysEvaluate(Lcoord, physvals); } diff --git a/library/LocalRegions/HexExp.h b/library/LocalRegions/HexExp.h index e7487e84693f947f56d94869414d097e838cb16a..5a5521de9f975d1bd90dd2c51952830a7167d1fc 100644 --- a/library/LocalRegions/HexExp.h +++ b/library/LocalRegions/HexExp.h @@ -135,6 +135,9 @@ namespace Nektar virtual NekDouble v_PhysEvaluate( const Array<OneD, const NekDouble> &coords); + virtual NekDouble v_PhysEvaluate( + const Array<OneD, const NekDouble> &coords, const Array<OneD, const NekDouble> & physvals); + /// Retrieve the local coordinates of each quadrature point. virtual void v_GetCoords( Array<OneD,NekDouble> &coords_1, Array<OneD,NekDouble> &coords_2, diff --git a/library/LocalRegions/PrismExp.cpp b/library/LocalRegions/PrismExp.cpp index b2f196bd4391eb1e8bcbb9d5f5143bdcb7d6d412..36a9fe89e85646e8919a8c2789c165423671225d 100644 --- a/library/LocalRegions/PrismExp.cpp +++ b/library/LocalRegions/PrismExp.cpp @@ -443,6 +443,11 @@ namespace Nektar NekDouble PrismExp::PhysEvaluate(const Array<OneD, const NekDouble> &coord) + { + PhysEvaluate(coord,m_phys); + } + + NekDouble PrismExp::PhysEvaluate(const Array<OneD, const NekDouble> &coord, const Array<OneD, const NekDouble> & physvals) { Array<OneD,NekDouble> Lcoord = Array<OneD,NekDouble>(3); @@ -450,7 +455,7 @@ namespace Nektar m_geom->GetLocCoords(coord, Lcoord); - return StdPrismExp::PhysEvaluate(Lcoord); + return StdPrismExp::PhysEvaluate(Lcoord,physvals); } DNekMatSharedPtr PrismExp::CreateStdMatrix(const StdRegions::StdMatrixKey &mkey) diff --git a/library/LocalRegions/PrismExp.h b/library/LocalRegions/PrismExp.h index 33aa24d022d0e17a3f52a0c8ca12e39c6147b484..88a487bc746e31e369664710a63ba2f912dc7b40 100644 --- a/library/LocalRegions/PrismExp.h +++ b/library/LocalRegions/PrismExp.h @@ -109,6 +109,8 @@ namespace Nektar LOCAL_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble> &coord); + LOCAL_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble> &coord, const Array<OneD, const NekDouble> & physvals); + //----------------------------- // Differentiation Methods //----------------------------- @@ -271,6 +273,11 @@ namespace Nektar return PhysEvaluate(coords); } + virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble> &coords, const Array<OneD, const NekDouble> & physvals) + { + return PhysEvaluate(coords,physvals); + } + virtual NekDouble v_Linf(const Array<OneD, const NekDouble> &sol) { return Linf(sol); diff --git a/library/LocalRegions/QuadExp.cpp b/library/LocalRegions/QuadExp.cpp index 0eaf8e1004ec0a02995e3bec4c85f1e06295d620..4a455b5d0a4d957a64e6645c188bc3348802b301 100644 --- a/library/LocalRegions/QuadExp.cpp +++ b/library/LocalRegions/QuadExp.cpp @@ -1314,12 +1314,17 @@ namespace Nektar NekDouble QuadExp::PhysEvaluate(const Array<OneD, const NekDouble> &coord) { - Array<OneD,NekDouble> Lcoord = Array<OneD,NekDouble>(2); + PhysEvaluate(coord,m_phys); + } + NekDouble QuadExp::PhysEvaluate(const Array<OneD, const NekDouble> &coord, const Array<OneD, const NekDouble> & physvals) + { + Array<OneD,NekDouble> Lcoord = Array<OneD,NekDouble>(2); + ASSERTL0(m_geom,"m_geom not defined"); m_geom->GetLocCoords(coord,Lcoord); - return StdQuadExp::PhysEvaluate(Lcoord); + return StdQuadExp::PhysEvaluate(Lcoord, physvals); } DNekMatSharedPtr QuadExp::v_GenMatrix(const StdRegions::StdMatrixKey &mkey) diff --git a/library/LocalRegions/QuadExp.h b/library/LocalRegions/QuadExp.h index 2590102276ab7b13ec0c291c0375f15204c4bf6f..9fa0d43dbdad695be6c769ced98e090b750095fc 100644 --- a/library/LocalRegions/QuadExp.h +++ b/library/LocalRegions/QuadExp.h @@ -171,14 +171,14 @@ namespace Nektar /** \brief Forward transform from physical quadrature space stored in \a inarray and evaluate the expansion coefficients and store in \a (this)->_coeffs */ - LOCAL_REGIONS_EXPORT void FwdTrans(const Array<OneD, const NekDouble> &inarray, - Array<OneD, NekDouble> &outarray); + LOCAL_REGIONS_EXPORT void FwdTrans(const Array<OneD, const NekDouble> &inarray, Array<OneD, NekDouble> &outarray); - LOCAL_REGIONS_EXPORT void FwdTrans_BndConstrained(const Array<OneD, const NekDouble>& inarray, - Array<OneD, NekDouble> &outarray); + LOCAL_REGIONS_EXPORT void FwdTrans_BndConstrained(const Array<OneD, const NekDouble>& inarray, Array<OneD, NekDouble> &outarray); LOCAL_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble> &coord); + LOCAL_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble> &coord, const Array<OneD, const NekDouble> & physvals); + LOCAL_REGIONS_EXPORT void GetEdgePhysVals(const int edge, const Array<OneD, const NekDouble> &inarray, Array<OneD,NekDouble> &outarray); /** \brief Extract the physical values along edge \a edge @@ -481,6 +481,11 @@ namespace Nektar { return PhysEvaluate(coords); } + + virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble> &coords, const Array<OneD, const NekDouble> & physvals) + { + return PhysEvaluate(coords, physvals); + } virtual NekDouble v_Linf(const Array<OneD, const NekDouble> &sol) { diff --git a/library/LocalRegions/SegExp.cpp b/library/LocalRegions/SegExp.cpp index f52ad61dbf7d9cc6075ff9ff05bd8bb75424a75d..b18a87de20ec04c8e15e9db2787384c037f05364 100644 --- a/library/LocalRegions/SegExp.cpp +++ b/library/LocalRegions/SegExp.cpp @@ -939,13 +939,18 @@ cout<<"deps/dx ="<<inarray_d0[i]<<" deps/dy="<<inarray_d1[i]<<endl; } NekDouble SegExp::PhysEvaluate(const Array<OneD, const NekDouble>& coord) + { + PhysEvaluate(coord,m_phys); + } + + NekDouble SegExp::PhysEvaluate(const Array<OneD, const NekDouble>& coord, const Array<OneD, const NekDouble> &physvals) { Array<OneD,NekDouble> Lcoord = Array<OneD,NekDouble>(1); ASSERTL0(m_geom,"_geom not defined"); m_geom->GetLocCoords(coord,Lcoord); - return StdSegExp::PhysEvaluate(Lcoord); + return StdSegExp::PhysEvaluate(Lcoord, physvals); } DNekScalMatSharedPtr SegExp::CreateMatrix(const MatrixKey &mkey) diff --git a/library/LocalRegions/SegExp.h b/library/LocalRegions/SegExp.h index 23ff07857f52f3120de2d1e4cace07ac16c2a938..51394cce9198033a593b473b38e288c1e467362e 100644 --- a/library/LocalRegions/SegExp.h +++ b/library/LocalRegions/SegExp.h @@ -214,6 +214,8 @@ namespace Nektar LOCAL_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& coord); + LOCAL_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& coord, const Array<OneD, const NekDouble> & physvals); + LOCAL_REGIONS_EXPORT void LaplacianMatrixOp(const Array<OneD, const NekDouble> &inarray, Array<OneD,NekDouble> &outarray); @@ -419,6 +421,11 @@ namespace Nektar return PhysEvaluate(coords); } + virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble> & physvals) + { + return PhysEvaluate(coords, physvals); + } + /** \brief Virtual function to evaluate the discrete \f$ L_\infty\f$ error \f$ |\epsilon|_\infty = \max |u - u_{exact}|\f$ where \f$ u_{exact}\f$ is given by the array \a sol. diff --git a/library/LocalRegions/TetExp.cpp b/library/LocalRegions/TetExp.cpp index c6c4a8e890fd6b262e880d96b1c190cdfcb987cc..3cb57a09014606f007705c4144d699847bdf5281 100644 --- a/library/LocalRegions/TetExp.cpp +++ b/library/LocalRegions/TetExp.cpp @@ -412,6 +412,16 @@ namespace Nektar */ NekDouble TetExp::v_PhysEvaluate( const Array<OneD, const NekDouble> &coord) + { + v_PhysEvaluate(coord,m_phys); + } + /** + * @param coord Physical space coordinate + * @returns Evaluation of expansion at given coordinate. + */ + NekDouble TetExp::v_PhysEvaluate( + const Array<OneD, const NekDouble> &coord, + const Array<OneD, const NekDouble> & physvals) { ASSERTL0(m_geom,"m_geom not defined"); @@ -421,7 +431,7 @@ namespace Nektar m_geom->GetLocCoords(coord,Lcoord); // Evaluate point in local (eta) coordinates. - return StdExpansion3D::v_PhysEvaluate(Lcoord); + return StdExpansion3D::v_PhysEvaluate(Lcoord,physvals); } diff --git a/library/LocalRegions/TetExp.h b/library/LocalRegions/TetExp.h index 3b04a7cb194ce08b97d3f48c82fffa7679eea669..c6d50e1c5665775ffc6dc39ba2ceeefa0e015de6 100644 --- a/library/LocalRegions/TetExp.h +++ b/library/LocalRegions/TetExp.h @@ -102,6 +102,10 @@ namespace Nektar virtual NekDouble v_PhysEvaluate( const Array<OneD, const NekDouble> &coords); + virtual NekDouble v_PhysEvaluate( + const Array<OneD, const NekDouble> &coords, + const Array<OneD, const NekDouble> & physvals); + /// Get the x,y,z coordinates of each quadrature point. virtual void v_GetCoords(Array<OneD,NekDouble> &coords_0, Array<OneD,NekDouble> &coords_1, diff --git a/library/LocalRegions/TriExp.cpp b/library/LocalRegions/TriExp.cpp index 8ecfe317ee2cd97d40f4ec57409a6bb3b896e1a5..2318d6fc9a0aa6e7881626d8286055e421127230 100644 --- a/library/LocalRegions/TriExp.cpp +++ b/library/LocalRegions/TriExp.cpp @@ -1400,13 +1400,18 @@ namespace Nektar } NekDouble TriExp::PhysEvaluate(const Array<OneD, const NekDouble> &coord) + { + PhysEvaluate(coord,m_phys); + } + + NekDouble TriExp::PhysEvaluate(const Array<OneD, const NekDouble> &coord, const Array<OneD, const NekDouble> & physvals) { Array<OneD,NekDouble> Lcoord = Array<OneD,NekDouble>(2); ASSERTL0(m_geom,"m_geom not defined"); m_geom->GetLocCoords(coord,Lcoord); - - return StdTriExp::PhysEvaluate(Lcoord); + + return StdTriExp::PhysEvaluate(Lcoord, physvals); } DNekScalMatSharedPtr TriExp::CreateMatrix(const MatrixKey &mkey) diff --git a/library/LocalRegions/TriExp.h b/library/LocalRegions/TriExp.h index 6ae88abeccfadc734e5af5590b922c772c75203e..ba7ee3d8a68cc7131d515682fe229ae2e658c1cf 100644 --- a/library/LocalRegions/TriExp.h +++ b/library/LocalRegions/TriExp.h @@ -165,6 +165,8 @@ namespace Nektar Array<OneD, NekDouble> &outarray); LOCAL_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble> &coord); + LOCAL_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble> &coord, const Array<OneD, const NekDouble> & physvals); + /** \brief Extract the physical values along edge \a edge from \a inarray into \a outarray following the local edge orientation and point distribution defined by @@ -471,12 +473,16 @@ namespace Nektar return PhysEvaluate(coords); } + virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble> &coords, const Array<OneD, const NekDouble> & physvals) + { + return PhysEvaluate(coords, physvals); + } + virtual NekDouble v_Linf(const Array<OneD, const NekDouble> &sol) { return Linf(sol); } - virtual NekDouble v_Linf() { return Linf(); diff --git a/library/MultiRegions/ExpList.cpp b/library/MultiRegions/ExpList.cpp index 57da7ef06b478dfb9139fca3269c49f1bdbe39a7..552299e769b2a5c303c0720d7e2563f5c81422ca 100644 --- a/library/MultiRegions/ExpList.cpp +++ b/library/MultiRegions/ExpList.cpp @@ -1294,12 +1294,25 @@ namespace Nektar /* region defined by vertices. The do point search. **/ int ExpList::GetExpIndex( - const Array<OneD, const NekDouble> &gloCoord) + const Array<OneD, const NekDouble> &gloCoord, + NekDouble tol) { - for (int i = 0; i < (*m_exp).size(); ++i) + static int start = 0; + // start search at previous element or 0 + for (int i = start; i < (*m_exp).size(); ++i) { - if ((*m_exp)[i]->GetGeom()->ContainsPoint(gloCoord)) + if ((*m_exp)[i]->GetGeom()->ContainsPoint(gloCoord,tol)) + { + start = i; + return i; + } + } + + for (int i = 0; i < start; ++i) + { + if ((*m_exp)[i]->GetGeom()->ContainsPoint(gloCoord,tol)) { + start = i; return i; } } diff --git a/library/MultiRegions/ExpList.h b/library/MultiRegions/ExpList.h index b6cf0b33be0d0f2f72a1fb18bf6e9eedb772838e..c3c129218e15f55eeff65014d20abf8a0fe3c7a0 100644 --- a/library/MultiRegions/ExpList.h +++ b/library/MultiRegions/ExpList.h @@ -524,7 +524,7 @@ namespace Nektar /// This function returns the index of the local elemental /// expansion containing the arbitrary point given by \a gloCoord. - MULTI_REGIONS_EXPORT int GetExpIndex(const Array<OneD, const NekDouble> &gloCoord); + MULTI_REGIONS_EXPORT int GetExpIndex(const Array<OneD, const NekDouble> &gloCoord, NekDouble tol = 0.0); /// Get the start offset position for a global list of #m_coeffs /// correspoinding to element n. @@ -1037,54 +1037,54 @@ namespace Nektar Array<OneD, NekDouble> &coord_1, Array<OneD, NekDouble> &coord_2 = NullNekDouble1DArray); - virtual void v_GetCoords(NekDouble &x,NekDouble &y,NekDouble &z); - - virtual void v_GetCoord(Array<OneD, NekDouble> &coords); + virtual void v_GetCoords(NekDouble &x,NekDouble &y,NekDouble &z); + + virtual void v_GetCoord(Array<OneD, NekDouble> &coords); - virtual void v_SetCoeff(NekDouble val); - - virtual void v_SetPhys(NekDouble val); - - virtual const SpatialDomains::VertexComponentSharedPtr &v_GetGeom(void) const; - - virtual const SpatialDomains::VertexComponentSharedPtr &v_GetVertex(void) const; - - virtual void v_PhysDeriv(const Array<OneD, const NekDouble> &inarray, - Array<OneD, NekDouble> &out_d0, - Array<OneD, NekDouble> &out_d1, - Array<OneD, NekDouble> &out_d2, bool UseContCoeffs = false); - - virtual void v_PhysDeriv(const int dir, - const Array<OneD, const NekDouble> &inarray, - Array<OneD, NekDouble> &out_d, bool UseContCoeffs = false); - - virtual void v_PhysDeriv(Direction edir, - const Array<OneD, const NekDouble> &inarray, - Array<OneD, NekDouble> &out_d, bool UseContCoeffs = false); - - virtual void v_HomogeneousFwdTrans(const Array<OneD, const NekDouble> &inarray, - Array<OneD, NekDouble> &outarray, - bool UseContCoeffs = false); - - virtual void v_HomogeneousBwdTrans(const Array<OneD, const NekDouble> &inarray, - Array<OneD, NekDouble> &outarray, - bool UseContCoeffs = false); - - virtual void v_Dealiasing(Array<OneD, NekDouble> &outarray, bool UseContCoeffs = false); - - virtual void v_GetBCValues(Array<OneD, NekDouble> &BndVals, - const Array<OneD, NekDouble> &TotField, - int BndID); - - virtual void v_NormVectorIProductWRTBase(Array<OneD, const NekDouble> &V1, - Array<OneD, const NekDouble> &V2, - Array<OneD, NekDouble> &outarray, - int BndID); - + virtual void v_SetCoeff(NekDouble val); + + virtual void v_SetPhys(NekDouble val); + + virtual const SpatialDomains::VertexComponentSharedPtr &v_GetGeom(void) const; + + virtual const SpatialDomains::VertexComponentSharedPtr &v_GetVertex(void) const; + + virtual void v_PhysDeriv(const Array<OneD, const NekDouble> &inarray, + Array<OneD, NekDouble> &out_d0, + Array<OneD, NekDouble> &out_d1, + Array<OneD, NekDouble> &out_d2, bool UseContCoeffs = false); + + virtual void v_PhysDeriv(const int dir, + const Array<OneD, const NekDouble> &inarray, + Array<OneD, NekDouble> &out_d, bool UseContCoeffs = false); + + virtual void v_PhysDeriv(Direction edir, + const Array<OneD, const NekDouble> &inarray, + Array<OneD, NekDouble> &out_d, bool UseContCoeffs = false); + + virtual void v_HomogeneousFwdTrans(const Array<OneD, const NekDouble> &inarray, + Array<OneD, NekDouble> &outarray, + bool UseContCoeffs = false); + + virtual void v_HomogeneousBwdTrans(const Array<OneD, const NekDouble> &inarray, + Array<OneD, NekDouble> &outarray, + bool UseContCoeffs = false); + + virtual void v_Dealiasing(Array<OneD, NekDouble> &outarray, bool UseContCoeffs = false); + + virtual void v_GetBCValues(Array<OneD, NekDouble> &BndVals, + const Array<OneD, NekDouble> &TotField, + int BndID); + + virtual void v_NormVectorIProductWRTBase(Array<OneD, const NekDouble> &V1, + Array<OneD, const NekDouble> &V2, + Array<OneD, NekDouble> &outarray, + int BndID); + virtual void v_SetUpPhysNormals(); - + virtual void v_SetUpTangents(); - + virtual void v_GetBoundaryToElmtMap(Array<OneD, int> &ElmtID, Array<OneD,int> &EdgeID); diff --git a/library/MultiRegions/LocalToGlobalC0ContMap.cpp b/library/MultiRegions/LocalToGlobalC0ContMap.cpp index e6f7dfc933380fb582a70f60d3430573495b9ccc..a997064212716ca76b7ff5062b538d19d71fadef 100644 --- a/library/MultiRegions/LocalToGlobalC0ContMap.cpp +++ b/library/MultiRegions/LocalToGlobalC0ContMap.cpp @@ -1003,11 +1003,23 @@ namespace Nektar systemSingular = (s == 1 ? true : false); if(systemSingular == true && checkIfSystemSingular) { - //last region i and j=0 edge - bndSegExp = boost::dynamic_pointer_cast<LocalRegions::SegExp>(bndCondExp[bndCondExp.num_elements()-1]->GetExp(0)); + if(m_session->DefinesParameter("SingularElement")) + { + int s_eid = m_session->GetParameter("SingularElement"); + + ASSERTL1(s_eid < locExpVector.size(),"SingularElement Parameter is too large"); + + meshVertId = locExpVector[s_eid]->GetGeom2D()->GetVid(0); + } + else + { + //last region i and j=0 edge + bndSegExp = boost::dynamic_pointer_cast<LocalRegions::SegExp>(bndCondExp[bndCondExp.num_elements()-1]->GetExp(0)); + + //first vertex 0 of the edge + meshVertId = (bndSegExp->GetGeom1D())->GetVid(0); + } - //first vertex 0 of the edge - meshVertId = (bndSegExp->GetGeom1D())->GetVid(0); if(ReorderedGraphVertId[0].count(meshVertId) == 0) { ReorderedGraphVertId[0][meshVertId] = graphVertId++; diff --git a/library/SpatialDomains/Geometry.h b/library/SpatialDomains/Geometry.h index bdc8b2b865ec44e60d7a2e2f779f3d4cbbcec0ca..b70e22bedb292877eb2375f41b94bd3cb7d0c577 100644 --- a/library/SpatialDomains/Geometry.h +++ b/library/SpatialDomains/Geometry.h @@ -166,9 +166,9 @@ namespace Nektar } inline bool ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord) + const Array<OneD, const NekDouble> &gloCoord, NekDouble tol = 0.0) { - return v_ContainsPoint(gloCoord); + return v_ContainsPoint(gloCoord,tol); } protected: @@ -242,7 +242,7 @@ namespace Nektar } virtual bool v_ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord) + const Array<OneD, const NekDouble> &gloCoord, NekDouble tol = 0.0) { NEKERROR(ErrorUtil::efatal, "This function has not been defined for this geometry"); diff --git a/library/SpatialDomains/Geometry2D.h b/library/SpatialDomains/Geometry2D.h index 93fc96d629e7b0052c734a52259498fe361532b4..c4c42079ae38b1af9ecc8724cb1c3a55e2e0487c 100644 --- a/library/SpatialDomains/Geometry2D.h +++ b/library/SpatialDomains/Geometry2D.h @@ -353,6 +353,14 @@ namespace Nektar { return 2; } + + virtual bool v_ContainsPoint( + const Array<OneD, const NekDouble> &gloCoord, NekDouble tol = 0.0) + { + NEKERROR(ErrorUtil::efatal, + "This function has not been defined for this geometry"); + return false; + } }; diff --git a/library/SpatialDomains/HexGeom.cpp b/library/SpatialDomains/HexGeom.cpp index 402349378dbee63484fc684d66fa8ef2bbfb801b..c3580afd197a84e853931ac13c523123b8e787e7 100644 --- a/library/SpatialDomains/HexGeom.cpp +++ b/library/SpatialDomains/HexGeom.cpp @@ -792,16 +792,16 @@ namespace Nektar } bool HexGeom::v_ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord) + const Array<OneD, const NekDouble> &gloCoord, NekDouble tol) { ASSERTL1(gloCoord.num_elements() == 3, "Three dimensional geometry expects three coordinates."); Array<OneD,NekDouble> stdCoord(GetCoordim(),0.0); GetLocCoords(gloCoord, stdCoord); - if (stdCoord[0] >= -1 && stdCoord[0] <= 1 - && stdCoord[1] >= -1 && stdCoord[1] <= 1 - && stdCoord[2] >= -1 && stdCoord[2] <= 1) + if (stdCoord[0] >= -(1+tol) && stdCoord[0] <= 1+tol + && stdCoord[1] >= -(1+tol) && stdCoord[1] <= 1+tol + && stdCoord[2] >= -(1+tol) && stdCoord[2] <= 1+tol) { return true; } diff --git a/library/SpatialDomains/HexGeom.h b/library/SpatialDomains/HexGeom.h index a189f20427dfaca99a2b8f8193818359ad447b72..6185aaa48e0cdf2a20e990fef13e1e5443467416 100644 --- a/library/SpatialDomains/HexGeom.h +++ b/library/SpatialDomains/HexGeom.h @@ -318,8 +318,7 @@ namespace Nektar return kNedges; } - virtual bool v_ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord); + virtual bool v_ContainsPoint(const Array<OneD, const NekDouble> &gloCoord, NekDouble tol = 0.0); }; diff --git a/library/SpatialDomains/QuadGeom.cpp b/library/SpatialDomains/QuadGeom.cpp index a14de53aaac7955c32fad8c0a82165fadf0c0a5d..61bd74f9519f11b13b4243d80af5b4f4d461b123 100644 --- a/library/SpatialDomains/QuadGeom.cpp +++ b/library/SpatialDomains/QuadGeom.cpp @@ -407,15 +407,15 @@ namespace Nektar } bool QuadGeom::v_ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord) + const Array<OneD, const NekDouble> &gloCoord, NekDouble tol) { ASSERTL1(gloCoord.num_elements() >= 2, "Two dimensional geometry expects at least two coordinates."); Array<OneD,NekDouble> stdCoord(GetCoordim(),0.0); GetLocCoords(gloCoord, stdCoord); - if (stdCoord[0] >= -1 && stdCoord[1] >= -1 - && stdCoord[0] <= 1 && stdCoord[1] <= 1) + if (stdCoord[0] >= -(1+tol) && stdCoord[1] >= -(1+tol) + && stdCoord[0] <= (1+tol) && stdCoord[1] <= (1+tol)) { return true; } diff --git a/library/SpatialDomains/QuadGeom.h b/library/SpatialDomains/QuadGeom.h index e917463e2f0d580c3156d9252d075156c0314866..da4788a3b957f83b1c33dad1f9442930661bc393 100644 --- a/library/SpatialDomains/QuadGeom.h +++ b/library/SpatialDomains/QuadGeom.h @@ -319,7 +319,7 @@ namespace Nektar } virtual bool v_ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord); + const Array<OneD, const NekDouble> &gloCoord, NekDouble tol = 0.0); }; }; //end of namespace diff --git a/library/SpatialDomains/SegGeom.cpp b/library/SpatialDomains/SegGeom.cpp index 1ffaa57a23fd652e492d1962776a72240639b428..f804f9050154502f09f959b00e5db10b5f3a9c85 100644 --- a/library/SpatialDomains/SegGeom.cpp +++ b/library/SpatialDomains/SegGeom.cpp @@ -393,12 +393,11 @@ namespace Nektar } } - bool SegGeom::v_ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord) + bool SegGeom::v_ContainsPoint(const Array<OneD, const NekDouble> &gloCoord, NekDouble tol) { Array<OneD,NekDouble> stdCoord(GetCoordim(),0.0); GetLocCoords(gloCoord, stdCoord); - if (stdCoord[0] >= -1 && stdCoord[0] <= 1) + if (stdCoord[0] >= -(1+tol) && stdCoord[0] <= 1+tol) { return true; } diff --git a/library/SpatialDomains/SegGeom.h b/library/SpatialDomains/SegGeom.h index 3167b9a15c5d24f1cb2ac5839013076fc9da4372..67156034cdfc91293e608cc932c214bbc1a02940 100644 --- a/library/SpatialDomains/SegGeom.h +++ b/library/SpatialDomains/SegGeom.h @@ -259,7 +259,7 @@ namespace Nektar } virtual bool v_ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord); + const Array<OneD, const NekDouble> &gloCoord, NekDouble tol = 0.0); }; // shorthand for boost pointer diff --git a/library/SpatialDomains/TetGeom.cpp b/library/SpatialDomains/TetGeom.cpp index 4e55d0f8e3527e7a8ea3a46a43213fa842eed11a..13c030b8d3d827ceecebeaa618c884651878d259 100644 --- a/library/SpatialDomains/TetGeom.cpp +++ b/library/SpatialDomains/TetGeom.cpp @@ -726,7 +726,7 @@ namespace Nektar * within this tetrahedral geometry. */ bool TetGeom::v_ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord) + const Array<OneD, const NekDouble> &gloCoord, NekDouble tol) { // Validation checks ASSERTL1(gloCoord.num_elements() == 3, @@ -737,8 +737,9 @@ namespace Nektar GetLocCoords(gloCoord, locCoord); // Check local coordinate is within [-1,1]^3 bounds. - if (locCoord[0] >= -1 && locCoord[1] >= -1 && locCoord[2] >= -1 - && locCoord[0] <= 1 && locCoord[1] <= 1 && locCoord[2] <= 1) + if (locCoord[0] >= -(1+tol) && locCoord[1] >= -(1+tol) + && locCoord[2] >= -(1+tol) + && locCoord[0] + locCoord[1] + locCoord[2] <= tol) { return true; } diff --git a/library/SpatialDomains/TetGeom.h b/library/SpatialDomains/TetGeom.h index baf659564205aa98cb061e1a984b438e0a5ed220..5dd30dacb91f44833d320582cae496f2cc1d7c95 100644 --- a/library/SpatialDomains/TetGeom.h +++ b/library/SpatialDomains/TetGeom.h @@ -326,7 +326,7 @@ namespace Nektar } virtual bool v_ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord); + const Array<OneD, const NekDouble> &gloCoord, NekDouble tol = 0.0); }; diff --git a/library/SpatialDomains/TriGeom.cpp b/library/SpatialDomains/TriGeom.cpp index 557daeadee6f4f1ff51135b4c19a1ea38da2c9c8..08f8e43b921fe651b5cd1b2be3e101bdbcacea62 100644 --- a/library/SpatialDomains/TriGeom.cpp +++ b/library/SpatialDomains/TriGeom.cpp @@ -361,16 +361,15 @@ namespace Nektar return returnval; } - bool TriGeom::v_ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord) + bool TriGeom::v_ContainsPoint(const Array<OneD, const NekDouble> &gloCoord, NekDouble tol) { ASSERTL1(gloCoord.num_elements() >= 2, "Two dimensional geometry expects at least two coordinates."); Array<OneD,NekDouble> stdCoord(GetCoordim(),0.0); GetLocCoords(gloCoord, stdCoord); - if (stdCoord[0] >= -1 && stdCoord[1] >= -1 - && stdCoord[0] + stdCoord[1] <= 0) + if (stdCoord[0] >= -(1+tol) && stdCoord[1] >= -(1+tol) + && stdCoord[0] + stdCoord[1] <= tol) { return true; } diff --git a/library/SpatialDomains/TriGeom.h b/library/SpatialDomains/TriGeom.h index cdcf9714031c80a6bb045a3b97e836fe2221ba37..7e6ec3b54bb1fd4ec944996c6e529ba6bbfc14e2 100644 --- a/library/SpatialDomains/TriGeom.h +++ b/library/SpatialDomains/TriGeom.h @@ -315,8 +315,7 @@ namespace Nektar return kNedges; } - virtual bool v_ContainsPoint( - const Array<OneD, const NekDouble> &gloCoord); + virtual bool v_ContainsPoint(const Array<OneD, const NekDouble> &gloCoord, NekDouble tol = 0.0); }; }; //end of namespace SpatialDomains }; //end of namespace Nektar diff --git a/library/StdRegions/StdExpansion.cpp b/library/StdRegions/StdExpansion.cpp index c4e5dc537134d41541b5428a7b753d89cbfe5123..2cdb7102fc674484d66102f2fbf43d3411a56132 100644 --- a/library/StdRegions/StdExpansion.cpp +++ b/library/StdRegions/StdExpansion.cpp @@ -1373,6 +1373,13 @@ namespace Nektar } + NekDouble StdExpansion::v_PhysEvaluate(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble>& physvals) + { + NEKERROR(ErrorUtil::efatal, "Method does not exist for this shape"); + return 0; + } + + void StdExpansion::v_FillMode(const int mode, Array<OneD, NekDouble> &outarray) { NEKERROR(ErrorUtil::efatal, "This function has not " diff --git a/library/StdRegions/StdExpansion.h b/library/StdRegions/StdExpansion.h index e50678c72e3bf7c7b1f5e8ecd6e4494949efb248..6703699d79f9759327ae5caee1ed8a553c7e6fa2 100644 --- a/library/StdRegions/StdExpansion.h +++ b/library/StdRegions/StdExpansion.h @@ -1137,6 +1137,36 @@ namespace Nektar return v_PhysEvaluate(coords); } + + + /** \brief This function evaluates the expansion at a single + * (arbitrary) point of the domain + * + * This function is a wrapper around the virtual function + * \a v_PhysEvaluate() + * + * Based on the value of the expansion at the quadrature + * points provided in \a physvals, this function + * calculates the value of the expansion at an arbitrary + * single points (with coordinates \f$ \mathbf{x_c}\f$ + * given by the pointer \a coords). This operation, + * equivalent to \f[ u(\mathbf{x_c}) = \sum_p + * \phi_p(\mathbf{x_c}) \hat{u}_p \f] is evaluated using + * Lagrangian interpolants through the quadrature points: + * \f[ u(\mathbf{x_c}) = \sum_p h_p(\mathbf{x_c}) u_p\f] + * + * \param coords the coordinates of the single point + * \param physvals the interpolated field at the quadrature points + * + * \return returns the value of the expansion at the + * single point + */ + NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& coords, + const Array<OneD, const NekDouble>& physvals) + { + return v_PhysEvaluate(coords,physvals); + } + const boost::shared_ptr<SpatialDomains::GeomFactors>& GetMetricInfo(void) const { return v_GetMetricInfo(); @@ -1531,6 +1561,8 @@ namespace Nektar STD_REGIONS_EXPORT virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& coords); + STD_REGIONS_EXPORT virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble> & physvals); + STD_REGIONS_EXPORT virtual void v_FillMode(const int mode, Array<OneD, NekDouble> &outarray); STD_REGIONS_EXPORT virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey); diff --git a/library/StdRegions/StdExpansion1D.cpp b/library/StdRegions/StdExpansion1D.cpp index 94132020f2589c60777d648f51778b346bb02139..4aad708c9a6d605f7ede28a7fe8394152177b554 100644 --- a/library/StdRegions/StdExpansion1D.cpp +++ b/library/StdRegions/StdExpansion1D.cpp @@ -103,8 +103,13 @@ namespace Nektar #endif //NEKTAR_USING_DIRECT_BLAS_CALLS } - NekDouble StdExpansion1D::PhysEvaluate(const Array<OneD, const NekDouble>& Lcoord) - { + NekDouble StdExpansion1D::PhysEvaluate(const Array<OneD, const NekDouble>& Lcoord) + { + PhysEvaluate(Lcoord,m_phys); + } + + NekDouble StdExpansion1D::PhysEvaluate(const Array<OneD, const NekDouble>& Lcoord, const Array<OneD, const NekDouble> & physvals) + { int nquad = GetTotPoints(); NekDouble val; DNekMatSharedPtr I = m_base[0]->GetI(Lcoord); @@ -112,7 +117,7 @@ namespace Nektar ASSERTL2(Lcoord[0] >= -1,"Lcoord[0] < -1"); ASSERTL2(Lcoord[0] <= 1,"Lcoord[0] > 1"); - val = Blas::Ddot(nquad, I->GetPtr(), 1, m_phys, 1); + val = Blas::Ddot(nquad, I->GetPtr(), 1, physvals, 1); return val; } diff --git a/library/StdRegions/StdExpansion1D.h b/library/StdRegions/StdExpansion1D.h index 8e86510d6616e428dd9819e7d8bfe48f1d749166..1c8c5fee3b47c118ac8034fd320eaf5904e93be6 100644 --- a/library/StdRegions/StdExpansion1D.h +++ b/library/StdRegions/StdExpansion1D.h @@ -77,6 +77,8 @@ namespace Nektar */ STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& coords); + STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble> & physvals); + void SetCoeffsToOrientation(StdRegions::EdgeOrientation dir) { v_SetCoeffsToOrientation(dir); @@ -120,6 +122,11 @@ namespace Nektar return PhysEvaluate(coords); } + virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble> & physvals) + { + return PhysEvaluate(coords,physvals); + } + virtual void v_SetCoeffsToOrientation(StdRegions::EdgeOrientation dir, Array<OneD, const NekDouble> &inarray, Array<OneD, NekDouble> &outarray) diff --git a/library/StdRegions/StdExpansion2D.cpp b/library/StdRegions/StdExpansion2D.cpp index 9439861169483f5f036cfb6c7910cf7ff5ae9c31..b969d94351d35c37999cfb81d32b7bfbf40530ce 100644 --- a/library/StdRegions/StdExpansion2D.cpp +++ b/library/StdRegions/StdExpansion2D.cpp @@ -115,6 +115,12 @@ namespace Nektar } NekDouble StdExpansion2D::PhysEvaluate(const Array<OneD, const NekDouble>& coords) + { + PhysEvaluate(coords,m_phys); + } + + + NekDouble StdExpansion2D::PhysEvaluate(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble> & physvals) { NekDouble val; int i; @@ -133,7 +139,7 @@ namespace Nektar for (i = 0; i < nq1;++i) { wsp1[i] = Blas::Ddot(nq0, &(I->GetPtr())[0], 1, - &m_phys[i * nq0], 1); + &physvals[i * nq0], 1); } // interpolate in second coordinate direction diff --git a/library/StdRegions/StdExpansion2D.h b/library/StdRegions/StdExpansion2D.h index 656b0ece0e82051edb951f9a36bcf662f59e104c..f3bd1f7d5be1242742cc7f13ea9c10a60c8cf6cb 100644 --- a/library/StdRegions/StdExpansion2D.h +++ b/library/StdRegions/StdExpansion2D.h @@ -118,6 +118,8 @@ namespace Nektar */ STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& coords); + STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble> & physvals); + STD_REGIONS_EXPORT NekDouble Integral(const Array<OneD, const NekDouble>& inarray, const Array<OneD, const NekDouble>& w0, const Array<OneD, const NekDouble>& w1); @@ -150,6 +152,11 @@ namespace Nektar return PhysEvaluate(coords); } + virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble> & physvals) + { + return PhysEvaluate(coords,physvals); + } + virtual void v_SetUpPhysNormals(const int edge); const NormalVector & v_GetEdgeNormal(const int edge) const; diff --git a/library/StdRegions/StdExpansion3D.cpp b/library/StdRegions/StdExpansion3D.cpp index d2280fe82034fdba4d632dac34d5bbba8bc7eebb..b0369052299505bd878ab8a9e0de2fe5d74a3a87 100644 --- a/library/StdRegions/StdExpansion3D.cpp +++ b/library/StdRegions/StdExpansion3D.cpp @@ -201,7 +201,12 @@ namespace Nektar } - NekDouble StdExpansion3D::v_PhysEvaluate(const Array<OneD, const NekDouble> &coords) + NekDouble StdExpansion3D::v_PhysEvaluate(const Array<OneD, const NekDouble> &coords ) + { + v_PhysEvaluate(coords,m_phys); + } + + NekDouble StdExpansion3D::v_PhysEvaluate(const Array<OneD, const NekDouble> &coords, const Array<OneD, const NekDouble> & physvals) { NekDouble value; ASSERTL2(coords[0] >= -1,"coord[0] < -1"); @@ -227,7 +232,7 @@ namespace Nektar interpolatingNodes = &I->GetPtr()[0]; for(int i = 0; i < Qy*Qz;++i) { - sumFactorization_qr[i] = Blas::Ddot(Qx, interpolatingNodes, 1, &m_phys[ i*Qx ], 1); + sumFactorization_qr[i] = Blas::Ddot(Qx, interpolatingNodes, 1, &physvals[ i*Qx ], 1); } // Interpolate in second coordinate direction diff --git a/library/StdRegions/StdExpansion3D.h b/library/StdRegions/StdExpansion3D.h index 1e588a5793563746004102360a1884fa99570268..752c0f116770c93b783c49e013643995cf3abd8d 100644 --- a/library/StdRegions/StdExpansion3D.h +++ b/library/StdRegions/StdExpansion3D.h @@ -130,10 +130,18 @@ namespace Nektar return v_PhysEvaluate(coords); } + NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& coords, + const Array<OneD, const NekDouble>& physvals) + { + return v_PhysEvaluate(coords, physvals); + } + protected: STD_REGIONS_EXPORT virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& coords); + STD_REGIONS_EXPORT virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble> & physvals); + private: virtual int v_GetShapeDimension() const diff --git a/library/StdRegions/StdHexExp.cpp b/library/StdRegions/StdHexExp.cpp index 451171e201cf5d5b18e356cbcad9a8fe654a55a5..df895002982e63382b9201fda488437c3b4dd04b 100644 --- a/library/StdRegions/StdHexExp.cpp +++ b/library/StdRegions/StdHexExp.cpp @@ -2540,6 +2540,12 @@ namespace Nektar return StdExpansion3D::v_PhysEvaluate(Lcoords); } + NekDouble StdHexExp::v_PhysEvaluate( + Array<OneD, const NekDouble>& Lcoords, const Array<OneD, const NekDouble> & physvals) + { + return StdExpansion3D::v_PhysEvaluate(Lcoords, physvals); + } + int StdHexExp::v_GetEdgeNcoeffs(const int i) const { ASSERTL2((i >= 0)&&(i <= 11),"edge id is out of range"); diff --git a/library/StdRegions/StdHexExp.h b/library/StdRegions/StdHexExp.h index d973c64a680c92e90f8135ae896067cf96a7d9c4..31e6d38b9bbe8d2c027c4b78a3f2cc22dd9f8a0c 100644 --- a/library/StdRegions/StdHexExp.h +++ b/library/StdRegions/StdHexExp.h @@ -240,6 +240,9 @@ namespace Nektar STD_REGIONS_EXPORT virtual NekDouble v_PhysEvaluate(Array<OneD, const NekDouble>& Lcoords); + + STD_REGIONS_EXPORT virtual NekDouble v_PhysEvaluate(Array<OneD, const NekDouble>& Lcoords, const Array<OneD, const NekDouble> & physvals); + STD_REGIONS_EXPORT virtual void v_MassMatrixOp( const Array<OneD, const NekDouble> &inarray, Array<OneD,NekDouble> &outarray, diff --git a/library/StdRegions/StdPrismExp.cpp b/library/StdRegions/StdPrismExp.cpp index 38136a6e3c8371dda45e87fd90324c4cd03f3232..b8a5c275c9e7eb4115fe2d0cf7a83ec17028c578 100644 --- a/library/StdRegions/StdPrismExp.cpp +++ b/library/StdRegions/StdPrismExp.cpp @@ -658,6 +658,11 @@ namespace Nektar NekDouble StdPrismExp::PhysEvaluate(const Array<OneD, const NekDouble>& xi) + { + PhysEvaluate(xi,m_phys); + } + + NekDouble StdPrismExp::PhysEvaluate(const Array<OneD, const NekDouble>& xi, const Array<OneD, const NekDouble> & physvals) { Array<OneD, NekDouble> eta = Array<OneD, NekDouble>(3); @@ -682,7 +687,7 @@ namespace Nektar } - return StdExpansion3D::PhysEvaluate(eta); + return StdExpansion3D::PhysEvaluate(eta, physvals); } diff --git a/library/StdRegions/StdPrismExp.h b/library/StdRegions/StdPrismExp.h index d8a25e352f1bd51e545b21137700b43cb7afda87..0f9a348f26d022aa5ab4832b83b91e69a5db5da9 100644 --- a/library/StdRegions/StdPrismExp.h +++ b/library/StdRegions/StdPrismExp.h @@ -205,7 +205,9 @@ namespace Nektar /** \brief Single Point Evaluation */ STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& xi); - + + STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& xi, const Array<OneD, const NekDouble> & physvals); + STD_REGIONS_EXPORT void GetCoords( Array<OneD, NekDouble> & xi_x, Array<OneD, NekDouble> & xi_y, Array<OneD, NekDouble> & xi_z); STD_REGIONS_EXPORT void FillMode(const int mode, Array<OneD, NekDouble> &outarray); STD_REGIONS_EXPORT void WriteToFile(std::ofstream &outfile, OutputFormat format, const bool dumpVar = true, std::string var = "v"); @@ -404,6 +406,11 @@ namespace Nektar return PhysEvaluate(Lcoords); } + virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& Lcoords, const Array<OneD, const NekDouble> & physvals) + { + return PhysEvaluate(Lcoords, physvals); + } + virtual void v_WriteToFile(std::ofstream &outfile, OutputFormat format, const bool dumpVar = true, std::string var = "v") { WriteToFile(outfile,format,dumpVar,var); diff --git a/library/StdRegions/StdPyrExp.cpp b/library/StdRegions/StdPyrExp.cpp index 4f584754141e50fb6d40fbe4aee4b1a2913a783e..970634a837de0f5e499241538db6dad4b308d844 100644 --- a/library/StdRegions/StdPyrExp.cpp +++ b/library/StdRegions/StdPyrExp.cpp @@ -570,6 +570,11 @@ namespace Nektar } NekDouble StdPyrExp::PhysEvaluate(const Array<OneD, const NekDouble>& xi) + { + PhysEvaluate(xi,m_phys); + } + + NekDouble StdPyrExp::PhysEvaluate(const Array<OneD, const NekDouble>& xi, const Array<OneD, const NekDouble> & physvals) { Array<OneD, NekDouble> eta = Array<OneD, NekDouble>(3); @@ -592,7 +597,7 @@ namespace Nektar // cout << "xi_x = " << xi[0] << ", xi_y = " << xi[1] << ", xi_z = " << xi[2] << endl; // cout << "eta_x = " << eta[0] << ", eta_y = " << eta[1] << ", eta_z = " << eta[2] << endl; - return StdExpansion3D::PhysEvaluate(eta); + return StdExpansion3D::PhysEvaluate(eta, physvals); } void StdPyrExp::GetCoords( Array<OneD, NekDouble> & xi_x, Array<OneD, NekDouble> & xi_y, Array<OneD, NekDouble> & xi_z) diff --git a/library/StdRegions/StdPyrExp.h b/library/StdRegions/StdPyrExp.h index 89a73fb1aeececf06ccd405917fd87e7d78da0c8..a5fcc0171019404bf96bf6910e479b5ee703c103 100644 --- a/library/StdRegions/StdPyrExp.h +++ b/library/StdRegions/StdPyrExp.h @@ -215,6 +215,7 @@ namespace Nektar /** \brief Single Point Evaluation */ STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& xi); + STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& xi, const Array<OneD, const NekDouble> & physvals); STD_REGIONS_EXPORT void GetCoords( Array<OneD, NekDouble> & xi_x, Array<OneD, NekDouble> & xi_y, Array<OneD, NekDouble> & xi_z); STD_REGIONS_EXPORT void WriteToFile(std::ofstream &outfile, OutputFormat format, const bool dumpVar = true, std::string var = "v"); @@ -392,6 +393,11 @@ namespace Nektar { return PhysEvaluate(Lcoords); } + + virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& Lcoords, const Array<OneD, const NekDouble> & physvals) + { + return PhysEvaluate(Lcoords, physvals); + } virtual int v_GetEdgeNcoeffs(const int i) const { diff --git a/library/StdRegions/StdQuadExp.h b/library/StdRegions/StdQuadExp.h index e58dd6b1588d721b6961eba1eb4501726692c998..f84aa7aa3e36db28ca0f94d7e73682c4041f7d89 100644 --- a/library/StdRegions/StdQuadExp.h +++ b/library/StdRegions/StdQuadExp.h @@ -213,7 +213,13 @@ namespace Nektar NekDouble PhysEvaluate(Array<OneD, const NekDouble>& coords) { - return StdExpansion2D::PhysEvaluate(coords); + return StdExpansion2D::PhysEvaluate(coords, m_phys); + } + + NekDouble PhysEvaluate(Array<OneD, const NekDouble>& coords, + const Array<OneD, const NekDouble> & physvals) + { + return StdExpansion2D::PhysEvaluate(coords, physvals); } STD_REGIONS_EXPORT void GetBoundaryMap(Array<OneD, unsigned int>& outarray); @@ -629,6 +635,12 @@ namespace Nektar return PhysEvaluate(Lcoords); } + + virtual NekDouble v_PhysEvaluate(Array<OneD, const NekDouble>& Lcoords, const Array<OneD, const NekDouble> &physvals) + { + return PhysEvaluate(Lcoords, physvals); + } + virtual void v_GetBoundaryMap(Array<OneD, unsigned int>& outarray) { GetBoundaryMap(outarray); diff --git a/library/StdRegions/StdTetExp.cpp b/library/StdRegions/StdTetExp.cpp index b7c4ccd8b133f1c6631e76b2e25fc1e26a413c7f..bdb114dcc7e5a108d3192ad890feb7c8c3112a47 100644 --- a/library/StdRegions/StdTetExp.cpp +++ b/library/StdRegions/StdTetExp.cpp @@ -1079,6 +1079,11 @@ namespace Nektar /////////////////////////////// NekDouble StdTetExp::v_PhysEvaluate(const Array<OneD, const NekDouble>& xi) + { + v_PhysEvaluate(xi,m_phys); + } + + NekDouble StdTetExp::v_PhysEvaluate(const Array<OneD, const NekDouble>& xi, const Array<OneD, const NekDouble> & physvals) { // Validation checks ASSERTL0(xi[0] + xi[1] + xi[2] <= -1, @@ -1124,7 +1129,7 @@ namespace Nektar || (eta[2] - NekConstants::kNekZeroTol <= 1), "Eta Coordinate outside bounds of tetrahedron."); - return StdExpansion3D::v_PhysEvaluate(eta); + return StdExpansion3D::v_PhysEvaluate(eta, physvals); } diff --git a/library/StdRegions/StdTetExp.h b/library/StdRegions/StdTetExp.h index 9d3f55e069f50dbc96283f457aac1752b3e110e0..7622ca7a963a2e036bcc2dffe5a0e39b0c461309 100644 --- a/library/StdRegions/StdTetExp.h +++ b/library/StdRegions/StdTetExp.h @@ -143,6 +143,8 @@ namespace Nektar /** \brief Single Point Evaluation */ STD_REGIONS_EXPORT NekDouble PhysEvaluate3D(const Array<OneD, const NekDouble>& coords); + STD_REGIONS_EXPORT NekDouble PhysEvaluate3D(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble> & physvals); + //---------------------------------- // Generate Matrix Routine @@ -236,6 +238,8 @@ namespace Nektar STD_REGIONS_EXPORT virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& coords); + STD_REGIONS_EXPORT virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble> & physvals); + private: STD_REGIONS_EXPORT virtual void v_BwdTrans_SumFac(const Array<OneD, const NekDouble>& inarray, Array<OneD, NekDouble> &outarray); diff --git a/library/StdRegions/StdTriExp.h b/library/StdRegions/StdTriExp.h index 03efbc7e533c42c50ea000b1f2ae004c05d5f51f..285a70732b17191ec10960a1b95dc644298ab724 100644 --- a/library/StdRegions/StdTriExp.h +++ b/library/StdRegions/StdTriExp.h @@ -232,6 +232,8 @@ namespace Nektar /** \brief Single Point Evaluation */ STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& coords); + + STD_REGIONS_EXPORT NekDouble PhysEvaluate(const Array<OneD, const NekDouble>& coords,const Array<OneD, const NekDouble> & physvals); STD_REGIONS_EXPORT void GetBoundaryMap(Array<OneD, unsigned int>& outarray); @@ -641,6 +643,11 @@ namespace Nektar return PhysEvaluate(coords); } + virtual NekDouble v_PhysEvaluate(const Array<OneD, const NekDouble>& coords, const Array<OneD, const NekDouble> &physvals) + { + return PhysEvaluate(coords, physvals); + } + virtual void v_GetBoundaryMap(Array<OneD, unsigned int>& outarray) { GetBoundaryMap(outarray);