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
00030
00031
00032 template <typename T>
00033 Sacado::PCE::HermiteBasis<T>::
00034 HermiteBasis(unsigned int degree) :
00035 d(degree),
00036 basis(d+1, StandardPoly<T>(d)),
00037 norms(d+1, T(0.0))
00038 {
00039
00040 basis[0].coeff(0) = T(1.0);
00041 if (d >= 1)
00042 basis[1].coeff(1) = T(2.0);
00043 for (unsigned int k=2; k<=d; k++) {
00044 basis[k].coeff(0) = -T(2.0)*T(k-1)*basis[k-2].coeff(0);
00045 for (unsigned int i=1; i<=k; i++)
00046 basis[k].coeff(i) =
00047 T(2.0)*(basis[k-1].coeff(i-1) - T(k-1)*basis[k-2].coeff(i));
00048 }
00049
00050
00051 norms[0] = 2.0*std::sqrt(std::atan(1.0));
00052 for (unsigned int k=1; k<=d; k++)
00053 norms[k] = T(2.0)*T(k)*norms[k-1];
00054 }
00055
00056 template <typename T>
00057 Sacado::PCE::HermiteBasis<T>::
00058 HermiteBasis(const Sacado::PCE::HermiteBasis<T>& b) :
00059 d(b.d),
00060 basis(b.basis),
00061 norms(b.norms)
00062 {
00063 }
00064
00065 template <typename T>
00066 Sacado::PCE::HermiteBasis<T>&
00067 Sacado::PCE::HermiteBasis<T>::
00068 operator=(const Sacado::PCE::HermiteBasis<T>& b)
00069 {
00070 if (this != &b) {
00071 d = b.d;
00072 basis = b.basis;
00073 norms = b.norms;
00074 }
00075 return *this;
00076 }
00077
00078 template <typename T>
00079 Sacado::PCE::HermiteBasis<T>::
00080 ~HermiteBasis()
00081 {
00082 }
00083
00084 template <typename T>
00085 unsigned int
00086 Sacado::PCE::HermiteBasis<T>::
00087 size() const
00088 {
00089 return d+1;
00090 }
00091
00092 template <typename T>
00093 const std::vector<T>&
00094 Sacado::PCE::HermiteBasis<T>::
00095 norm_squared() const
00096 {
00097 return norms;
00098 }
00099
00100 template <typename T>
00101 T
00102 Sacado::PCE::HermiteBasis<T>::
00103 derivCoeff(unsigned int i) const
00104 {
00105 return T(2.0*i);
00106 }
00107
00108 template <typename T>
00109 void
00110 Sacado::PCE::HermiteBasis<T>::
00111 project(const Sacado::PCE::StandardPoly<T>& p, std::vector<T>& coeffs) const
00112 {
00113
00114 for (unsigned int i=0; i<=d; i++)
00115 coeffs[i] = T(0.0);
00116
00117 unsigned int dp = p.degree();
00118 if (dp > d)
00119 dp = d;
00120
00121
00122 if (dp == 0) {
00123 coeffs[0] = p.coeff(0);
00124 return;
00125 }
00126
00127
00128 std::vector<T> h(dp+1,T(0.));
00129
00130 coeffs[0] = p.coeff(dp-1);
00131 coeffs[1] = T(0.5)*p.coeff(dp);
00132 unsigned int dc = 1;
00133
00134 for (int k=dp-2; k>=0; --k) {
00135
00136
00137 h[0] = coeffs[1] + p.coeff(k);
00138 for (unsigned int i=1; i<=dc-1; i++) {
00139 h[i] = T(0.5)*coeffs[i-1] + T(i+1)*coeffs[i+1];
00140 }
00141 h[dc] = T(0.5)*coeffs[dc-1];
00142 h[dc+1] = T(0.5)*coeffs[dc];
00143
00144
00145 for (unsigned int i=0; i<=dc+1; i++)
00146 coeffs[i] = h[i];
00147
00148 dc = dc+1;
00149 }
00150 }
00151
00152 template <typename T>
00153 Sacado::PCE::StandardPoly<T>
00154 Sacado::PCE::HermiteBasis<T>::
00155 toStandardBasis(const T coeffs[], unsigned int n) const
00156 {
00157 unsigned int dp = d;
00158 if (n < d+1)
00159 dp = n-1;
00160 StandardPoly<T> p(dp);
00161
00162 for (unsigned int i=0; i<=dp; i++)
00163 p.add(coeffs[i], basis[i], 1.0);
00164
00165 return p;
00166 }
00167
00168 template <typename T>
00169 const Sacado::PCE::StandardPoly<T>&
00170 Sacado::PCE::HermiteBasis<T>::
00171 getBasisPoly(unsigned int i) const
00172 {
00173 return basis[i];
00174 }
00175
00176 template <typename T>
00177 void
00178 Sacado::PCE::HermiteBasis<T>::
00179 print(std::ostream& os) const
00180 {
00181 os << "Hermite basis of degree " << d << ". Basis vectors:\n";
00182 for (unsigned int i=0; i<basis.size(); i++)
00183 os << "\t" << basis[i];
00184 os << "Basis vector norms (squared):\n\t";
00185 for (unsigned int i=0; i<norms.size(); i++)
00186 os << norms[i] << " ";
00187 os << "\n";
00188 }