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_PARAMETER_DRIVEN_MULTI_VECTOR_INPUT_HPP
00030 #define THYRA_PARAMETER_DRIVEN_MULTI_VECTOR_INPUT_HPP
00031
00032 #include "Thyra_MultiVectorFileIOBase.hpp"
00033 #include "Thyra_DetachedVectorView.hpp"
00034 #include "Teuchos_ParameterListAcceptor.hpp"
00035 #include "Teuchos_VerboseObject.hpp"
00036 #include "Teuchos_StandardCompositionMacros.hpp"
00037 #include "Teuchos_implicit_cast.hpp"
00038
00039 namespace Thyra {
00040
00074 template<class Scalar>
00075 class ParameterDrivenMultiVectorInput
00076 : public Teuchos::ParameterListAcceptor
00077 , public Teuchos::VerboseObject<ParameterDrivenMultiVectorInput<Scalar> >
00078 {
00079 public:
00080
00083
00085 ParameterDrivenMultiVectorInput();
00086
00090 STANDARD_CONST_COMPOSITION_MEMBERS( VectorSpaceBase<Scalar>, vecSpc );
00091
00095 STANDARD_COMPOSITION_MEMBERS( MultiVectorFileIOBase<Scalar>, fileIO );
00096
00098
00101
00103 void setParameterList(Teuchos::RCP<Teuchos::ParameterList> const& paramList);
00105 Teuchos::RCP<Teuchos::ParameterList> getNonconstParameterList();
00107 Teuchos::RCP<Teuchos::ParameterList> unsetParameterList();
00109 Teuchos::RCP<const Teuchos::ParameterList> getParameterList() const;
00111 Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
00112
00114
00117
00121 const std::string& readinFileNameBase() const;
00122
00126 const Teuchos::Array<Scalar>& readinExplicitArray() const;
00127
00131 Scalar readinScaleBy() const;
00132
00134
00137
00159 bool readMultiVector(
00160 const std::string &mvName
00161 ,Thyra::MultiVectorBase<Scalar> *mv
00162 ) const;
00163
00204 bool readVector(
00205 const std::string &vName
00206 ,Teuchos::RCP<Thyra::VectorBase<Scalar> > *v
00207 ) const;
00208
00218 Teuchos::RCP<Thyra::VectorBase<Scalar> >
00219 readVector( const std::string &vName ) const;
00220
00222
00223 private:
00224
00225 mutable Teuchos::RCP<const Teuchos::ParameterList> validParamList_;
00226 Teuchos::RCP<Teuchos::ParameterList> paramList_;
00227
00228 std::string fileNameBase_;
00229 Teuchos::Array<Scalar> explicitArray_;
00230 Scalar scaleBy_;
00231 Scalar addScalar_;
00232
00233 static const std::string FileNameBase_name_;
00234 static const std::string FileNameBase_default_;
00235
00236 static const std::string ExplicitArray_name_;
00237 static const std::string ExplicitArray_default_;
00238
00239 static const std::string ScaleBy_name_;
00240 static const double ScaleBy_default_;
00241
00242 static const std::string AddScalar_name_;
00243 static const double AddScalar_default_;
00244
00245 };
00246
00247
00252 template<class Scalar>
00253 RCP<const VectorBase<Scalar> >
00254 readVectorOverride(
00255 const ParameterDrivenMultiVectorInput<Scalar> &pdmvi,
00256 const std::string &vName,
00257 const RCP<const VectorBase<Scalar> > &defaultVector
00258 )
00259 {
00260 RCP<const VectorBase<Scalar> >
00261 vector = pdmvi.readVector(vName);
00262 if (!is_null(vector))
00263 return vector;
00264 return defaultVector;
00265 }
00266
00267
00268
00269
00270
00271 template<class Scalar>
00272 inline
00273 const std::string&
00274 ParameterDrivenMultiVectorInput<Scalar>::readinFileNameBase() const
00275 {
00276 return fileNameBase_;
00277 }
00278
00279 template<class Scalar>
00280 inline
00281 const Teuchos::Array<Scalar>&
00282 ParameterDrivenMultiVectorInput<Scalar>::readinExplicitArray() const
00283 {
00284 return explicitArray_;
00285 }
00286
00287 template<class Scalar>
00288 inline
00289 Scalar
00290 ParameterDrivenMultiVectorInput<Scalar>::readinScaleBy() const
00291 {
00292 return scaleBy_;
00293 }
00294
00295
00296
00297
00298 namespace PDMVIUtilityPack {
00299
00300 template<class Scalar>
00301 void copy(
00302 const Teuchos::Array<Scalar> &array
00303 ,VectorBase<Scalar> *vec
00304 )
00305 {
00306 using Teuchos::implicit_cast;
00307 TEST_FOR_EXCEPT(vec==0);
00308 DetachedVectorView<Scalar> dVec(*vec);
00309 TEST_FOR_EXCEPT(implicit_cast<int>(dVec.subDim())!=implicit_cast<int>(array.size()));
00310 for( Index i = 0; i < dVec.subDim(); ++i ) {
00311 dVec[i] = array[i];
00312 }
00313 }
00314
00315 }
00316
00317
00318
00319 template<class Scalar>
00320 const std::string
00321 ParameterDrivenMultiVectorInput<Scalar>::FileNameBase_name_ = "File Name Base";
00322 template<class Scalar>
00323 const std::string
00324 ParameterDrivenMultiVectorInput<Scalar>::FileNameBase_default_ = "";
00325
00326 template<class Scalar>
00327 const std::string
00328 ParameterDrivenMultiVectorInput<Scalar>::ExplicitArray_name_ = "Explicit Array";
00329 template<class Scalar>
00330 const std::string
00331 ParameterDrivenMultiVectorInput<Scalar>::ExplicitArray_default_ = "{}";
00332
00333 template<class Scalar>
00334 const std::string
00335 ParameterDrivenMultiVectorInput<Scalar>::ScaleBy_name_ = "Scale By";
00336 template<class Scalar>
00337 const double
00338 ParameterDrivenMultiVectorInput<Scalar>::ScaleBy_default_ = 1.0;
00339
00340 template<class Scalar>
00341 const std::string
00342 ParameterDrivenMultiVectorInput<Scalar>::AddScalar_name_ = "Add Scalar";
00343 template<class Scalar>
00344 const double
00345 ParameterDrivenMultiVectorInput<Scalar>::AddScalar_default_ = 0.0;
00346
00347
00348
00349 template<class Scalar>
00350 ParameterDrivenMultiVectorInput<Scalar>::ParameterDrivenMultiVectorInput()
00351 :fileNameBase_(FileNameBase_default_),
00352 scaleBy_(ScaleBy_default_),
00353 addScalar_(AddScalar_default_)
00354 {}
00355
00356
00357
00358 template<class Scalar>
00359 void ParameterDrivenMultiVectorInput<Scalar>::setParameterList(
00360 Teuchos::RCP<Teuchos::ParameterList> const& paramList
00361 )
00362 {
00363 TEST_FOR_EXCEPT(0==paramList.get());
00364 paramList->validateParameters(*getValidParameters());
00365 paramList_ = paramList;
00366 fileNameBase_ = paramList_->get(
00367 FileNameBase_name_,FileNameBase_default_ );
00368 explicitArray_ = Teuchos::getArrayFromStringParameter<Scalar>(
00369 *paramList_,ExplicitArray_name_
00370 ,-1
00371 ,false
00372 );
00373 scaleBy_ = paramList_->get(ScaleBy_name_,ScaleBy_default_);
00374 addScalar_ = paramList_->get(AddScalar_name_,AddScalar_default_);
00375 #ifdef TEUCHOS_DEBUG
00376 paramList_->validateParameters(*getValidParameters(),0);
00377 #endif // TEUCHOS_DEBUG
00378 }
00379
00380 template<class Scalar>
00381 Teuchos::RCP<Teuchos::ParameterList>
00382 ParameterDrivenMultiVectorInput<Scalar>::getNonconstParameterList()
00383 {
00384 return paramList_;
00385 }
00386
00387 template<class Scalar>
00388 Teuchos::RCP<Teuchos::ParameterList>
00389 ParameterDrivenMultiVectorInput<Scalar>::unsetParameterList()
00390 {
00391 Teuchos::RCP<Teuchos::ParameterList>
00392 _paramList = paramList_;
00393 paramList_ = Teuchos::null;
00394 return _paramList;
00395 }
00396
00397 template<class Scalar>
00398 Teuchos::RCP<const Teuchos::ParameterList>
00399 ParameterDrivenMultiVectorInput<Scalar>::getParameterList() const
00400 {
00401 return paramList_;
00402 }
00403
00404 template<class Scalar>
00405 Teuchos::RCP<const Teuchos::ParameterList>
00406 ParameterDrivenMultiVectorInput<Scalar>::getValidParameters() const
00407 {
00408 if(!validParamList_.get()) {
00409 Teuchos::RCP<Teuchos::ParameterList>
00410 pl = Teuchos::rcp(new Teuchos::ParameterList);
00411 pl->set(
00412 FileNameBase_name_,FileNameBase_default_
00413 ,"Base-name of file(s) that will be used to read in the vector.\n"
00414 "If this parameter is empty \"\", no file(s) will be read.\n"
00415 "Note that a MultiVectorFileIOBase object and a VectorSpaceBase object\n"
00416 "must be set internally for this to work."
00417 );
00418 pl->set(
00419 ExplicitArray_name_,ExplicitArray_default_
00420 ,"The vector specified explicitly as a string interpreted as a Teuchos::Array\n"
00421 "object. If this array is set, it will override the vector specified\n"
00422 "by the above \"" + FileNameBase_name_ + "\" parameter.\n"
00423 "Note that a VectorSpaceBase object\n"
00424 "must be set internally for this to work."
00425 );
00426 pl->set(
00427 ScaleBy_name_,ScaleBy_default_,
00428 "A factor by which the read in vector will be scaled by."
00429 );
00430 pl->set(
00431 AddScalar_name_, AddScalar_default_,
00432 "A scalar that will added to the read in vector after it\n"
00433 "optionally scaled."
00434 );
00435 validParamList_ = pl;
00436 }
00437 return validParamList_;
00438 }
00439
00440
00441
00442 template<class Scalar>
00443 bool ParameterDrivenMultiVectorInput<Scalar>::readMultiVector(
00444 const std::string &mvName
00445 ,Thyra::MultiVectorBase<Scalar> *mv
00446 ) const
00447 {
00448 using Teuchos::implicit_cast;
00449 TEST_FOR_EXCEPT(0==mv);
00450 typedef Teuchos::ScalarTraits<Scalar> ST;
00451 const Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
00452 Teuchos::RCP<Teuchos::FancyOStream>
00453 out = this->getOStream();
00454 const bool trace = ( verbLevel >= implicit_cast<int>(Teuchos::VERB_LOW) );
00455 Teuchos::OSTab tab(out);
00456 bool vectorWasRead = false;
00457 if(fileNameBase_.length()) {
00458 if( out.get() && trace )
00459 *out << "\nReading \"" << mvName << "\" from the file(s) with base name \""
00460 << fileNameBase_ << "\" ...\n";
00461 fileIO().readMultiVectorFromFile(fileNameBase_,mv);
00462 vectorWasRead = true;
00463 }
00464 if(explicitArray_.size()) {
00465 if( implicit_cast<Index>(explicitArray_.size()) != vecSpc().dim() ) {
00466
00467 Teuchos::getArrayFromStringParameter<Scalar>(
00468 *paramList_,ExplicitArray_name_,vecSpc().dim(),false);
00469 TEST_FOR_EXCEPT(!"Should never get here!");
00470 }
00471 if( out.get() && trace )
00472 *out << "\nSetting \"" << mvName << "\" directly from the parameter array "
00473 << explicitArray_ << " ...\n";
00474 TEST_FOR_EXCEPTION(
00475 mv->domain()->dim()!=implicit_cast<Index>(1), std::logic_error
00476 ,"Error! We can not handle reading in multi-vectors directly from"
00477 " the parameter list yet!"
00478 );
00479 PDMVIUtilityPack::copy(explicitArray_,&*mv->col(0));
00480
00481
00482 vectorWasRead = true;
00483 }
00484 if( scaleBy_ != ST::one() && vectorWasRead ) {
00485 if( out.get() && trace )
00486 *out << "\nScaling \"" << mvName << "\" by " << scaleBy_ << " ...\n";
00487 Vt_S(&*mv,scaleBy_);
00488 }
00489 if( addScalar_ != ST::zero() && vectorWasRead ) {
00490 if( out.get() && trace )
00491 *out << "\nAdding scalar " << addScalar_ << " to \"" << mvName << "\" ...\n";
00492 Vp_S(&*mv,addScalar_);
00493 }
00494 return vectorWasRead;
00495 }
00496
00497 template<class Scalar>
00498 bool ParameterDrivenMultiVectorInput<Scalar>::readVector(
00499 const std::string &vName
00500 ,Teuchos::RCP<Thyra::VectorBase<Scalar> > *v
00501 ) const
00502 {
00503 TEST_FOR_EXCEPT(0==v);
00504 bool vectorWasRead = false;
00505 if( fileNameBase_.length() || explicitArray_.size() ) {
00506 if(!(*v).get())
00507 (*v) = createMember(this->vecSpc());
00508 vectorWasRead = this->readMultiVector(vName,&*(*v));
00509 }
00510 return vectorWasRead;
00511 }
00512
00513 template<class Scalar>
00514 Teuchos::RCP<Thyra::VectorBase<Scalar> >
00515 ParameterDrivenMultiVectorInput<Scalar>::readVector(
00516 const std::string &vName
00517 ) const
00518 {
00519 Teuchos::RCP<Thyra::VectorBase<Scalar> > v;
00520 const bool vectorWasRead = readVector(vName,&v);
00521 if(!vectorWasRead)
00522 v = Teuchos::null;
00523 return v;
00524 }
00525
00526 }
00527
00528 #endif // THYRA_PARAMETER_DRIVEN_MULTI_VECTOR_INPUT_HPP