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