00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
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
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
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;
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
00072
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 }
00079
00080 #endif // THYRA_SINGLE_RHS_LINEAR_OP_WITH_SOLVE_BASE_HPP