Amandus: Simulations based on multilevel Schwarz methods
readiff/residual.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  **********************************************************************/
8 
9 #ifndef __readiff_residual_h
10 #define __readiff_residual_h
11 
12 #include <amandus/integrator.h>
13 #include <deal.II/base/polynomial.h>
14 #include <deal.II/base/tensor.h>
15 #include <deal.II/integrators/divergence.h>
16 #include <deal.II/integrators/l2.h>
17 #include <deal.II/integrators/laplace.h>
18 #include <readiff/parameters.h>
19 
20 using namespace dealii;
21 using namespace LocalIntegrators;
22 using namespace MeshWorker;
23 
24 namespace ReactionDiffusion
25 {
33 template <int dim>
34 class Residual : public AmandusIntegrator<dim>
35 {
36 public:
37  Residual(const Parameters& par);
38 
39  virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
40  virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
41  virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
42  IntegrationInfo<dim>& info2) const;
43 
44 private:
45  SmartPointer<const Parameters, class Residual<dim>> parameters;
46 };
47 
48 //----------------------------------------------------------------------//
49 
50 template <int dim>
51 Residual<dim>::Residual(const Parameters& par)
52  : parameters(&par)
53 {
54  this->use_boundary = false;
55  this->use_face = true;
56 }
57 
58 template <int dim>
59 void
60 Residual<dim>::cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
61 {
62  Assert(this->timestep != 0, ExcMessage("Only for transient problems"));
63  Assert(info.values.size() >= 1, ExcDimensionMismatch(info.values.size(), 1));
64  Assert(info.gradients.size() >= 1, ExcDimensionMismatch(info.values.size(), 1));
65 
66  std::vector<double> rhs0(info.fe_values(0).n_quadrature_points, 0.);
67  std::vector<double> rhs1(info.fe_values(0).n_quadrature_points, 0.);
68 
69  const Parameters& p = *parameters;
70  for (unsigned int k = 0; k < info.fe_values(0).n_quadrature_points; ++k)
71  {
72  const double u = info.values[0][0][k];
73  const double v = info.values[0][1][k];
74  rhs0[k] = p.A1 + p.B1 * u + p.C1 * v + p.D1 * u * v + p.E1 * u * u + p.F1 * v * v +
75  p.G1 * u * u * v + p.H1 * u * v * v;
76  rhs1[k] = p.A2 + p.B2 * u + p.C2 * v + p.D2 * u * v + p.E2 * u * u + p.F2 * v * v +
77  p.G2 * u * u * v + p.H2 * u * v * v;
78  }
79 
80  L2::L2(dinfo.vector(0).block(0), info.fe_values(0), rhs0);
81  L2::L2(dinfo.vector(0).block(1), info.fe_values(0), rhs1);
83  dinfo.vector(0).block(0), info.fe_values(0), info.gradients[0][0], p.alpha1);
85  dinfo.vector(0).block(1), info.fe_values(0), info.gradients[0][1], p.alpha2);
86 }
87 
88 template <int dim>
89 void
90 Residual<dim>::boundary(DoFInfo<dim>&, IntegrationInfo<dim>&) const
91 {
92 }
93 
94 template <int dim>
95 void
96 Residual<dim>::face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
97  IntegrationInfo<dim>& info2) const
98 {
99  const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
100  const Parameters& p = *parameters;
101  Laplace::ip_residual(dinfo1.vector(0).block(0),
102  dinfo2.vector(0).block(0),
103  info1.fe_values(0),
104  info2.fe_values(0),
105  info1.values[0][0],
106  info1.gradients[0][0],
107  info2.values[0][0],
108  info2.gradients[0][0],
109  Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
110  p.alpha1);
111  Laplace::ip_residual(dinfo1.vector(0).block(1),
112  dinfo2.vector(0).block(1),
113  info1.fe_values(0),
114  info2.fe_values(0),
115  info1.values[0][1],
116  info1.gradients[0][1],
117  info2.values[0][1],
118  info2.gradients[0][1],
119  Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
120  p.alpha2);
121 }
122 }
123 
124 #endif
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: readiff/residual.h:96
double timestep
Current timestep if applicable.
Definition: integrator.h:48
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: readiff/residual.h:90
SmartPointer< const Parameters, class Residual< dim > > parameters
Definition: readiff/residual.h:45
Definition: readiff/residual.h:34
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: readiff/residual.h:60
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
Definition: readiff/matrix.h:31
Definition: integrator.h:29