MOOCHO (Single Doxygen Collection) Version of the Day
AbstractLinAlgPack_MatrixOpThyra.cpp
Go to the documentation of this file.
00001 // @HEADER
00002 // ***********************************************************************
00003 // 
00004 // Moocho: Multi-functional Object-Oriented arCHitecture for Optimization
00005 //                  Copyright (2003) 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 // 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 Roscoe A. Bartlett (rabartl@sandia.gov) 
00038 // 
00039 // ***********************************************************************
00040 // @HEADER
00041 
00042 #include <assert.h>
00043 
00044 #include "AbstractLinAlgPack_MatrixOpThyra.hpp"
00045 #include "AbstractLinAlgPack_VectorMutableThyra.hpp"
00046 #include "AbstractLinAlgPack_ThyraAccessors.hpp"
00047 #include "Teuchos_Assert.hpp"
00048 #include "Teuchos_dyn_cast.hpp"
00049 
00050 namespace AbstractLinAlgPack {
00051 
00052 // Constructors / Initializers
00053 
00054 MatrixOpThyra::MatrixOpThyra()
00055 {}
00056 
00057 MatrixOpThyra::MatrixOpThyra(
00058   const Teuchos::RCP<const Thyra::LinearOpBase<value_type> >   &thyra_linear_op
00059   ,BLAS_Cpp::Transp                                                    thyra_linear_op_trans
00060   )
00061 {
00062   this->initialize(thyra_linear_op,thyra_linear_op_trans);
00063 }
00064 
00065 void MatrixOpThyra::initialize(
00066   const Teuchos::RCP<const Thyra::LinearOpBase<value_type> >   &thyra_linear_op
00067   ,BLAS_Cpp::Transp                                                    thyra_linear_op_trans
00068   )
00069 {
00070   namespace mmp = MemMngPack;
00071   TEUCHOS_TEST_FOR_EXCEPTION(
00072     thyra_linear_op.get()==NULL, std::invalid_argument
00073     ,"MatrixOpThyra::initialize(thyra_linear_op): Error!"
00074     );
00075   const bool adjointSupported = ( ::Thyra::opSupported(*thyra_linear_op,Thyra::NOTRANS) && ::Thyra::opSupported(*thyra_linear_op,Thyra::TRANS) );
00076   TEUCHOS_TEST_FOR_EXCEPTION(
00077     !adjointSupported, std::invalid_argument
00078     ,"MatrixOpThyra::initialize(thyra_linear_op): Error, the operator opSupported(thyra_linear_op,transp) must return true "
00079     "for both values of transp==NOTRANS and transp=TRANS!"
00080     );
00081   thyra_linear_op_       = thyra_linear_op;
00082   thyra_linear_op_trans_ = thyra_linear_op_trans;
00083   space_cols_.initialize(thyra_linear_op_->range());
00084   space_rows_.initialize(thyra_linear_op_->domain());
00085 }
00086 
00087 Teuchos::RCP<const Thyra::LinearOpBase<value_type> > 
00088 MatrixOpThyra::set_uninitialized()
00089 {
00090   Teuchos::RCP<const Thyra::LinearOpBase<value_type> > tmp_thyra_linear_op = thyra_linear_op_;
00091   thyra_linear_op_       = Teuchos::null;
00092   thyra_linear_op_trans_ = BLAS_Cpp::no_trans;
00093   space_cols_.set_uninitialized();
00094   space_rows_.set_uninitialized();
00095   return tmp_thyra_linear_op;
00096 }
00097 
00098 // Overridden from MatrixBase
00099 
00100 const VectorSpace&
00101 MatrixOpThyra::space_cols() const
00102 {
00103   return space_cols_;
00104 }
00105 
00106 const VectorSpace&
00107 MatrixOpThyra::space_rows() const
00108 {
00109   return space_rows_;
00110 }
00111 
00112 // Overridden from MatrixOp
00113 
00114 MatrixOp::mat_mut_ptr_t
00115 MatrixOpThyra::clone()
00116 {
00117   return Teuchos::rcp(new MatrixOpThyra(thyra_linear_op_->clone()));
00118 }
00119 
00120 MatrixOp& MatrixOpThyra::operator=(const MatrixOp& mwo_rhs)
00121 {
00122   using Teuchos::dyn_cast;
00123   const MatrixOpThyra &mwo_rhs_thyra = dyn_cast<const MatrixOpThyra>(mwo_rhs);
00124   thyra_linear_op_       = mwo_rhs_thyra.thyra_linear_op_;  // ToDo: Clone this!
00125   thyra_linear_op_trans_ = mwo_rhs_thyra.thyra_linear_op_trans_;
00126   space_cols_           = mwo_rhs_thyra.space_cols_;  // ToDo: Clone this!
00127   space_rows_           = mwo_rhs_thyra.space_rows_;  // ToDo: Clone this!
00128   return *this;
00129 }
00130 
00131 void MatrixOpThyra::Vp_StMtV(
00132   VectorMutable* v_lhs, value_type alpha, BLAS_Cpp::Transp trans_rhs1
00133   ,const Vector& v_rhs2, value_type beta
00134   ) const
00135 {
00136   using BLAS_Cpp::trans_trans;
00137   // Get Thyra views of the vectors
00138   Teuchos::RCP<const Thyra::VectorBase<value_type> > thyra_vec_rhs2;
00139   get_thyra_vector( BLAS_Cpp::no_trans==trans_rhs1 ? space_rows_ : space_cols_, v_rhs2, &thyra_vec_rhs2 );
00140   Teuchos::RCP<Thyra::VectorBase<value_type> > thyra_vec_lhs;
00141   get_thyra_vector( BLAS_Cpp::no_trans==trans_rhs1 ? space_cols_ : space_rows_, v_lhs, &thyra_vec_lhs );
00142   // Perform the multiplication
00143   ::Thyra::apply(
00144     *thyra_linear_op_
00145     ,trans_trans(trans_rhs1,thyra_linear_op_trans())==BLAS_Cpp::no_trans ? Thyra::NOTRANS : Thyra::TRANS  // M_trans
00146     ,*thyra_vec_rhs2                                                                                      // x
00147     ,thyra_vec_lhs.ptr()                                                                                  // y
00148     ,alpha                                                                                                // alpha
00149     ,beta                                                                                                // beta
00150     );
00151   // Free/commit Thyra vector views
00152   free_thyra_vector( BLAS_Cpp::no_trans==trans_rhs1 ? space_rows_ : space_cols_, v_rhs2, &thyra_vec_rhs2 );
00153   commit_thyra_vector( BLAS_Cpp::no_trans==trans_rhs1 ? space_cols_ : space_rows_, v_lhs, &thyra_vec_lhs );
00154 }
00155 
00156 bool MatrixOpThyra::Mp_StMtM(
00157   MatrixOp* mwo_lhs, value_type alpha
00158   ,BLAS_Cpp::Transp trans_rhs1
00159   ,const MatrixOp& mwo_rhs2, BLAS_Cpp::Transp trans_rhs2
00160   ,value_type beta
00161   ) const
00162 {
00163   return false; // ToDo: Specialize!
00164 }
00165 
00166 } // end namespace AbstractLinAlgPack
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines