63{
64
66
67
69 "--enable-petsc, --enable-trilinos, or --enable-eigen");
70
71
72 libmesh_example_requires(LIBMESH_DIM > 2, "3D support");
73
74
75#ifndef LIBMESH_ENABLE_DIRICHLET
76 libmesh_example_requires(false, "--enable-dirichlet");
77#endif
78
79
80 GetPot infile("fem_system_ex3.in");
81
82
83 infile.parse_command_line(argc, argv);
84
85
86 const Real deltat = infile(
"deltat", 0.25);
87 unsigned int n_timesteps = infile("n_timesteps", 1);
88
89#ifdef LIBMESH_HAVE_EXODUS_API
90 const unsigned int write_interval = infile("write_interval", 1);
91#endif
92
93
94 const unsigned int dim = 3;
95
96
97 libmesh_example_requires(
dim == LIBMESH_DIM,
"3D support");
98
99 const unsigned int nx = infile("nx", 32);
100 const unsigned int ny = infile("ny", 8);
101 const unsigned int nz = infile("nz", 4);
102
103
106 nx,
107 ny,
108 nz,
109 0., 1.*x_scaling,
110 0., 0.3,
111 0., 0.1,
113
114
115
117
118
119
120
121 for (
const auto & elem :
mesh.element_ptr_range())
122 {
123 unsigned int
124 side_max_x = 0, side_min_y = 0,
125 side_max_y = 0, side_max_z = 0;
126 bool
127 found_side_max_x = false, found_side_max_y = false,
128 found_side_min_y = false, found_side_max_z = false;
129 for (auto side : elem->side_index_range())
130 {
132 {
133 side_max_x = side;
134 found_side_max_x = true;
135 }
136
138 {
139 side_min_y = side;
140 found_side_min_y = true;
141 }
142
144 {
145 side_max_y = side;
146 found_side_max_y = true;
147 }
148
150 {
151 side_max_z = side;
152 found_side_max_z = true;
153 }
154 }
155
156
157
158
159 if (found_side_max_x && found_side_max_y && found_side_max_z)
160 for (auto n : elem->node_index_range())
161 if (elem->is_node_on_side(n, side_max_x) &&
162 elem->is_node_on_side(n, side_max_y) &&
163 elem->is_node_on_side(n, side_max_z))
165
166
167
168
169 if (found_side_max_x && found_side_min_y)
170 for (auto e : elem->edge_index_range())
171 if (elem->is_edge_on_side(e, side_max_x) &&
172 elem->is_edge_on_side(e, side_min_y))
174 }
175
176
177
179
180
182
183
186
187
188 const std::string time_solver = infile("time_solver","DIE!");
189
192
193 if (time_solver == "newmark")
194 {
195
196 v_system = &equation_systems.add_system<
ExplicitSystem> (
"Velocity");
200
201
202 a_system = &equation_systems.add_system<
ExplicitSystem> (
"Acceleration");
206
207 system.
time_solver = std::make_unique<NewmarkSolver>(system);
208 }
209
210 else if (time_solver == "euler")
211 {
212 system.
time_solver = std::make_unique<EulerSolver>(system);
214 euler_solver.
theta = infile(
"theta", 1.0);
215 }
216
217 else if (time_solver == "euler2")
218 {
219 system.
time_solver = std::make_unique<Euler2Solver>(system);
221 euler_solver.
theta = infile(
"theta", 1.0);
222 }
223
224 else if (time_solver == "steady")
225 {
226 system.
time_solver = std::make_unique<SteadySolver>(system);
227 libmesh_assert_equal_to (n_timesteps, 1);
228 }
229 else
230 libmesh_error_msg(std::string("ERROR: invalid time_solver ")+time_solver);
231
232
233 equation_systems.init ();
234
235
237
238
240 solver.
quiet = infile(
"solver_quiet",
true);
246
247
250
251
252 equation_systems.print_info();
253
254
255
256
258 if (newton_solver &&
259 (time_solver == "euler" || time_solver == "euler2"))
260 {
261#ifdef LIBMESH_HAVE_EIGEN_SPARSE
265
266 if (eigen_linear_solver)
268#endif
269 }
270
271 if (time_solver == "newmark")
272 {
275
276
277
280 }
281
282#ifdef LIBMESH_HAVE_EXODUS_API
283
284 {
285 std::ostringstream file_name;
286
287
288 file_name << std::string("out.")+time_solver+std::string(".e-s.")
289 << std::setw(3)
290 << std::setfill('0')
291 << std::right
292 << 0;
293
295 equation_systems,
296 1,
297
299 }
300#endif
301
302
303
304 for (unsigned int t_step=0; t_step != n_timesteps; ++t_step)
305 {
306
308 << t_step
309 << ", time = "
311 << std::endl;
312
314
315
317
318
319
320 if (time_solver == "newmark")
321 {
324 }
325
326#ifdef LIBMESH_HAVE_EXODUS_API
327
328 if ((t_step+1)%write_interval == 0)
329 {
330 std::ostringstream file_name;
331
332
333 file_name << std::string("out.")+time_solver+std::string(".e-s.")
334 << std::setw(3)
335 << std::setfill('0')
336 << std::right
337 << t_step+1;
338
340 equation_systems,
341 1,
342
344 }
345#endif
346 }
347
348
349 return 0;
350}
bool has_boundary_id(const Node *const node, const boundary_id_type id) const
void regenerate_id_sets()
Clears and regenerates the cached sets of ids.
This is a generic class that defines a solver to handle ImplicitSystem classes, including NonlinearIm...
Real absolute_residual_tolerance
The DiffSolver should exit after the residual is reduced to either less than absolute_residual_tolera...
unsigned int max_linear_iterations
Each linear solver step should exit after max_linear_iterations is exceeded.
double initial_linear_tolerance
Any required linear solves will at first be done with this tolerance; the DiffSolver may tighten the ...
Real relative_residual_tolerance
Real relative_step_tolerance
bool verbose
The DiffSolver may print a lot more to libMesh::out if verbose is set to true; default is false.
unsigned int max_nonlinear_iterations
The DiffSolver should exit in failure if max_nonlinear_iterations is exceeded and continue_after_max_...
bool quiet
The DiffSolver should not print anything to libMesh::out unless quiet is set to false; default is tru...
Real deltat
For time-dependent problems, this is the amount delta t to advance the solution in time.
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we're going to use.
This class provides an interface to Eigen iterative solvers that is compatible with the libMesh Linea...
This is the EquationSystems class.
This class defines a theta-method (defaulting to Backward Euler with theta = 1.0) solver to handle ti...
Real theta
The value for the theta method to employ: 1.0 corresponds to backwards Euler, 0.0 corresponds to forw...
This class defines a theta-method Euler (defaulting to Backward Euler with theta = 1....
Real theta
The value for the theta method to employ: 1.0 corresponds to backwards Euler, 0.0 corresponds to forw...
The ExodusII_IO class implements reading meshes in the ExodusII file format from Sandia National Labs...
void write_timestep(const std::string &fname, const EquationSystems &es, const int timestep, const Real time, const std::set< std::string > *system_names=nullptr)
Writes out the solution at a specific timestep.
Manages consistently variables, degrees of freedom, and coefficient vectors for explicit systems.
virtual void solve() override
Invokes the solver associated with the system.
The LibMeshInit class, when constructed, initializes the dependent libraries (e.g.
This base class can be inherited from to provide interfaces to linear solvers from different packages...
void set_solver_type(const SolverType st)
Sets the type of solver to use.
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
void print_info(std::ostream &os=libMesh::out, const unsigned int verbosity=0, const bool global=true) const
Prints relevant information about the mesh.
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
This class defines a Newmark time integrator for second order (in time) DifferentiableSystems.
virtual void compute_initial_accel()
This method uses the specified initial displacement and velocity to compute the initial acceleration ...
This class defines a solver which uses the default libMesh linear solver in a quasiNewton method to h...
LinearSolver< Number > & get_linear_solver()
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Real time
For time-dependent problems, this is the time t at the beginning of the current timestep.
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
const NumericVector< Number > & get_vector(std::string_view vec_name) const
boundary_id_type boundary_id_max_x
boundary_id_type boundary_id_min_y
boundary_id_type boundary_id_max_z
boundary_id_type boundary_id_max_y
const boundary_id_type edge_boundary_id
const boundary_id_type node_boundary_id
void init(triangulateio &t)
Initializes the fields of t to nullptr/0 as necessary.
SolverPackage default_solver_package()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real