Nektar++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
NodalUtil.h
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File NodalUtil.h
4 //
5 // For more information, please see: http://www.nektar.info
6 //
7 // The MIT License
8 //
9 // Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10 // Department of Aeronautics, Imperial College London (UK), and Scientific
11 // Computing and Imaging Institute, University of Utah (USA).
12 //
13 // License for the specific language governing rights and limitations under
14 // Permission is hereby granted, free of charge, to any person obtaining a
15 // copy of this software and associated documentation files (the "Software"),
16 // to deal in the Software without restriction, including without limitation
17 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
18 // and/or sell copies of the Software, and to permit persons to whom the
19 // Software is furnished to do so, subject to the following conditions:
20 //
21 // The above copyright notice and this permission notice shall be included
22 // in all copies or substantial portions of the Software.
23 //
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
25 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
27 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
30 // DEALINGS IN THE SOFTWARE.
31 //
32 // Description: 2D and 3D Nodal Triangle and Tetrahedron Utilities header file --
33 // Basis function, Interpolation, Integral, Derivation, etc.
34 //
35 ///////////////////////////////////////////////////////////////////////////////
36 
37 #ifndef NODALUTIL_H
38 #define NODALUTIL_H
39 
45 
46 
47 //#include <LibUtilities/BasicUtils/BasicUtilsFwd.hpp> // for NekManager
49 
50 
51 namespace Nektar
52 {
53  namespace LibUtilities
54  {
55 
56  // /////////////////////////////////////
57  // General matrix and vector stuff
58  template< typename T > NekVector<T> GetColumn(const NekMatrix<T> & matA, int n);
59  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> & SetColumn(NekMatrix<NekDouble> & matA, int n, const NekVector<NekDouble> & x);
60  LIB_UTILITIES_EXPORT NekVector<NekDouble> GetE(int rows, int n);
61  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> Invert(const NekMatrix<NekDouble> & matA);
62  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetTranspose(const NekMatrix<NekDouble> & matA);
63  LIB_UTILITIES_EXPORT int GetSize(const Array<OneD, const NekDouble> & x);
64  LIB_UTILITIES_EXPORT int GetSize(const NekVector<NekDouble> & x);
65  LIB_UTILITIES_EXPORT int GetDegree(int nBasisFunctions);
67  LIB_UTILITIES_EXPORT NekVector<NekDouble> ToVector( const Array<OneD, const NekDouble> & x );
68  LIB_UTILITIES_EXPORT Array<OneD, NekDouble> ToArray( const NekVector<NekDouble> & x );
69  LIB_UTILITIES_EXPORT NekVector<NekDouble> Hadamard( const NekVector<NekDouble> & x, const NekVector<NekDouble> & y );
70  LIB_UTILITIES_EXPORT NekVector<NekDouble> VectorPower( const NekVector<NekDouble> & x, NekDouble p );
71  LIB_UTILITIES_EXPORT std::string MatrixToString( const NekMatrix<NekDouble> & A, int precision = 2, NekDouble threshold = 1e12 );
72  LIB_UTILITIES_EXPORT std::string VectorToString( const NekVector<NekDouble> & v, int precision = 2, NekDouble threshold = 1e12 );
73 
74  // ////////////////////////////////////////////////////////////////
75  // Polynomials(Jacobi, Legendre, and Dubiner) and its derivations
76  LIB_UTILITIES_EXPORT NekVector<NekDouble> LegendrePoly(int degree, const NekVector<NekDouble>& x);
77  LIB_UTILITIES_EXPORT NekVector<NekDouble> DubinerPoly(int p, int q, const NekVector<NekDouble>& x, const NekVector<NekDouble>& y);
78  LIB_UTILITIES_EXPORT NekVector<NekDouble> JacobiPoly(int degree, const NekVector<NekDouble>& x, NekDouble alpha, NekDouble beta);
80  LIB_UTILITIES_EXPORT NekVector<NekDouble> LegendrePolyDerivative(int degree, const NekVector<NekDouble>& x);
81  LIB_UTILITIES_EXPORT NekVector<NekDouble> DubinerPolyXDerivative(int p, int q, const NekVector<NekDouble>& x, const NekVector<NekDouble>& y);
82  LIB_UTILITIES_EXPORT NekVector<NekDouble> DubinerPolyYDerivative(int p, int q, const NekVector<NekDouble>& x, const NekVector<NekDouble>& y);
83  LIB_UTILITIES_EXPORT NekVector<NekDouble> JacobiPolyDerivative(int degree, const NekVector<NekDouble>& x, int alpha, int beta);
84 
85  // /////////////////////////////
86  // Triangle stuff
87  LIB_UTILITIES_EXPORT NekVector<NekDouble> MakeDubinerQuadratureSystem(int nBasisFunctions);
88  LIB_UTILITIES_EXPORT SharedNekMatrixPtr MakeVmatrixOfDubinerPolynomial(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y);
89  LIB_UTILITIES_EXPORT NekVector<NekDouble> MakeQuadratureWeights(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y);
90  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y);
91  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, int degree);
92  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermondeForXDerivative(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, int degree);
93  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermondeForXDerivative(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y);
94  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermondeForYDerivative(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, int degree);
95  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermondeForYDerivative(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y);
96  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetInterpolationMatrix(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
97  const NekVector<NekDouble>& xi, const NekVector<NekDouble>& yi);
98  LIB_UTILITIES_EXPORT Points<NekDouble>::MatrixSharedPtrType GetYDerivativeMatrix(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
99  const NekVector<NekDouble>& xi, const NekVector<NekDouble>& yi);
100  LIB_UTILITIES_EXPORT Points<NekDouble>::MatrixSharedPtrType GetXDerivativeMatrix(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
101  const NekVector<NekDouble>& xi, const NekVector<NekDouble>& yi);
102 
103  // /////////////////////////////
104  // Tetrahedron stuff
105  LIB_UTILITIES_EXPORT int GetTetDegree(int nBasisFunc);
106  LIB_UTILITIES_EXPORT NekVector<NekDouble> TetrahedralBasis(int p, int q, int r, const NekVector<NekDouble>& x,
107  const NekVector<NekDouble>& y, const NekVector<NekDouble>& z);
108  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetTetVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z, int degree);
109  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetTetVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z);
110  LIB_UTILITIES_EXPORT SharedNekMatrixPtr MakeVmatrixOfTet(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z);
111  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetTetInterpolationMatrix(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z,
112  const NekVector<NekDouble>& xi, const NekVector<NekDouble>& yi, const NekVector<NekDouble>& zi);
113  LIB_UTILITIES_EXPORT NekVector<NekDouble> MakeTetWeights(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z);
114  LIB_UTILITIES_EXPORT NekVector<NekDouble> MakeTetQuadratureSystem(int nBasisFunctions);
115  LIB_UTILITIES_EXPORT NekVector<NekDouble> TetXDerivative(int p, int q, int r, const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
116  const NekVector<NekDouble>& z);
117  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermondeForTetXDerivative(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z);
118  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermondeForTetXDerivative(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z,
119  int degree);
120  LIB_UTILITIES_EXPORT Points<NekDouble>::MatrixSharedPtrType GetTetXDerivativeMatrix(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
121  const NekVector<NekDouble>& z, const NekVector<NekDouble>& xi, const NekVector<NekDouble>& yi, const NekVector<NekDouble>& zi);
122 
123  LIB_UTILITIES_EXPORT NekVector<NekDouble> TetYDerivative(int p, int q, int r, const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
124  const NekVector<NekDouble>& z);
125  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermondeForTetYDerivative(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z);
126  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermondeForTetYDerivative(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z,
127  int degree);
128  LIB_UTILITIES_EXPORT Points<NekDouble>::MatrixSharedPtrType GetTetYDerivativeMatrix(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
129  const NekVector<NekDouble>& z, const NekVector<NekDouble>& xi, const NekVector<NekDouble>& yi, const NekVector<NekDouble>& zi);
130 
131  LIB_UTILITIES_EXPORT NekVector<NekDouble> TetZDerivative(int p, int q, int r, const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
132  const NekVector<NekDouble>& z);
133  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermondeForTetZDerivative(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z);
134  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetVandermondeForTetZDerivative(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z,
135  int degree);
136  LIB_UTILITIES_EXPORT Points<NekDouble>::MatrixSharedPtrType GetTetZDerivativeMatrix(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
137  const NekVector<NekDouble>& z, const NekVector<NekDouble>& xi, const NekVector<NekDouble>& yi, const NekVector<NekDouble>& zi);
138 
139 
140  // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
141  // Monomial Vandermonde stuff for Triangle : Useful to test triangle(integration, interpolation, and derivation)
142  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, int degree);
143  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y);
144  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetXDerivativeOfMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, int degree);
145  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetXDerivativeOfMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y);
146  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetYDerivativeOfMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, int degree);
147  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetYDerivativeOfMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y);
148  LIB_UTILITIES_EXPORT NekVector<NekDouble> GetIntegralOfMonomialVandermonde(int degree);
149 
150 
151  // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
152  // Monomial Vandermonde stuff for Tetrahedron : Useful to test tetrahedron(integration, interpolation, and derivation)
153  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
154  const NekVector<NekDouble>& z, int degree);
155  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y, const NekVector<NekDouble>& z);
156  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetTetXDerivativeOfMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
157  const NekVector<NekDouble>& z, int degree);
158  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetTetXDerivativeOfMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
159  const NekVector<NekDouble>& z);
160  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetTetYDerivativeOfMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
161  const NekVector<NekDouble>& z, int degree);
162  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetTetYDerivativeOfMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
163  const NekVector<NekDouble>& z);
164  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetTetZDerivativeOfMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
165  const NekVector<NekDouble>& z, int degree);
166  LIB_UTILITIES_EXPORT NekMatrix<NekDouble> GetTetZDerivativeOfMonomialVandermonde(const NekVector<NekDouble>& x, const NekVector<NekDouble>& y,
167  const NekVector<NekDouble>& z);
168 
169  } // end of LibUtilities namespace
170 } // end of Nektar namespace
171 
172 #endif //NODALUTIL_H