26 template <
int dim,
int spacedim,
class LacType>
31 , lambda(
"/LinearElasticity/Lame coefficients",
"1.0",
"lambda")
32 , mu(
"/LinearElasticity/Lame coefficients",
"1.0",
"mu")
35 this->output_results_call_back.connect([&]() { postprocess(); });
36 this->check_consistency_call_back.connect([&]() {
40 "This code won't produce correct results in transient simulations. "
41 "Run the wave_equation code instead."));
47 template <
int dim,
int spacedim,
class LacType>
54 auto &cell_matrix = copy.matrices[0];
55 auto &cell_rhs = copy.vectors[0];
57 cell->get_dof_indices(copy.local_dof_indices[0]);
59 const auto &fe_values = scratch.
reinit(cell);
63 for (
const unsigned int q_index : fe_values.quadrature_point_indices())
65 for (
const unsigned int i : fe_values.dof_indices())
67 const auto x = fe_values.quadrature_point(q_index);
69 fe_values[displacement].symmetric_gradient(i, q_index);
70 const auto &div_v = fe_values[displacement].divergence(i, q_index);
72 for (
const unsigned int j : fe_values.dof_indices())
75 fe_values[displacement].symmetric_gradient(j, q_index);
77 fe_values[displacement].divergence(j, q_index);
78 cell_matrix(i, j) += (2 * mu.value(x) * eps_v * eps_u +
79 lambda.value(x) * div_v * div_u) *
80 fe_values.JxW(q_index);
84 (fe_values.shape_value(i, q_index) *
85 this->forcing_term.value(x,
86 this->finite_element()
87 .system_to_component_index(i)
89 fe_values.JxW(q_index));
96 template <
int dim,
int spacedim,
class LacType>
101 const auto A = linear_operator<VectorType>(this->matrix.block(0, 0));
102 this->preconditioner.initialize(this->matrix.block(0, 0));
104 this->solution.block(0) = Ainv * this->rhs.block(0);
105 this->constraints.distribute(this->solution);
106 this->locally_relevant_solution = this->solution;
111 template <
int dim,
int spacedim,
class LacType>
116 std::map<types::boundary_id, Tensor<1, spacedim>> forces;
118 const auto face_integrator = [&](
const auto &cell,
124 auto &f = data[cell->face(face)->boundary_id()];
126 const auto &fe_face_values = scratch.reinit(cell, face);
127 scratch.extract_local_dof_values(
"solution",
128 this->locally_relevant_solution);
130 scratch.get_symmetric_gradients(
"solution", displacement);
132 const auto &div_u = scratch.get_divergences(
"solution", displacement);
134 const auto &n = scratch.get_normal_vectors();
135 const auto &JxW = scratch.get_JxW_values();
137 for (
unsigned int q = 0; q < n.size(); ++q)
139 (2 * mu.value(fe_face_values.quadrature_point(q)) * eps_u[q] * n[q] +
140 lambda.value(fe_face_values.quadrature_point(q)) * div_u[q] * n[q]) *
144 const auto copyer = [&](
const auto &data) {
145 for (
const auto &[
id, f] : data)
147 if (forces.find(
id) == forces.end())
156 this->
triangulation, this->finite_element().tensor_degree() + 1);
160 this->
triangulation, this->finite_element().tensor_degree() + 1);
163 this->finite_element(),
166 face_quadrature_formula,
176 this->dof_handler.begin_active()),
178 this->dof_handler.end()),
186 deallog <<
"Forces: " << std::endl;
187 for (
const auto &[
id, force] : forces)
188 deallog <<
"ID " <<
id <<
": " << force << std::endl;
void reinit(const Triangulation< dim, spacedim > &tria)
virtual void solve() override
Make sure we initialize the right type of linear solver.
typename LinearProblem< dim, spacedim, LacType >::ScratchData ScratchData
typename LinearProblem< dim, spacedim, LacType >::CopyData CopyData
virtual void assemble_system_one_cell(const typename DoFHandler< dim, spacedim >::active_cell_iterator &cell, ScratchData &scratch, CopyData ©) override
Explicitly assemble the LinearElasticity problem on a single cell.
void postprocess()
Compute integrals normal stress on Dirichlet faces, and average displacement on Neumann faces.
Construct a LinearProblem.
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
LinearOperator< Domain, Range, Payload > inverse_operator(const LinearOperator< Range, Domain, Payload > &op, Solver &solver, const Preconditioner &preconditioner)
void mesh_loop(const CellIteratorType &begin, const CellIteratorType &end, const CellWorkerFunctionType &cell_worker, const CopierType &copier, const ScratchData &sample_scratch_data, const CopyData &sample_copy_data, const AssembleFlags flags=assemble_own_cells, const BoundaryWorkerFunctionType &boundary_worker=BoundaryWorkerFunctionType(), const FaceWorkerFunctionType &face_worker=FaceWorkerFunctionType(), const unsigned int queue_length=2 *MultithreadInfo::n_threads(), const unsigned int chunk_size=8)
PDEs::LinearElasticity< dim, spacedim, LAC::LATrilinos > LinearElasticity
We collect in this namespace all PDEs that are relevant to Fluid Structure Interaction Problems.
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation