Amandus: Simulations based on multilevel Schwarz methods
elasticity/polynomial.h
Go to the documentation of this file.
1 /**********************************************************************
2  *
3  * Copyright Guido Kanschat, 2010, 2012, 2013
4  *
5  **********************************************************************/
6 
7 #ifndef __elasticity_polynomial_h
8 #define __elasticity_polynomial_h
9 
10 #include <amandus/elasticity/residual.h>
11 #include <amandus/integrator.h>
12 #include <deal.II/base/polynomial.h>
13 #include <deal.II/base/tensor.h>
14 #include <deal.II/integrators/divergence.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;
20 using namespace LocalIntegrators;
21 using namespace MeshWorker;
22 
23 namespace Elasticity
24 {
37 template <int dim>
38 class PolynomialRHS : public AmandusIntegrator<dim>
39 {
40 public:
41  PolynomialRHS(const Parameters& par,
42  const std::vector<Polynomials::Polynomial<double>> potentials_1d);
43 
44  virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
45  virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
46 
47 private:
48  dealii::SmartPointer<const Parameters, class Residual<dim>> parameters;
49  std::vector<Polynomials::Polynomial<double>> potentials_1d;
50 };
51 
90 template <int dim>
92 {
93 public:
94  PolynomialError(const Parameters& par,
95  const std::vector<Polynomials::Polynomial<double>> potentials_1d);
96 
97  virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
98  virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
99  virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
100  IntegrationInfo<dim>& info2) const;
101 
102 private:
103  dealii::SmartPointer<const Parameters, class Residual<dim>> parameters;
104  std::vector<Polynomials::Polynomial<double>> potentials_1d;
105 };
106 
107 //----------------------------------------------------------------------//
108 
109 template <int dim>
110 PolynomialRHS<dim>::PolynomialRHS(const Parameters& par,
111  const std::vector<Polynomials::Polynomial<double>> potentials_1d)
112  : parameters(&par)
113  , potentials_1d(potentials_1d)
114 {
115  AssertDimension(potentials_1d.size(), (dim == 2 ? 2 : dim + 1));
116  this->use_boundary = false;
117  this->use_face = false;
118 }
119 
120 template <int dim>
121 void
122 PolynomialRHS<dim>::cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
123 {
124  std::vector<std::vector<double>> rhs(dim,
125  std::vector<double>(info.fe_values(0).n_quadrature_points));
126  std::vector<std::vector<double>> phi(dim, std::vector<double>(4));
127 
128  for (unsigned int k = 0; k < info.fe_values(0).n_quadrature_points; ++k)
129  {
130  const Point<dim>& x = info.fe_values(0).quadrature_point(k);
131  Tensor<1, dim> DivDu;
132  Tensor<1, dim> DDivu;
133 
134  if (dim == 2)
135  {
136  // The gradient potential
137  potentials_1d[0].value(x(0), phi[0]);
138  potentials_1d[0].value(x(1), phi[1]);
139  DivDu[0] -= phi[0][3] * phi[1][0] + phi[0][1] * phi[1][2];
140  DivDu[1] -= phi[0][0] * phi[1][3] + phi[0][2] * phi[1][1];
141  DDivu[0] -= phi[0][3] * phi[1][0] + phi[0][1] * phi[1][2];
142  DDivu[1] -= phi[0][2] * phi[1][1] + phi[0][0] * phi[1][3];
143  // The curl potential
144  potentials_1d[1].value(x(0), phi[0]);
145  potentials_1d[1].value(x(1), phi[1]);
146  // div epsilon(curl) = Delta?
147  DivDu[0] += 0.5 * (phi[0][0] * phi[1][3] + phi[0][2] * phi[1][1]);
148  DivDu[1] -= 0.5 * (phi[0][3] * phi[1][0] + phi[0][1] * phi[1][2]);
149  // div curl = 0
150  }
151 
152  for (unsigned int d = 0; d < dim; ++d)
153  rhs[d][k] = 2. * parameters->mu * DivDu[d] + parameters->lambda * DDivu[d];
154  }
155 
156  L2::L2(dinfo.vector(0).block(0), info.fe_values(0), rhs);
157 }
158 
159 template <int dim>
160 void
161 PolynomialRHS<dim>::boundary(DoFInfo<dim>&, IntegrationInfo<dim>&) const
162 {
163 }
164 
165 //----------------------------------------------------------------------//
166 
167 template <int dim>
169  const Parameters& par, const std::vector<Polynomials::Polynomial<double>> potentials_1d)
170  : parameters(&par)
172 {
173  AssertDimension(potentials_1d.size(), (dim == 2 ? 2 : dim + 1));
174  this->error_types.push_back(2);
175  this->error_names.push_back("u");
176  this->error_types.push_back(2);
177  this->error_names.push_back("gradu");
178  this->error_types.push_back(2);
179  this->error_names.push_back("divu");
180  this->use_boundary = false;
181  this->use_face = false;
182 }
183 
184 template <int dim>
185 void
186 PolynomialError<dim>::cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
187 {
188  // Assert(dinfo.n_values() >= 4, ExcDimensionMismatch(dinfo.n_values(), 4));
189 
190  std::vector<std::vector<double>> phi(dim, std::vector<double>(3));
191  for (unsigned int k = 0; k < info.fe_values(0).n_quadrature_points; ++k)
192  {
193  const Point<dim>& x = info.fe_values(0).quadrature_point(k);
194 
195  double u[dim];
196  Tensor<1, dim> Du[dim];
197  const double dx = info.fe_values(0).JxW(k);
198 
199  for (unsigned int d = 0; d < dim; ++d)
200  {
201  u[d] = info.values[0][d][k];
202  Du[d] = info.gradients[0][d][k];
203  }
204 
205  // The gradient potential
206  potentials_1d[0].value(x(0), phi[0]);
207  potentials_1d[0].value(x(1), phi[1]);
208  u[0] -= phi[0][1] * phi[1][0];
209  u[1] -= phi[0][0] * phi[1][1];
210  Du[0][0] -= phi[0][2] * phi[1][0];
211  Du[0][1] -= phi[0][1] * phi[1][1];
212  Du[1][0] -= phi[0][1] * phi[1][1];
213  Du[1][1] -= phi[0][0] * phi[1][2];
214 
215  // The curl potential
216  if (dim == 2)
217  {
218  potentials_1d[1].value(x(0), phi[0]);
219  potentials_1d[1].value(x(1), phi[1]);
220 
221  u[0] += phi[0][0] * phi[1][1];
222  u[1] -= phi[0][1] * phi[1][0];
223  Du[0][0] += phi[0][1] * phi[1][1];
224  Du[0][1] += phi[0][0] * phi[1][2];
225  Du[1][0] -= phi[0][2] * phi[1][0];
226  Du[1][1] -= phi[0][1] * phi[1][1];
227  }
228 
229  double uu = 0., Duu = 0., div = 0.;
230  for (unsigned int d = 0; d < dim; ++d)
231  {
232  uu += u[d] * u[d];
233  Duu += Du[d] * Du[d];
234  div += Du[d][d] * Du[d][d];
235  }
236 
237  // 0. L^2(u)
238  dinfo.value(0) += uu * dx;
239  // 1. H^1(u)
240  dinfo.value(1) += Duu * dx;
241  // 2. div u
242  dinfo.value(2) = div * dx;
243  }
244 
245  for (unsigned int i = 0; i <= 2; ++i)
246  dinfo.value(i) = std::sqrt(dinfo.value(i));
247 }
248 
249 template <int dim>
250 void
251 PolynomialError<dim>::boundary(DoFInfo<dim>&, IntegrationInfo<dim>&) const
252 {
253 }
254 
255 template <int dim>
256 void
257 PolynomialError<dim>::face(DoFInfo<dim>&, DoFInfo<dim>&, IntegrationInfo<dim>&,
258  IntegrationInfo<dim>&) const
259 {
260 }
261 }
262 
263 #endif
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: elasticity/polynomial.h:122
std::vector< Polynomials::Polynomial< double > > potentials_1d
Definition: elasticity/polynomial.h:49
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: elasticity/polynomial.h:186
std::vector< std::string > error_names
Definition: integrator.h:120
dealii::SmartPointer< const Parameters, class Residual< dim > > parameters
Definition: elasticity/polynomial.h:48
Definition: elasticity/polynomial.h:91
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: elasticity/polynomial.h:251
Definition: elasticity/eigen.h:25
std::vector< Polynomials::Polynomial< double > > potentials_1d
Definition: elasticity/polynomial.h:104
std::vector< unsigned int > error_types
Definition: integrator.h:113
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: elasticity/polynomial.h:257
Definition: elasticity/polynomial.h:38
PolynomialError(const Parameters &par, const std::vector< Polynomials::Polynomial< double >> potentials_1d)
Definition: elasticity/polynomial.h:168
dealii::SmartPointer< const Parameters, class Residual< dim > > parameters
Definition: elasticity/polynomial.h:103
Definition: integrator.h:29
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: elasticity/polynomial.h:161