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);
112 const approx_type* opas[N];
113 for (
int i=0; i<N; i++)
114 opas[i] = &(
x.getArg(i));
116 quad_expansion_->nary_op(func, *th_, opas);
120template <
typename T,
typename Storage>
121OrthogPolyImpl<T,Storage>::
127 const_expansion_ = Teuchos::rcp(
new Stokhos::ConstantOrthogPolyExpansion<int,T>);
128 expansion_ = const_expansion_;
131template <
typename T,
typename Storage>
132OrthogPolyImpl<T,Storage>::
133OrthogPolyImpl(
const typename OrthogPolyImpl<T,Storage>::value_type& x) :
138 const_expansion_ = Teuchos::rcp(
new Stokhos::ConstantOrthogPolyExpansion<int,T>);
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_)),
147 th_(new Stokhos::OrthogPolyApprox<int,
value_type,
Storage>(expansion_->getBasis()))
149 const_expansion_ = Teuchos::rcp(
new Stokhos::ConstantOrthogPolyExpansion<int,T>);
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_)),
158 th_(new Stokhos::OrthogPolyApprox<int,
value_type,
Storage>(expansion_->getBasis(), sz))
160 const_expansion_ = Teuchos::rcp(
new Stokhos::ConstantOrthogPolyExpansion<int,T>);
163template <
typename T,
typename Storage>
164OrthogPolyImpl<T,Storage>::
165OrthogPolyImpl(
const OrthogPolyImpl<T,Storage>& x) :
166 expansion_(
x.expansion_),
167 quad_expansion_(
x.quad_expansion_),
170 const_expansion_ = Teuchos::rcp(
new Stokhos::ConstantOrthogPolyExpansion<int,T>);
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_)),
179 th_(new Stokhos::OrthogPolyApprox<int,
value_type,
Storage>(expansion_->getBasis(),
x.size()))
181 const_expansion_ = Teuchos::rcp(
new Stokhos::ConstantOrthogPolyExpansion<int,T>);
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>::
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);
Stokhos::StandardStorage< int, double > Storage
std::istream & operator>>(std::istream &is, OrthogPoly< T, Storage > &a)
std::ostream & operator<<(std::ostream &os, const OrthogPoly< T, Storage > &a)
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)