Amandus: Simulations based on multilevel Schwarz methods
advection/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 #ifndef __advection_residual_h
8 #define __advection_residual_h
9 
10 #include <amandus/advection/parameters.h>
11 #include <amandus/integrator.h>
12 #include <deal.II/integrators/advection.h>
13 #include <deal.II/integrators/l2.h>
14 
15 using namespace dealii::MeshWorker;
16 
20 namespace Advection
21 {
27 template <int dim>
28 class Residual : public AmandusIntegrator<dim>
29 {
30 public:
31  Residual(const Parameters& par, const dealii::Function<dim>& bdry);
32 
33  virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
34  virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
35  virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
36  IntegrationInfo<dim>& info2) const;
37 
38 private:
39  dealii::SmartPointer<const Parameters, class Residual<dim>> parameters;
40  dealii::SmartPointer<const dealii::Function<dim>, class Residual<dim>> boundary_values;
41 };
42 
43 //----------------------------------------------------------------------//
44 
45 template <int dim>
46 Residual<dim>::Residual(const Parameters& par, const dealii::Function<dim>& bdry)
47  : parameters(&par)
48  , boundary_values(&bdry)
49 {
50  this->input_vector_names.push_back("Newton iterate");
51 }
52 
53 template <int dim>
54 void
55 Residual<dim>::cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
56 {
57  Assert(info.values.size() >= 1, dealii::ExcDimensionMismatch(info.values.size(), 1));
58  Assert(info.gradients.size() >= 1, dealii::ExcDimensionMismatch(info.values.size(), 1));
59 
60  const double mu = parameters->mu;
61  const double lambda = parameters->lambda;
62 
63  // std::vector<std::vector<double> > null(dim,
64  // std::vector<double>(info.fe_values(0).n_quadrature_points, 0.));
65  // std::fill(null[0].begin(), null[0].end(), 1);
66  // dealii::LocalIntegrators::L2::L2(
67  // dinfo.vector(0).block(0), info.fe_values(0), null);
68 
69  if (parameters->linear)
70  {
72  dinfo.vector(0).block(0),
73  info.fe_values(0),
74  dealii::make_slice(info.gradients[0], 0, dim),
75  2. * mu);
76  dealii::LocalIntegrators::Divergence::grad_div_residual(
77  dinfo.vector(0).block(0),
78  info.fe_values(0),
79  dealii::make_slice(info.gradients[0], 0, dim),
80  lambda);
81  }
82  else
83  {
84  StVenantKirchhoff::cell_residual(dinfo.vector(0).block(0),
85  info.fe_values(0),
86  dealii::make_slice(info.gradients[0], 0, dim),
87  lambda,
88  mu);
89  }
90 }
91 
92 template <int dim>
93 void
94 Residual<dim>::boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
95 {
96  std::vector<std::vector<double>> null(
97  dim, std::vector<double>(info.fe_values(0).n_quadrature_points, 0.));
98 
99  boundary_values->vector_values(info.fe_values(0).get_quadrature_points(), null);
100 
101  const unsigned int deg = info.fe_values(0).get_fe().tensor_degree();
102  if (dinfo.face->boundary_indicator() == 0 || dinfo.face->boundary_indicator() == 1)
103  dealii::LocalIntegrators::Advection::nitsche_residual(
104  dinfo.vector(0).block(0),
105  info.fe_values(0),
106  dealii::make_slice(info.values[0], 0, dim),
107  dealii::make_slice(info.gradients[0], 0, dim),
108  null,
109  dealii::LocalIntegrators::Laplace::compute_penalty(dinfo, dinfo, deg, deg),
110  2. * parameters->mu);
111 }
112 
113 template <int dim>
114 void
115 Residual<dim>::face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
116  IntegrationInfo<dim>& info2) const
117 {
118  const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
119  dealii::LocalIntegrators::Advection::ip_residual(
120  dinfo1.vector(0).block(0),
121  dinfo2.vector(0).block(0),
122  info1.fe_values(0),
123  info2.fe_values(0),
124  dealii::make_slice(info1.values[0], 0, dim),
125  dealii::make_slice(info1.gradients[0], 0, dim),
126  dealii::make_slice(info2.values[0], 0, dim),
127  dealii::make_slice(info2.gradients[0], 0, dim),
128  dealii::LocalIntegrators::Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
129  2. * parameters->mu);
130 }
131 }
132 
133 #endif
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: advection/residual.h:115
Definition: advection/residual.h:28
Definition: advection/matrix.h:17
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: advection/residual.h:55
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: advection/residual.h:94
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
dealii::SmartPointer< const Parameters, class Residual< dim > > parameters
Definition: advection/residual.h:39
Definition: integrator.h:29