42 #include "Sacado_DynamicArrayTraits.hpp" 43 #include "Teuchos_TimeMonitor.hpp" 49 template <
int NN,
typename ExprT>
51 static const int N = NN;
55 template <
typename tuple_type>
57 return expr_.template eval_sample<0>(
x);
61 template <
typename T,
typename Storage>
64 OrthogPolyImpl<T,Storage>::
65 expressionCopy(
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);
120 template <
typename T,
typename Storage>
121 OrthogPolyImpl<T,Storage>::
128 expansion_ = const_expansion_;
131 template <
typename T,
typename Storage>
132 OrthogPolyImpl<T,Storage>::
139 expansion_ = const_expansion_;
142 template <
typename T,
typename Storage>
143 OrthogPolyImpl<T,Storage>::
144 OrthogPolyImpl(
const Teuchos::RCP<expansion_type>& expansion) :
145 expansion_(expansion),
146 quad_expansion_(
Teuchos::rcp_dynamic_cast<quad_expansion_type>(expansion_)),
152 template <
typename T,
typename Storage>
153 OrthogPolyImpl<T,Storage>::
154 OrthogPolyImpl(
const Teuchos::RCP<expansion_type>& expansion,
156 expansion_(expansion),
157 quad_expansion_(
Teuchos::rcp_dynamic_cast<quad_expansion_type>(expansion_)),
163 template <
typename T,
typename Storage>
164 OrthogPolyImpl<T,Storage>::
165 OrthogPolyImpl(
const OrthogPolyImpl<T,Storage>&
x) :
166 expansion_(
x.expansion_),
167 quad_expansion_(
x.quad_expansion_),
173 template <
typename T,
typename Storage>
174 template <
typename S>
175 OrthogPolyImpl<T,Storage>::
176 OrthogPolyImpl(
const Expr<S>&
x) :
177 expansion_(
x.expansion()),
178 quad_expansion_(
Teuchos::rcp_dynamic_cast<quad_expansion_type>(expansion_)),
185 template <
typename T,
typename Storage>
187 OrthogPolyImpl<T,Storage>::
188 reset(
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());
195 template <
typename T,
typename Storage>
197 OrthogPolyImpl<T,Storage>::
198 reset(
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);
205 template <
typename T,
typename Storage>
207 OrthogPolyImpl<T,Storage>::
210 return th_->evaluate(point);
213 template <
typename T,
typename Storage>
215 OrthogPolyImpl<T,Storage>::
220 return th_->evaluate(point, bvals);
223 template <
typename T,
typename Storage>
224 template <
typename S>
226 OrthogPolyImpl<T,Storage>::
227 isEqualTo(
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));
245 template <
typename T,
typename Storage>
246 OrthogPolyImpl<T,Storage>&
247 OrthogPolyImpl<T,Storage>::
255 template <
typename T,
typename Storage>
256 OrthogPolyImpl<T,Storage>&
257 OrthogPolyImpl<T,Storage>::
258 operator=(
const OrthogPolyImpl<T,Storage>&
x)
260 expansion_ =
x.expansion_;
261 quad_expansion_ =
x.quad_expansion_;
266 template <
typename T,
typename Storage>
267 template <
typename S>
268 OrthogPolyImpl<T,Storage>&
269 OrthogPolyImpl<T,Storage>::
270 operator=(
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());
280 template <
typename T,
typename Storage>
281 OrthogPolyImpl<T,Storage>&
282 OrthogPolyImpl<T,Storage>::
286 expansion_->plusEqual(*th_, v);
290 template <
typename T,
typename Storage>
291 OrthogPolyImpl<T,Storage>&
292 OrthogPolyImpl<T,Storage>::
296 expansion_->minusEqual(*th_, v);
300 template <
typename T,
typename Storage>
301 OrthogPolyImpl<T,Storage>&
302 OrthogPolyImpl<T,Storage>::
306 expansion_->timesEqual(*th_, v);
310 template <
typename T,
typename Storage>
311 OrthogPolyImpl<T,Storage>&
312 OrthogPolyImpl<T,Storage>::
316 expansion_->divideEqual(*th_, v);
320 template <
typename T,
typename Storage>
322 operator << (std::ostream& os, const OrthogPoly<T,Storage>& a)
329 os << a.coeff(i) <<
" ";
336 template <
typename T,
typename Storage>
347 is >> a.fastAccessCoeff(i);
KERNEL_PREFIX value_type operator()(tuple_type x) const
ExprQuadFuncWrapper(const ExprT &expr)
const IndexType const IndexType const IndexType const IndexType const ValueType const ValueType * x
Top-level namespace for Stokhos classes and functions.
ExprT::value_type value_type
Orthogonal polynomial expansion class for constant (size 1) expansions.
std::istream & operator>>(std::istream &is, OrthogPoly< T, Storage > &a)