MOOCHO/Thyra Adapter Software Version of the Day
AbstractLinAlgPack_MatrixOpNonsingThyra.cpp
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 
00043 #include "AbstractLinAlgPack_MatrixOpNonsingThyra.hpp"
00044 #include "AbstractLinAlgPack_VectorMutableThyra.hpp"
00045 #include "Thyra_VectorStdOps.hpp"
00046 #include "Thyra_MultiVectorStdOps.hpp"
00047 #include "Teuchos_Assert.hpp"
00048 #include "Teuchos_dyn_cast.hpp"
00049 
00050 namespace AbstractLinAlgPack {
00051 
00052 // Constructors / Initializers
00053 
00054 MatrixOpNonsingThyra::MatrixOpNonsingThyra()
00055 {}
00056 
00057 MatrixOpNonsingThyra::MatrixOpNonsingThyra(
00058   const Teuchos::RCP<const Thyra::LinearOpWithSolveBase<value_type> >  &thyra_linear_op_ns
00059   ,BLAS_Cpp::Transp                                                            thyra_linear_op_trans
00060   )
00061 {
00062   this->initialize(thyra_linear_op_ns,thyra_linear_op_trans);
00063 }
00064 
00065 void MatrixOpNonsingThyra::initialize(
00066   const Teuchos::RCP<const Thyra::LinearOpWithSolveBase<value_type> >  &thyra_linear_op_ns
00067   ,BLAS_Cpp::Transp                                                            thyra_linear_op_trans
00068   )
00069 {
00070   namespace mmp = MemMngPack;
00071   TEUCHOS_TEST_FOR_EXCEPTION(
00072     thyra_linear_op_ns.get()==NULL, std::invalid_argument
00073     ,"MatrixOpNonsingThyra::initialize(thyra_linear_op_ns): Error!"
00074     );
00075   MatrixOpThyra::initialize(thyra_linear_op_ns,thyra_linear_op_trans);
00076 }
00077 
00078 Teuchos::RCP<const Thyra::LinearOpWithSolveBase<value_type> > 
00079 MatrixOpNonsingThyra::set_uninitialized()
00080 {
00081   Teuchos::RCP<const Thyra::LinearOpWithSolveBase<value_type> >
00082     tmp_thyra_linear_op_ns = thyra_linear_op_ns();
00083   MatrixOpThyra::set_uninitialized();
00084   return tmp_thyra_linear_op_ns;
00085 }
00086 
00087 Teuchos::RCP<const Thyra::LinearOpWithSolveBase<value_type> >
00088 MatrixOpNonsingThyra::thyra_linear_op_ns() const
00089 {
00090   return Teuchos::rcp_dynamic_cast<const Thyra::LinearOpWithSolveBase<value_type> >(this->thyra_linear_op());
00091 }
00092 
00093 // Overridden from MatrixOp (needed to remove ambiguities)
00094 
00095 MatrixOp::mat_mut_ptr_t
00096 MatrixOpNonsingThyra::clone()
00097 {
00098   return this->MatrixOpThyra::clone();
00099 }
00100 
00101 // Overridden from MatrixNonsing
00102 
00103 void MatrixOpNonsingThyra::V_InvMtV(
00104   VectorMutable* v_lhs, BLAS_Cpp::Transp trans_rhs1
00105   ,const Vector& v_rhs2
00106   ) const
00107 {
00108   using Teuchos::dyn_cast;
00109   using BLAS_Cpp::trans_trans;
00110 #ifdef TEUCHOS_DEBUG
00111   TEUCHOS_TEST_FOR_EXCEPTION(
00112     v_lhs==NULL, std::invalid_argument
00113     ,"MatrixOpThyra::Vp_StMtV(...): Error!"
00114     );
00115 #endif
00116   *v_lhs = 0.0; // Must initialize before sending to solve(...)!
00117   VectorMutableThyra &v_thyra_lhs = dyn_cast<VectorMutableThyra>(*v_lhs);
00118   Teuchos::RCP<Thyra::VectorBase<value_type> > thyra_vec_lhs = v_thyra_lhs.set_uninitialized();
00119   Thyra::solve<value_type>(
00120     *thyra_linear_op_ns()
00121     ,trans_trans(trans_rhs1,thyra_linear_op_trans())==BLAS_Cpp::no_trans ? Thyra::NOTRANS : Thyra::TRANS  // M_trans
00122     ,*dyn_cast<const VectorMutableThyra>(v_rhs2).thyra_vec()                                              // y
00123     ,thyra_vec_lhs.ptr()                                                                                  // x
00124     );
00125   v_thyra_lhs.initialize(thyra_vec_lhs);
00126 }
00127 
00128 void MatrixOpNonsingThyra::M_StInvMtM(
00129   MatrixOp* m_lhs, value_type alpha
00130   ,BLAS_Cpp::Transp trans_rhs1
00131   ,const MatrixOp& mwo_rhs2, BLAS_Cpp::Transp trans_rhs2
00132   ) const
00133 {
00134   MatrixNonsing::M_StInvMtM(m_lhs,alpha,trans_rhs1,mwo_rhs2,trans_rhs2); // ToDo: Specialize!
00135 }
00136 
00137 // Overridden from MatrixOpNonsing
00138 
00139 MatrixOpNonsing::mat_mwons_ptr_t
00140 MatrixOpNonsingThyra::clone_mwons() const
00141 {
00142   return Teuchos::null; // ToDo: Add a clone function to Thyra::LinearOpWithSolveBase???
00143   //return Teuchos::rcp(new MatrixOpNonsingThyra(thyra_linear_op_ns()->clone_lows()));
00144 }
00145 
00146 } // end namespace AbstractLinAlgPack
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends