59{
60
62
63
65 "--enable-petsc, --enable-trilinos, or --enable-eigen");
66
67#if !defined(LIBMESH_HAVE_XDR)
68
69 libmesh_example_requires(false, "--enable-xdr");
70#elif defined(LIBMESH_DEFAULT_SINGLE_PRECISION)
71
72 libmesh_example_requires(false, "double precision");
73#elif defined(LIBMESH_DEFAULT_TRIPLE_PRECISION)
74
75 libmesh_example_requires(false, "double precision");
76#endif
77
78
79 libmesh_example_requires(2 <= LIBMESH_DIM, "2D support");
80
81
82
83#if !defined(LIBMESH_ENABLE_DIRICHLET) || !defined(LIBMESH_HAVE_CAPNPROTO)
84 libmesh_example_requires(false, "--enable-dirichlet --enable-capnp");
85#else
86
87
88 std::string eim_parameters = "eim.in";
89 std::string rb_parameters = "rb.in";
90 std::string main_parameters = "reduced_basis_ex4.in";
91 GetPot infile(main_parameters);
92
93 unsigned int n_elem = infile(
"n_elem", 1);
94 const unsigned int dim = 2;
95
96
97 const int online_mode =
99 eim_training_function_to_plot =
101 eim_basis_function_to_plot =
103
106 n_elem, n_elem,
107 -1., 1.,
108 -1., 1.,
110
111
112 bool eim_binary_io = true;
113
114 if (!online_mode)
115 {
116
117 {
118 libMesh::out <<
"Perform EIM training" << std::endl << std::endl;
119
120
121
123
126
127
128 equation_systems.
init ();
129
130
132 equation_systems.print_info();
133
134
136
137
139
140
143
144
147
149 rb_eim_eval_writer.write_to_file("rb_eim_eval.bin");
150
151
152 eim_rb_eval.write_out_basis_functions("eim_data", eim_binary_io);
153 }
154
155 {
156 libMesh::out << std::endl <<
"Perform RB training" << std::endl << std::endl;
157
158
159
161
166
167
168 equation_systems.
init ();
169
170
172 equation_systems.print_info();
173
174
176
177
179
180
182 rb_construction.set_rb_evaluation(rb_eval);
183
185 rb_eim_eval_reader.read_from_file("rb_eim_eval.bin");
186 eim_rb_eval.read_in_basis_functions(rb_construction, "eim_data", eim_binary_io);
187
188
189 rb_construction.process_parameters_file(rb_parameters);
190
191
192 eim_rb_eval.initialize_eim_theta_objects();
193 rb_eval.get_rb_theta_expansion().attach_multiple_F_theta(eim_rb_eval.get_eim_theta_objects());
194
195
197 rb_construction.get_rb_assembly_expansion().attach_multiple_F_assembly(eim_construction.
get_eim_assembly_objects());
198
199
200 rb_construction.print_info();
201
202
203
204 rb_construction.initialize_rb_construction();
205 rb_construction.train_reduced_basis();
206
208 rb_eval_writer.write_to_file("rb_eval.bin");
209
210 rb_construction.get_rb_evaluation().write_out_basis_functions(rb_construction,
211 "rb_data");
212 }
213 }
214 else
215 {
218
220 rb_eim_eval_reader.read_from_file("rb_eim_eval.bin");
221
222
223 eim_rb_eval.initialize_eim_theta_objects();
224 rb_eval.get_rb_theta_expansion().attach_multiple_F_theta(eim_rb_eval.get_eim_theta_objects());
225
226
228 rb_eval_reader.read_from_file("rb_eval.bin", true);
229
230
231 Real online_center_x = infile(
"online_center_x", 0.);
232 Real online_center_y = infile(
"online_center_y", 0.);
236
237
238
241
242
243
244
247
248
249
250
251
252
253 rb_eval.set_parameters(online_mu);
254 rb_eval.print_parameters();
255
256
257
258
259
260
261 const RBThetaExpansion & rb_theta_expansion = rb_eval.get_rb_theta_expansion();
262
263
264
265 std::vector<RBParameters> mu_vec = {online_mu};
266
267
268 std::vector<std::vector<Number>> all_A(rb_theta_expansion.
get_n_A_terms());
269 for (
unsigned int q_a=0; q_a<rb_theta_expansion.
get_n_A_terms(); q_a++)
270 {
271
272
273
274 all_A[q_a] = rb_theta_expansion.
eval_A_theta(q_a, mu_vec);
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299 }
300
301
302 std::vector<std::vector<Number>> all_F(rb_theta_expansion.
get_n_F_terms());
303 for (
unsigned int q_f=0; q_f<rb_theta_expansion.
get_n_F_terms(); q_f++)
304 all_F[q_f] = rb_theta_expansion.
eval_F_theta(q_f, mu_vec);
305
306
307
308 const auto & eim_error_indicators =
309 eim_rb_eval.get_rb_eim_error_indicators();
310
313 libMesh::
out <<
"EIM (error indicator, normalization factor) for step "
315 <<
"(" << eim_error_indicators[
idx].first
316 <<
", " << eim_error_indicators[
idx].second
319
320
321
322
324 {
325 unsigned int output_counter = 0;
326 for (
unsigned int n=0; n<rb_theta_expansion.
get_n_outputs(); n++)
328 all_outputs[output_counter++] =
330 }
331
332
333
334 unsigned int n_thetas =
338
339
340 std::vector<Number> evaluated_thetas(n_thetas);
341
342
344
347
348 equation_systems.
init ();
349
350
351
353 rb_eval.read_in_basis_functions(rb_construction, "rb_data");
354
355
356 for (
unsigned sample_idx=0; sample_idx<online_mu.
n_samples(); ++sample_idx)
357 {
358 unsigned int counter = 0;
359
360
361 for (
unsigned int q_a=0; q_a<rb_theta_expansion.
get_n_A_terms(); q_a++)
362 evaluated_thetas[counter++] = all_A[q_a][sample_idx];
363
364
365 for (
unsigned int q_f=0; q_f<rb_theta_expansion.
get_n_F_terms(); q_f++)
366 evaluated_thetas[counter++] = all_F[q_f][sample_idx];
367
368
369 {
370 unsigned int output_counter = 0;
371 for (
unsigned int n=0; n<rb_theta_expansion.
get_n_outputs(); n++)
373 evaluated_thetas[counter++] = all_outputs[output_counter++][sample_idx];
374 }
375
376
377 libMesh::out <<
"Performing solve for step " << sample_idx << std::endl;
378 rb_eval.rb_solve(rb_eval.get_n_basis_functions(), &evaluated_thetas);
379
380
382 libMesh::
out <<
"Output value " << i <<
" = " << rb_eval.RB_outputs[i]
383 << ", error bound " << i << " = " << rb_eval.RB_output_error_bounds[i]
385
386
388#ifdef LIBMESH_HAVE_EXODUS_API
390#endif
391 }
392 }
393
394#endif
395}
This is the EquationSystems class.
The ExodusII_IO class implements reading meshes in the ExodusII file format from Sandia National Labs...
virtual void write_equation_systems(const std::string &fname, const EquationSystems &es, const std::set< std::string > *system_names=nullptr) override
Writes out the solution for no specific time or timestep.
The LibMeshInit class, when constructed, initializes the dependent libraries (e.g.
void print_info(std::ostream &os=libMesh::out, const unsigned int verbosity=0, const bool global=true) const
Prints relevant information about the mesh.
const Parallel::Communicator & comm() const
void set_rb_evaluation(RBEvaluation &rb_eval_in)
Set the RBEvaluation object.
virtual void load_rb_solution()
Load the RB solution from the most recent solve with rb_eval into this system's solution vector.
This class de-serializes a RBEIMEvaluation object using the Cap'n Proto library.
This class de-serializes an RBEvaluation object using the Cap'n Proto library.
This class serializes an RBEIMEvaluation object using the Cap'n Proto library.
This class serializes an RBEvaluation object using the Cap'n Proto library.
void initialize_eim_construction()
Perform initialization of this object to prepare for running train_eim_approximation().
std::vector< std::unique_ptr< ElemAssembly > > & get_eim_assembly_objects()
virtual void initialize_eim_assembly_objects()
Build a vector of ElemAssembly objects that accesses the basis functions stored in this RBEIMConstruc...
void set_rb_eim_evaluation(RBEIMEvaluation &rb_eim_eval_in)
Set the RBEIMEvaluation object.
virtual Real train_eim_approximation()
Generate the EIM approximation for the specified parametrized function using either POD or the Greedy...
virtual void print_info()
Print out info that describes the current setup of this RBConstruction.
virtual void process_parameters_file(const std::string ¶meters_filename)
Read parameters in from file and set up this system accordingly.
This class is part of the rbOOmit framework.
void push_back_value(const std::string ¶m_name, Real value)
Similar to set_value(name, index, value) but instead of specifying a particular index,...
unsigned int n_samples() const
Returns the number of samples stored for all parameters.
This class stores the set of RBTheta functor objects that define the "parameter-dependent expansion" ...
virtual Number eval_F_theta(unsigned int q, const RBParameters &mu) const
Evaluate theta_q_f at the current parameter.
unsigned int get_total_n_output_terms() const
Returns the total number of affine terms associated with all outputs.
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
virtual Number eval_A_theta(unsigned int q, const RBParameters &mu) const
Evaluate theta_q_a at the current parameter.
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output.
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.
virtual Number eval_output_theta(unsigned int output_index, unsigned int q_l, const RBParameters &mu) const
Evaluate theta_q_l at the current parameter.
The ReplicatedMesh class is derived from the MeshBase class, and is used to store identical copies of...
void init()
Initializes degrees of freedom on the current mesh.
void init(triangulateio &t)
Initializes the fields of t to nullptr/0 as necessary.
The libMesh namespace provides an interface to certain functionality in the library.
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
SolverPackage default_solver_package()
T command_line_next(std::string name, T default_value)
Use GetPot's search()/next() functions to get following arguments from the command line.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real