1 /*  _______________________________________________________________________
2 
3     DAKOTA: Design Analysis Kit for Optimization and Terascale Applications
4     Copyright 2014-2020 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
5     This software is distributed under the GNU Lesser General Public License.
6     For more information, see the README file in the top Dakota directory.
7     _______________________________________________________________________ */
8 
9 //- Class:	 NonDIntegration
10 //- Description: Base class for multidimensional integration using
11 //-              tensor-product quadrature or Smolyak sparse grids.
12 //- Owner:       Mike Eldred
13 //- Revised by:
14 //- Version:
15 
16 #ifndef NOND_INTEGRATION_H
17 #define NOND_INTEGRATION_H
18 
19 #include "dakota_data_types.hpp"
20 #include "DakotaNonD.hpp"
21 #include "IntegrationDriver.hpp"
22 
23 namespace Dakota {
24 
25 
26 /// Derived nondeterministic class that generates N-dimensional
27 /// numerical integration points for evaluation of expectation integrals
28 
29 /** This class provides a base class for shared code among
30     NonDQuadrature and NonDSparseGrid. */
31 
32 class NonDIntegration: public NonD
33 {
34 public:
35 
36   //
37   //- Heading: Virtual functions
38   //
39 
40   /// initialize integration grid by drawing from polynomial basis settings
41   virtual void initialize_grid(
42     const std::vector<Pecos::BasisPolynomial>& poly_basis) = 0;
43 
44   /// increment SSG level/TPQ order
45   virtual void increment_grid() = 0;
46   /// increment SSG level/TPQ order and update anisotropy
47   virtual void increment_grid_preference(const RealVector& dim_pref);
48   /// increment SSG level/TPQ order and preserve anisotropy
49   virtual void increment_grid_preference();
50   /// increment SSG level/TPQ order and update anisotropy
51   virtual void increment_grid_weights(const RealVector& aniso_wts);
52   /// increment SSG level/TPQ order and preserve anisotropy
53   virtual void increment_grid_weights();
54   /// decrement SSG level/TPQ order
55   virtual void decrement_grid() = 0;
56 
57   /// computes a grid increment and evaluates the new parameter sets
58   virtual void evaluate_grid_increment();
59   /// restores a previously computed grid increment (no new evaluations)
60   virtual void push_grid_increment();
61   /// removes a previously computed grid increment
62   virtual void pop_grid_increment();
63   /// merges a grid increment into the reference grid
64   virtual void merge_grid_increment();
65 
66   /// update reference grid within adaptive grid refinement procedures
67   virtual void update_reference();
68 
69   //
70   //- Heading: Member functions
71   //
72 
73   /// return IntegrationDriver::polynomialBasis
74   const std::vector<Pecos::BasisPolynomial>& polynomial_basis() const;
75   /// return IntegrationDriver::polynomialBasis
76   std::vector<Pecos::BasisPolynomial>& polynomial_basis();
77 
78   /// convert scalar_order_spec and vector dim_pref_spec to vector aniso_order
79   static void dimension_preference_to_anisotropic_order(
80     unsigned short scalar_order_spec, const RealVector& dim_pref_spec,
81     size_t num_v, UShortArray& aniso_order);
82   /// convert vector aniso_order to scalar_order and vector dim_pref
83   static void anisotropic_order_to_dimension_preference(
84     const UShortArray& aniso_order, unsigned short& scalar_order,
85     RealVector& dim_pref);
86 
87   /// return numIntDriver
88   const Pecos::IntegrationDriver& driver() const;
89 
90   // return product weights corresponding to each of the collocation points
91   //const RealVector& weight_products() const;
92 
93   // return the number of unique points in the current grid
94   //size_t grid_size();
95 
96   //
97   //- Heading: Virtual function redefinitions
98   //
99 
100   bool resize();
101 
102 protected:
103 
104   //
105   //- Heading: Constructors and destructor
106   //
107 
108   /// constructor
109   NonDIntegration(ProblemDescDB& problem_db, Model& model);
110   /// alternate constructor for instantiations "on the fly"
111   NonDIntegration(unsigned short method_name, Model& model);
112   /// alternate constructor for instantiations "on the fly"
113   NonDIntegration(unsigned short method_name, Model& model,
114 		  const RealVector& dim_pref);
115   /// destructor
116   ~NonDIntegration();
117 
118   //
119   //- Heading: Virtual function redefinitions
120   //
121 
122   void core_run();
123 
124   //
125   //- Heading: Member functions
126   //
127 
128   // verify self-consistency of variables data
129   //void check_variables(const std::vector<Pecos::RandomVariable>& x_ran_vars);
130 
131   /// output integration points and weights to a tabular file
132   void print_points_weights(const String& tabular_name);
133 
134   //
135   //- Heading: Data
136   //
137 
138   /// Pecos utlity class for managing interface to tensor-product grids
139   /// and VPISparseGrid utilities for Smolyak sparse grids and cubature
140   Pecos::IntegrationDriver numIntDriver;
141 
142   /// counter for number of integration executions for this object
143   size_t numIntegrations;
144 
145   /// the user specification for anisotropic dimension preference
146   RealVector dimPrefSpec;
147 
148 private:
149 
150   //
151   //- Heading: Data
152   //
153 };
154 
155 
driver() const156 inline const Pecos::IntegrationDriver& NonDIntegration::driver() const
157 { return numIntDriver; }
158 
159 
160 inline const std::vector<Pecos::BasisPolynomial>& NonDIntegration::
polynomial_basis() const161 polynomial_basis() const
162 { return numIntDriver.polynomial_basis(); }
163 
164 
polynomial_basis()165 inline std::vector<Pecos::BasisPolynomial>& NonDIntegration::polynomial_basis()
166 { return numIntDriver.polynomial_basis(); }
167 
168 
169 //inline const Pecos::RealVector& NonDIntegration::weight_products() const
170 //{ return numIntDriver.weight_sets(); }
171 
172 
173 //inline size_t NonDIntegration::grid_size()
174 //{ return numIntDriver.grid_size(); }
175 
176 } // namespace Dakota
177 
178 #endif
179