// -*- c++ -*- // // $COPYRIGHT$ // #ifndef ITL_MODIFIED_GRAM_SCHMIDT_ORTHOGONALIZATION_H #define ITL_MODIFIED_GRAM_SCHMIDT_ORTHOGONALIZATION_H #include #include #include namespace itl { template class modified_gram_schmidt { public: typedef typename itl_traits::size_type size_type; typedef typename itl_traits::value_type value_type; template modified_gram_schmidt(int restart, const Size& s) : V(restart+1) { typedef typename itl_traits::vector_category VecCat; do_initialize(VecCat(), s); } inline const Vec& operator[](size_type i) const { return V[i]; } inline Vec& operator[](size_type i) { return V[i]; } protected: //such as mtl::dense1D template void do_initialize(referencing_object_tag, const Size& s) { for (size_type i=0; i void do_initialize(non_referencing_object_tag, const Size& s) { for (size_type i=0; i V; }; template void orthogonalize(modified_gram_schmidt& V, const VecHi& _Hi, Size i) { VecHi& Hi = const_cast(_Hi); ++i; for (Size k = 0; k < i; k++) { Hi[k] = itl::dot_conj(V[i], V[k]); itl::add(itl::scaled(V[k], -Hi[k]), V[i]); } } template void combine(modified_gram_schmidt& V, const VecS& s, VecX& x, Size i) { itl::copy(itl::scaled(V[0], s[0]), x); for (Size j = 1; j < i; ++j) itl::add(itl::scaled(V[j], s[j]), x); } } #endif