42#include "Sacado_DynamicArrayTraits.hpp"
43#include "Teuchos_TimeMonitor.hpp"
49template <
int NN,
typename ExprT>
51 static const int N = NN;
55 template <
typename tuple_type>
57 return expr_.template eval_sample<0>(x);
61template <
typename T,
typename Storage>
64OrthogPolyImpl<T,Storage>::
65expressionCopy(
const Expr<S>& x)
67#ifdef STOKHOS_TEUCHOS_TIME_MONITOR
68 TEUCHOS_FUNC_TIME_MONITOR(
"ETPCE ExpressionCopy(" << x.name() <<
")");
76 approx_type* tc = th_.get();
81 const int N = Expr<S>::num_args;
82 for (
int i=0; i<N; i++) {
83 const approx_type* opa = &(x.getArg(i));
93 tc =
new approx_type(expansion_->getBasis(), sz);
96 if (
x.has_fast_access(sz)) {
97 for (
int i=1; i<sz; i++)
98 (*tc)[i] =
x.fast_higher_order_coeff(i);
101 for (
int i=1; i<sz; i++)
102 (*tc)[i] =
x.higher_order_coeff(i);
107 th_ = Sacado::Handle<approx_type>(tc);
111 const int N = Expr<S>::num_args;
112 const approx_type* opas[N];
113 for (
int i=0; i<N; i++)
114 opas[i] = &(
x.getArg(i));
115 ExprQuadFuncWrapper< N, Expr<S> > func(x);
116 quad_expansion_->nary_op(func, *th_, opas);
120template <
typename T,
typename Storage>
121OrthogPolyImpl<T,Storage>::
128 expansion_ = const_expansion_;
131template <
typename T,
typename Storage>
132OrthogPolyImpl<T,Storage>::
133OrthogPolyImpl(
const typename OrthogPolyImpl<T,Storage>::value_type& x) :
139 expansion_ = const_expansion_;
142template <
typename T,
typename Storage>
143OrthogPolyImpl<T,Storage>::
144OrthogPolyImpl(
const Teuchos::RCP<expansion_type>& expansion) :
145 expansion_(expansion),
146 quad_expansion_(
Teuchos::rcp_dynamic_cast<quad_expansion_type>(expansion_)),
152template <
typename T,
typename Storage>
153OrthogPolyImpl<T,Storage>::
154OrthogPolyImpl(
const Teuchos::RCP<expansion_type>& expansion,
156 expansion_(expansion),
157 quad_expansion_(
Teuchos::rcp_dynamic_cast<quad_expansion_type>(expansion_)),
163template <
typename T,
typename Storage>
164OrthogPolyImpl<T,Storage>::
165OrthogPolyImpl(
const OrthogPolyImpl<T,Storage>& x) :
166 expansion_(
x.expansion_),
167 quad_expansion_(
x.quad_expansion_),
173template <
typename T,
typename Storage>
175OrthogPolyImpl<T,Storage>::
176OrthogPolyImpl(
const Expr<S>& x) :
177 expansion_(
x.expansion()),
178 quad_expansion_(
Teuchos::rcp_dynamic_cast<quad_expansion_type>(expansion_)),
185template <
typename T,
typename Storage>
187OrthogPolyImpl<T,Storage>::
188reset(
const Teuchos::RCP<expansion_type>& expansion)
190 expansion_ = expansion;
191 quad_expansion_ = Teuchos::rcp_dynamic_cast<quad_expansion_type>(expansion_);
192 th_->reset(expansion_->getBasis());
195template <
typename T,
typename Storage>
197OrthogPolyImpl<T,Storage>::
198reset(
const Teuchos::RCP<expansion_type>& expansion, ordinal_type sz)
200 expansion_ = expansion;
201 quad_expansion_ = Teuchos::rcp_dynamic_cast<quad_expansion_type>(expansion_);
202 th_->reset(expansion_->getBasis(), sz);
205template <
typename T,
typename Storage>
206typename OrthogPolyImpl<T,Storage>::value_type
207OrthogPolyImpl<T,Storage>::
208evaluate(
const Teuchos::Array<
typename OrthogPolyImpl<T,Storage>::value_type>& point)
const
210 return th_->evaluate(point);
213template <
typename T,
typename Storage>
214typename OrthogPolyImpl<T,Storage>::value_type
215OrthogPolyImpl<T,Storage>::
217 const Teuchos::Array<
typename OrthogPolyImpl<T,Storage>::value_type>& point,
218 const Teuchos::Array<
typename OrthogPolyImpl<T,Storage>::value_type>& bvals)
const
220 return th_->evaluate(point, bvals);
223template <
typename T,
typename Storage>
226OrthogPolyImpl<T,Storage>::
227isEqualTo(
const Expr<S>& x)
const {
228 typedef IsEqual<value_type> IE;
229 if (
x.size() != this->size())
return false;
232 if (expansion_ !=
x.expansion_) {
235 if ((expansion_ != const_expansion_) &&
236 (
x.expansion_ !=
x.const_expansion_))
240 for (
int i=0; i<this->size(); i++)
241 eq = eq && IE::eval(
x.coeff(i), this->coeff(i));
245template <
typename T,
typename Storage>
246OrthogPolyImpl<T,Storage>&
247OrthogPolyImpl<T,Storage>::
248operator=(
const typename OrthogPolyImpl<T,Storage>::value_type& v)
255template <
typename T,
typename Storage>
256OrthogPolyImpl<T,Storage>&
257OrthogPolyImpl<T,Storage>::
258operator=(
const OrthogPolyImpl<T,Storage>& x)
260 expansion_ =
x.expansion_;
261 quad_expansion_ =
x.quad_expansion_;
266template <
typename T,
typename Storage>
268OrthogPolyImpl<T,Storage>&
269OrthogPolyImpl<T,Storage>::
270operator=(
const Expr<S>& x)
273 expansion_ =
x.expansion();
274 quad_expansion_ = Teuchos::rcp_dynamic_cast<quad_expansion_type>(expansion_);
275 th_->reset(expansion_->getBasis(),
x.size());
280template <
typename T,
typename Storage>
281OrthogPolyImpl<T,Storage>&
282OrthogPolyImpl<T,Storage>::
283operator+=(
const typename OrthogPolyImpl<T,Storage>::value_type& v)
286 expansion_->plusEqual(*th_, v);
290template <
typename T,
typename Storage>
291OrthogPolyImpl<T,Storage>&
292OrthogPolyImpl<T,Storage>::
293operator-=(
const typename OrthogPolyImpl<T,Storage>::value_type& v)
296 expansion_->minusEqual(*th_, v);
300template <
typename T,
typename Storage>
301OrthogPolyImpl<T,Storage>&
302OrthogPolyImpl<T,Storage>::
303operator*=(
const typename OrthogPolyImpl<T,Storage>::value_type& v)
306 expansion_->timesEqual(*th_, v);
310template <
typename T,
typename Storage>
311OrthogPolyImpl<T,Storage>&
312OrthogPolyImpl<T,Storage>::
313operator/=(
const typename OrthogPolyImpl<T,Storage>::value_type& v)
316 expansion_->divideEqual(*th_, v);
320template <
typename T,
typename Storage>
328 for (ordinal_type i=0; i<a.size(); i++) {
329 os << a.coeff(i) <<
" ";
336template <
typename T,
typename Storage>
346 for (ordinal_type i=0; i<a.size(); i++) {
347 is >> a.fastAccessCoeff(i);
Orthogonal polynomial expansion class for constant (size 1) expansions.
std::istream & operator>>(std::istream &is, OrthogPoly< T, Storage > &a)
std::ostream & operator<<(std::ostream &os, const OrthogPoly< T, Storage > &a)
Top-level namespace for Stokhos classes and functions.
const IndexType const IndexType const IndexType const IndexType const ValueType const ValueType * x
KERNEL_PREFIX value_type operator()(tuple_type x) const
ExprT::value_type value_type
ExprQuadFuncWrapper(const ExprT &expr)