TSFEpetraMatrixOps.cpp
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 #include "TSFEpetraMatrix.hpp"
00030 #include "TSFEpetraVector.hpp"
00031 #include "TSFVectorSpaceDecl.hpp"  // changed from Impl
00032 #include "TSFVectorDecl.hpp"
00033 #include "TSFLinearOperatorDecl.hpp"  // changed from Impl
00034 
00035 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00036 #include "TSFVectorImpl.hpp"
00037 #include "TSFLinearOperatorImpl.hpp"
00038 #endif
00039 
00040 using namespace TSFExtended;
00041 using namespace Teuchos;
00042 using namespace Thyra;
00043 
00044 
00045 
00046 namespace TSFExtended
00047 {
00048 
00049 Vector<double> getEpetraDiagonal(const LinearOperator<double>& A)
00050 {
00051   /* Extract the underlying Epetra matrix. Type checking is done
00052    * ny rcp_dynamic_cast, so we need no error check here. */
00053   RCP<const Epetra_CrsMatrix> A_crs = EpetraMatrix::getConcretePtr(A);
00054 
00055   VectorSpace<double> rowSpace = A.domain();
00056   Vector<double> rtn = rowSpace.createMember();
00057 
00058   Epetra_Vector* xPtr = EpetraVector::getConcretePtr(rtn);
00059   A_crs->ExtractDiagonalCopy(*xPtr);
00060 
00061   return rtn;
00062 }
00063 
00064 
00065 LinearOperator<double> makeEpetraDiagonalMatrix(const Vector<double>& d)
00066 {
00067   VectorSpace<double> space = d.space();
00068   RCP<const EpetraVectorSpace> eps 
00069     = rcp_dynamic_cast<const EpetraVectorSpace>(space.ptr());
00070 
00071   EpetraMatrixFactory mf(eps, eps);
00072 
00073   int nLocal = space.numLocalElements();
00074   int offset = space.lowestLocallyOwnedIndex();
00075   for (int i=0; i<nLocal; i++)
00076   {
00077     int rowIndex = offset + i;
00078     mf.initializeNonzerosInRow(rowIndex, 1, &rowIndex);
00079   }
00080 
00081   mf.finalize();
00082   LinearOperator<double> rtn = mf.createMatrix();
00083 
00084   RCP<EpetraMatrix> epm = rcp_dynamic_cast<EpetraMatrix>(rtn.ptr());
00085   epm->zero();
00086   
00087   for (int i=0; i<nLocal; i++)
00088   {
00089     int rowIndex = offset + i;
00090     double val = d.getElement(rowIndex);
00091     epm->addToRow(rowIndex, 1, &rowIndex, &val);
00092   }
00093   
00094   return rtn;
00095 }
00096 
00097 }

Site Contact