Amandus: Simulations based on multilevel Schwarz methods
elasticity/eigen.h
Go to the documentation of this file.
1 /**********************************************************************
2  * Copyright (C) 2011 - 2014 by the authors
3  * Distributed under the MIT License
4  *
5  * See the files AUTHORS and LICENSE in the project root directory
6  **********************************************************************/
7 #ifndef __elasticity_eigen_h
8 #define __elasticity_eigen_h
9 
10 #include <amandus/elasticity/matrix_integrators.h>
11 #include <amandus/integrator.h>
12 #include <deal.II/integrators/divergence.h>
13 #include <deal.II/integrators/elasticity.h>
14 #include <deal.II/integrators/grad_div.h>
15 #include <deal.II/integrators/l2.h>
16 #include <deal.II/integrators/laplace.h>
17 #include <deal.II/meshworker/integration_info.h>
18 #include <elasticity/parameters.h>
19 
20 #include <set>
21 
22 using namespace dealii;
23 using namespace dealii::MeshWorker;
24 
25 namespace Elasticity
26 {
45 template <int dim>
46 class Eigen : public AmandusIntegrator<dim>
47 {
48 public:
49  Eigen(const Parameters& par, const std::set<unsigned int>& dirichlet = std::set<unsigned int>());
50 
51  virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
52  virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
53  virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
54  IntegrationInfo<dim>& info2) const;
55 
56 private:
57  dealii::SmartPointer<const Parameters, class Eigen<dim>> parameters;
58  std::set<unsigned int> dirichlet_boundaries;
59 };
60 
61 template <int dim>
62 Eigen<dim>::Eigen(const Parameters& par, const std::set<unsigned int>& dirichlet)
63  : parameters(&par)
64  , dirichlet_boundaries(dirichlet)
65 {
66  // this->input_vector_names.push_back("Newton iterate");
67 }
68 
69 template <int dim>
70 void
71 Eigen<dim>::cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
72 {
73  if (dinfo.n_matrices() > 1)
74  {
75  AssertDimension(dinfo.n_matrices(), 2);
76  }
77  else
78  {
79  AssertDimension(dinfo.n_matrices(), 1);
80  }
81 
82  dealii::LocalIntegrators::L2::mass_matrix(dinfo.matrix(0, false).matrix, info.fe_values(0));
84  dinfo.matrix(0, false).matrix, info.fe_values(0), 2. * parameters->mu);
86  dinfo.matrix(0, false).matrix, info.fe_values(0), parameters->lambda);
87 
88  // Eigenvalue mass matrices
89  if (dinfo.n_matrices() > 1)
90  {
91  LocalIntegrators::L2::mass_matrix(dinfo.matrix(1, false).matrix, info.fe_values(0));
92  }
93 }
94 
95 template <int dim>
96 void
97 Eigen<dim>::boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
98 {
99  const unsigned int deg = info.fe_values(0).get_fe().tensor_degree();
100  if (dirichlet_boundaries.count(dinfo.face->boundary_id()) != 0)
101  {
102  dealii::LocalIntegrators::Elasticity::nitsche_matrix(
103  dinfo.matrix(0, false).matrix,
104  info.fe_values(0),
105  dealii::LocalIntegrators::Laplace::compute_penalty(dinfo, dinfo, deg, deg),
106  2000. * parameters->mu);
107  dealii::LocalIntegrators::GradDiv::nitsche_matrix(
108  dinfo.matrix(0, false).matrix,
109  info.fe_values(0),
110  dealii::LocalIntegrators::Laplace::compute_penalty(dinfo, dinfo, deg, deg),
111  parameters->lambda);
112  }
113 }
114 
115 template <int dim>
116 void
117 Eigen<dim>::face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
118  IntegrationInfo<dim>& info2) const
119 {
120  const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
121  dealii::LocalIntegrators::Elasticity::ip_matrix(
122  dinfo1.matrix(0, false).matrix,
123  dinfo1.matrix(0, true).matrix,
124  dinfo2.matrix(0, true).matrix,
125  dinfo2.matrix(0, false).matrix,
126  info1.fe_values(0),
127  info2.fe_values(0),
128  dealii::LocalIntegrators::Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
129  2. * parameters->mu);
130  dealii::LocalIntegrators::GradDiv::ip_matrix(
131  dinfo1.matrix(0, false).matrix,
132  dinfo1.matrix(0, true).matrix,
133  dinfo2.matrix(0, true).matrix,
134  dinfo2.matrix(0, false).matrix,
135  info1.fe_values(0),
136  info2.fe_values(0),
137  dealii::LocalIntegrators::Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
138  parameters->lambda);
139 }
140 }
141 
142 #endif
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
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: elasticity/eigen.h:117
Definition: elasticity/eigen.h:46
std::set< unsigned int > dirichlet_boundaries
Definition: elasticity/eigen.h:58
Definition: elasticity/eigen.h:25
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: elasticity/eigen.h:97
dealii::SmartPointer< const Parameters, class Eigen< dim > > parameters
Definition: elasticity/eigen.h:57
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: elasticity/eigen.h:71
Definition: integrator.h:29