Intrepid
Intrepid_HGRAD_TET_Cn_FEM_ORTH.hpp
1 // @HEADER
2 // ************************************************************************
3 //
4 // Intrepid Package
5 // Copyright (2007) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Pavel Bochev (pbboche@sandia.gov)
38 // Denis Ridzal (dridzal@sandia.gov), or
39 // Kara Peterson (kjpeter@sandia.gov)
40 //
41 // ************************************************************************
42 // @HEADER
43 
49 #ifndef INTREPID_HGRAD_TET_Cn_FEM_ORTH_HPP
50 #define INTREPID_HGRAD_TET_Cn_FEM_ORTH_HPP
51 
52 #include "Intrepid_Basis.hpp"
53 #include "Sacado.hpp"
54 
55 namespace Intrepid {
56 
66 template<class Scalar, class ArrayScalar>
67 class Basis_HGRAD_TET_Cn_FEM_ORTH: public Basis<Scalar, ArrayScalar> {
68 private:
71  void initializeTags();
72 
73 public:
74 
78  Basis_HGRAD_TET_Cn_FEM_ORTH( int degree );
79 
80 
91  void getValues(ArrayScalar & outputValues,
92  const ArrayScalar & inputPoints,
93  const EOperator operatorType) const;
94 
95 
98  void getValues(ArrayScalar & outputValues,
99  const ArrayScalar & inputPoints,
100  const ArrayScalar & cellVertices,
101  const EOperator operatorType = OPERATOR_VALUE) const;
102 
103 };
104 
118 template<typename Scalar,typename ArrayScalar, unsigned derivOrder>
120 {
121 public:
131  static void tabulate( ArrayScalar & outputValues ,
132  const int deg ,
133  const ArrayScalar &inputPoints );
134 };
135 
136 
141 template<typename Scalar,typename ArrayScalar>
142 class TabulatorTet<Scalar,ArrayScalar,0>
143 {
144 public:
153  static void tabulate( ArrayScalar & outputValues ,
154  const int deg ,
155  const ArrayScalar &inputPoints );
156 
162  static int idx(int p, int q,int r)
163  {
164  return (p+q+r)*(p+q+r+1)*(p+q+r+2)/6+(q+r)*(q+r+1)/2+r;
165  }
166 
184  static void jrc( const Scalar &alpha , const Scalar &beta ,
185  const int &n ,
186  Scalar &an , Scalar &bn, Scalar &cn )
187 
188  {
189  an = (2.0 * n + 1.0 + alpha + beta) * ( 2.0 * n + 2.0 + alpha + beta )
190  / ( 2.0 * ( n + 1 ) * ( n + 1 + alpha + beta ) );
191  bn = (alpha*alpha-beta*beta)*(2.0*n+1.0+alpha+beta)
192  / ( 2.0*(n+1.0)*(2.0*n+alpha+beta)*(n+1.0+alpha+beta) );
193  cn = (n+alpha)*(n+beta)*(2.0*n+2.0+alpha+beta)
194  / ( (n+1.0)*(n+1.0+alpha+beta)*(2.0*n+alpha+beta) );
195 
196  return;
197  }
198 
199 
200 
201 };
202 
209 template<typename Scalar,typename ArrayScalar>
210 class TabulatorTet<Scalar,ArrayScalar,1>
211 {
212 public:
222  static void tabulate( ArrayScalar & outputValues ,
223  const int deg ,
224  const ArrayScalar &inputPoints );
225 
226 };
227 
228 
229 
230 }// namespace Intrepid
231 
233 
234 #endif
235 
static void jrc(const Scalar &alpha, const Scalar &beta, const int &n, Scalar &an, Scalar &bn, Scalar &cn)
function for computing the Jacobi recurrence coefficients so that
static int idx(int p, int q, int r)
function for indexing from orthogonal expansion indices into linear space p+q+r = the degree of the p...
Definition file for FEM orthogonal basis functions of arbitrary degree for H(grad) functions on TET...
EOperator
Enumeration of primitive operators available in Intrepid. Primitive operators act on reconstructed fu...
Header file for the abstract base class Intrepid::Basis.
An abstract base class that defines interface for concrete basis implementations for Finite Element (...
void getValues(ArrayScalar &outputValues, const ArrayScalar &inputPoints, const EOperator operatorType) const
Evaluation of a FEM basis on a reference Tetrahedron cell.
void initializeTags()
Initializes tagToOrdinal_ and ordinalToTag_ lookup arrays.
This is an internal class with a static member function for tabulating derivatives of orthogonal expa...
Implementation of the default H(grad)-compatible orthogonal basis of arbitrary degree on tetrahedron...
static void tabulate(ArrayScalar &outputValues, const int deg, const ArrayScalar &inputPoints)
basic tabulate mathod evaluates the derivOrder^th derivatives of the basis functions at inputPoints i...