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