44#include "Teuchos_LAPACK.hpp"
45#include "Teuchos_SerialDenseMatrix.hpp"
47template <
typename ordinal_type,
typename value_type>
56#ifdef HAVE_STOKHOS_DAKOTA
69template <
typename ordinal_type,
typename value_type>
86template <
typename ordinal_type,
typename value_type>
106template <
typename ordinal_type,
typename value_type>
112template <
typename ordinal_type,
typename value_type>
120template <
typename ordinal_type,
typename value_type>
128template <
typename ordinal_type,
typename value_type>
129const Teuchos::Array<value_type>&
136template <
typename ordinal_type,
typename value_type>
144template <
typename ordinal_type,
typename value_type>
145Teuchos::RCP< Stokhos::Dense3Tensor<ordinal_type, value_type> >
151 Teuchos::RCP< Stokhos::Dense3Tensor<ordinal_type, value_type> > Cijk =
153 Teuchos::Array<value_type> points, weights;
154 Teuchos::Array< Teuchos::Array<value_type> > values;
161 for (
ordinal_type l=0; l<static_cast<ordinal_type>(points.size());
164 weights[l]*(values[l][i])*(values[l][
j])*(values[l][k]);
166 (*Cijk)(i,
j,k) = triple_product;
174template <
typename ordinal_type,
typename value_type>
175Teuchos::RCP< Stokhos::Sparse3Tensor<ordinal_type, value_type> >
182 Teuchos::RCP< Stokhos::Sparse3Tensor<ordinal_type, value_type> > Cijk =
184 Teuchos::Array<value_type> points, weights;
185 Teuchos::Array< Teuchos::Array<value_type> > values;
192 for (
ordinal_type l=0; l<static_cast<ordinal_type>(points.size());
195 weights[l]*(values[l][i])*(values[l][
j])*(values[l][k]);
197 if (std::abs(triple_product/norms[i]) > sparse_tol)
198 Cijk->add_term(i,
j,k,triple_product);
202 Cijk->fillComplete();
207template <
typename ordinal_type,
typename value_type>
208Teuchos::RCP< Teuchos::SerialDenseMatrix<ordinal_type, value_type> >
213 Teuchos::Array<value_type> points, weights;
214 Teuchos::Array< Teuchos::Array<value_type> > values, derivs;
220 derivs[i].resize(sz);
223 Teuchos::RCP< Teuchos::SerialDenseMatrix<ordinal_type, value_type> > Bij =
224 Teuchos::rcp(
new Teuchos::SerialDenseMatrix<ordinal_type, value_type>(sz,sz));
228 for (
int qp=0; qp<nqp; qp++)
229 b += weights[qp]*derivs[qp][i]*values[qp][
j];
237template <
typename ordinal_type,
typename value_type>
251 basis_pts[i] = ((
delta[i-1]*x-
alpha[i-1])*basis_pts[i-1] -
255template <
typename ordinal_type,
typename value_type>
259 Teuchos::Array<value_type>& vals,
260 Teuchos::Array<value_type>& derivs)
const
267 derivs[i] = (
delta[i-1]*vals[i-1] + (
delta[i-1]*x-
alpha[i-1])*derivs[i-1] -
271template <
typename ordinal_type,
typename value_type>
300template <
typename ordinal_type,
typename value_type>
303print(std::ostream& os)
const
305 os <<
name <<
" basis of order " <<
p <<
"." << std::endl;
307 os <<
"Alpha recurrence coefficients:\n\t";
309 os <<
alpha[i] <<
" ";
312 os <<
"Beta recurrence coefficients:\n\t";
314 os <<
beta[i] <<
" ";
317 os <<
"Delta recurrence coefficients:\n\t";
319 os <<
delta[i] <<
" ";
322 os <<
"Gamma recurrence coefficients:\n\t";
324 os <<
gamma[i] <<
" ";
327 os <<
"Basis polynomial norms (squared):\n\t";
329 os <<
norms[i] <<
" ";
333template <
typename ordinal_type,
typename value_type>
341template <
typename ordinal_type,
typename value_type>
345 Teuchos::Array<value_type>& quad_points,
346 Teuchos::Array<value_type>& quad_weights,
347 Teuchos::Array< Teuchos::Array<value_type> >& quad_values)
const
355 static_cast<ordinal_type>(std::ceil((quad_order+1)/2.0));
356 Teuchos::Array<value_type> a(num_points,0);
357 Teuchos::Array<value_type> b(num_points,0);
358 Teuchos::Array<value_type> c(num_points,0);
359 Teuchos::Array<value_type> d(num_points,0);
362 if(num_points >
p+1){
378 quad_points.resize(num_points);
379 quad_weights.resize(num_points);
381 if (num_points == 1) {
382 quad_points[0] = a[0];
383 quad_weights[0] =
beta[0];
394 Teuchos::SerialDenseMatrix<ordinal_type,value_type> eig_vectors(num_points,
396 Teuchos::Array<value_type> workspace(4*num_points);
398 Teuchos::LAPACK<ordinal_type,value_type> my_lapack;
404 if (std::abs(a[n]) > max_a)
408 if (std::abs(b[n]) > max_b)
418 my_lapack.PTEQR(
'I', num_points, &a[0], &b[1], eig_vectors.values(),
419 num_points, &workspace[0], &info_flag);
420 TEUCHOS_TEST_FOR_EXCEPTION(info_flag != 0, std::logic_error,
421 "PTEQR returned info = " << info_flag);
426 quad_points[i] = a[num_points-1-i]-shift;
428 quad_points[i] = 0.0;
429 quad_weights[i] =
beta[0]*eig_vectors[num_points-1-i][0]*eig_vectors[num_points-1-i][0];
434 quad_values.resize(num_points);
436 quad_values[i].resize(
p+1);
441template <
typename ordinal_type,
typename value_type>
449template <
typename ordinal_type,
typename value_type>
461template <
typename ordinal_type,
typename value_type>
477template <
typename ordinal_type,
typename value_type>
481 Teuchos::Array<value_type>& b,
482 Teuchos::Array<value_type>& c,
483 Teuchos::Array<value_type>&
g)
const
491template <
typename ordinal_type,
typename value_type>
495 Teuchos::Array<value_type>& a,
496 Teuchos::Array<value_type>& b,
497 Teuchos::Array<value_type>& c,
498 Teuchos::Array<value_type>&
g)
const
502 b[0] = std::sqrt(b[0]);
506 b[k] = std::sqrt((b[k]*
g[k])/(c[k]*c[k-1]));
Data structure storing a dense 3-tensor C(i,j,k).
ordinal_type size() const
Return size.
void resize(const Teuchos::RCP< const Epetra_BlockMap > &map)
Resize to map map.
virtual ordinal_type order() const
Return order of basis (largest monomial degree ).
Teuchos::Array< value_type > norms
Norms.
virtual ordinal_type pointGrowth(ordinal_type n) const
Evaluate point growth rule for Smolyak-type bases.
virtual Teuchos::RCP< Stokhos::Dense3Tensor< ordinal_type, value_type > > computeTripleProductTensor() const
Compute triple product tensor.
bool normalize
Normalize basis.
virtual void print(std::ostream &os) const
Print basis to stream os.
virtual value_type evaluate(const value_type &point, ordinal_type order) const
Evaluate basis polynomial given by order order at given point point.
GrowthPolicy growth
Smolyak growth policy.
virtual const Teuchos::Array< value_type > & norm_squared() const
Return array storing norm-squared of each basis polynomial.
value_type quad_zero_tol
Tolerance for quadrature points near zero.
virtual ordinal_type quadDegreeOfExactness(ordinal_type n) const
virtual Teuchos::RCP< Stokhos::Sparse3Tensor< ordinal_type, value_type > > computeSparseTripleProductTensor(ordinal_type order) const
Compute triple product tensor.
virtual Teuchos::RCP< Teuchos::SerialDenseMatrix< ordinal_type, value_type > > computeDerivDoubleProductTensor() const
Compute derivative double product tensor.
virtual ordinal_type size() const
Return total size of basis (given by order() + 1).
virtual void evaluateBases(const value_type &point, Teuchos::Array< value_type > &basis_pts) const
Evaluate each basis polynomial at given point point.
Teuchos::Array< value_type > alpha
Recurrence coefficients.
Teuchos::Array< value_type > beta
Recurrence coefficients.
ordinal_type p
Order of basis.
Teuchos::Array< value_type > gamma
Recurrence coefficients.
virtual ordinal_type coefficientGrowth(ordinal_type n) const
Evaluate coefficient growth rule for Smolyak-type bases.
void normalizeRecurrenceCoefficients(Teuchos::Array< ValueType > &alpha, Teuchos::Array< ValueType > &beta, Teuchos::Array< ValueType > &delta, Teuchos::Array< ValueType > &gamma) const
Teuchos::Array< value_type > delta
Recurrence coefficients.
virtual void evaluateBasesAndDerivatives(const value_type &point, Teuchos::Array< value_type > &vals, Teuchos::Array< value_type > &derivs) const
Evaluate basis polynomials and their derivatives at given point point.
virtual bool computeRecurrenceCoefficients(OrdinalType n, Teuchos::Array< ValueType > &alpha, Teuchos::Array< ValueType > &beta, Teuchos::Array< ValueType > &delta, Teuchos::Array< ValueType > &gamma) const=0
virtual void setup()
Setup basis after computing recurrence coefficients.
virtual void getRecurrenceCoefficients(Teuchos::Array< value_type > &alpha, Teuchos::Array< value_type > &beta, Teuchos::Array< value_type > &delta, Teuchos::Array< value_type > &gamma) const
Return recurrence coefficients defined by above formula.
virtual const std::string & getName() const
Return string name of basis.
LevelToOrderFnPtr sparse_grid_growth_rule
Sparse grid growth rule (as determined by Pecos).
std::string name
Name of basis.
virtual void getQuadPoints(OrdinalType quad_order, Teuchos::Array< ValueType > &points, Teuchos::Array< ValueType > &weights, Teuchos::Array< Teuchos::Array< ValueType > > &values) const
virtual ~RecurrenceBasis()
Destructor.
RecurrenceBasis(const std::string &name, ordinal_type p, bool normalize, GrowthPolicy growth=SLOW_GROWTH)
Constructor to be called by derived classes.
Data structure storing a sparse 3-tensor C(i,j,k) in a a compressed format.
ScalarType g(const Teuchos::Array< ScalarType > &x, const ScalarType &y)
GrowthPolicy
Enumerated type for determining Smolyak growth policies.