Amandus: Simulations based on multilevel Schwarz methods
stokes/eigen.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 __matrix_stokes_h
8 #define __matrix_stokes_h
9 
10 #include <amandus/integrator.h>
11 #include <deal.II/integrators/divergence.h>
12 #include <deal.II/integrators/l2.h>
13 #include <deal.II/integrators/laplace.h>
14 #include <deal.II/meshworker/integration_info.h>
15 
16 using namespace dealii;
17 using namespace LocalIntegrators;
18 
38 {
39 template <int dim>
40 class Eigen : public AmandusIntegrator<dim>
41 {
42 public:
43  virtual void cell(MeshWorker::DoFInfo<dim>& dinfo, MeshWorker::IntegrationInfo<dim>& info) const;
44  virtual void boundary(MeshWorker::DoFInfo<dim>& dinfo,
45  MeshWorker::IntegrationInfo<dim>& info) const;
46  virtual void face(MeshWorker::DoFInfo<dim>& dinfo1, MeshWorker::DoFInfo<dim>& dinfo2,
47  MeshWorker::IntegrationInfo<dim>& info1,
48  MeshWorker::IntegrationInfo<dim>& info2) const;
49 };
50 
51 template <int dim>
52 void
53 Eigen<dim>::cell(MeshWorker::DoFInfo<dim>& dinfo, MeshWorker::IntegrationInfo<dim>& info) const
54 {
55  if (dinfo.n_matrices() > 4)
56  {
57  AssertDimension(dinfo.n_matrices(), 8);
58  }
59  else
60  {
61  AssertDimension(dinfo.n_matrices(), 4);
62  }
63 
64  Laplace::cell_matrix(dinfo.matrix(0, false).matrix, info.fe_values(0));
65  Divergence::cell_matrix(dinfo.matrix(2, false).matrix, info.fe_values(0), info.fe_values(1));
66  dinfo.matrix(1, false).matrix.copy_transposed(dinfo.matrix(2, false).matrix);
67 
68  // Eigenvalue mass matrices
69  if (dinfo.n_matrices() > 4)
70  {
71  L2::mass_matrix(dinfo.matrix(4, false).matrix, info.fe_values(0));
72  // L2::mass_matrix(dinfo.matrix(7,false).matrix, info.fe_values(1));
73  }
74 }
75 
76 template <int dim>
77 void
78 Eigen<dim>::boundary(MeshWorker::DoFInfo<dim>& dinfo,
79  typename MeshWorker::IntegrationInfo<dim>& info) const
80 {
81  const unsigned int deg = info.fe_values(0).get_fe().tensor_degree();
82  Laplace::nitsche_matrix(dinfo.matrix(0, false).matrix,
83  info.fe_values(0),
84  Laplace::compute_penalty(dinfo, dinfo, deg, deg));
85 }
86 
87 template <int dim>
88 void
89 Eigen<dim>::face(MeshWorker::DoFInfo<dim>& dinfo1, MeshWorker::DoFInfo<dim>& dinfo2,
90  MeshWorker::IntegrationInfo<dim>& info1,
91  MeshWorker::IntegrationInfo<dim>& info2) const
92 {
93  const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
94  Laplace::ip_matrix(dinfo1.matrix(0, false).matrix,
95  dinfo1.matrix(0, true).matrix,
96  dinfo2.matrix(0, true).matrix,
97  dinfo2.matrix(0, false).matrix,
98  info1.fe_values(0),
99  info2.fe_values(0),
100  Laplace::compute_penalty(dinfo1, dinfo2, deg, deg));
101 }
102 }
103 
104 #endif
void cell_matrix(dealii::FullMatrix< double > &M, 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: matrix_integrators.h:23
Definition: stokes/eigen.h:37
Definition: stokes/eigen.h:40
Definition: integrator.h:29