48 template<
class Scalar>
51 Scalar &an , Scalar &bn, Scalar &cn )
53 an = (2.0 * n + 1.0 + alpha + beta) * ( 2.0 * n + 2.0 + alpha + beta )
54 / ( 2.0 * ( n + 1 ) * ( n + 1 + alpha + beta ) );
55 bn = (alpha*alpha-beta*beta)*(2.0*n+1.0+alpha+beta)
56 / ( 2.0*(n+1.0)*(2.0*n+alpha+beta)*(n+1.0+alpha+beta) );
57 cn = (n+alpha)*(n+beta)*(2.0*n+2.0+alpha+beta)
58 / ( (n+1.0)*(n+1.0+alpha+beta)*(2.0*n+alpha+beta) );
64 template<
class Scalar,
class ScalarArray1,
class ScalarArray2>
67 ScalarArray2 & poly_val )
69 const int np = z.dimension( 0 );
77 int idx_curp1,idx_curm1;
80 for (
int i=0;i<np;i++) {
81 poly_val(idx_cur,i) = 1.0;
84 Teuchos::Array<Scalar> f1(np),f2(np),f3(np);
86 for (
int i=0;i<np;i++) {
87 f1[i] = 0.5 * (1.0+2.0*(2.0*z(i,0)-1.0)+(2.0*z(i,1)-1.0));
88 f2[i] = 0.5 * (1.0-(2.0*z(i,1)-1.0));
89 f3[i] = f2[i] * f2[i];
94 for (
int i=0;i<np;i++) {
95 poly_val(idx_cur,i) = f1[i];
99 for (
int p=1;p<n;p++) {
103 Scalar a = (2.0*p+1.0)/(1.0+p);
104 Scalar b = p / (p+1.0);
106 for (
int i=0;i<np;i++) {
107 poly_val(idx_curp1,i) = a * f1[i] * poly_val(idx_cur,i)
108 - b * f3[i] * poly_val(idx_curm1,i);
113 for (
int p=0;p<n;p++) {
116 for (
int i=0;i<np;i++) {
117 poly_val(idxp1,i) = poly_val(idxp0,i)
118 *0.5*(1.0+2.0*p+(3.0+2.0*p)*(2.0*z(i,1)-1.0));
123 for (
int p=0;p<n-1;p++) {
124 for (
int q=1;q<n-p;q++) {
129 jrc((Scalar)(2*p+1),(Scalar)0,q,a,b,c);
130 for (
int i=0;i<np;i++) {
132 = (a*(2.0*z(i,1)-1.0)+b)*poly_val(idxpq,i)
133 - c*poly_val(idxpqm1,i);
141 template<
class Scalar,
class ScalarArray1,
class ScalarArray2>
144 ScalarArray2 &poly_val )
146 const int np = z.dimension( 0 );
154 Teuchos::Array<Scalar> f1(np),f2(np),f3(np),f4(np),f5(np);
156 for (
int i=0;i<np;i++) {
157 f1[i] = 0.5 * ( 2.0 + 2.0*(2.0*z(i,0)-1.0) + (2.0*z(i,1)-1.0) + (2.0*z(i,2)-1.0) );
158 f2[i] = pow( 0.5 * ( (2.0*z(i,1)-1.0) + (2.0*z(i,2)-1.0) ) , 2 );
159 f3[i] = 0.5 * ( 1.0 + 2.0 * (2.0*z(i,1)-1.0) + (2.0*z(i,2)-1.0) );
160 f4[i] = 0.5 * ( 1.0 - (2.0*z(i,2)-1.0) );
161 f5[i] = f4[i] * f4[i];
166 for (
int i=0;i<np;i++) {
167 poly_val(idxcur,i) = 1.0;
172 for (
int i=0;i<np;i++) {
173 poly_val(idxcur,i) = f1[i];
177 for (
int p=1;p<n;p++) {
178 Scalar a1 = (2.0 * p + 1.0) / ( p + 1.0);
179 Scalar a2 = p / ( p + 1.0 );
181 int idxpp1 =
idxtet(p+1,0,0);
182 int idxpm1 =
idxtet(p-1,0,0);
184 for (
int i=0;i<np;i++) {
185 poly_val(idxpp1,i) = a1 * f1[i] * poly_val(idxp,i) - a2 * f2[i] * poly_val(idxpm1,i);
189 for (
int p=0;p<n;p++) {
192 for (
int i=0;i<np;i++) {
193 poly_val(idx1,i) = poly_val(idx0,i) * ( p * ( 1.0 + (2.0*z(i,1)-1.0) ) + 0.5 * ( 2.0 + 3.0 * (2.0*z(i,1)-1.0) + (2.0*z(i,2)-1.0) ) );
198 for (
int p=0;p<n-1;p++) {
199 for (
int q=1;q<n-p;q++) {
201 jrc((Scalar)(2.0*p+1.0),(Scalar)(0),q,aq,bq,cq);
202 int idxpqp1 =
idxtet(p,q+1,0);
203 int idxpq =
idxtet(p,q,0);
204 int idxpqm1 =
idxtet(p,q-1,0);
205 for (
int i=0;i<np;i++) {
206 poly_val(idxpqp1,i) = ( aq * f3[i] + bq * f4[i] ) * poly_val(idxpq,i)
207 - ( cq * f5[i] ) * poly_val(idxpqm1,i);
213 for (
int p=0;p<n;p++) {
214 for (
int q=0;q<n-p;q++) {
215 int idxpq1 =
idxtet(p,q,1);
216 int idxpq0 =
idxtet(p,q,0);
217 for (
int i=0;i<np;i++) {
218 poly_val(idxpq1,i) = poly_val(idxpq0,i) * ( 1.0 + p + q + ( 2.0 + q + p ) * (2.0*z(i,2)-1.0) );
224 for (
int p=0;p<n-1;p++) {
225 for (
int q=0;q<n-p-1;q++) {
226 for (
int r=1;r<n-p-q;r++) {
228 int idxpqrp1 =
idxtet(p,q,r+1);
229 int idxpqr =
idxtet(p,q,r);
230 int idxpqrm1 =
idxtet(p,q,r-1);
231 jrc(2.0*p+2.0*q+2.0,0.0,r,ar,br,cr);
232 for (
int i=0;i<np;i++) {
233 poly_val(idxpqrp1,i) = (ar * (2.0*z(i,2)-1.0) + br) * poly_val( idxpqr , i ) - cr * poly_val(idxpqrm1,i);
static int idxtet(int p, int q, int r)
Given indices p,q,r, computes the linear index of the tetrahedral polynomial D^{p,q,r}.
static void tabulateTriangle(const ScalarArray1 &z, const int n, ScalarArray2 &poly_val)
Calculates triangular orthogonal expansions (e.g. Dubiner basis) at a range of input points...
static int idxtri(int p, int q)
Given indices p,q, computes the linear index of the Dubiner polynomial D^{p,q}.
static void tabulateTetrahedron(const ScalarArray1 &z, const int n, ScalarArray2 &poly_val)
Calculates triangular orthogonal expansions (e.g. Dubiner basis) at a range of input points...
static void jrc(const Scalar &alpha, const Scalar &beta, const int &n, Scalar &an, Scalar &bn, Scalar &cn)
computes Jacobi recurrence coefficients of order n with weights a,b so that P^{alpha,beta}_{n+1}(x) = (an x + bn) P^{alpha,beta}_n(x) - cn P^{alpha,beta}_{n-1}(x)