Thyra_SingleRhsLinearOpWithSolveBase.hpp

Go to the documentation of this file.
00001 // @HEADER
00002 // ***********************************************************************
00003 // 
00004 //    Thyra: Interfaces and Support for Abstract Numerical Algorithms
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 #ifndef THYRA_SINGLE_RHS_LINEAR_OP_WITH_SOLVE_BASE_HPP
00030 #define THYRA_SINGLE_RHS_LINEAR_OP_WITH_SOLVE_BASE_HPP
00031 
00032 #include "Thyra_SingleRhsLinearOpWithSolveBaseDecl.hpp"
00033 #include "Thyra_SingleScalarLinearOpWithSolveBase.hpp"
00034 
00035 namespace Thyra {
00036   
00037 // Overridden from SingleScalarLinearOpWithSolveBase
00038 
00039 template <class Scalar>
00040 void SingleRhsLinearOpWithSolveBase<Scalar>::solve(
00041   const ETransp                         M_trans
00042   ,const MultiVectorBase<Scalar>        &B
00043   ,MultiVectorBase<Scalar>              *X
00044   ,const int                            numBlocks
00045   ,const BlockSolveCriteria<Scalar>     blockSolveCriteria[]
00046   ,SolveStatus<Scalar>                  blockSolveStatus[]
00047   ) const
00048 {
00049 #ifdef TEUCHOS_DEBUG
00050   TEST_FOR_EXCEPT( numBlocks < 0 );
00051   TEST_FOR_EXCEPT( numBlocks > 0 && blockSolveCriteria==NULL );
00052 #endif
00053   const VectorSpaceBase<Scalar> &space_mv_rows = *B.domain();
00054   const Index num_mv_cols = space_mv_rows.dim();
00055   if(numBlocks) {
00056     // There is client-requested solve criteria so we need to keep track of this
00057     Index j = 0;
00058     for( int block_i = 0; block_i < numBlocks; ++block_i ) {
00059       const BlockSolveCriteria<Scalar> &solveCriteria = blockSolveCriteria[block_i];
00060       SolveStatus<Scalar> overallSolveStatus;
00061       overallSolveStatus.solveStatus = SOLVE_STATUS_CONVERGED; // Initialized for accumulateSolveStatus()
00062       for( Index block_col_i = 0; block_col_i < solveCriteria.numRhs; ++block_col_i, ++j ) {
00063         SolveStatus<Scalar>
00064           solveStatus = this->solve(M_trans,*B.col(j),&*X->col(j),&solveCriteria.solveCriteria);
00065         accumulateSolveStatus( solveCriteria.solveCriteria, solveStatus, &overallSolveStatus );
00066       }
00067       if(blockSolveStatus) blockSolveStatus[block_i] = overallSolveStatus;
00068     }
00069   }
00070   else {
00071     // There is not client-requested solve criteria so just solve the systems
00072     // with the default tolerenaces.
00073     for( Index j = 0; j < num_mv_cols; ++j )
00074       this->solve(M_trans,*B.col(j),&*X->col(j),NULL);
00075   }
00076 }
00077 
00078 } // namespace Thyra
00079 
00080 #endif // THYRA_SINGLE_RHS_LINEAR_OP_WITH_SOLVE_BASE_HPP

Generated on Thu Sep 18 12:33:03 2008 for Thyra Package Browser (Single Doxygen Collection) by doxygen 1.3.9.1