58 template <
typename OrdinalType,
typename ValueType>
68 UnitTestSetup<int,double>
setup;
71 int order =
setup.basis.order();
72 TEUCHOS_TEST_EQUALITY(order,
setup.p, out, success);
76 int size =
setup.basis.size();
77 TEUCHOS_TEST_EQUALITY(size,
setup.p+1, out, success);
81 const Teuchos::Array<double>& n1 =
setup.basis.norm_squared();
82 Teuchos::Array<double> n2(
setup.p+1);
83 for (
int i=0; i<=
setup.p; i++)
84 n2[i] = 1.0/(2.0*i+1.0);
90 Teuchos::Array<double> n1(
setup.p+1);
91 Teuchos::Array<double> n2(
setup.p+1);
92 for (
int i=0; i<=
setup.p; i++) {
93 n1[i] =
setup.basis.norm_squared(i);
94 n2[i] = 1.0/(2.0*i+1.0);
101 const Teuchos::Array<double>& n1 =
setup.basis.norm_squared();
102 Teuchos::Array<double> n2(
setup.p+1);
103 Teuchos::Array<double> x, w;
104 Teuchos::Array< Teuchos::Array<double> > v;
105 setup.basis.getQuadPoints(2*
setup.p, x, w, v);
107 for (
int i=0; i<=
setup.p; i++) {
109 for (
int j=0;
j<nqp;
j++)
110 n2[i] += w[
j]*v[
j][i]*v[
j][i];
118 const Teuchos::Array<double>& norms =
setup.basis.norm_squared();
119 Teuchos::Array<double> x, w;
120 Teuchos::Array< Teuchos::Array<double> > v;
121 setup.basis.getQuadPoints(2*
setup.p, x, w, v);
123 Teuchos::SerialDenseMatrix<int,double> mat(
setup.p+1,
setup.p+1);
124 for (
int i=0; i<=
setup.p; i++) {
126 for (
int k=0; k<nqp; k++)
127 mat(i,
j) += w[k]*v[k][i]*v[k][
j];
128 mat(i,
j) /= std::sqrt(norms[i]*norms[
j]);
132 success = mat.normInf() <
setup.atol;
134 out <<
"\n Error, mat.normInf() < atol = " << mat.normInf()
135 <<
" < " <<
setup.atol <<
": failed!\n";
136 out <<
"mat = " <<
printMat(mat) << std::endl;
141 Teuchos::RCP< Stokhos::Dense3Tensor<int, double> > Cijk =
142 setup.basis.computeTripleProductTensor();
144 Teuchos::Array<double> x, w;
145 Teuchos::Array< Teuchos::Array<double> > v;
146 setup.basis.getQuadPoints(3*
setup.p, x, w, v);
149 for (
int i=0; i<=
setup.p; i++) {
151 for (
int k=0; k<=
setup.p; k++) {
154 for (
int qp=0; qp<nqp; qp++)
155 c += w[qp]*v[qp][i]*v[qp][
j]*v[qp][k];
156 std::stringstream ss;
157 ss <<
"Cijk(" << i <<
"," <<
j <<
"," << k <<
")";
167 Teuchos::RCP< Teuchos::SerialDenseMatrix<int, double> > Bij =
168 setup.basis.computeDerivDoubleProductTensor();
170 Teuchos::Array<double> x, w;
171 Teuchos::Array< Teuchos::Array<double> > v,
val, deriv;
172 setup.basis.getQuadPoints(3*
setup.p, x, w, v);
176 for (
int i=0; i<nqp; i++) {
178 deriv[i].resize(
setup.p+1);
179 setup.basis.evaluateBasesAndDerivatives(x[i],
val[i], deriv[i]);
183 for (
int i=0; i<=
setup.p; i++) {
186 for (
int qp=0; qp<nqp; qp++)
187 b += w[qp]*deriv[qp][i]*
val[qp][
j];
188 std::stringstream ss;
189 ss <<
"Bij(" << i <<
"," <<
j <<
")";
198 Teuchos::RCP< Teuchos::SerialDenseMatrix<int, double> > Bij =
199 setup.basis.computeDerivDoubleProductTensor();
200 const Teuchos::Array<double>& n =
setup.basis.norm_squared();
202 Teuchos::Array< Teuchos::Array<double> > deriv_coeffs(
setup.p+1);
203 deriv_coeffs[0].resize(
setup.p+1,0.0);
205 deriv_coeffs[1].resize(
setup.p+1,0.0);
206 deriv_coeffs[1][0] = 1.0;
209 deriv_coeffs[2].resize(
setup.p+1,0.0);
210 deriv_coeffs[2][1] = 3.0;
212 for (
int k=3; k<=
setup.p; k++) {
213 deriv_coeffs[k].resize(
setup.p+1,0.0);
214 deriv_coeffs[k][0] = 1.0/3.0*deriv_coeffs[k-1][1];
215 for (
int i=1; i<=k-3; i++)
216 deriv_coeffs[k][i] = i/(2.0*i - 1.0)*deriv_coeffs[k-1][i-1] +
217 (i+1.0)/(2.0*i + 3.0)*deriv_coeffs[k-1][i+1];
218 deriv_coeffs[k][k-2] = (k-2.0)/(2.0*k-5.0)*deriv_coeffs[k-1][k-3];
219 deriv_coeffs[k][k-1] = (k-1.0)/(2.0*k-3.0)*deriv_coeffs[k-1][k-2] + k;
223 for (
int i=0; i<=
setup.p; i++) {
225 double b = deriv_coeffs[i][
j]*n[
j];
226 std::stringstream ss;
227 ss <<
"Bij(" << i <<
"," <<
j <<
")";
237 Teuchos::Array<double> v1(
setup.p+1), v2(
setup.p+1);
238 setup.basis.evaluateBases(x, v1);
247 for (
int i=2; i<=
setup.p; i++)
248 v2[i] = (2.0*i-1.0)/i*x*v2[i-1] - (i-1.0)/i*v2[i-2];
255 Teuchos::Array<double> val1(
setup.p+1), deriv1(
setup.p+1),
257 setup.basis.evaluateBasesAndDerivatives(x, val1, deriv1);
269 for (
int i=2; i<=
setup.p; i++)
270 val2[i] = (2.0*i-1.0)/i*x*val2[i-1] - (i-1.0)/i*val2[i-2];
275 for (
int i=2; i<=
setup.p; i++)
276 deriv2[i] = i*val2[i-1] + x*deriv2[i-1];
288 Teuchos::Array<double> v1(
setup.p+1), v2(
setup.p+1);
289 for (
int i=0; i<=
setup.p; i++)
290 v1[i] =
setup.basis.evaluate(x, i);
299 for (
int i=2; i<=
setup.p; i++)
300 v2[i] = (2.0*i-1.0)/i*x*v2[i-1] - (i-1.0)/i*v2[i-2];
310 setup.basis.getRecurrenceCoefficients(a1, b1, c1, d1);
313 a2[0] = 0.0; b2[0] = 1.0; c2[0] = 1.0; d2[0] = 1.0;
314 for (
int i=1; i<=
setup.p; i++) {
317 c2[i] = (2.0*i+1.0)/(i+1);
336 setup.basis.getRecurrenceCoefficients(a1, b1, c1, d1);
338 Teuchos::Array<double> a2(
setup.p+1);
339 const Teuchos::Array<double>& n1 =
setup.basis.norm_squared();
340 Teuchos::Array<double> x, w;
341 Teuchos::Array< Teuchos::Array<double> > v;
342 setup.basis.getQuadPoints(2*
setup.p, x, w, v);
344 for (
int i=0; i<=
setup.p; i++) {
346 for (
int j=0;
j<nqp;
j++)
347 a2[i] += w[
j]*x[
j]*v[
j][i]*v[
j][i];
348 a2[i] = a2[i]*c1[i]/n1[i];
360 setup.basis.getRecurrenceCoefficients(a1, b1, c1, d1);
362 Teuchos::Array<double> b2(
setup.p+1);
363 const Teuchos::Array<double>& n1 =
setup.basis.norm_squared();
365 for (
int i=1; i<=
setup.p; i++) {
366 b2[i] = d1[i]*(c1[i]/c1[i-1])*(n1[i]/n1[i-1]);
372#ifdef HAVE_STOKHOS_DAKOTA
374 int n =
static_cast<int>(std::ceil((
setup.p+1)/2.0));
375 Teuchos::Array<double> x1, w1;
376 Teuchos::Array< Teuchos::Array<double> > v1;
377 setup.basis.getQuadPoints(
setup.p, x1, w1, v1);
379 Teuchos::Array<double> x2(n), w2(n);
380 Teuchos::Array< Teuchos::Array<double> > v2(n);
381 webbur::legendre_compute(n, &x2[0], &w2[0]);
383 for (
int i=0; i<n; i++) {
385 v2[i].resize(
setup.p+1);
386 setup.basis.evaluateBases(x2[i], v2[i]);
393 for (
int i=0; i<n; i++) {
394 std::stringstream ss1, ss2;
395 ss1 <<
"v1[" << i <<
"]";
396 ss2 <<
"v2[" << i <<
"]";
404#ifdef HAVE_STOKHOS_FORUQTK
406 int n =
static_cast<int>(std::ceil((
setup.p+1)/2.0));
407 Teuchos::Array<double> x1, w1;
408 Teuchos::Array< Teuchos::Array<double> > v1;
409 setup.basis.getQuadPoints(
setup.p, x1, w1, v1);
411 Teuchos::Array<double> x2(n), w2(n);
412 Teuchos::Array< Teuchos::Array<double> > v2(n);
415 double endpts[2] = {0.0, 0.0};
416 Teuchos::Array<double> b(n);
419 GAUSSQ_F77(&kind, &n, &alpha, &beta, &kpts, endpts, &b[0], &x2[0], &w2[0]);
421 for (
int i=0; i<n; i++) {
423 v2[i].resize(
setup.p+1);
424 setup.basis.evaluateBases(x2[i], v2[i]);
431 for (
int i=0; i<n; i++) {
432 std::stringstream ss1, ss2;
433 ss1 <<
"v1[" << i <<
"]";
434 ss2 <<
"v2[" << i <<
"]";
bool compareValues(const ValueType &a1, const std::string &a1_name, const ValueType &a2, const std::string &a2_name, const ValueType &rel_tol, const ValueType &abs_tol, Teuchos::FancyOStream &out)
bool compareArrays(const Array1 &a1, const std::string &a1_name, const Array2 &a2, const std::string &a2_name, const ValueType &rel_tol, const ValueType &abs_tol, Teuchos::FancyOStream &out)
void printMat(const char *name, Epetra_IntSerialDenseMatrix &matrix)