Teuchos_Polynomial.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef TEUCHOS_POLYNOMIAL_HPP
00030 #define TEUCHOS_POLYNOMIAL_HPP
00031
00032 #include "Teuchos_PolynomialDecl.hpp"
00033 #include "Teuchos_ScalarTraits.hpp"
00034
00035 template <typename CoeffT>
00036 Teuchos::Polynomial<CoeffT>::Polynomial(unsigned int deg,
00037 const CoeffT& cloneCoeff,
00038 unsigned int reserve) :
00039 d(deg)
00040 {
00041 if (reserve > d)
00042 sz = reserve+1;
00043 else
00044 sz = d+1;
00045
00046 coeff.resize(sz);
00047 for (unsigned int i=0; i<sz; i++)
00048 coeff[i] = PolynomialTraits<CoeffT>::clone(cloneCoeff);
00049 }
00050
00051 template <typename CoeffT>
00052 Teuchos::Polynomial<CoeffT>::Polynomial(unsigned int deg,
00053 unsigned int reserve) :
00054 d(deg)
00055 {
00056 if (reserve > d)
00057 sz = reserve+1;
00058 else
00059 sz = d+1;
00060
00061 coeff.resize(sz);
00062 }
00063
00064 template <typename CoeffT>
00065 Teuchos::Polynomial<CoeffT>::~Polynomial()
00066 {
00067 }
00068
00069 template <typename CoeffT>
00070 void
00071 Teuchos::Polynomial<CoeffT>::setDegree(unsigned int deg)
00072 {
00073 d = deg;
00074 if (d+1 > sz) {
00075 coeff.resize(d+1);
00076 if (coeff[0] != Teuchos::null) {
00077 for (unsigned int i=sz; i<d+1; i++)
00078 coeff[i] = PolynomialTraits<CoeffT>::clone(*coeff[0]);
00079 }
00080 sz = d+1;
00081 }
00082 }
00083
00084 template <typename CoeffT>
00085 Teuchos::RCP<CoeffT>
00086 Teuchos::Polynomial<CoeffT>::getCoefficient(unsigned int i)
00087 {
00088 #ifdef TEUCHOS_DEBUG
00089 TEST_FOR_EXCEPTION(i > d,
00090 std::out_of_range,
00091 "Polynomial<CoeffT>::getCoefficient(i): " <<
00092 "Error, coefficient i = " << i <<
00093 " is not in range, degree = " << d << "." );
00094 #endif
00095 return coeff[i];
00096 }
00097
00098 template <typename CoeffT>
00099 Teuchos::RCP<const CoeffT>
00100 Teuchos::Polynomial<CoeffT>::getCoefficient(unsigned int i) const
00101 {
00102 #ifdef TEUCHOS_DEBUG
00103 TEST_FOR_EXCEPTION(i > d,
00104 std::out_of_range,
00105 "Polynomial<CoeffT>::getCoefficient(i): " <<
00106 "Error, coefficient i = " << i <<
00107 " is not in range, degree = " << d << "." );
00108 #endif
00109 return coeff[i];
00110 }
00111
00112 template <typename CoeffT>
00113 void
00114 Teuchos::Polynomial<CoeffT>::setCoefficient(unsigned int i, const CoeffT& v)
00115 {
00116 #ifdef TEUCHOS_DEBUG
00117 TEST_FOR_EXCEPTION(i > d,
00118 std::out_of_range,
00119 "Polynomial<CoeffT>::setCoefficient(i,v): " <<
00120 "Error, coefficient i = " << i <<
00121 " is not in range, degree = " << d << "." );
00122 TEST_FOR_EXCEPTION(coeff[i] == Teuchos::null,
00123 std::runtime_error,
00124 "Polynomial<CoeffT>::setCoefficient(i,v): " <<
00125 "Error, coefficient i = " << i << " is null!");
00126 #endif
00127 PolynomialTraits<CoeffT>::copy(v, coeff[i].get());
00128 }
00129
00130 template <typename CoeffT>
00131 void
00132 Teuchos::Polynomial<CoeffT>::setCoefficientPtr(
00133 unsigned int i,
00134 const Teuchos::RCP<CoeffT>& v)
00135 {
00136 #ifdef TEUCHOS_DEBUG
00137 TEST_FOR_EXCEPTION(i > d,
00138 std::out_of_range,
00139 "Polynomial<CoeffT>::setCoefficientPtr(i,v): " <<
00140 "Error, coefficient i = " << i <<
00141 " is not in range, degree = " << d << "." );
00142 #endif
00143 coeff[i] = v;
00144 }
00145
00146 template <typename CoeffT>
00147 void
00148 Teuchos::Polynomial<CoeffT>::evaluate(
00149 typename Teuchos::Polynomial<CoeffT>::scalar_type t,
00150 CoeffT* x, CoeffT* xdot) const
00151 {
00152 bool evaluate_xdot = (xdot != NULL);
00153
00154 #ifdef TEUCHOS_DEBUG
00155 for (unsigned int i=0; i<=d; i++)
00156 TEST_FOR_EXCEPTION(coeff[i] == Teuchos::null,
00157 std::runtime_error,
00158 "Polynomial<CoeffT>::evaluate(): " <<
00159 "Error, coefficient i = " << i << " is null!");
00160 #endif
00161
00162
00163 PolynomialTraits<CoeffT>::copy(*coeff[d], x);
00164 if (evaluate_xdot) {
00165 if (d > 0)
00166 PolynomialTraits<CoeffT>::copy(*coeff[d], xdot);
00167 else
00168 PolynomialTraits<CoeffT>::assign(
00169 xdot,
00170 Teuchos::ScalarTraits<scalar_type>::zero());
00171 }
00172
00173
00174 if (d == 0)
00175 return;
00176
00177 for (int k=d-1; k>=0; --k) {
00178
00179 PolynomialTraits<CoeffT>::update(x, *coeff[k], t);
00180
00181
00182 if (evaluate_xdot && k > 0)
00183 PolynomialTraits<CoeffT>::update(xdot, *x, t);
00184 }
00185 }
00186
00187 #endif // TEUCHOS_VECTOR_POLYNOMIAL_HPP