Amandus: Simulations based on multilevel Schwarz methods
stokes/noforce.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 __stokes_noforce_h
10 #define __stokes_noforce_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 
19 using namespace dealii;
20 using namespace LocalIntegrators;
21 using namespace MeshWorker;
22 
23 namespace StokesIntegrators
24 {
32 template <int dim>
34 {
35 public:
37 
38  virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
39  virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
40  virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
41  IntegrationInfo<dim>& info2) const;
42 };
43 
44 //----------------------------------------------------------------------//
45 
46 template <int dim>
48 {
49  this->input_vector_names.push_back("Newton iterate");
50 }
51 
52 template <int dim>
53 inline void
54 NoForceResidual<dim>::cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
55 {
56  Assert(info.values.size() >= 1, ExcDimensionMismatch(info.values.size(), 1));
57  Assert(info.gradients.size() >= 1, ExcDimensionMismatch(info.values.size(), 1));
58 
60  dinfo.vector(0).block(0), info.fe_values(0), make_slice(info.gradients[0], 0, dim));
61  // This must be the weak gradient residual!
62  Divergence::gradient_residual(
63  dinfo.vector(0).block(0), info.fe_values(0), info.values[0][dim], -1.);
65  dinfo.vector(0).block(1), info.fe_values(1), make_slice(info.gradients[0], 0, dim), 1.);
66 }
67 
68 template <int dim>
69 inline void
70 NoForceResidual<dim>::boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
71 {
72  std::vector<std::vector<double>> null(
73  dim, std::vector<double>(info.fe_values(0).n_quadrature_points, 0.));
74 
75  const unsigned int deg = info.fe_values(0).get_fe().tensor_degree();
76  Laplace::nitsche_residual(dinfo.vector(0).block(0),
77  info.fe_values(0),
78  make_slice(info.values[0], 0, dim),
79  make_slice(info.gradients[0], 0, dim),
80  null,
81  Laplace::compute_penalty(dinfo, dinfo, deg, deg));
82 }
83 
84 template <int dim>
85 inline void
86 NoForceResidual<dim>::face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
87  IntegrationInfo<dim>& info2) const
88 {
89  const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
90  Laplace::ip_residual(dinfo1.vector(0).block(0),
91  dinfo2.vector(0).block(0),
92  info1.fe_values(0),
93  info2.fe_values(0),
94  make_slice(info1.values[0], 0, dim),
95  make_slice(info1.gradients[0], 0, dim),
96  make_slice(info2.values[0], 0, dim),
97  make_slice(info2.gradients[0], 0, dim),
98  Laplace::compute_penalty(dinfo1, dinfo2, deg, deg));
99 }
100 }
101 
102 #endif
Definition: stokes/eigen.h:37
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: stokes/noforce.h:33
Definition: integrator.h:29