Teuchos Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Teuchos_Polynomial.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Teuchos: Common Tools Package
4 //
5 // Copyright 2004 NTESS and the Teuchos contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef TEUCHOS_POLYNOMIAL_HPP
11 #define TEUCHOS_POLYNOMIAL_HPP
12 
14 #include "Teuchos_ScalarTraits.hpp"
15 
16 template <typename CoeffT>
18  const CoeffT& cloneCoeff,
19  unsigned int reserve) :
20  d(deg)
21 {
22  if (reserve > d)
23  sz = reserve+1;
24  else
25  sz = d+1;
26 
27  coeff.resize(sz);
28  for (unsigned int i=0; i<sz; i++)
29  coeff[i] = PolynomialTraits<CoeffT>::clone(cloneCoeff);
30 }
31 
32 template <typename CoeffT>
34  unsigned int reserve) :
35  d(deg)
36 {
37  if (reserve > d)
38  sz = reserve+1;
39  else
40  sz = d+1;
41 
42  coeff.resize(sz);
43 }
44 
45 template <typename CoeffT>
47 {
48 }
49 
50 template <typename CoeffT>
51 void
53 {
54  d = deg;
55  if (d+1 > sz) {
56  coeff.resize(d+1);
57  if (coeff[0] != Teuchos::null) {
58  for (unsigned int i=sz; i<d+1; i++)
59  coeff[i] = PolynomialTraits<CoeffT>::clone(*coeff[0]);
60  }
61  sz = d+1;
62  }
63 }
64 
65 template <typename CoeffT>
68 {
69 #ifdef TEUCHOS_DEBUG
71  std::out_of_range,
72  "Polynomial<CoeffT>::getCoefficient(i): " <<
73  "Error, coefficient i = " << i <<
74  " is not in range, degree = " << d << "." );
75 #endif
76  return coeff[i];
77 }
78 
79 template <typename CoeffT>
82 {
83 #ifdef TEUCHOS_DEBUG
85  std::out_of_range,
86  "Polynomial<CoeffT>::getCoefficient(i): " <<
87  "Error, coefficient i = " << i <<
88  " is not in range, degree = " << d << "." );
89 #endif
90  return coeff[i];
91 }
92 
93 template <typename CoeffT>
94 void
95 Teuchos::Polynomial<CoeffT>::setCoefficient(unsigned int i, const CoeffT& v)
96 {
97 #ifdef TEUCHOS_DEBUG
99  std::out_of_range,
100  "Polynomial<CoeffT>::setCoefficient(i,v): " <<
101  "Error, coefficient i = " << i <<
102  " is not in range, degree = " << d << "." );
104  std::runtime_error,
105  "Polynomial<CoeffT>::setCoefficient(i,v): " <<
106  "Error, coefficient i = " << i << " is null!");
107 #endif
108  PolynomialTraits<CoeffT>::copy(v, coeff[i].get());
109 }
110 
111 template <typename CoeffT>
112 void
114  unsigned int i,
115  const Teuchos::RCP<CoeffT>& v)
116 {
117 #ifdef TEUCHOS_DEBUG
119  std::out_of_range,
120  "Polynomial<CoeffT>::setCoefficientPtr(i,v): " <<
121  "Error, coefficient i = " << i <<
122  " is not in range, degree = " << d << "." );
123 #endif
124  coeff[i] = v;
125 }
126 
127 template <typename CoeffT>
128 void
131  CoeffT* x, CoeffT* xdot) const
132 {
133  bool evaluate_xdot = (xdot != NULL);
134 
135 #ifdef TEUCHOS_DEBUG
136  for (unsigned int i=0; i<=d; i++)
138  std::runtime_error,
139  "Polynomial<CoeffT>::evaluate(): " <<
140  "Error, coefficient i = " << i << " is null!");
141 #endif
142 
143  // Initialize x, xdot with coeff[d]
144  PolynomialTraits<CoeffT>::copy(*coeff[d], x);
145  if (evaluate_xdot) {
146  if (d > 0)
147  PolynomialTraits<CoeffT>::copy(*coeff[d], xdot);
148  else
150  xdot,
152  }
153 
154  // If this is a degree 0 polynomial, we're done
155  if (d == 0)
156  return;
157 
158  for (int k=d-1; k>=0; --k) {
159  // compute x = coeff[k] + t*x
160  PolynomialTraits<CoeffT>::update(x, *coeff[k], t);
161 
162  // compute xdot = x + t*xdot
163  if (evaluate_xdot && k > 0)
165  }
166 }
167 
168 #endif // TEUCHOS_VECTOR_POLYNOMIAL_HPP
static void assign(coeff_type *y, const scalar_type &alpha)
Assign a scalar to a coefficient.
static void update(coeff_type *y, const coeff_type &x, const scalar_type &beta)
y = x + beta*y
void setDegree(unsigned int deg)
Set degree of polynomial to deg.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
unsigned int sz
Size of polynomial (may be &gt; d)
Polynomial(unsigned int deg, const CoeffT &cloneCoeff, unsigned int reserve=0)
Create a polynomial of degree deg.
This structure defines some basic traits for a scalar field type.
void setCoefficient(unsigned int i, const CoeffT &v)
Set coefficient i to c.
void setCoefficientPtr(unsigned int i, const Teuchos::RCP< CoeffT > &c_ptr)
Set pointer for coefficient i to c_ptr. DANGEROUS!
Teuchos::RCP< CoeffT > getCoefficient(unsigned int i)
Return ref-count pointer to coefficient i.
std::vector< Teuchos::RCP< CoeffT > > coeff
Vector of polynomial coefficients.
Traits class for polynomial coefficients in Teuchos::Polynomial.
Defines basic traits for the scalar field type.
Smart reference counting pointer class for automatic garbage collection.
void evaluate(typename Teuchos::Polynomial< CoeffT >::scalar_type &t, CoeffT *x, CoeffT *xdot=NULL) const
Evaluate polynomial and possibly its derivative at time t.
static void copy(const coeff_type &x, coeff_type *y)
Copy a coefficient.
unsigned int d
Degree of polynomial.