Thyra_ParameterDrivenMultiVectorInput.hpp

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_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 // Inline functions
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 // Implementations
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())); // ToDo: Give a very good error message!
00310   for( Index i = 0; i < dVec.subDim(); ++i ) {
00311     dVec[i] = array[i];
00312   }
00313 }
00314 
00315 } // namespace PDMVIUtilityPack
00316 
00317 // Static data members
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 // Constructors/Initializers
00348 
00349 template<class Scalar>
00350 ParameterDrivenMultiVectorInput<Scalar>::ParameterDrivenMultiVectorInput()
00351   :fileNameBase_(FileNameBase_default_),
00352    scaleBy_(ScaleBy_default_),
00353    addScalar_(AddScalar_default_)
00354 {}
00355 
00356 // Overridden from ParameterListAcceptor
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     // An array of any size will do here
00371     ,false  // The parameter does not need to exist
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 // (Multi)Vector Readers
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       // Call back to throw an exception with a better erro message!
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     // ToDo: Find a way to read a matrix from a file (perhaps a nested
00481     // Array<Array<Scalar> > or something!)
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 } // namespace Thyra
00527 
00528 #endif // THYRA_PARAMETER_DRIVEN_MULTI_VECTOR_INPUT_HPP

Generated on Wed May 12 21:26:54 2010 for Thyra Operator/Vector Support by  doxygen 1.4.7