Amandus: Simulations based on multilevel Schwarz methods
cahn_hilliard/matrix.h
Go to the documentation of this file.
1 #include <amandus/integrator.h>
2 #include <deal.II/integrators/advection.h>
3 #include <deal.II/integrators/laplace.h>
4 
5 namespace CahnHilliard
6 {
7 using namespace dealii;
8 using namespace LocalIntegrators;
9 
10 template <int dim>
11 class Matrix : public AmandusIntegrator<dim>
12 {
13 public:
14  Matrix(double diffusion, const Function<dim>& advection);
15 
16  virtual void cell(MeshWorker::DoFInfo<dim>& dinfo, MeshWorker::IntegrationInfo<dim>& info) const;
17 
18 private:
19  const double diffusion;
20  const Function<dim>* const advection;
21 };
22 
23 template <int dim>
24 Matrix<dim>::Matrix(double diffusion, const Function<dim>& advection)
25  : diffusion(diffusion)
26  , advection(&advection)
27 {
28  this->use_cell = true;
29  this->use_face = false;
30  this->use_boundary = false;
31 }
32 
33 template <int dim>
34 void
35 Matrix<dim>::cell(MeshWorker::DoFInfo<dim>& dinfo, MeshWorker::IntegrationInfo<dim>& info) const
36 {
37  AssertDimension(dinfo.n_matrices(), 4);
38  Assert(info.values.size() > 0, ExcDimensionMismatch(info.values.size(), 1));
39 
40  // values of the function at which we are linearizing
41  const std::vector<double>& point_of_linearization = info.values[0][1];
42 
43  // fixed potential function for now
44  std::vector<double> minus_dd_potential(point_of_linearization.size());
45  for (unsigned int q = 0; q < minus_dd_potential.size(); ++q)
46  {
47  minus_dd_potential[q] =
48  (1.0 - 3.0 * point_of_linearization[q] * point_of_linearization[q]) / diffusion;
49  }
50 
51  const unsigned int n_qpoints = info.fe_values(1).n_quadrature_points;
52  std::vector<std::vector<double>> direction(dim, std::vector<double>(n_qpoints));
53  this->advection->vector_values(info.fe_values(1).get_quadrature_points(), direction);
54 
55  L2::mass_matrix(dinfo.matrix(0).matrix, info.fe_values(0));
56 
57  // actually, these operators are from fe_values(1) to the dual of
58  // fe_values(0), but we assume that they are equal
59  L2::weighted_mass_matrix(dinfo.matrix(1).matrix, info.fe_values(1), minus_dd_potential);
60  Laplace::cell_matrix(dinfo.matrix(1).matrix, info.fe_values(1), -1.0 * diffusion);
61 
62  Laplace::cell_matrix(dinfo.matrix(2).matrix, info.fe_values(0));
63 
64  Advection::cell_matrix(dinfo.matrix(3).matrix, info.fe_values(1), info.fe_values(1), direction);
65 }
66 }
Definition: cahn_hilliard/matrix.h:11
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 cell(MeshWorker::DoFInfo< dim > &dinfo, MeshWorker::IntegrationInfo< dim > &info) const
Definition: cahn_hilliard/matrix.h:35
const Function< dim > *const advection
Definition: cahn_hilliard/matrix.h:20
Matrix(double diffusion, const Function< dim > &advection)
Definition: cahn_hilliard/matrix.h:24
Definition: massout.h:16
const double diffusion
Definition: cahn_hilliard/matrix.h:19
Definition: integrator.h:29