67{
69
70
71#ifndef LIBMESH_HAVE_EXODUS_API
72 libmesh_example_requires(false, "--enable-exodus");
73#endif
74
75
76 libmesh_example_requires(LIBMESH_DIM > 2, "--disable-1D-only --disable-2D-only");
77
78
79#ifndef LIBMESH_ENABLE_DIRICHLET
80 libmesh_example_requires(false, "--enable-dirichlet");
81#endif
82
83
85
86 GetPot infile("systems_of_equations_ex8.in");
87 infile.parse_command_line(argc,argv);
88
89 const std::string approx_order = infile("approx_order", "FIRST");
90 const std::string fe_family = infile("fe_family", "LAGRANGE");
91
92 const Real young_modulus = infile(
"Young_modulus", 1.0);
93 const Real poisson_ratio = infile(
"poisson_ratio", 0.3);
94
95 const Real nonlinear_abs_tol = infile(
"nonlinear_abs_tol", 1.e-8);
96 const Real nonlinear_rel_tol = infile(
"nonlinear_rel_tol", 1.e-8);
97 const unsigned int nonlinear_max_its = infile("nonlinear_max_its", 50);
98 const Real contact_penalty = infile(
"contact_penalty", 1.e2);
99 const Real gap_function_tol = infile(
"gap_function_tol", 1.e-8);
100
101
103 mesh.
read(
"systems_of_equations_ex8.exo");
104
105 const unsigned int n_refinements = infile("n_refinements", 0);
106
107#ifndef LIBMESH_ENABLE_AMR
108 libmesh_example_requires(n_refinements==0, "--enable-amr");
109#else
111 mesh_refinement.uniformly_refine(n_refinements);
112#endif
113
115
117
120
122
123 unsigned int u_var =
125 Utility::string_to_enum<Order> (approx_order),
126 Utility::string_to_enum<FEFamily>(fe_family));
127
128 unsigned int v_var =
130 Utility::string_to_enum<Order> (approx_order),
131 Utility::string_to_enum<FEFamily>(fe_family));
132
133 unsigned int w_var =
135 Utility::string_to_enum<Order> (approx_order),
136 Utility::string_to_enum<FEFamily>(fe_family));
137
138
141
149
150 equation_systems.parameters.set<
Real> (
"nonlinear solver absolute residual tolerance") = nonlinear_abs_tol;
151 equation_systems.parameters.set<
Real> (
"nonlinear solver relative residual tolerance") = nonlinear_rel_tol;
152 equation_systems.parameters.set<unsigned int> ("nonlinear solver maximum iterations") = nonlinear_max_its;
153
155
156 equation_systems.parameters.set<
Real>(
"young_modulus") = young_modulus;
157 equation_systems.parameters.set<
Real>(
"poisson_ratio") = poisson_ratio;
158
159#ifdef LIBMESH_ENABLE_DIRICHLET
160
162
163
164
168
172
174
178#endif
180
181 le.initialize_contact_load_paths();
182
183 libMesh::out <<
"Mesh before adding edge connectors" << std::endl;
185 le.add_contact_edge_elements();
186
187 libMesh::out <<
"Mesh after adding edge connectors" << std::endl;
189
190 equation_systems.init();
191 equation_systems.print_info();
192
193 libMesh::out <<
"Contact penalty: " << contact_penalty << std::endl << std::endl;
194
195 Real current_max_gap_function = std::numeric_limits<Real>::max();
196
197 const unsigned int max_outer_iterations = 10;
198 for (unsigned int outer_iteration = 0;
199 outer_iteration != max_outer_iterations; ++outer_iteration)
200 {
201 if (current_max_gap_function <= gap_function_tol)
202 {
204 break;
205 }
206
207 libMesh::out <<
"Starting outer iteration " << outer_iteration << std::endl;
208
209
212
213
214 le.update_lambdas();
215
216 std::pair<Real, Real> least_and_max_gap_function = le.get_least_and_max_gap_function();
217 Real least_gap_fn = least_and_max_gap_function.first;
218 Real max_gap_fn = least_and_max_gap_function.second;
219
220 libMesh::out <<
"Finished outer iteration, least gap function: "
221 << least_gap_fn
222 << ", max gap function: "
223 << max_gap_fn
224 << std::endl
225 << std::endl;
226
227 current_max_gap_function = std::max(std::abs(least_gap_fn), std::abs(max_gap_fn));
228 }
229
230
233
235
236 le.compute_stresses();
237
238 std::stringstream filename;
239 filename << "solution.exo";
241 equation_systems);
242
243 return 0;
244}
Function that returns a single value that never changes.
This class allows one to associate Dirichlet boundary values with a given set of mesh boundary ids an...
void add_dirichlet_boundary(const DirichletBoundary &dirichlet_boundary)
Adds a copy of the specified Dirichlet boundary to the system.
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
Constrains the numeric vector v, which represents a solution defined on the mesh.
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.
Manages consistently variables, degrees of freedom, and coefficient vectors for explicit systems.
The LibMeshInit class, when constructed, initializes the dependent libraries (e.g.
virtual void read(const std::string &name, void *mesh_data=nullptr, bool skip_renumber_nodes_and_elements=false, bool skip_find_neighbors=false, bool skip_detect_interior_parents=false)=0
Interfaces for reading/writing a mesh to/from a file.
void print_info(std::ostream &os=libMesh::out, const unsigned int verbosity=0, const bool global=true) const
Prints relevant information about the mesh.
Implements (adaptive) mesh refinement algorithms for a MeshBase.
Manages consistently variables, degrees of freedom, coefficient vectors, matrices and non-linear solv...
virtual void solve() override
Assembles & solves the nonlinear system R(x) = 0.
std::unique_ptr< NonlinearSolver< Number > > nonlinear_solver
The NonlinearSolver defines the default interface used to solve the nonlinear_implicit system.
The ReplicatedMesh class is derived from the MeshBase class, and is used to store identical copies of...
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.
virtual void update()
Update the local values to reflect the solution on neighboring processors.
const DofMap & get_dof_map() const
ConstFunction that simply returns 0.
void init(triangulateio &t)
Initializes the fields of t to nullptr/0 as necessary.
void libmesh_ignore(const Args &...)
SolverPackage default_solver_package()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real