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_DEFUALT_PRECONDITIONER_HPP
00030 #define THYRA_DEFUALT_PRECONDITIONER_HPP
00031
00032 #include "Thyra_DefaultPreconditionerDecl.hpp"
00033
00034 namespace Thyra {
00035
00036
00037
00038 template <class RangeScalar, class DomainScalar>
00039 DefaultPreconditioner<RangeScalar,DomainScalar>::DefaultPreconditioner()
00040 {}
00041
00042 template <class RangeScalar, class DomainScalar>
00043 DefaultPreconditioner<RangeScalar,DomainScalar>::DefaultPreconditioner(
00044 const Teuchos::RCP<LinearOpBase<RangeScalar,DomainScalar> > &leftPrecOp
00045 ,const Teuchos::RCP<LinearOpBase<RangeScalar,DomainScalar> > &rightPrecOp
00046 )
00047 {
00048 #ifdef TEUCHOS_DEBUG
00049 TEST_FOR_EXCEPT( leftPrecOp.get()==NULL && rightPrecOp.get()==NULL );
00050 #endif
00051 if(leftPrecOp.get()) leftPrecOp_.initialize(leftPrecOp);
00052 if(rightPrecOp.get()) rightPrecOp_.initialize(rightPrecOp);
00053 }
00054
00055 template <class RangeScalar, class DomainScalar>
00056 DefaultPreconditioner<RangeScalar,DomainScalar>::DefaultPreconditioner(
00057 const Teuchos::RCP<const LinearOpBase<RangeScalar,DomainScalar> > &leftPrecOp
00058 ,const Teuchos::RCP<const LinearOpBase<RangeScalar,DomainScalar> > &rightPrecOp
00059 )
00060 {
00061 #ifdef TEUCHOS_DEBUG
00062 TEST_FOR_EXCEPT( leftPrecOp.get()==NULL && rightPrecOp.get()==NULL );
00063 #endif
00064 if(leftPrecOp.get())
00065 leftPrecOp_.initialize(leftPrecOp);
00066 if(rightPrecOp.get())
00067 rightPrecOp_.initialize(rightPrecOp);
00068 }
00069
00070 template <class RangeScalar, class DomainScalar>
00071 DefaultPreconditioner<RangeScalar,DomainScalar>::DefaultPreconditioner(
00072 const Teuchos::RCP<LinearOpBase<RangeScalar,DomainScalar> > &unspecifiedPrecOp
00073 )
00074 {
00075 unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
00076 }
00077
00078 template <class RangeScalar, class DomainScalar>
00079 DefaultPreconditioner<RangeScalar,DomainScalar>::DefaultPreconditioner(
00080 const Teuchos::RCP<const LinearOpBase<RangeScalar,DomainScalar> > &unspecifiedPrecOp
00081 )
00082 {
00083 unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
00084 }
00085
00086 template <class RangeScalar, class DomainScalar>
00087 void DefaultPreconditioner<RangeScalar,DomainScalar>::initializeLeft(
00088 const Teuchos::RCP<LinearOpBase<RangeScalar,DomainScalar> > &leftPrecOp
00089 )
00090 {
00091 uninitialize();
00092 leftPrecOp_.initialize(leftPrecOp);
00093 }
00094
00095 template <class RangeScalar, class DomainScalar>
00096 void DefaultPreconditioner<RangeScalar,DomainScalar>::initializeLeft(
00097 const Teuchos::RCP<const LinearOpBase<RangeScalar,DomainScalar> > &leftPrecOp
00098 )
00099 {
00100 uninitialize();
00101 leftPrecOp_.initialize(leftPrecOp);
00102 }
00103
00104 template <class RangeScalar, class DomainScalar>
00105 void DefaultPreconditioner<RangeScalar,DomainScalar>::initializeRight(
00106 const Teuchos::RCP<LinearOpBase<RangeScalar,DomainScalar> > &rightPrecOp
00107 )
00108 {
00109 uninitialize();
00110 rightPrecOp_.initialize(rightPrecOp);
00111 }
00112
00113 template <class RangeScalar, class DomainScalar>
00114 void DefaultPreconditioner<RangeScalar,DomainScalar>::initializeRight(
00115 const Teuchos::RCP<const LinearOpBase<RangeScalar,DomainScalar> > &rightPrecOp
00116 )
00117 {
00118 uninitialize();
00119 rightPrecOp_.initialize(rightPrecOp);
00120 }
00121
00122 template <class RangeScalar, class DomainScalar>
00123 void DefaultPreconditioner<RangeScalar,DomainScalar>::initializeLeftRight(
00124 const Teuchos::RCP<LinearOpBase<RangeScalar,DomainScalar> > &leftPrecOp
00125 ,const Teuchos::RCP<LinearOpBase<RangeScalar,DomainScalar> > &rightPrecOp
00126 )
00127 {
00128 uninitialize();
00129 rightPrecOp_.initialize(rightPrecOp);
00130 leftPrecOp_.initialize(leftPrecOp);
00131 }
00132
00133 template <class RangeScalar, class DomainScalar>
00134 void DefaultPreconditioner<RangeScalar,DomainScalar>::initializeLeftRight(
00135 const Teuchos::RCP<const LinearOpBase<RangeScalar,DomainScalar> > &leftPrecOp
00136 ,const Teuchos::RCP<const LinearOpBase<RangeScalar,DomainScalar> > &rightPrecOp
00137 )
00138 {
00139 uninitialize();
00140 rightPrecOp_.initialize(rightPrecOp);
00141 leftPrecOp_.initialize(leftPrecOp);
00142 }
00143
00144 template <class RangeScalar, class DomainScalar>
00145 void DefaultPreconditioner<RangeScalar,DomainScalar>::initializeUnspecified(
00146 const Teuchos::RCP<LinearOpBase<RangeScalar,DomainScalar> > &unspecifiedPrecOp
00147 )
00148 {
00149 uninitialize();
00150 unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
00151 }
00152
00153 template <class RangeScalar, class DomainScalar>
00154 void DefaultPreconditioner<RangeScalar,DomainScalar>::initializeUnspecified(
00155 const Teuchos::RCP<const LinearOpBase<RangeScalar,DomainScalar> > &unspecifiedPrecOp
00156 )
00157 {
00158 uninitialize();
00159 unspecifiedPrecOp_.initialize(unspecifiedPrecOp);
00160 }
00161
00162 template <class RangeScalar, class DomainScalar>
00163 void DefaultPreconditioner<RangeScalar,DomainScalar>::uninitialize()
00164 {
00165 leftPrecOp_.uninitialize();
00166 rightPrecOp_.uninitialize();
00167 unspecifiedPrecOp_.uninitialize();
00168 }
00169
00170
00171
00172 template <class RangeScalar, class DomainScalar>
00173 bool DefaultPreconditioner<RangeScalar,DomainScalar>::isLeftPrecOpConst() const
00174 {
00175 return leftPrecOp_.isConst();
00176 }
00177
00178 template <class RangeScalar, class DomainScalar>
00179 Teuchos::RCP<LinearOpBase<RangeScalar,DomainScalar> >
00180 DefaultPreconditioner<RangeScalar,DomainScalar>::getNonconstLeftPrecOp()
00181 {
00182 return leftPrecOp_.getNonconstObj();
00183 }
00184
00185 template <class RangeScalar, class DomainScalar>
00186 Teuchos::RCP<const LinearOpBase<RangeScalar,DomainScalar> >
00187 DefaultPreconditioner<RangeScalar,DomainScalar>::getLeftPrecOp() const
00188 {
00189 return leftPrecOp_.getConstObj();
00190 }
00191
00192 template <class RangeScalar, class DomainScalar>
00193 bool DefaultPreconditioner<RangeScalar,DomainScalar>::isRightPrecOpConst() const
00194 {
00195 return rightPrecOp_.isConst();
00196 }
00197
00198 template <class RangeScalar, class DomainScalar>
00199 Teuchos::RCP<LinearOpBase<RangeScalar,DomainScalar> >
00200 DefaultPreconditioner<RangeScalar,DomainScalar>::getNonconstRightPrecOp()
00201 {
00202 return rightPrecOp_.getNonconstObj();
00203 }
00204
00205 template <class RangeScalar, class DomainScalar>
00206 Teuchos::RCP<const LinearOpBase<RangeScalar,DomainScalar> >
00207 DefaultPreconditioner<RangeScalar,DomainScalar>::getRightPrecOp() const
00208 {
00209 return rightPrecOp_.getConstObj();
00210 }
00211
00212 template <class RangeScalar, class DomainScalar>
00213 bool DefaultPreconditioner<RangeScalar,DomainScalar>::isUnspecifiedPrecOpConst() const
00214 {
00215 return unspecifiedPrecOp_.isConst();
00216 }
00217
00218 template <class RangeScalar, class DomainScalar>
00219 Teuchos::RCP<LinearOpBase<RangeScalar,DomainScalar> >
00220 DefaultPreconditioner<RangeScalar,DomainScalar>::getNonconstUnspecifiedPrecOp()
00221 {
00222 return unspecifiedPrecOp_.getNonconstObj();
00223 }
00224
00225 template <class RangeScalar, class DomainScalar>
00226 Teuchos::RCP<const LinearOpBase<RangeScalar,DomainScalar> >
00227 DefaultPreconditioner<RangeScalar,DomainScalar>::getUnspecifiedPrecOp() const
00228 {
00229 return unspecifiedPrecOp_.getConstObj();
00230 }
00231
00232
00233
00234
00235
00236 template <class RangeScalar, class DomainScalar>
00237 std::string DefaultPreconditioner<RangeScalar,DomainScalar>::description() const
00238 {
00239 std::ostringstream oss;
00240 oss << Teuchos::Describable::description() << "{";
00241 bool wroteOne = false;
00242 if(!is_null(leftPrecOp_.getConstObj())) {
00243 if(wroteOne) oss << ",";
00244 oss << "leftPrecOp=" << leftPrecOp_.getConstObj()->description();
00245 wroteOne = true;
00246 }
00247 if(!is_null(rightPrecOp_.getConstObj())) {
00248 if(wroteOne) oss << ",";
00249 oss << "rightPrecOp=" << rightPrecOp_.getConstObj()->description();
00250 wroteOne = true;
00251 }
00252 if(!is_null(unspecifiedPrecOp_.getConstObj())) {
00253 if(wroteOne) oss << ",";
00254 oss << "unspecifiedPrecOp=" << unspecifiedPrecOp_.getConstObj()->description();
00255 wroteOne = true;
00256 }
00257 oss << "}";
00258 return oss.str();
00259 }
00260
00261 template <class RangeScalar, class DomainScalar>
00262 void DefaultPreconditioner<RangeScalar,DomainScalar>::describe(
00263 Teuchos::FancyOStream &out
00264 ,const Teuchos::EVerbosityLevel verbLevel
00265 ) const
00266 {
00267 using Teuchos::FancyOStream;
00268 using Teuchos::OSTab;
00269 using Teuchos::describe;
00270 OSTab tab(out);
00271 switch(verbLevel) {
00272 case Teuchos::VERB_DEFAULT:
00273 case Teuchos::VERB_LOW:
00274 out << Teuchos::Describable::description() << std::endl;
00275 break;
00276 case Teuchos::VERB_MEDIUM:
00277 case Teuchos::VERB_HIGH:
00278 case Teuchos::VERB_EXTREME:
00279 {
00280 out
00281 << Teuchos::typeName(*this) << "\n";
00282 OSTab tab(out);
00283 if(!is_null(leftPrecOp_.getConstObj()))
00284 out << "leftPrecOp=" << describe(*leftPrecOp_.getConstObj(),verbLevel);
00285 if(!is_null(rightPrecOp_.getConstObj()))
00286 out << "rig htPrecOp=" << describe(*rightPrecOp_.getConstObj(),verbLevel);
00287 if(!is_null(unspecifiedPrecOp_.getConstObj()))
00288 out << "unspecifiedPrecOp=" << describe(*unspecifiedPrecOp_.getConstObj(),verbLevel);
00289 break;
00290 }
00291 default:
00292 TEST_FOR_EXCEPT(true);
00293 }
00294 }
00295
00296
00297 }
00298
00299 #endif // THYRA_DEFUALT_PRECONDITIONER_HPP