1 2 #ifndef BUILDSAMPLERHPP 3 #define BUILDSAMPLERHPP 4 5 #include "Teuchos_Comm.hpp" 6 #include "ROL_Stream.hpp" 7 #include "Teuchos_GlobalMPISession.hpp" 8 #include "Teuchos_XMLParameterListHelpers.hpp" 9 10 // SOL Inputs 11 #include "ROL_MonteCarloGenerator.hpp" 12 #include "ROL_SROMGenerator.hpp" 13 #include "ROL_DistributionFactory.hpp" 14 #include "ROL_TpetraTeuchosBatchManager.hpp" 15 16 #include <iostream> 17 #include <fstream> 18 #include <sstream> 19 #include <string> 20 21 template<class Real> 22 class BuildSampler { 23 private: 24 ROL::Ptr<ROL::BatchManager<Real> > bman_; 25 ROL::Ptr<ROL::SampleGenerator<Real> > sampler_; 26 std::vector<ROL::Ptr<ROL::Distribution<Real> > > distVec_; 27 28 public: ~BuildSampler()29 virtual ~BuildSampler() {}; BuildSampler(const ROL::Ptr<const Teuchos::Comm<int>> & comm,Teuchos::ParameterList & Slist,Teuchos::ParameterList & Elist)30 BuildSampler(const ROL::Ptr<const Teuchos::Comm<int> > &comm, 31 Teuchos::ParameterList &Slist, 32 Teuchos::ParameterList &Elist) { 33 /*** Build stochastic functionality. ***/ 34 Real scale = static_cast<Real>(M_PI)/static_cast<Real>(180); 35 int sdim = 0; 36 distVec_.clear(); 37 // Build distribution for volumetric force 38 bool vStochMag = Elist.sublist("Elasticity").get<bool>("Stochastic Bodyforce Magnitude"); 39 if ( vStochMag ) { 40 Teuchos::ParameterList &magList 41 = Slist.sublist("Problem").sublist("Volumetric Force").sublist("Magnitude"); 42 distVec_.push_back(ROL::DistributionFactory<Real>(magList)); 43 Elist.sublist("Elasticity").set("Bodyforce Magnitude",distVec_[sdim]->moment(1)); 44 sdim++; 45 } 46 bool vStochAng = Elist.sublist("Elasticity").get<bool>("Stochastic Bodyforce Angle"); 47 if ( vStochAng ) { 48 Teuchos::ParameterList &angList 49 = Slist.sublist("Problem").sublist("Volumetric Force").sublist("Angle"); 50 distVec_.push_back(ROL::DistributionFactory<Real>(angList)); 51 Elist.sublist("Elasticity").set("Bodyforce Angle",scale * distVec_[sdim]->moment(1)); 52 sdim++; 53 } 54 // Build distribution for traction force 55 bool tStochMag = Elist.sublist("Elasticity").get<bool>("Stochastic Traction Magnitude"); 56 if ( tStochMag ) { 57 Teuchos::ParameterList &magList 58 = Slist.sublist("Problem").sublist("Traction Force").sublist("Magnitude"); 59 distVec_.push_back(ROL::DistributionFactory<Real>(magList)); 60 Elist.sublist("Elasticity").set("Traction Magnitude",distVec_[sdim]->moment(1)); 61 sdim++; 62 } 63 bool tStochAng = Elist.sublist("Elasticity").get<bool>("Stochastic Traction Angle"); 64 if ( tStochAng ) { 65 Teuchos::ParameterList &angList 66 = Slist.sublist("Problem").sublist("Traction Force").sublist("Angle"); 67 distVec_.push_back(ROL::DistributionFactory<Real>(angList)); 68 Elist.sublist("Elasticity").set("Traction Angle",scale * distVec_[sdim]->moment(1)); 69 sdim++; 70 } 71 // Build distribution for point force 72 bool pStochMag = Elist.sublist("Elasticity").get<bool>("Stochastic Pointload Magnitude"); 73 if ( pStochMag ) { 74 Teuchos::ParameterList &magList 75 = Slist.sublist("Problem").sublist("Point Force").sublist("Magnitude"); 76 distVec_.push_back(ROL::DistributionFactory<Real>(magList)); 77 Elist.sublist("Elasticity").set("Pointload Magnitude",distVec_[sdim]->moment(1)); 78 sdim++; 79 } 80 bool pStochAng = Elist.sublist("Elasticity").get<bool>("Stochastic Pointload Angle"); 81 if ( pStochAng ) { 82 Teuchos::ParameterList &angList 83 = Slist.sublist("Problem").sublist("Point Force").sublist("Angle"); 84 distVec_.push_back(ROL::DistributionFactory<Real>(angList)); 85 Elist.sublist("Elasticity").set("Pointload Angle",scale * distVec_[sdim]->moment(1)); 86 sdim++; 87 } 88 // Build sampler 89 int nsamp = Slist.sublist("Problem").get("Number of Samples",100); 90 if ( !vStochMag && !vStochAng && 91 !tStochMag && !tStochAng && 92 !pStochMag && !pStochAng ) { 93 nsamp = 1; 94 } 95 bman_ = ROL::makePtr<ROL::TpetraTeuchosBatchManager<Real>>(comm); 96 bool useOBS = Slist.sublist("Problem").get("Use Optimization-Based Sampling",false); 97 if ( useOBS ) { 98 Slist.sublist("SOL").sublist("Sample Generator").sublist("SROM").set("Number of Samples",nsamp); 99 sampler_ = ROL::makePtr<ROL::SROMGenerator<Real>>(Slist,bman_,distVec_); 100 } 101 else { 102 sampler_ = ROL::makePtr<ROL::MonteCarloGenerator<Real>>(nsamp,distVec_,bman_,false,false,0); 103 } 104 } 105 get(void)106 ROL::Ptr<ROL::SampleGenerator<Real> >& get(void) { 107 return sampler_; 108 } 109 getBatchManager(void)110 ROL::Ptr<ROL::BatchManager<Real> >& getBatchManager(void) { 111 return bman_; 112 } 113 print(const std::string & filename,const int prec=12) const114 void print(const std::string &filename, const int prec = 12) const { 115 int width = prec + 5 + 4; 116 std::stringstream name; 117 name << filename << "_" << sampler_->batchID() << ".txt"; 118 std::ofstream file(name.str().c_str()); 119 if (file.is_open()) { 120 file << std::scientific << std::setprecision(prec); 121 for (int i = 0; i < sampler_->numMySamples(); ++i) { 122 std::vector<Real> pt = sampler_->getMyPoint(i); 123 Real wt = sampler_->getMyWeight(i); 124 for (int j = 0; j < static_cast<int>(pt.size()); ++j) { 125 file << std::setw(width) << std::left << pt[j]; 126 } 127 file << std::setw(width) << std::left << wt << std::endl; 128 } 129 file.close(); 130 } 131 else { 132 TEUCHOS_TEST_FOR_EXCEPTION(true, std::invalid_argument, 133 ">>> (BuildSampler::print): Unable to open file!"); 134 } 135 } 136 137 }; 138 139 #endif 140