42 #include "Sacado_DynamicArrayTraits.hpp" 43 #include "Teuchos_TimeMonitor.hpp" 49 template <
typename T,
typename Storage>
56 expansion_ = const_expansion_;
59 template <
typename T,
typename Storage>
66 expansion_ = const_expansion_;
69 template <
typename T,
typename Storage>
71 OrthogPoly(
const Teuchos::RCP<expansion_type>& expansion) :
72 expansion_(expansion),
78 template <
typename T,
typename Storage>
80 OrthogPoly(
const Teuchos::RCP<expansion_type>& expansion,
82 expansion_(expansion),
88 template <
typename T,
typename Storage>
91 expansion_(
x.expansion_),
97 template <
typename T,
typename Storage>
103 template <
typename T,
typename Storage>
106 reset(
const Teuchos::RCP<expansion_type>& expansion)
108 expansion_ = expansion;
109 th->reset(expansion_->getBasis());
112 template <
typename T,
typename Storage>
117 expansion_ = expansion;
118 th->reset(expansion_->getBasis(), sz);
121 template <
typename T,
typename Storage>
126 return th->evaluate(point);
129 template <
typename T,
typename Storage>
136 return th->evaluate(point, bvals);
139 template <
typename T,
typename Storage>
143 typedef IsEqual<value_type> IE;
144 if (
x.size() != this->size())
return false;
147 if (expansion_ !=
x.expansion_) {
150 if ((expansion_ != const_expansion_) &&
151 (
x.expansion_ !=
x.const_expansion_))
155 for (
int i=0; i<this->size(); i++)
156 eq = eq && IE::eval(
x.coeff(i), this->coeff(i));
160 template <
typename T,
typename Storage>
170 template <
typename T,
typename Storage>
175 expansion_ =
x.expansion_;
180 template <
typename T,
typename Storage>
188 template <
typename T,
typename Storage>
194 expansion_->unaryMinus(*(
x.th), *th);
198 template <
typename T,
typename Storage>
204 expansion_->plusEqual(*th, v);
208 template <
typename T,
typename Storage>
214 expansion_->minusEqual(*th, v);
218 template <
typename T,
typename Storage>
224 expansion_->timesEqual(*th, v);
228 template <
typename T,
typename Storage>
234 expansion_->divideEqual(*th, v);
238 template <
typename T,
typename Storage>
244 Teuchos::RCP<typename OrthogPoly<T,Storage>::expansion_type> e = expansion_;
245 if (
x.size() > size()) {
249 e->plusEqual(*th, *
x.th);
253 template <
typename T,
typename Storage>
259 Teuchos::RCP<typename OrthogPoly<T,Storage>::expansion_type> e = expansion_;
260 if (
x.size() > size()) {
264 e->minusEqual(*th, *
x.th);
268 template <
typename T,
typename Storage>
274 Teuchos::RCP<typename OrthogPoly<T,Storage>::expansion_type> e = expansion_;
275 if (
x.size() > size()) {
279 e->timesEqual(*th, *
x.th);
283 template <
typename T,
typename Storage>
289 Teuchos::RCP<typename OrthogPoly<T,Storage>::expansion_type> e = expansion_;
290 if (
x.size() > size()) {
294 e->divideEqual(*th, *
x.th);
298 template <
typename T,
typename Storage>
307 Teuchos::RCP<typename OrthogPoly<T,Storage>::expansion_type> e = a.expansion();
308 if (da == db || da > 1)
314 e->plus(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(),
315 b.getOrthogPolyApprox());
320 template <
typename T,
typename Storage>
321 OrthogPoly<T,Storage>
326 b.expansion()->plus(c.getOrthogPolyApprox(), a, b.getOrthogPolyApprox());
330 template <
typename T,
typename Storage>
331 OrthogPoly<T,Storage>
336 a.expansion()->plus(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(), b);
340 template <
typename T,
typename Storage>
341 OrthogPoly<T,Storage>
349 Teuchos::RCP<typename OrthogPoly<T,Storage>::expansion_type> e = a.expansion();
350 if (da == db || da > 1)
356 e->minus(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(),
357 b.getOrthogPolyApprox());
362 template <
typename T,
typename Storage>
363 OrthogPoly<T,Storage>
368 b.expansion()->minus(c.getOrthogPolyApprox(), a, b.getOrthogPolyApprox());
372 template <
typename T,
typename Storage>
373 OrthogPoly<T,Storage>
378 a.expansion()->minus(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(), b);
382 template <
typename T,
typename Storage>
383 OrthogPoly<T,Storage>
391 Teuchos::RCP<typename OrthogPoly<T,Storage>::expansion_type> e = a.expansion();
392 if (da == db || da > 1)
398 e->times(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(),
399 b.getOrthogPolyApprox());
404 template <
typename T,
typename Storage>
405 OrthogPoly<T,Storage>
410 b.expansion()->times(c.getOrthogPolyApprox(), a, b.getOrthogPolyApprox());
414 template <
typename T,
typename Storage>
415 OrthogPoly<T,Storage>
420 a.expansion()->times(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(), b);
424 template <
typename T,
typename Storage>
425 OrthogPoly<T,Storage>
433 Teuchos::RCP<typename OrthogPoly<T,Storage>::expansion_type> e = a.expansion();
434 if (da == db || da > 1)
440 e->divide(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(),
441 b.getOrthogPolyApprox());
446 template <
typename T,
typename Storage>
447 OrthogPoly<T,Storage>
452 b.expansion()->divide(c.getOrthogPolyApprox(), a, b.getOrthogPolyApprox());
456 template <
typename T,
typename Storage>
457 OrthogPoly<T,Storage>
462 a.expansion()->divide(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(), b);
466 template <
typename T,
typename Storage>
467 OrthogPoly<T,Storage>
471 a.expansion()->exp(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
475 template <
typename T,
typename Storage>
476 OrthogPoly<T,Storage>
479 TEUCHOS_FUNC_TIME_MONITOR(
"LOG");
482 TEUCHOS_FUNC_TIME_MONITOR(
"OPA LOG");
483 a.expansion()->log(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
490 template <
typename T,
typename Storage>
495 a.expansion()->log(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
498 template <
typename T,
typename Storage>
499 OrthogPoly<T,Storage>
503 a.expansion()->log10(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
507 template <
typename T,
typename Storage>
508 OrthogPoly<T,Storage>
512 a.expansion()->sqrt(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
516 template <
typename T,
typename Storage>
517 OrthogPoly<T,Storage>
521 a.expansion()->cbrt(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
525 template <
typename T,
typename Storage>
526 OrthogPoly<T,Storage>
534 Teuchos::RCP<typename OrthogPoly<T,Storage>::expansion_type> e = a.expansion();
535 if (da == db || da > 1)
541 e->pow(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(),
542 b.getOrthogPolyApprox());
547 template <
typename T,
typename Storage>
548 OrthogPoly<T,Storage>
553 b.expansion()->pow(c.getOrthogPolyApprox(), a, b.getOrthogPolyApprox());
557 template <
typename T,
typename Storage>
558 OrthogPoly<T,Storage>
563 a.expansion()->pow(c.getOrthogPolyApprox(),a.getOrthogPolyApprox(), b);
567 template <
typename T,
typename Storage>
568 OrthogPoly<T,Storage>
572 a.expansion()->sin(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
576 template <
typename T,
typename Storage>
577 OrthogPoly<T,Storage>
581 a.expansion()->cos(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
585 template <
typename T,
typename Storage>
586 OrthogPoly<T,Storage>
590 a.expansion()->tan(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
594 template <
typename T,
typename Storage>
595 OrthogPoly<T,Storage>
599 a.expansion()->sinh(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
603 template <
typename T,
typename Storage>
604 OrthogPoly<T,Storage>
608 a.expansion()->cosh(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
612 template <
typename T,
typename Storage>
613 OrthogPoly<T,Storage>
617 a.expansion()->tanh(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
621 template <
typename T,
typename Storage>
622 OrthogPoly<T,Storage>
626 a.expansion()->acos(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
630 template <
typename T,
typename Storage>
631 OrthogPoly<T,Storage>
635 a.expansion()->asin(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
639 template <
typename T,
typename Storage>
640 OrthogPoly<T,Storage>
644 a.expansion()->atan(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
648 template <
typename T,
typename Storage>
649 OrthogPoly<T,Storage>
653 a.expansion()->acosh(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
657 template <
typename T,
typename Storage>
658 OrthogPoly<T,Storage>
662 a.expansion()->asinh(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
666 template <
typename T,
typename Storage>
667 OrthogPoly<T,Storage>
671 a.expansion()->atanh(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
675 template <
typename T,
typename Storage>
676 OrthogPoly<T,Storage>
680 a.expansion()->fabs(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
684 template <
typename T,
typename Storage>
685 OrthogPoly<T,Storage>
689 a.expansion()->abs(c.getOrthogPolyApprox(), a.getOrthogPolyApprox());
693 template <
typename T,
typename Storage>
694 OrthogPoly<T,Storage>
702 Teuchos::RCP<typename OrthogPoly<T,Storage>::expansion_type> e = a.expansion();
703 if (da == db || da > 1)
709 e->max(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(),
710 b.getOrthogPolyApprox());
715 template <
typename T,
typename Storage>
716 OrthogPoly<T,Storage>
721 b.expansion()->max(c.getOrthogPolyApprox(), a, b.getOrthogPolyApprox());
725 template <
typename T,
typename Storage>
726 OrthogPoly<T,Storage>
731 a.expansion()->max(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(), b);
735 template <
typename T,
typename Storage>
736 OrthogPoly<T,Storage>
744 Teuchos::RCP<typename OrthogPoly<T,Storage>::expansion_type> e = a.expansion();
745 if (da == db || da > 1)
751 e->min(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(),
752 b.getOrthogPolyApprox());
757 template <
typename T,
typename Storage>
758 OrthogPoly<T,Storage>
763 b.expansion()->min(c.getOrthogPolyApprox(), a, b.getOrthogPolyApprox());
767 template <
typename T,
typename Storage>
768 OrthogPoly<T,Storage>
773 a.expansion()->min(c.getOrthogPolyApprox(), a.getOrthogPolyApprox(), b);
777 template <
typename T,
typename Storage>
782 int n =
std::max(a.size(), b.size());
783 for (
int i=0; i<n; i++)
784 if (a.coeff(i) != b.coeff(i))
789 template <
typename T,
typename Storage>
796 for (
int i=1; i<b.size(); i++)
797 if (b.coeff(i) != T(0.0))
802 template <
typename T,
typename Storage>
809 for (
int i=1; i<a.size(); i++)
810 if (a.coeff(i) != T(0.0))
815 template <
typename T,
typename Storage>
823 template <
typename T,
typename Storage>
831 template <
typename T,
typename Storage>
839 template <
typename T,
typename Storage>
841 operator<=(const OrthogPoly<T,Storage>& a,
844 return a.two_norm() <= b.two_norm();
847 template <
typename T,
typename Storage>
852 return a <= b.two_norm();
855 template <
typename T,
typename Storage>
857 operator<=(const OrthogPoly<T,Storage>& a,
860 return a.two_norm() <= b;
863 template <
typename T,
typename Storage>
868 return a.two_norm() >= b.two_norm();
871 template <
typename T,
typename Storage>
876 return a >= b.two_norm();
879 template <
typename T,
typename Storage>
884 return a.two_norm() >= b;
887 template <
typename T,
typename Storage>
889 operator<(const OrthogPoly<T,Storage>& a,
892 return a.two_norm() < b.two_norm();
895 template <
typename T,
typename Storage>
900 return a < b.two_norm();
903 template <
typename T,
typename Storage>
905 operator<(const OrthogPoly<T,Storage>& a,
908 return a.two_norm() < b;
911 template <
typename T,
typename Storage>
916 return a.two_norm() > b.two_norm();
919 template <
typename T,
typename Storage>
924 return a > b.two_norm();
927 template <
typename T,
typename Storage>
932 return a.two_norm() > b;
935 template <
typename T,
typename Storage>
938 for (
int i=0; i<
x.size(); i++)
939 is_zero = is_zero && (
x.coeff(i) == 0.0);
943 template <
typename T,
typename Storage>
950 template <
typename T,
typename Storage>
958 template <
typename T,
typename Storage>
966 template <
typename T,
typename Storage>
973 template <
typename T,
typename Storage>
981 template <
typename T,
typename Storage>
989 template <
typename T,
typename Storage>
991 operator << (std::ostream& os, const OrthogPoly<T,Storage>& a)
998 os << a.coeff(i) <<
" ";
1005 template <
typename T,
typename Storage>
1016 is >> a.fastAccessCoeff(i);
OrthogPoly< T, Storage > exp(const OrthogPoly< T, Storage > &a)
bool operator||(const OrthogPoly< T, Storage > &x1, const OrthogPoly< T, Storage > &x2)
OrthogPoly< T, Storage > log(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > sin(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > sqrt(const OrthogPoly< T, Storage > &a)
bool operator>=(const OrthogPoly< T, Storage > &a, const OrthogPoly< T, Storage > &b)
OrthogPoly< T, Storage > operator-(const OrthogPoly< T, Storage > &a, const OrthogPoly< T, Storage > &b)
OrthogPoly< T, Storage > pow(const OrthogPoly< T, Storage > &a, const OrthogPoly< T, Storage > &b)
OrthogPoly< T, Storage > atan(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > cbrt(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > acos(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > atanh(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > cosh(const OrthogPoly< T, Storage > &a)
std::istream & operator>>(std::istream &is, OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > sinh(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > tan(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > asin(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > operator+(const OrthogPoly< T, Storage > &a, const OrthogPoly< T, Storage > &b)
OrthogPoly< T, Storage > operator/(const OrthogPoly< T, Storage > &a, const OrthogPoly< T, Storage > &b)
OrthogPoly< T, Storage > max(const OrthogPoly< T, Storage > &a, const OrthogPoly< T, Storage > &b)
OrthogPoly< T, Storage > operator+(const OrthogPoly< T, Storage > &a, const typename OrthogPoly< T, Storage >::value_type &b)
bool operator!=(const OrthogPoly< T, Storage > &a, const OrthogPoly< T, Storage > &b)
const IndexType const IndexType const IndexType const IndexType const ValueType const ValueType * x
OrthogPoly< T, Storage > cos(const OrthogPoly< T, Storage > &a)
bool operator==(const OrthogPoly< T, Storage > &a, const OrthogPoly< T, Storage > &b)
OrthogPoly< T, Storage > acosh(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > min(const OrthogPoly< T, Storage > &a, const OrthogPoly< T, Storage > &b)
Orthogonal polynomial expansion class for constant (size 1) expansions.
OrthogPoly< T, Storage > log10(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > max(const OrthogPoly< T, Storage > &a, const typename OrthogPoly< T, Storage >::value_type &b)
OrthogPoly< T, Storage > abs(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > fabs(const OrthogPoly< T, Storage > &a)
OrthogPoly< T, Storage > operator-(const OrthogPoly< T, Storage > &a, const typename OrthogPoly< T, Storage >::value_type &b)
Class to store coefficients of a projection onto an orthogonal polynomial basis.
OrthogPoly< T, Storage > asinh(const OrthogPoly< T, Storage > &a)
bool operator&&(const OrthogPoly< T, Storage > &x1, const OrthogPoly< T, Storage > &x2)
OrthogPoly< T, Storage > tanh(const OrthogPoly< T, Storage > &a)
bool operator>(const OrthogPoly< T, Storage > &a, const OrthogPoly< T, Storage > &b)
OrthogPoly< T, Storage > operator*(const OrthogPoly< T, Storage > &a, const OrthogPoly< T, Storage > &b)
bool toBool(const OrthogPoly< T, Storage > &x)