Amandus: Simulations based on multilevel Schwarz methods
elasticity/residual.h
Go to the documentation of this file.
1 /**********************************************************************
2  *
3  * Copyright Guido Kanschat, 2010, 2012, 2013
4  *
5  **********************************************************************/
6 
7 #ifndef __elasticity_residual_h
8 #define __elasticity_residual_h
9 
10 #include <amandus/elasticity/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 <elasticity/parameters.h>
18 
19 using namespace dealii::MeshWorker;
20 
82 namespace Elasticity
83 {
92 template <int dim, int force_type = 0>
93 class Residual : public AmandusIntegrator<dim>
94 {
95 public:
96  Residual(const Parameters& par, const dealii::Function<dim>& bdry,
97  const std::set<unsigned int>& dirichlet = std::set<unsigned int>());
98 
99  virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
100  virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
101  virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
102  IntegrationInfo<dim>& info2) const;
103 
104 private:
105  dealii::SmartPointer<const Parameters, class Residual<dim>> parameters;
106  dealii::SmartPointer<const dealii::Function<dim>, class Residual<dim>> boundary_values;
107  std::set<unsigned int> dirichlet_boundaries;
108 };
109 
110 //----------------------------------------------------------------------//
111 
112 template <int dim, int force_type>
113 Residual<dim, force_type>::Residual(const Parameters& par, const dealii::Function<dim>& bdry,
114  const std::set<unsigned int>& dirichlet)
115  : parameters(&par)
116  , boundary_values(&bdry)
117  , dirichlet_boundaries(dirichlet)
118 {
119  this->input_vector_names.push_back("Newton iterate");
120 }
121 
122 template <int dim, int force_type>
123 void
124 Residual<dim, force_type>::cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
125 {
126  Assert(info.values.size() >= 1, dealii::ExcDimensionMismatch(info.values.size(), 1));
127  Assert(info.gradients.size() >= 1, dealii::ExcDimensionMismatch(info.values.size(), 1));
128 
129  const double mu = parameters->mu;
130  const double lambda = parameters->lambda;
131 
132  if (force_type == 1)
133  {
134  std::vector<std::vector<double>> force(
135  dim, std::vector<double>(info.fe_values(0).n_quadrature_points, 0.));
136  std::fill(force[dim - 1].begin(), force[dim - 1].end(), 9.80665);
137  dealii::LocalIntegrators::L2::L2(dinfo.vector(0).block(0), info.fe_values(0), force);
138  }
139 
140  if (parameters->linear)
141  {
143  dinfo.vector(0).block(0),
144  info.fe_values(0),
145  dealii::make_slice(info.gradients[0], 0, dim),
146  2. * mu);
147  dealii::LocalIntegrators::GradDiv::cell_residual(dinfo.vector(0).block(0),
148  info.fe_values(0),
149  dealii::make_slice(info.gradients[0], 0, dim),
150  lambda);
151  }
152  else
153  {
154  StVenantKirchhoff::cell_residual(dinfo.vector(0).block(0),
155  info.fe_values(0),
156  dealii::make_slice(info.gradients[0], 0, dim),
157  lambda,
158  mu);
159  }
160 }
161 
162 template <int dim, int force_type>
163 void
164 Residual<dim, force_type>::boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
165 {
166  std::vector<std::vector<double>> null(
167  dim, std::vector<double>(info.fe_values(0).n_quadrature_points, 0.));
168 
169  boundary_values->vector_values(info.fe_values(0).get_quadrature_points(), null);
170 
171  const unsigned int deg = info.fe_values(0).get_fe().tensor_degree();
172  if (dirichlet_boundaries.count(dinfo.face->boundary_id()) != 0)
173  {
174  dealii::LocalIntegrators::Elasticity::nitsche_residual(
175  dinfo.vector(0).block(0),
176  info.fe_values(0),
177  dealii::make_slice(info.values[0], 0, dim),
178  dealii::make_slice(info.gradients[0], 0, dim),
179  null,
180  dealii::LocalIntegrators::Laplace::compute_penalty(dinfo, dinfo, deg, deg),
181  2. * parameters->mu);
182  }
183 }
184 
185 template <int dim, int force_type>
186 void
187 Residual<dim, force_type>::face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2,
188  IntegrationInfo<dim>& info1, IntegrationInfo<dim>& info2) const
189 {
190  const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
191  dealii::LocalIntegrators::Elasticity::ip_residual(
192  dinfo1.vector(0).block(0),
193  dinfo2.vector(0).block(0),
194  info1.fe_values(0),
195  info2.fe_values(0),
196  dealii::make_slice(info1.values[0], 0, dim),
197  dealii::make_slice(info1.gradients[0], 0, dim),
198  dealii::make_slice(info2.values[0], 0, dim),
199  dealii::make_slice(info2.gradients[0], 0, dim),
200  dealii::LocalIntegrators::Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
201  2. * parameters->mu);
202 }
203 }
204 
205 #endif
Definition: elasticity/residual.h:93
dealii::SmartPointer< const Parameters, class Residual< dim > > parameters
Definition: elasticity/residual.h:105
Definition: elasticity/eigen.h:25
dealii::SmartPointer< const dealii::Function< dim >, class Residual< dim > > boundary_values
Definition: elasticity/residual.h:106
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: elasticity/residual.h:187
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: elasticity/residual.h:164
std::set< unsigned int > dirichlet_boundaries
Definition: elasticity/residual.h:107
void cell_residual(dealii::Vector< number > &result, 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: elasticity/integrators.h:23
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: elasticity/residual.h:124
Definition: integrator.h:29