Amandus: Simulations based on multilevel Schwarz methods
matrix_integrators.h
Go to the documentation of this file.
1 namespace Elasticity
2 {
3 namespace StVenantKirchhoff
4 {
21 template <int dim>
22 inline void
24  dealii::FullMatrix<double>& M, const dealii::FEValuesBase<dim>& fe,
25  const dealii::VectorSlice<const std::vector<std::vector<dealii::Tensor<1, dim>>>>& input,
26  double lambda = 0., double mu = 1.)
27 {
28  const unsigned int nq = fe.n_quadrature_points;
29  const unsigned int n_dofs = fe.dofs_per_cell;
30 
31  for (unsigned int k = 0; k < nq; ++k)
32  {
33  const double dx = fe.JxW(k);
34  // F(u) = (I+grad u)
35  dealii::Tensor<2, dim> F;
36  // E builded as in parameters.h
37  dealii::Tensor<2, dim> E;
38  for (unsigned int d1 = 0; d1 < dim; ++d1)
39  {
40  F[d1][d1] = 1.;
41  for (unsigned int d2 = 0; d2 < dim; ++d2)
42  {
43  F[d1][d2] += input[d1][k][d2];
44  E[d1][d2] = .5 * (input[d1][k][d2] + input[d2][k][d1]);
45  for (unsigned int dd = 0; dd < dim; ++dd)
46  E[d1][d2] += .5 * (input[dd][k][d1] * input[dd][k][d2]);
47  }
48  }
49 
50  double trace = 0.;
51  for (unsigned int dd = 0; dd < dim; ++dd)
52  trace += E[dd][dd];
53  for (unsigned int dd = 0; dd < dim; ++dd)
54  E[dd][dd] += lambda / (2. * mu) * trace;
55 
56  for (unsigned int i = 0; i < n_dofs; ++i)
57  {
58  // build F_i
59  dealii::Tensor<2, dim> F_i;
60  // build E_i
61  dealii::Tensor<2, dim> E_i;
62  for (unsigned int d1 = 0; d1 < dim; ++d1)
63  {
64  F_i[d1][d1] = 1.;
65  for (unsigned int d2 = 0; d2 < dim; ++d2)
66  {
67  F_i[d1][d2] += fe.shape_grad_component(i, k, d1)[d2];
68  E_i[d1][d2] =
69  .5 * (fe.shape_grad_component(i, k, d1)[d2] + fe.shape_grad_component(i, k, d2)[d1]);
70 
71  double Ed1d2 = 0.;
72  for (unsigned int dd = 0; dd < dim; ++dd)
73  //.5 * (grad u)^T * grad v
74  Ed1d2 += .5 * (input[dd][k][d1] * fe.shape_grad_component(i, k, dd)[d2]);
75 
76  E_i[d1][d2] += Ed1d2;
77  E_i[d2][d1] += Ed1d2;
78  }
79  }
80 
81  double trace = 0.;
82  for (unsigned int dd = 0; dd < dim; ++dd)
83  trace += E_i[dd][dd];
84  for (unsigned int dd = 0; dd < dim; ++dd)
85  E_i[dd][dd] += lambda / (2. * mu) * trace;
86 
87  // left term computation
88  // L_i: left tensor
89  dealii::Tensor<2, dim> L_i;
90 
91  // F_i * E
92  for (unsigned int d1 = 0; d1 < dim; ++d1)
93  for (unsigned int d2 = 0; d2 < dim; ++d2)
94  {
95  double temp = 0.;
96  for (unsigned int dd = 0; dd < dim; ++dd)
97  {
98  L_i[d1][d2] += F_i[d1][dd] * E[dd][d2];
99  temp += F[d1][dd] * E_i[dd][d2];
100  }
101  L_i[d1][d2] += temp;
102  }
103 
104  //: product
105  for (unsigned int j = 0; j < n_dofs; ++j)
106  {
107  double temp = 0.;
108  for (unsigned int d1 = 0; d1 < dim; ++d1)
109  for (unsigned int d2 = 0; d2 < dim; ++d2)
110  temp += fe.shape_grad_component(j, k, d1)[d2] * L_i[d1][d2];
111 
112  M(i, j) += 2. * mu * dx * temp;
113  }
114  }
115  }
116 }
117 }
118 }
void cell_matrix(dealii::FullMatrix< double > &M, const dealii::FEValuesBase< dim > &fe, const dealii::VectorSlice< const std::vector< std::vector< dealii::Tensor< 1, dim >>>> &input, double lambda=0., double mu=1.)
Definition: matrix_integrators.h:23
Definition: elasticity/eigen.h:25