Amandus: Simulations based on multilevel Schwarz methods
elasticity/matrix.h
Go to the documentation of this file.
1 #ifndef __elasticity_matrix_h
2 #define __elasticity_matrix_h
3 
4 #include <amandus/elasticity/matrix_integrators.h>
5 #include <amandus/integrator.h>
6 #include <deal.II/integrators/divergence.h>
7 #include <deal.II/integrators/elasticity.h>
8 #include <deal.II/integrators/grad_div.h>
9 #include <deal.II/integrators/l2.h>
10 #include <deal.II/integrators/laplace.h>
11 #include <deal.II/meshworker/integration_info.h>
12 #include <elasticity/parameters.h>
13 
14 #include <set>
15 
16 using namespace dealii::MeshWorker;
17 
18 namespace Elasticity
19 {
31 template <int dim>
32 class Matrix : public AmandusIntegrator<dim>
33 {
34 public:
35  Matrix(const Parameters& par, const std::set<unsigned int>& dirichlet = std::set<unsigned int>(),
36  const std::set<unsigned int>& tangential = std::set<unsigned int>());
37 
38  virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
39  virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
40  virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
41  IntegrationInfo<dim>& info2) const;
42 
43 private:
44  dealii::SmartPointer<const Parameters, class Matrix<dim>> parameters;
45  std::set<unsigned int> dirichlet_boundaries;
46  std::set<unsigned int> tangential_boundaries;
47 };
48 
49 template <int dim>
50 Matrix<dim>::Matrix(const Parameters& par, const std::set<unsigned int>& dirichlet,
51  const std::set<unsigned int>& tangential)
52  : parameters(&par)
53  , dirichlet_boundaries(dirichlet)
54  , tangential_boundaries(tangential)
55 {
56  // this->input_vector_names.push_back("Newton iterate");
57 }
58 
59 template <int dim>
60 void
61 Matrix<dim>::cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
62 {
63  AssertDimension(dinfo.n_matrices(), 1);
64  if (true || parameters->linear)
65  {
67  dinfo.matrix(0, false).matrix, info.fe_values(0), 2. * parameters->mu);
69  dinfo.matrix(0, false).matrix, info.fe_values(0), parameters->lambda);
70  }
71  else
72  {
73  Elasticity::StVenantKirchhoff::cell_matrix(dinfo.matrix(0, false).matrix,
74  info.fe_values(0),
75  dealii::make_slice(info.gradients[0], 0, dim),
76  parameters->lambda,
77  parameters->mu);
78  }
79 }
80 
81 template <int dim>
82 void
83 Matrix<dim>::boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
84 {
85  const unsigned int deg = info.fe_values(0).get_fe().tensor_degree();
86  if (dirichlet_boundaries.count(dinfo.face->boundary_id()) != 0)
87  {
88  dealii::LocalIntegrators::Elasticity::nitsche_matrix(
89  dinfo.matrix(0, false).matrix,
90  info.fe_values(0),
91  dealii::LocalIntegrators::Laplace::compute_penalty(dinfo, dinfo, deg, deg),
92  2. * parameters->mu);
93  }
94  else if (tangential_boundaries.count(dinfo.face->boundary_id()) != 0)
95  {
96  dealii::LocalIntegrators::Elasticity::nitsche_tangential_matrix(
97  dinfo.matrix(0, false).matrix,
98  info.fe_values(0),
99  dealii::LocalIntegrators::Laplace::compute_penalty(dinfo, dinfo, deg, deg),
100  2. * parameters->mu);
101  }
102 }
103 
104 template <int dim>
105 void
106 Matrix<dim>::face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
107  IntegrationInfo<dim>& info2) const
108 {
109  const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
110  dealii::LocalIntegrators::Elasticity::ip_matrix(
111  dinfo1.matrix(0, false).matrix,
112  dinfo1.matrix(0, true).matrix,
113  dinfo2.matrix(0, true).matrix,
114  dinfo2.matrix(0, false).matrix,
115  info1.fe_values(0),
116  info2.fe_values(0),
117  dealii::LocalIntegrators::Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
118  2. * parameters->mu);
119 }
120 }
121 
122 #endif
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: elasticity/matrix.h:61
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
dealii::SmartPointer< const Parameters, class Matrix< dim > > parameters
Definition: elasticity/matrix.h:44
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: elasticity/matrix.h:106
Definition: elasticity/eigen.h:25
std::set< unsigned int > dirichlet_boundaries
Definition: elasticity/matrix.h:45
Definition: elasticity/matrix.h:32
std::set< unsigned int > tangential_boundaries
Definition: elasticity/matrix.h:46
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: elasticity/matrix.h:83
Definition: integrator.h:29