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 THYRA_SILLY_MODIFIED_GRAM_SHMIDT_HPP
00030 #define THYRA_SILLY_MODIFIED_GRAM_SHMIDT_HPP
00031
00032 #include "Thyra_MultiVectorBase.hpp"
00033 #include "Thyra_MultiVectorStdOps.hpp"
00034 #include "Thyra_VectorStdOps.hpp"
00035 #include "Thyra_DetachedMultiVectorView.hpp"
00036
00048 template<class Scalar>
00049 void sillyModifiedGramSchmidt(
00050 Thyra::MultiVectorBase<Scalar> *V_inout
00051 ,Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > *R_out
00052 )
00053 {
00054 typedef Teuchos::ScalarTraits<Scalar> ST;
00055 TEST_FOR_EXCEPT(V_inout==NULL);
00056 Thyra::MultiVectorBase<Scalar> &V = *V_inout;
00057 const int n = V.domain()->dim();
00058 *R_out = Thyra::createMembers(V.domain(),n);
00059
00060 Thyra::DetachedMultiVectorView<Scalar> R(*(*R_out));
00061 for( int k = 0; k < n; ++k ) {
00062 R(k,k) = Thyra::norm(*V.col(k));
00063 Thyra::scale(Scalar(ST::one()/R(k,k)),&*V.col(k));
00064 for( int j = k+1; j < n; ++j ) {
00065 R(k,j) = Thyra::scalarProd(*V.col(k),*V.col(j));
00066 Thyra::update( Scalar(-R(k,j)), *V.col(k), &*V.col(j) );
00067 }
00068 }
00069
00070 }
00071
00072 #endif // THYRA_SILLY_MODIFIED_GRAM_SHMIDT_HPP