Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_Polynomial.hpp
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
13#include "Teuchos_PolynomialDecl.hpp"
15
16template <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++)
30}
31
32template <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
45template <typename CoeffT>
49
50template <typename CoeffT>
51void
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
65template <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
79template <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
93template <typename CoeffT>
94void
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 << "." );
103 TEUCHOS_TEST_FOR_EXCEPTION(coeff[i] == Teuchos::null,
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
111template <typename CoeffT>
112void
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
127template <typename CoeffT>
128void
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++)
137 TEUCHOS_TEST_FOR_EXCEPTION(coeff[i] == Teuchos::null,
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)
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
Defines basic traits for the scalar field type.
Traits class for polynomial coefficients in Teuchos::Polynomial.
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
static void copy(const coeff_type &x, coeff_type *y)
Copy a coefficient.
void setCoefficient(unsigned int i, const CoeffT &v)
Set coefficient i to c.
Teuchos::RCP< CoeffT > getCoefficient(unsigned int i)
Return ref-count pointer to coefficient i.
Teuchos::PolynomialTraits< coeff_type >::scalar_type scalar_type
Typename of scalars.
unsigned int sz
Size of polynomial (may be > d)
void evaluate(typename Teuchos::Polynomial< CoeffT >::scalar_type &t, CoeffT *x, CoeffT *xdot=NULL) const
Evaluate polynomial and possibly its derivative at time t.
void setDegree(unsigned int deg)
Set degree of polynomial to deg.
std::vector< Teuchos::RCP< CoeffT > > coeff
Vector of polynomial coefficients.
unsigned int d
Degree of polynomial.
Polynomial(unsigned int deg, const CoeffT &cloneCoeff, unsigned int reserve=0)
Create a polynomial of degree deg.
void setCoefficientPtr(unsigned int i, const Teuchos::RCP< CoeffT > &c_ptr)
Set pointer for coefficient i to c_ptr. DANGEROUS!
Smart reference counting pointer class for automatic garbage collection.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
This structure defines some basic traits for a scalar field type.