44 #ifndef ROL_STDTRIDIAGONALOPERATOR_H 45 #define ROL_STDTRIDIAGONALOPERATOR_H 70 template <
typename T>
using RCP = Teuchos::RCP<T>;
71 template <
typename T>
using vector = std::vector<T>;
91 for(
int i=0;i<N_-1;++i) {
96 d_[N_-1] = (*a_)[N_-1];
97 du2_.assign(N_-2,0.0);
118 StrdTridiagonalOperator(a,b,b);
131 Hv[0] = (*a_)[0]*v[0] + (*b_)[0]*v[1];
133 for(
int i=1; i<N_-1; ++i ) {
134 Hv[i] = (*c_)[i-1]*v[i-1] + (*a_)[i]*v[i] + (*b_)[i]*v[i+1];
137 Hv[N_-1] = (*a_)[N_-1]*v[N_-1] + (*c_)[N_-2]*v[N_-2];
142 Hv[0] = (*a_)[0]*v[0] + (*c_)[0]*v[1];
144 for(
int i=1; i<N_-1; ++i ) {
145 Hv[i] = (*b_)[i-1]*v[i-1] + (*a_)[i]*v[i] + (*c_)[i]*v[i+1];
148 Hv[N_-1] = (*a_)[N_-1]*v[N_-1] + (*b_)[N_-2]*v[N_-2];
155 lapack_.GTTRF(N_,&dl_[0],&d_[0],&du_[0],&du2_[0],&ipiv_[0],&INFO);
156 lapack_.GTTRS(
'N',N_,1,&dl_[0],&d_[0],&du_[0],&du2_[0],&ipiv_[0],&Hv[0],N_,&INFO);
163 lapack_.GTTRF(N_,&dl_[0],&d_[0],&du_[0],&du2_[0],&ipiv_[0],&INFO);
164 lapack_.GTTRS(
'T',N_,1,&dl_[0],&d_[0],&du_[0],&du2_[0],&ipiv_[0],&Hv[0],N_,&INFO);
Provides the std::vector implementation to apply a linear operator, which is a std::vector representa...
const RCP< const vector< Real > > b_
StdTridiagonalOperator(const RCP< const vector< Real > > &a, const RCP< const vector< Real > > &b)
StdTridiagonalOperator(const RCP< const vector< Real > > &a, const RCP< const vector< Real > > &b, const RCP< const vector< Real > > &c)
Provides the std::vector implementation to apply a linear operator, which encapsulates a tridiagonal ...
virtual void applyAdjoint(vector< Real > &Hv, const vector< Real > &v, Real &tol) const
virtual void applyAdjointInverse(vector< Real > &Hv, const vector< Real > &v, Real &tol) const
virtual ~StdTridiagonalOperator()
Teuchos::LAPACK< int, Real > lapack_
const RCP< const vector< Real > > a_
virtual void applyInverse(vector< Real > &Hv, const vector< Real > &v, Real &tol) const
virtual void apply(vector< Real > &Hv, const vector< Real > &v, Real &tol) const
const RCP< const vector< Real > > c_