Belos Version of the Day
BelosOperator.hpp
Go to the documentation of this file.
00001 //@HEADER
00002 // ************************************************************************
00003 //
00004 //                 Belos: Block Linear Solvers Package
00005 //                  Copyright 2004 Sandia Corporation
00006 //
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00038 //
00039 // ************************************************************************
00040 //@HEADER
00041 
00042 #ifndef BELOS_OPERATOR_HPP
00043 #define BELOS_OPERATOR_HPP
00044 
00048 
00049 #include "BelosConfigDefs.hpp"
00050 #include "BelosOperatorTraits.hpp"
00051 #include "BelosMultiVec.hpp"
00052 #ifdef HAVE_BELOS_EXPERIMENTAL
00053 #  include "BelosInnerSolver.hpp"
00054 #endif // HAVE_BELOS_EXPERIMENTAL
00055 
00056 
00057 namespace Belos {
00058 
00080   template <class ScalarType>
00081   class Operator {
00082   public:
00084 
00085     
00087     Operator() {};
00088     
00090     virtual ~Operator() {};
00092     
00094 
00095 
00119     virtual void 
00120     Apply (const MultiVec<ScalarType>& x, 
00121      MultiVec<ScalarType>& y, 
00122      ETrans trans=NOTRANS) const = 0;
00123 
00142     virtual bool HasApplyTranspose () const {
00143       return false;
00144     }
00146   };
00147   
00149   //
00150   // Implementation of the Belos::OperatorTraits for Belos::Operator 
00151   //                                               and Belos::MultiVec.
00152   //
00154   
00162   template<class ScalarType> 
00163   class OperatorTraits<ScalarType, MultiVec<ScalarType>, Operator<ScalarType> > 
00164   {
00165   public:
00167     static void 
00168     Apply (const Operator<ScalarType>& Op, 
00169      const MultiVec<ScalarType>& x, 
00170      MultiVec<ScalarType>& y,
00171      ETrans trans=NOTRANS)
00172     { 
00173       Op.Apply (x, y, trans); 
00174     }
00175 
00177     static bool
00178     HasApplyTranspose (const Operator<ScalarType>& Op)
00179     {
00180       return Op.HasApplyTranspose ();
00181     }
00182   };
00183 
00184 #ifdef HAVE_BELOS_EXPERIMENTAL
00185 
00199   template<class Scalar>
00200   class OperatorInnerSolver : public Operator<Scalar> {
00201   public:
00202     typedef Scalar scalar_type;
00203     typedef MultiVec<Scalar> multivector_type;
00204     typedef Operator<Scalar> operator_type;
00205     typedef InnerSolver<scalar_type, multivector_type, operator_type> inner_solver_type;
00206 
00210     OperatorInnerSolver (const Teuchos::RCP<inner_solver_type>& solver) :
00211       solver_ (solver)
00212     {}
00214     virtual ~OperatorInnerSolver() {}
00215 
00237     Teuchos::RCP<inner_solver_type> getInnerSolver() const {
00238       return solver_;
00239     }
00240 
00250     virtual void 
00251     Apply (const multivector_type& X,
00252      multivector_type& Y,
00253      ETrans mode = NOTRANS) const
00254     {
00255       using Teuchos::rcpFromRef;
00256 
00257       TEUCHOS_TEST_FOR_EXCEPTION(mode != NOTRANS, std::invalid_argument,
00258        "Belos::OperatorInnerSolver only supports applying the"
00259        " operator itself, not its transpose or conjugate "
00260        "transpose.");
00261       solver_->solve (rcpFromRef (Y), rcpFromRef (X));
00262     }
00263 
00268     virtual bool HasApplyTranspose() const {
00269       return false;
00270     }
00271 
00272   private:
00274     OperatorInnerSolver ();
00275 
00277     Teuchos::RCP<inner_solver_type> solver_;
00278   };
00279 
00291   template <class Scalar>
00292   class InnerSolverTraits<Scalar, MultiVec<Scalar>, Operator<Scalar> > {
00293   public:
00294     typedef Scalar scalar_type;
00295     typedef MultiVec<scalar_type> multivector_type;
00296     typedef Operator<scalar_type> operator_type;
00297     typedef InnerSolver<scalar_type, multivector_type, operator_type> inner_solver_type;
00298     typedef OperatorInnerSolver<scalar_type> wrapper_type;
00299 
00304     static Teuchos::RCP<operator_type>
00305     makeInnerSolverOperator (const Teuchos::RCP<inner_solver_type>& solver)
00306     {
00307       using Teuchos::rcp;
00308       using Teuchos::rcp_implicit_cast;
00309       return rcp_implicit_cast<operator_type> (rcp (new wrapper_type (solver)));
00310     }
00311 
00321     static Teuchos::RCP<inner_solver_type>
00322     getInnerSolver (const Teuchos::RCP<operator_type>& op)
00323     {
00324       using Teuchos::RCP;
00325       using Teuchos::rcp_dynamic_cast;
00326       RCP<wrapper_type> wrapper = rcp_dynamic_cast<wrapper_type> (op, true);
00327       return wrapper->getInnerSolver();
00328     }
00329   };
00330 #endif // HAVE_BELOS_EXPERIMENTAL
00331   
00332 } // end Belos namespace
00333 
00334 #endif
00335 
00336 // end of file BelosOperator.hpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines