Amandus: Simulations based on multilevel Schwarz methods
brusselator/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 __brusselator_matrix_h
8 #define __brusselator_matrix_h
9 
10 #include <amandus/brusselator/parameters.h>
11 #include <amandus/integrator.h>
12 #include <deal.II/integrators/divergence.h>
13 #include <deal.II/integrators/l2.h>
14 #include <deal.II/integrators/laplace.h>
15 #include <deal.II/meshworker/integration_info.h>
16 
17 using namespace dealii;
18 using namespace LocalIntegrators;
19 
40 namespace Brusselator
41 {
55 template <int dim>
56 class Matrix : public AmandusIntegrator<dim>
57 {
58 public:
59  Matrix(const Parameters& par);
60 
61  virtual void cell(MeshWorker::DoFInfo<dim>& dinfo, MeshWorker::IntegrationInfo<dim>& info) const;
62  virtual void boundary(MeshWorker::DoFInfo<dim>& dinfo,
63  MeshWorker::IntegrationInfo<dim>& info) const;
64  virtual void face(MeshWorker::DoFInfo<dim>& dinfo1, MeshWorker::DoFInfo<dim>& dinfo2,
65  MeshWorker::IntegrationInfo<dim>& info1,
66  MeshWorker::IntegrationInfo<dim>& info2) const;
67 
68 private:
69  SmartPointer<const Parameters, class Matrix<dim>> parameters;
70 };
71 
72 template <int dim>
74  : parameters(&par)
75 {
76  this->use_boundary = false;
77  this->use_face = true;
78  this->input_vector_names.push_back("Newton iterate");
79 }
80 
81 template <int dim>
82 void
83 Matrix<dim>::cell(MeshWorker::DoFInfo<dim>& dinfo, MeshWorker::IntegrationInfo<dim>& info) const
84 {
85  AssertDimension(dinfo.n_matrices(), 4);
86  // Assert (info.values.size() >0, ExcInternalError());
87  const double factor = (this->timestep == 0.) ? 1. : this->timestep;
88  if (this->timestep != 0.)
89  {
90  L2::mass_matrix(dinfo.matrix(0, false).matrix, info.fe_values(0));
91  L2::mass_matrix(dinfo.matrix(3, false).matrix, info.fe_values(0));
92  }
93 
95  dinfo.matrix(0, false).matrix, info.fe_values(0), parameters->alpha0 * factor);
97  dinfo.matrix(3, false).matrix, info.fe_values(0), parameters->alpha1 * factor);
98  if (info.values.size() > 0)
99  {
100  AssertDimension(info.values[0].size(), 2);
101  AssertDimension(info.values[0][0].size(), info.fe_values(0).n_quadrature_points);
102  AssertDimension(info.values[0][1].size(), info.fe_values(0).n_quadrature_points);
103  std::vector<double> Du_ru(info.fe_values(0).n_quadrature_points);
104  std::vector<double> Dv_ru(info.fe_values(0).n_quadrature_points);
105  std::vector<double> Dv_rv(info.fe_values(0).n_quadrature_points);
106  std::vector<double> Du_rv(info.fe_values(0).n_quadrature_points);
107  for (unsigned int k = 0; k < Du_ru.size(); ++k)
108  {
109  const double u = info.values[0][0][k];
110  const double v = info.values[0][1][k];
111  Du_ru[k] = (-2. * u * v + (parameters->A + 1.)) * factor;
112  Dv_ru[k] = -u * u * factor;
113  Dv_rv[k] = u * u * factor;
114  Du_rv[k] = (-parameters->A + 2. * u * v) * factor;
115  }
116  L2::weighted_mass_matrix(dinfo.matrix(0, false).matrix, info.fe_values(0), Du_ru);
117  L2::weighted_mass_matrix(dinfo.matrix(1, false).matrix, info.fe_values(0), Dv_ru);
118  L2::weighted_mass_matrix(dinfo.matrix(2, false).matrix, info.fe_values(0), Dv_rv);
119  L2::weighted_mass_matrix(dinfo.matrix(3, false).matrix, info.fe_values(0), Du_rv);
120  }
121 }
122 
123 template <int dim>
124 void
125 Matrix<dim>::boundary(MeshWorker::DoFInfo<dim>&, typename MeshWorker::IntegrationInfo<dim>&) const
126 {
127 }
128 
129 template <int dim>
130 void
131 Matrix<dim>::face(MeshWorker::DoFInfo<dim>& dinfo1, MeshWorker::DoFInfo<dim>& dinfo2,
132  MeshWorker::IntegrationInfo<dim>& info1,
133  MeshWorker::IntegrationInfo<dim>& info2) const
134 {
135  const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
136  const double factor = (this->timestep == 0.) ? 1. : this->timestep;
137  Laplace::ip_matrix(dinfo1.matrix(0, false).matrix,
138  dinfo1.matrix(0, true).matrix,
139  dinfo2.matrix(0, true).matrix,
140  dinfo2.matrix(0, false).matrix,
141  info1.fe_values(0),
142  info2.fe_values(0),
143  Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
144  parameters->alpha0 * factor);
145  Laplace::ip_matrix(dinfo1.matrix(3, false).matrix,
146  dinfo1.matrix(3, true).matrix,
147  dinfo2.matrix(3, true).matrix,
148  dinfo2.matrix(3, false).matrix,
149  info1.fe_values(0),
150  info2.fe_values(0),
151  Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
152  parameters->alpha1 * factor);
153 }
154 }
155 
156 #endif
virtual void cell(MeshWorker::DoFInfo< dim > &dinfo, MeshWorker::IntegrationInfo< dim > &info) const
Definition: brusselator/matrix.h:83
void weighted_mass_matrix(dealii::FullMatrix< double > &M, const dealii::FEValuesBase< dim > &fe, const dealii::TensorFunction< 2, dim > &weight)
Definition: darcy/integrators.h:41
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 face(MeshWorker::DoFInfo< dim > &dinfo1, MeshWorker::DoFInfo< dim > &dinfo2, MeshWorker::IntegrationInfo< dim > &info1, MeshWorker::IntegrationInfo< dim > &info2) const
Definition: brusselator/matrix.h:131
Definition: explicit.h:25
SmartPointer< const Parameters, class Matrix< dim > > parameters
Definition: brusselator/matrix.h:69
double timestep
Current timestep if applicable.
Definition: integrator.h:48
Definition: brusselator/parameters.h:14
Definition: brusselator/matrix.h:56
virtual void boundary(MeshWorker::DoFInfo< dim > &dinfo, MeshWorker::IntegrationInfo< dim > &info) const
Definition: brusselator/matrix.h:125
Definition: integrator.h:29