Amandus: Simulations based on multilevel Schwarz methods
logarithmic.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 schroedinger_logarithmic_h
8 #define schroedinger_logarithmic_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 #include <schroedinger/parameters.h>
16 
17 using namespace dealii;
18 using namespace LocalIntegrators;
19 
25 namespace Schroedinger
26 {
27 template <int dim>
28 class Logarithmic : public AmandusIntegrator<dim>
29 {
30 public:
31  Logarithmic(const Parameters& par);
32  virtual void cell(MeshWorker::DoFInfo<dim>& dinfo, MeshWorker::IntegrationInfo<dim>& info) const;
33  virtual void boundary(MeshWorker::DoFInfo<dim>& dinfo,
34  MeshWorker::IntegrationInfo<dim>& info) const;
35  virtual void face(MeshWorker::DoFInfo<dim>& dinfo1, MeshWorker::DoFInfo<dim>& dinfo2,
36  MeshWorker::IntegrationInfo<dim>& info1,
37  MeshWorker::IntegrationInfo<dim>& info2) const;
38 
39 private:
40  SmartPointer<const Parameters, class Logarithmic<dim>> parameters;
41 };
42 
43 template <int dim>
44 Logarithmic<dim>::Logarithmic(const Parameters& par)
45  : parameters(&par)
46 {
47  this->use_boundary = true;
48  this->use_face = false;
49 }
50 
51 template <int dim>
52 void
53 Logarithmic<dim>::cell(MeshWorker::DoFInfo<dim>& dinfo,
54  MeshWorker::IntegrationInfo<dim>& info) const
55 {
56  const FEValuesBase<dim>& fe = info.fe_values(0);
57  FullMatrix<double>& M = dinfo.matrix(0, false).matrix;
58  Laplace::cell_matrix(M, fe);
59  L2::mass_matrix(M, fe, parameters->shift);
60  const unsigned int n_dofs = fe.dofs_per_cell;
61  const unsigned int n_components = fe.get_fe().n_components();
62 
63  for (unsigned int k = 0; k < fe.n_quadrature_points; ++k)
64  {
65  const double potential = parameters->depth * std::log(fe.quadrature_point(k).norm() / 2.);
66  const double dx = fe.JxW(k);
67  for (unsigned int i = 0; i < n_dofs; ++i)
68  {
69  double Mii = 0.0;
70  for (unsigned int d = 0; d < n_components; ++d)
71  Mii +=
72  dx * potential * fe.shape_value_component(i, k, d) * fe.shape_value_component(i, k, d);
73 
74  M(i, i) += Mii;
75 
76  for (unsigned int j = i + 1; j < n_dofs; ++j)
77  {
78  double Mij = 0.0;
79  for (unsigned int d = 0; d < n_components; ++d)
80  Mij +=
81  dx * potential * fe.shape_value_component(j, k, d) * fe.shape_value_component(i, k, d);
82 
83  M(i, j) += Mij;
84  M(j, i) += Mij;
85  }
86  }
87  }
88 
89  if (dinfo.n_matrices() == 2)
90  L2::mass_matrix(dinfo.matrix(1, false).matrix, info.fe_values(0));
91 }
92 
93 template <int dim>
94 void
95 Logarithmic<dim>::boundary(MeshWorker::DoFInfo<dim>& dinfo,
96  typename MeshWorker::IntegrationInfo<dim>& info) const
97 {
98  const unsigned int deg = info.fe_values(0).get_fe().tensor_degree();
99  Laplace::nitsche_matrix(dinfo.matrix(0, false).matrix,
100  info.fe_values(0),
101  Laplace::compute_penalty(dinfo, dinfo, deg, deg));
102 }
103 
104 template <int dim>
105 void
106 Logarithmic<dim>::face(MeshWorker::DoFInfo<dim>& dinfo1, MeshWorker::DoFInfo<dim>& dinfo2,
107  MeshWorker::IntegrationInfo<dim>& info1,
108  MeshWorker::IntegrationInfo<dim>& info2) const
109 {
110  const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
111  Laplace::ip_matrix(dinfo1.matrix(0, false).matrix,
112  dinfo1.matrix(0, true).matrix,
113  dinfo2.matrix(0, true).matrix,
114  dinfo2.matrix(0, false).matrix,
115  info1.fe_values(0),
116  info2.fe_values(0),
117  Laplace::compute_penalty(dinfo1, dinfo2, deg, deg));
118 }
119 }
120 
121 #endif
virtual void face(MeshWorker::DoFInfo< dim > &dinfo1, MeshWorker::DoFInfo< dim > &dinfo2, MeshWorker::IntegrationInfo< dim > &info1, MeshWorker::IntegrationInfo< dim > &info2) const
Definition: logarithmic.h:106
SmartPointer< const Parameters, class Logarithmic< dim > > parameters
Definition: logarithmic.h:40
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
virtual void boundary(MeshWorker::DoFInfo< dim > &dinfo, MeshWorker::IntegrationInfo< dim > &info) const
Definition: logarithmic.h:95
Definition: coulomb.h:25
Definition: logarithmic.h:28
virtual void cell(MeshWorker::DoFInfo< dim > &dinfo, MeshWorker::IntegrationInfo< dim > &info) const
Definition: logarithmic.h:53
Definition: integrator.h:29