Amandus: Simulations based on multilevel Schwarz methods
cahn_hilliard/residual.h
Go to the documentation of this file.
1 #ifndef __cahn_hilliard_residual_h
2 #define __cahn_hilliard_residual_h
3 
4 #include <amandus/integrator.h>
5 #include <deal.II/integrators/advection.h>
6 #include <deal.II/integrators/l2.h>
7 #include <deal.II/integrators/laplace.h>
8 
9 namespace CahnHilliard
10 {
11 using namespace dealii;
12 using namespace LocalIntegrators;
13 using namespace MeshWorker;
14 
26 template <int dim>
27 class Residual : public AmandusIntegrator<dim>
28 {
29 public:
30  Residual(double diffusion, const Function<dim>& advection);
31 
32  virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
33 
34 private:
35  const double diffusion;
36  const Function<dim>* const advection;
37 };
38 
39 template <int dim>
40 Residual<dim>::Residual(double diffusion, const Function<dim>& advection)
41  : diffusion(diffusion)
42  , advection(&advection)
43 {
44  this->use_cell = true;
45  this->use_boundary = false;
46  this->use_face = false;
47 }
48 
49 template <int dim>
50 void
51 Residual<dim>::cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
52 {
53  Assert(info.values.size() >= 1, ExcDimensionMismatch(info.values.size(), 1));
54  Assert(info.gradients.size() >= 1, ExcDimensionMismatch(info.values.size(), 1));
55 
56  const unsigned int n_qpoints = info.fe_values(1).n_quadrature_points;
57  std::vector<std::vector<double>> direction(dim, std::vector<double>(n_qpoints));
58  this->advection->vector_values(info.fe_values(1).get_quadrature_points(), direction);
59 
60  const std::vector<std::vector<double>>& point = info.values[0];
61  const std::vector<std::vector<Tensor<1, dim>>>& Dpoint = info.gradients[0];
62 
63  std::vector<double> minus_d_potential(point[1].size());
64  for (unsigned int q = 0; q < minus_d_potential.size(); ++q)
65  {
66  minus_d_potential[q] = (point[1][q] * (1.0 - point[1][q] * point[1][q])) / diffusion;
67  }
68 
69  L2::L2(dinfo.vector(0).block(0), info.fe_values(0), point[0]);
70  L2::L2(dinfo.vector(0).block(0), info.fe_values(0), minus_d_potential);
71  Laplace::cell_residual(dinfo.vector(0).block(0), info.fe_values(0), Dpoint[1], -1.0 * diffusion);
72 
73  Laplace::cell_residual(dinfo.vector(0).block(1), info.fe_values(1), Dpoint[0]);
74 
76  dinfo.vector(0).block(1), info.fe_values(1), Dpoint[1], direction);
77 }
78 }
79 
80 #endif
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: cahn_hilliard/residual.h:51
Residual(double diffusion, const Function< dim > &advection)
Definition: cahn_hilliard/residual.h:40
Definition: cahn_hilliard/residual.h:27
const Function< dim > *const advection
Definition: cahn_hilliard/residual.h:36
void cell_residual(dealii::Vector< number > &result, 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: elasticity/integrators.h:23
Definition: massout.h:16
Definition: integrator.h:29
const double diffusion
Definition: cahn_hilliard/residual.h:35