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_LINEAR_OP_WITH_SOLVE_BASE_DEF_HPP
00030 #define THYRA_LINEAR_OP_WITH_SOLVE_BASE_DEF_HPP
00031
00032 #include "Thyra_LinearOpWithSolveBase_decl.hpp"
00033
00034
00035 namespace Thyra {
00036
00037
00038
00039
00040
00041 template<class Scalar>
00042 bool LinearOpWithSolveBase<Scalar>::solveSupportsConj(EConj conj) const
00043 {
00044 return solveSupports(applyConjToTrans(conj));
00045 }
00046
00047
00048 template<class Scalar>
00049 bool LinearOpWithSolveBase<Scalar>::solveSupportsSolveMeasureType(
00050 EConj conj, const SolveMeasureType& solveMeasureType) const
00051 {
00052 return solveSupportsSolveMeasureType(applyConjToTrans(conj), solveMeasureType);
00053 }
00054
00055
00056 template<class Scalar>
00057 void LinearOpWithSolveBase<Scalar>::solve(
00058 const EConj conj,
00059 const MultiVectorBase<Scalar> &B,
00060 MultiVectorBase<Scalar> *X,
00061 const int numBlocks,
00062 const BlockSolveCriteria<Scalar> blockSolveCriteria[],
00063 SolveStatus<Scalar> blockSolveStatus[]
00064 ) const
00065 {
00066 const SolveStatus<Scalar> solveStatus =
00067 this->solve(applyConjToTrans(conj), B, Teuchos::ptr(X),
00068 converToBlockSolveCriteriaToSolveCritiera(numBlocks, blockSolveCriteria)
00069 );
00070 if (numBlocks) {
00071 blockSolveStatus[0] = solveStatus;
00072 }
00073 }
00074
00075
00076 template<class Scalar>
00077 bool LinearOpWithSolveBase<Scalar>::solveTransposeSupportsConj(EConj conj) const
00078 {
00079 return solveSupports(applyTransposeConjToTrans(conj));
00080 }
00081
00082
00083 template<class Scalar>
00084 bool LinearOpWithSolveBase<Scalar>::solveTransposeSupportsSolveMeasureType(
00085 EConj conj, const SolveMeasureType& solveMeasureType) const
00086 {
00087 return solveSupportsSolveMeasureType(applyTransposeConjToTrans(conj),
00088 solveMeasureType);
00089 }
00090
00091
00092 template<class Scalar>
00093 void LinearOpWithSolveBase<Scalar>::solveTranspose(
00094 const EConj conj,
00095 const MultiVectorBase<Scalar> &B,
00096 MultiVectorBase<Scalar> *X,
00097 const int numBlocks,
00098 const BlockSolveCriteria<Scalar> blockSolveCriteria[],
00099 SolveStatus<Scalar> blockSolveStatus[]
00100 ) const
00101 {
00102 const SolveStatus<Scalar> solveStatus =
00103 this->solve(applyTransposeConjToTrans(conj), B, Teuchos::ptr(X),
00104 converToBlockSolveCriteriaToSolveCritiera(numBlocks, blockSolveCriteria)
00105 );
00106 if (numBlocks) {
00107 blockSolveStatus[0] = solveStatus;
00108 }
00109 }
00110
00111
00112
00113
00114
00115 template<class Scalar>
00116 bool
00117 LinearOpWithSolveBase<Scalar>::solveSupportsImpl(
00118 EOpTransp transp) const
00119 {
00120 return (transp == NOTRANS);
00121 }
00122
00123
00124 template<class Scalar>
00125 bool
00126 LinearOpWithSolveBase<Scalar>::solveSupportsSolveMeasureTypeImpl(
00127 EOpTransp transp, const SolveMeasureType& solveMeasureType) const
00128 {
00129 return (solveSupports(transp) && solveMeasureType.useDefault());
00130 }
00131
00132
00133
00134
00135
00136 template<class Scalar>
00137 Ptr<const SolveCriteria<Scalar> >
00138 LinearOpWithSolveBase<Scalar>::converToBlockSolveCriteriaToSolveCritiera(
00139 const int numBlocks,
00140 const BlockSolveCriteria<Scalar> blockSolveCriteria[]
00141 )
00142 {
00143 TEUCHOS_ASSERT(numBlocks == 0 || numBlocks == 1);
00144 if (numBlocks == 1)
00145 return Teuchos::ptrFromRef(blockSolveCriteria[0].solveCriteria);
00146 return Teuchos::null;
00147 }
00148
00149
00150 }
00151
00152
00153 #endif // THYRA_LINEAR_OP_WITH_SOLVE_BASE_DEF_HPP