57 #include "libmesh/libmesh.h"
58 #include "libmesh/mesh.h"
59 #include "libmesh/mesh_generation.h"
60 #include "libmesh/mesh_refinement.h"
61 #include "libmesh/exodusII_io.h"
62 #include "libmesh/equation_systems.h"
63 #include "libmesh/fe.h"
64 #include "libmesh/quadrature_gauss.h"
65 #include "libmesh/dof_map.h"
66 #include "libmesh/sparse_matrix.h"
67 #include "libmesh/numeric_vector.h"
68 #include "libmesh/dense_matrix.h"
69 #include "libmesh/dense_vector.h"
70 #include "libmesh/getpot.h"
71 #include "libmesh/elem.h"
72 #include "libmesh/fe_interface.h"
73 #include "libmesh/boundary_info.h"
74 #include "libmesh/linear_implicit_system.h"
75 #include "libmesh/zero_function.h"
76 #include "libmesh/dirichlet_boundaries.h"
77 #include "libmesh/enum_solver_package.h"
83 #define MIN_Z_BOUNDARY 1
84 #define MAX_Z_BOUNDARY 2
85 #define CRACK_BOUNDARY_LOWER 3
86 #define CRACK_BOUNDARY_UPPER 4
98 int main (
int argc,
char ** argv)
104 #ifndef LIBMESH_HAVE_EXODUS_API
105 libmesh_example_requires(
false,
"--enable-exodus");
109 libmesh_example_requires(3 <= LIBMESH_DIM,
"3D support");
112 #ifndef LIBMESH_ENABLE_DIRICHLET
113 libmesh_example_requires(
false,
"--enable-dirichlet");
116 GetPot command_line (argc, argv);
119 if (command_line.search(1,
"-R"))
120 R = command_line.next(R);
134 #ifdef LIBMESH_ENABLE_DIRICHLET
136 std::set<boundary_id_type> boundary_ids;
137 boundary_ids.insert(MAX_Z_BOUNDARY);
138 std::vector<unsigned int> variables;
139 variables.push_back(0);
147 #endif // LIBMESH_ENABLE_DIRICHLET
156 (
mesh, CRACK_BOUNDARY_LOWER, CRACK_BOUNDARY_UPPER);
161 equation_systems.init();
162 equation_systems.print_info();
165 equation_systems.parameters.set<
Real>(
"R") = R;
172 #ifdef LIBMESH_HAVE_EXODUS_API
178 #ifdef LIBMESH_ENABLE_AMR
181 unsigned int n_refinements = 0;
182 if (command_line.search(
"-n_refinements"))
183 n_refinements = command_line.next(0);
185 for (
unsigned int r = 0; r != n_refinements; ++r)
187 std::cout <<
"Refining the mesh" << std::endl;
190 equation_systems.reinit();
196 #ifdef LIBMESH_HAVE_EXODUS_API
198 std::ostringstream
out;
199 out <<
"solution_" << r <<
".exo";
221 const DofMap & dof_map = system.get_dof_map();
223 FEType fe_type = dof_map.variable_type(0);
232 fe->attach_quadrature_rule (&qrule);
233 fe_elem_face->attach_quadrature_rule (&qface);
234 fe_neighbor_face->attach_quadrature_rule (&qface);
236 const std::vector<Real> & JxW = fe->get_JxW();
237 const std::vector<std::vector<Real>> & phi = fe->get_phi();
238 const std::vector<std::vector<RealGradient>> & dphi = fe->get_dphi();
240 const std::vector<Real> & JxW_face = fe_elem_face->get_JxW();
242 const std::vector<Point> & qface_points = fe_elem_face->get_xyz();
244 const std::vector<std::vector<Real>> & phi_face = fe_elem_face->get_phi();
245 const std::vector<std::vector<Real>> & phi_neighbor_face = fe_neighbor_face->get_phi();
255 std::vector<dof_id_type> dof_indices;
259 dof_map.dof_indices (elem, dof_indices);
260 const unsigned int n_dofs = dof_indices.size();
264 Ke.
resize (n_dofs, n_dofs);
268 for (
unsigned int qp=0; qp<qrule.n_points(); qp++)
269 for (
unsigned int i=0; i<n_dofs; i++)
270 for (
unsigned int j=0; j<n_dofs; j++)
271 Ke(i,j) += JxW[qp]*(dphi[i][qp]*dphi[j][qp]);
275 for (
auto side : elem->side_index_range())
276 if (elem->neighbor_ptr(side) ==
nullptr)
280 fe_elem_face->reinit(elem, side);
282 for (
unsigned int qp=0; qp<qface.n_points(); qp++)
283 for (std::size_t i=0; i<phi.size(); i++)
284 Fe(i) += JxW_face[qp] * phi_face[i][qp];
292 for (
auto side : elem->side_index_range())
293 if (elem->neighbor_ptr(side) ==
nullptr)
298 fe_elem_face->reinit(elem, side);
300 ElementSideMap::const_iterator ltu_it =
301 lower_to_upper.find(std::make_pair(elem, side));
304 const Elem * neighbor = ltu_it->second;
306 std::vector<Point> qface_neighbor_points;
309 qface_neighbor_points);
310 fe_neighbor_face->reinit(neighbor, &qface_neighbor_points);
312 std::vector<dof_id_type> neighbor_dof_indices;
313 dof_map.dof_indices (neighbor, neighbor_dof_indices);
314 const unsigned int n_neighbor_dofs = neighbor_dof_indices.
size();
316 Kne.
resize (n_neighbor_dofs, n_dofs);
317 Ken.
resize (n_dofs, n_neighbor_dofs);
318 Kee.
resize (n_dofs, n_dofs);
319 Knn.
resize (n_neighbor_dofs, n_neighbor_dofs);
322 for (
unsigned int qp=0; qp<qface.n_points(); qp++)
323 for (
unsigned int i=0; i<n_dofs; i++)
324 for (
unsigned int j=0; j<n_dofs; j++)
325 Kee(i,j) -= JxW_face[qp] * (1./R)*(phi_face[i][qp] * phi_face[j][qp]);
328 for (
unsigned int qp=0; qp<qface.n_points(); qp++)
329 for (
unsigned int i=0; i<n_dofs; i++)
330 for (
unsigned int j=0; j<n_neighbor_dofs; j++)
331 Ken(i,j) += JxW_face[qp] * (1./R)*(phi_face[i][qp] * phi_neighbor_face[j][qp]);
334 for (
unsigned int qp=0; qp<qface.n_points(); qp++)
335 for (
unsigned int i=0; i<n_neighbor_dofs; i++)
336 for (
unsigned int j=0; j<n_neighbor_dofs; j++)
337 Knn(i,j) -= JxW_face[qp] * (1./R)*(phi_neighbor_face[i][qp] * phi_neighbor_face[j][qp]);
340 for (
unsigned int qp=0; qp<qface.n_points(); qp++)
341 for (
unsigned int i=0; i<n_neighbor_dofs; i++)
342 for (
unsigned int j=0; j<n_dofs; j++)
343 Kne(i,j) += JxW_face[qp] * (1./R)*(phi_neighbor_face[i][qp] * phi_face[j][qp]);
345 system.matrix->add_matrix(Kne, neighbor_dof_indices, dof_indices);
346 system.matrix->add_matrix(Ken, dof_indices, neighbor_dof_indices);
347 system.matrix->add_matrix(Kee, dof_indices);
348 system.matrix->add_matrix(Knn, neighbor_dof_indices);
353 dof_map.constrain_element_matrix_and_vector (Ke, Fe, dof_indices);
355 system.matrix->add_matrix (Ke, dof_indices);
356 system.rhs->add_vector (Fe, dof_indices);