85 #include "libmesh/libmesh.h"
86 #include "libmesh/mesh.h"
87 #include "libmesh/mesh_generation.h"
88 #include "libmesh/exodusII_io.h"
89 #include "libmesh/equation_systems.h"
90 #include "libmesh/dof_map.h"
91 #include "libmesh/getpot.h"
92 #include "libmesh/elem.h"
93 #include "libmesh/rb_data_serialization.h"
94 #include "libmesh/rb_data_deserialization.h"
95 #include "libmesh/enum_solver_package.h"
98 #include "rb_classes.h"
99 #include "eim_classes.h"
100 #include "assembly.h"
108 const std::string & filename);
111 int main (
int argc,
char ** argv)
118 "--enable-petsc, --enable-trilinos, or --enable-eigen");
120 #if !defined(LIBMESH_HAVE_XDR)
122 libmesh_example_requires(
false,
"--enable-xdr");
123 #elif defined(LIBMESH_DEFAULT_SINGLE_PRECISION)
125 libmesh_example_requires(
false,
"--disable-singleprecision");
126 #elif defined(LIBMESH_DEFAULT_TRIPLE_PRECISION)
128 libmesh_example_requires(
false,
"double precision");
129 #elif defined(LIBMESH_ENABLE_BLOCKED_STORAGE)
132 libmesh_example_requires(
false,
"--disable-blocked-storage");
136 libmesh_example_requires(3 == LIBMESH_DIM,
"3D support");
138 #ifndef LIBMESH_ENABLE_DIRICHLET
139 libmesh_example_requires(
false,
"--enable-dirichlet");
143 std::string eim_parameters =
"eim.in";
144 std::string rb_parameters =
"rb.in";
145 std::string main_parameters =
"reduced_basis_ex6.in";
146 GetPot infile(main_parameters);
148 unsigned int n_elem_xy = infile(
"n_elem_xy", 1);
149 unsigned int n_elem_z = infile(
"n_elem_z", 1);
152 bool store_basis_functions = infile(
"store_basis_functions",
true);
155 GetPot command_line (argc, argv);
157 if (command_line.search(1,
"-online_mode"))
158 online_mode = command_line.next(online_mode);
167 n_elem_xy, n_elem_xy, n_elem_z,
182 equation_systems.
init ();
195 eim_construction.set_rb_evaluation(eim_rb_eval);
196 rb_construction.set_rb_evaluation(rb_eval);
201 eim_construction.process_parameters_file(eim_parameters);
202 eim_construction.print_info();
205 eim_construction.initialize_rb_construction();
207 eim_construction.train_reduced_basis();
209 #if defined(LIBMESH_HAVE_CAPNPROTO)
213 eim_construction.get_rb_evaluation().legacy_write_offline_data_to_files(
"eim_data");
217 rb_construction.process_parameters_file(rb_parameters);
220 eim_rb_eval.initialize_eim_theta_objects();
221 rb_eval.get_rb_theta_expansion().attach_multiple_A_theta(eim_rb_eval.get_eim_theta_objects());
224 eim_construction.initialize_eim_assembly_objects();
225 rb_construction.get_rb_assembly_expansion().attach_multiple_A_assembly(eim_construction.get_eim_assembly_objects());
228 rb_construction.print_info();
232 rb_construction.initialize_rb_construction();
233 rb_construction.train_reduced_basis();
235 #if defined(LIBMESH_HAVE_CAPNPROTO)
239 rb_construction.get_rb_evaluation().legacy_write_offline_data_to_files(
"rb_data");
243 if (store_basis_functions)
246 eim_construction.get_rb_evaluation().write_out_basis_functions(eim_construction.get_explicit_system(),
248 rb_construction.get_rb_evaluation().write_out_basis_functions(rb_construction,
254 #if defined(LIBMESH_HAVE_CAPNPROTO)
258 eim_rb_eval.legacy_read_offline_data_from_files(
"eim_data");
262 eim_rb_eval.initialize_eim_theta_objects();
263 rb_eval.get_rb_theta_expansion().attach_multiple_A_theta(eim_rb_eval.get_eim_theta_objects());
266 #if defined(LIBMESH_HAVE_CAPNPROTO)
270 rb_eval.legacy_read_offline_data_from_files(
"rb_data");
274 Real online_curvature = infile(
"online_curvature", 0.);
275 Real online_Bi = infile(
"online_Bi", 0.);
276 Real online_kappa = infile(
"online_kappa", 0.);
278 online_mu.
set_value(
"curvature", online_curvature);
280 online_mu.
set_value(
"kappa", online_kappa);
281 rb_eval.set_parameters(online_mu);
282 rb_eval.print_parameters();
283 rb_eval.rb_solve(rb_eval.get_n_basis_functions());
286 if (store_basis_functions)
289 eim_rb_eval.read_in_basis_functions(
290 eim_construction.get_explicit_system(),
"eim_data");
291 rb_eval.read_in_basis_functions(rb_construction,
"rb_data");
293 eim_construction.load_rb_solution();
294 rb_construction.load_rb_solution();
300 #endif // LIBMESH_ENABLE_DIRICHLET
305 #ifdef LIBMESH_ENABLE_DIRICHLET
309 const std::string & filename)
319 (*node)(0) = -1./curvature + (1./curvature + x)*cos(curvature*z);
320 (*node)(2) = (1./curvature + x)*sin(curvature*z);
323 #ifdef LIBMESH_HAVE_EXODUS_API
328 #endif // LIBMESH_ENABLE_DIRICHLET