TSFSimplifiedLinearOpBaseImpl.hpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 /* ***********************************************************************
00003 // 
00004 //           TSFExtended: Trilinos Solver Framework Extended
00005 //                 Copyright (2004) Sandia Corporation
00006 // 
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 // 
00010 // This library is free software; you can redistribute it and/or modify
00011 // it under the terms of the GNU Lesser General Public License as
00012 // published by the Free Software Foundation; either version 2.1 of the
00013 // License, or (at your option) any later version.
00014 //  
00015 // This library is distributed in the hope that it will be useful, but
00016 // WITHOUT ANY WARRANTY; without even the implied warranty of
00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018 // Lesser General Public License for more details.
00019 //  
00020 // You should have received a copy of the GNU Lesser General Public
00021 // License along with this library; if not, write to the Free Software
00022 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00023 // USA
00024 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 
00025 // 
00026 // **********************************************************************/
00027  /* @HEADER@ */
00028 
00029 #ifndef TSFSIMPLIFIEDOPBASE_IMPL_HPP
00030 #define TSFSIMPLIFIEDOPBASE_IMPL_HPP
00031 
00032 #include "SundanceDefs.hpp"
00033 #include "SundanceOut.hpp"
00034 #include "TSFSimplifiedLinearOpBaseDecl.hpp"
00035 #include "TSFVectorDecl.hpp"
00036 
00037 
00038 
00039 
00040 namespace TSFExtended
00041 {
00042 using namespace Teuchos;
00043 using namespace Thyra;
00044 
00045 template <class Scalar>
00046 void SimplifiedLinearOpBase<Scalar>
00047 ::generalApply(const Thyra::EOpTransp M_trans,
00048   const Thyra::VectorBase<Scalar>    &x,
00049   Thyra::VectorBase<Scalar>* y,
00050   const Scalar alpha, 
00051   const Scalar beta) const 
00052 {
00053   bool useA = alpha != Teuchos::ScalarTraits<Scalar>::one();
00054   bool useB = beta != Teuchos::ScalarTraits<Scalar>::zero();
00055 
00056   RCP<const Thyra::VectorBase<Scalar> > cxp = rcp(&x, false);
00057   RCP<Thyra::VectorBase<Scalar> > xp 
00058     = rcp_const_cast<Thyra::VectorBase<Scalar> >(cxp);
00059   Vector<Scalar> in = xp;
00060   Vector<Scalar> opOut;
00061 
00062   if (!useB)
00063   {
00064     /* wrap y in a temporary handle */
00065     opOut = rcp(y, false);
00066     applyOp(M_trans, in, opOut);
00067     if (useA)
00068     {
00069       opOut.scale(alpha);
00070     }
00071   }
00072   else
00073   {
00074     opOut = VectorSpace<Scalar>(this->range()).createMember();
00075     applyOp(M_trans, in, opOut);
00076     Vector<Scalar> Y = rcp(y, false);
00077     if (useA)
00078     {
00079       Y.update(alpha, opOut, beta);
00080     }
00081   }
00082 }
00083     
00084  
00085 
00086 /* ---- Simplified linear op with spaces ------- */
00087 
00088 template <class Scalar> inline
00089 SimplifiedLinearOpWithSpaces<Scalar>
00090 ::SimplifiedLinearOpWithSpaces(const VectorSpace<Scalar>& domain,
00091   const VectorSpace<Scalar>& range)
00092   : range_(range), domain_(domain) {}
00093 
00094 
00095 template <class Scalar> inline
00096 RCP< const VectorSpaceBase<Scalar> > 
00097 SimplifiedLinearOpWithSpaces<Scalar>::range() const 
00098 {
00099   return range_.ptr();
00100 }
00101 
00102 
00103 template <class Scalar> inline
00104 RCP< const VectorSpaceBase<Scalar> > 
00105 SimplifiedLinearOpWithSpaces<Scalar>::domain() const 
00106 {
00107   return domain_.ptr();
00108 }
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 }
00117 
00118 #endif

Site Contact