10 #ifndef THYRA_SILLY_POWER_METHOD_HPP
11 #define THYRA_SILLY_POWER_METHOD_HPP
13 #include "Thyra_LinearOpBase.hpp"
14 #include "Thyra_VectorStdOps.hpp"
28 template<
class Scalar>
29 bool sillyPowerMethod(
31 const int maxNumIters,
46 out <<
"\nStarting power method (target tolerance = "<<tolerance<<
") ...\n\n";
48 Thyra::seed_randomize<Scalar>(0);
49 Thyra::randomize( Scalar(-one), Scalar(+one), z.ptr() );
52 for(
int iter = 0; iter < maxNumIters; ++iter ) {
53 const ScalarMag z_nrm =
norm(*z);
54 V_StV( q.ptr(), Scalar(one/z_nrm), *z );
55 apply<Scalar>( A,
NOTRANS , *q, z.ptr() );
57 if( iter%(maxNumIters/10) == 0 || iter+1 == maxNumIters ) {
58 V_StVpV(r.ptr(),Scalar(-*lambda),*q,*z);
59 const ScalarMag r_nrm =
norm(*r);
60 out <<
"Iter = " << iter <<
", lambda = " << (*lambda)
61 <<
", ||A*q-lambda*q|| = " << r_nrm << std::endl;
62 if( r_nrm < tolerance )
67 out <<
"\nMaximum number of iterations exceeded with ||-lambda*q + z||"
68 " > tolerence = " << tolerance <<
"\n";
74 #endif // THYRA_SILLY_POWER_METHOD_HPP
virtual RCP< const VectorSpaceBase< Scalar > > range() const =0
Return a smart pointer for the range space for this operator.
Use the non-transposed operator.
RCP< VectorBase< Scalar > > createMember(const RCP< const VectorSpaceBase< Scalar > > &vs, const std::string &label="")
Create a vector member from the vector space.
Base class for all linear operators.
virtual RCP< const VectorSpaceBase< Scalar > > domain() const =0
Return a smart pointer for the domain space for this operator.
Teuchos::ScalarTraits< Scalar >::magnitudeType norm(const VectorBase< Scalar > &v)
Natural norm: result = sqrt(<v,v>).
Scalar scalarProd(const VectorBase< Scalar > &x, const VectorBase< Scalar > &y)
Scalar product result = <x,y>.
void V_StV(const Ptr< VectorBase< Scalar > > &y, const Scalar &alpha, const VectorBase< Scalar > &x)
Assign scaled vector: y(i) = alpha * x(i), i = 0...y->space()->dim()-1.
void V_StVpV(const Ptr< MultiVectorBase< Scalar > > &Z, const Scalar &alpha, const MultiVectorBase< Scalar > &X, const MultiVectorBase< Scalar > &Y)
Z(i,j) = alpha*X(i,j) + Y(i), i = 0...z->space()->dim()-1, , j = 0...Z->domain()->dim()-1.