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 
00079   template <class ScalarType>
00080   class Operator {
00081   public:
00082     
00084 
00085     
00087     Operator() {};
00088     
00090     virtual ~Operator() {};
00092     
00094 
00095 
00105     virtual void 
00106     Apply (const MultiVec<ScalarType>& x, 
00107      MultiVec<ScalarType>& y, 
00108      ETrans trans=NOTRANS) const = 0;
00109   };
00110   
00112   //
00113   // Implementation of the Belos::OperatorTraits for Belos::Operator 
00114   //                                               and Belos::MultiVec.
00115   //
00117   
00125   template<class ScalarType> 
00126   class OperatorTraits<ScalarType, MultiVec<ScalarType>, Operator<ScalarType> > 
00127   {
00128   public:
00130     static void 
00131     Apply (const Operator<ScalarType>& Op, 
00132      const MultiVec<ScalarType>& x, 
00133      MultiVec<ScalarType>& y,
00134      ETrans trans=NOTRANS)
00135     { 
00136       Op.Apply (x, y, trans); 
00137     }
00138   };
00139 
00140 #ifdef HAVE_BELOS_EXPERIMENTAL
00141 
00155   template<class Scalar>
00156   class OperatorInnerSolver : public Operator<Scalar> {
00157   public:
00158     typedef Scalar scalar_type;
00159     typedef MultiVec<Scalar> multivector_type;
00160     typedef Operator<Scalar> operator_type;
00161     typedef InnerSolver<scalar_type, multivector_type, operator_type> inner_solver_type;
00162 
00166     OperatorInnerSolver (const Teuchos::RCP<inner_solver_type>& solver) :
00167       solver_ (solver)
00168     {}
00170     virtual ~OperatorInnerSolver() {}
00171 
00193     Teuchos::RCP<inner_solver_type> getInnerSolver() const {
00194       return solver_;
00195     }
00196 
00202     void 
00203     apply(const multivector_type& X,
00204     multivector_type& Y,
00205     ETrans mode = NOTRANS) const
00206     {
00207       using Teuchos::rcpFromRef;
00208 
00209       TEST_FOR_EXCEPTION(mode != NOTRANS, std::invalid_argument,
00210        "Belos::OperatorInnerSolver only supports applying the"
00211        " operator itself, not its transpose or conjugate "
00212        "transpose.");
00213       solver_->solve (rcpFromRef (Y), rcpFromRef (X));
00214     }
00215 
00216   private:
00218     OperatorInnerSolver ();
00219 
00221     Teuchos::RCP<inner_solver_type> solver_;
00222   };
00223 
00235   template <class Scalar>
00236   class InnerSolverTraits<Scalar, MultiVec<Scalar>, Operator<Scalar> > {
00237   public:
00238     typedef Scalar scalar_type;
00239     typedef MultiVec<scalar_type> multivector_type;
00240     typedef Operator<scalar_type> operator_type;
00241     typedef InnerSolver<scalar_type, multivector_type, operator_type> inner_solver_type;
00242     typedef OperatorInnerSolver<scalar_type> wrapper_type;
00243 
00248     static Teuchos::RCP<operator_type>
00249     makeInnerSolverOperator (const Teuchos::RCP<inner_solver_type>& solver)
00250     {
00251       using Teuchos::rcp;
00252       using Teuchos::rcp_implicit_cast;
00253       return rcp_implicit_cast<operator_type> (rcp (new wrapper_type (solver)));
00254     }
00255 
00265     static Teuchos::RCP<inner_solver_type>
00266     getInnerSolver (const Teuchos::RCP<operator_type>& op)
00267     {
00268       using Teuchos::RCP;
00269       using Teuchos::rcp_dynamic_cast;
00270       RCP<wrapper_type> wrapper = rcp_dynamic_cast<wrapper_type> (op, true);
00271       return wrapper->getInnerSolver();
00272     }
00273   };
00274 #endif // HAVE_BELOS_EXPERIMENTAL
00275   
00276 } // end Belos namespace
00277 
00278 #endif
00279 
00280 // end of file BelosOperator.hpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines