Amandus: Simulations based on multilevel Schwarz methods
maxwell/matrix.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_curl_curl_h
8 #define __matrix_curl_curl_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/maxwell.h>
14 #include <deal.II/meshworker/integration_info.h>
15 
16 using namespace dealii;
17 using namespace LocalIntegrators;
18 
22 namespace MaxwellIntegrators
23 {
52 namespace DivCurl
53 {
60 template <int dim>
61 class Matrix : public AmandusIntegrator<dim>
62 {
63 public:
68  Matrix();
69  virtual void cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
70  dealii::MeshWorker::IntegrationInfo<dim>& info) const;
71  virtual void boundary(dealii::MeshWorker::DoFInfo<dim>& dinfo,
72  dealii::MeshWorker::IntegrationInfo<dim>& info) const;
73  virtual void face(dealii::MeshWorker::DoFInfo<dim>& dinfo1,
74  dealii::MeshWorker::DoFInfo<dim>& dinfo2,
75  dealii::MeshWorker::IntegrationInfo<dim>& info1,
76  dealii::MeshWorker::IntegrationInfo<dim>& info2) const;
77 
78  std::vector<double> curl_coefficient;
79  std::vector<double> mass_coefficient;
80 };
81 
82 template <int dim>
84  : curl_coefficient(1, 1.)
85  , mass_coefficient(1, 0.)
86 {
87  this->use_boundary = false;
88  this->use_face = false;
89 }
90 
91 template <int dim>
92 void
93 Matrix<dim>::cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
94  dealii::MeshWorker::IntegrationInfo<dim>& info) const
95 {
96  AssertDimension(dinfo.n_matrices(), 4);
97  const unsigned int id = dinfo.cell->material_id();
98  AssertIndexRange(id, curl_coefficient.size());
99  AssertIndexRange(id, mass_coefficient.size());
100  const double mu = curl_coefficient[id];
101  const double sigma = mass_coefficient[id];
102 
103  Maxwell::curl_curl_matrix(dinfo.matrix(0, false).matrix, info.fe_values(0), mu);
104  if (sigma != 0.)
105  L2::mass_matrix(dinfo.matrix(0, false).matrix, info.fe_values(0), sigma);
106  Divergence::gradient_matrix(dinfo.matrix(1, false).matrix, info.fe_values(1), info.fe_values(0));
107  dinfo.matrix(2, false).matrix.copy_transposed(dinfo.matrix(1, false).matrix);
108 }
109 
110 template <int dim>
111 void
112 Matrix<dim>::boundary(dealii::MeshWorker::DoFInfo<dim>& /*dinfo*/,
113  typename dealii::MeshWorker::IntegrationInfo<dim>& /*info*/) const
114 {
115 }
116 
117 template <int dim>
118 void
119 Matrix<dim>::face(dealii::MeshWorker::DoFInfo<dim>& /*dinfo1*/,
120  dealii::MeshWorker::DoFInfo<dim>& /*dinfo2*/,
121  dealii::MeshWorker::IntegrationInfo<dim>& /*info1*/,
122  dealii::MeshWorker::IntegrationInfo<dim>& /*info2*/) const
123 {
124 }
125 }
126 }
127 
128 #endif
Definition: maxwell/eigen.h:22
virtual void cell(dealii::MeshWorker::DoFInfo< dim > &dinfo, dealii::MeshWorker::IntegrationInfo< dim > &info) const
Definition: maxwell/matrix.h:93
virtual void boundary(dealii::MeshWorker::DoFInfo< dim > &dinfo, dealii::MeshWorker::IntegrationInfo< dim > &info) const
Definition: maxwell/matrix.h:112
std::vector< double > curl_coefficient
Definition: maxwell/matrix.h:78
Definition: maxwell/matrix.h:61
virtual void face(dealii::MeshWorker::DoFInfo< dim > &dinfo1, dealii::MeshWorker::DoFInfo< dim > &dinfo2, dealii::MeshWorker::IntegrationInfo< dim > &info1, dealii::MeshWorker::IntegrationInfo< dim > &info2) const
Definition: maxwell/matrix.h:119
std::vector< double > mass_coefficient
Definition: maxwell/matrix.h:79
Definition: integrator.h:29