Thyra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
sillyPowerMethod.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Thyra: Interfaces and Support for Abstract Numerical Algorithms
5 // Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Roscoe A. Bartlett (bartlettra@ornl.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #ifndef THYRA_SILLY_POWER_METHOD_HPP
43 #define THYRA_SILLY_POWER_METHOD_HPP
44 
45 #include "Thyra_LinearOpBase.hpp"
46 #include "Thyra_VectorStdOps.hpp"
47 
48 
60 template<class Scalar>
61 bool sillyPowerMethod(
63  const int maxNumIters,
64  const typename Teuchos::ScalarTraits<Scalar>::magnitudeType tolerance,
65  const Teuchos::Ptr<Scalar> &lambda,
66  std::ostream &out
67  )
68 {
69 
70  // Create some typedefs and some other stuff to make the code cleaner
71  typedef Teuchos::ScalarTraits<Scalar> ST; typedef typename ST::magnitudeType ScalarMag;
72  using Thyra::apply;
73  const Scalar one = ST::one(); using Thyra::NOTRANS;
74  //typedef Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > VectorSpacePtr; // unused
75  typedef Teuchos::RCP<Thyra::VectorBase<Scalar> > VectorPtr;
76 
77  // Initialize
78  out << "\nStarting power method (target tolerance = "<<tolerance<<") ...\n\n";
79  VectorPtr q = createMember(A.domain()), z = createMember(A.range()), r = createMember(A.range());
80  Thyra::seed_randomize<Scalar>(0);
81  Thyra::randomize( Scalar(-one), Scalar(+one), z.ptr() );
82 
83  // Perform iterations
84  for( int iter = 0; iter < maxNumIters; ++iter ) {
85  const ScalarMag z_nrm = norm(*z); // Compute natural norm of z
86  V_StV( q.ptr(), Scalar(one/z_nrm), *z ); // q = (1/||z||)*z
87  apply<Scalar>( A, NOTRANS , *q, z.ptr() ); // z = A*q
88  *lambda = scalarProd(*q,*z); // lambda = <q,z>
89  if( iter%(maxNumIters/10) == 0 || iter+1 == maxNumIters ) {
90  V_StVpV(r.ptr(),Scalar(-*lambda),*q,*z); // r = -lambda*q + z
91  const ScalarMag r_nrm = norm(*r); // Compute natural norm of r
92  out << "Iter = " << iter << ", lambda = " << (*lambda)
93  << ", ||A*q-lambda*q|| = " << r_nrm << std::endl;
94  if( r_nrm < tolerance )
95  return true; // Success!
96  }
97  }
98 
99  out << "\nMaximum number of iterations exceeded with ||-lambda*q + z||"
100  " > tolerence = " << tolerance << "\n";
101  return false; // Failure
102 
103 } // end sillyPowerMethod
104 
105 
106 #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(&lt;v,v&gt;).
Scalar scalarProd(const VectorBase< Scalar > &x, const VectorBase< Scalar > &y)
Scalar product result = &lt;x,y&gt;.
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-&gt;space()-&gt;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-&gt;space()-&gt;dim()-1, , j = 0...Z-&gt;domain()-&gt;dim()-1.