45 #include "libmesh/libmesh.h"    46 #include "libmesh/replicated_mesh.h"    47 #include "libmesh/exodusII_io.h"    48 #include "libmesh/equation_systems.h"    49 #include "libmesh/dof_map.h"    50 #include "libmesh/numeric_vector.h"    51 #include "libmesh/getpot.h"    52 #include "libmesh/dirichlet_boundaries.h"    53 #include "libmesh/string_to_enum.h"    54 #include "libmesh/zero_function.h"    55 #include "libmesh/nonlinear_solver.h"    56 #include "libmesh/nonlinear_implicit_system.h"    57 #include "libmesh/petsc_macro.h"    58 #include "libmesh/enum_solver_package.h"    59 #include "libmesh/mesh_refinement.h"    66 int main (
int argc, 
char ** argv)
    71 #ifndef LIBMESH_HAVE_EXODUS_API    72   libmesh_example_requires(
false, 
"--enable-exodus");
    76   libmesh_example_requires(LIBMESH_DIM > 2, 
"--disable-1D-only --disable-2D-only");
    79 #ifndef LIBMESH_ENABLE_DIRICHLET    80   libmesh_example_requires(
false, 
"--enable-dirichlet");
    86   GetPot infile(
"systems_of_equations_ex8.in");
    87   infile.parse_command_line(argc,argv);
    89   const std::string approx_order = infile(
"approx_order", 
"FIRST");
    90   const std::string fe_family = infile(
"fe_family", 
"LAGRANGE");
    92   const Real young_modulus = infile(
"Young_modulus", 1.0);
    93   const Real poisson_ratio = infile(
"poisson_ratio", 0.3);
    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);
   103   mesh.
read(
"systems_of_equations_ex8.exo");
   105   const unsigned int n_refinements = infile(
"n_refinements", 0);
   107 #ifndef LIBMESH_ENABLE_AMR   108   libmesh_example_requires(n_refinements==0, 
"--enable-amr");
   125                         Utility::string_to_enum<Order>   (approx_order),
   126                         Utility::string_to_enum<FEFamily>(fe_family));
   130                         Utility::string_to_enum<Order>   (approx_order),
   131                         Utility::string_to_enum<FEFamily>(fe_family));
   135                         Utility::string_to_enum<Order>   (approx_order),
   136                         Utility::string_to_enum<FEFamily>(fe_family));
   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;
   159 #ifdef LIBMESH_ENABLE_DIRICHLET   178 #endif // LIBMESH_ENABLE_DIRICHLET   181   le.initialize_contact_load_paths();
   183   libMesh::out << 
"Mesh before adding edge connectors" << std::endl;
   185   le.add_contact_edge_elements();
   187   libMesh::out << 
"Mesh after adding edge connectors" << std::endl;
   190   equation_systems.
init();
   193   libMesh::out << 
"Contact penalty: " << contact_penalty  << std::endl << std::endl;
   195   Real current_max_gap_function = std::numeric_limits<Real>::max();
   197   const unsigned int max_outer_iterations = 10;
   198   for (
unsigned int outer_iteration = 0;
   199        outer_iteration != max_outer_iterations; ++outer_iteration)
   201       if (current_max_gap_function <= gap_function_tol)
   207       libMesh::out << 
"Starting outer iteration " << outer_iteration << std::endl;
   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;
   220       libMesh::out << 
"Finished outer iteration, least gap function: "   222                    << 
", max gap function: "   227       current_max_gap_function = std::max(std::abs(least_gap_fn), std::abs(max_gap_fn));
   236   le.compute_stresses();
   238   std::stringstream filename;
   239   filename << 
"solution.exo";
 This is the EquationSystems class. 
virtual void read(const std::string &name, void *mesh_data=nullptr, bool skip_renumber_nodes_and_elements=false, bool skip_find_neighbors=false)=0
Interfaces for reading/writing a mesh to/from a file. 
The ReplicatedMesh class is derived from the MeshBase class, and is used to store identical copies of...
std::unique_ptr< NonlinearSolver< Number > > nonlinear_solver
The NonlinearSolver defines the default interface used to solve the nonlinear_implicit system...
ConstFunction that simply returns 0. 
The ExodusII_IO class implements reading meshes in the ExodusII file format from Sandia National Labs...
void print_info(std::ostream &os=libMesh::out) const
Prints information about the equation systems, by default to libMesh::out. 
int main(int argc, char **argv)
This class allows one to associate Dirichlet boundary values with a given set of mesh boundary ids an...
The LibMeshInit class, when constructed, initializes the dependent libraries (e.g. 
The libMesh namespace provides an interface to certain functionality in the library. 
SolverPackage default_solver_package()
void libmesh_ignore(const Args &...)
Implements (adaptive) mesh refinement algorithms for a MeshBase. 
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. 
void print_info(std::ostream &os=libMesh::out, const unsigned int verbosity=0, const bool global=true) const
Prints relevant information about the mesh. 
void init(triangulateio &t)
Initializes the fields of t to nullptr/0 as necessary. 
Manages consistently variables, degrees of freedom, coefficient vectors, matrices and non-linear solv...
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 solve() override
Assembles & solves the nonlinear system R(x) = 0. 
virtual void update()
Update the local values to reflect the solution on neighboring processors. 
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
T & set(const std::string &)
Parameters parameters
Data structure holding arbitrary parameters. 
Function that returns a single value that never changes. 
void add_dirichlet_boundary(const DirichletBoundary &dirichlet_boundary)
Adds a copy of the specified Dirichlet boundary to the system. 
virtual void init()
Initialize all the systems. 
virtual System & add_system(std::string_view system_type, std::string_view name)
Add the system of type system_type named name to the systems array. 
const DofMap & get_dof_map() const
Manages consistently variables, degrees of freedom, and coefficient vectors for explicit systems...
void uniformly_refine(unsigned int n=1)
Uniformly refines the mesh n times. 
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. ...