Amandus: Simulations based on multilevel Schwarz methods
polynomial_boundary.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 __advectiondiffusion_polynomial_h
8 #define __advectiondiffusion_polynomial_h
9 
10 #include <advection-diffusion/parameters.h>
11 #include <amandus/advection-diffusion/boundary_values.h>
12 #include <amandus/integrator.h>
13 #include <deal.II/base/polynomial.h>
14 #include <deal.II/base/tensor.h>
15 #include <deal.II/integrators/divergence.h>
16 #include <deal.II/integrators/l2.h>
17 #include <deal.II/integrators/laplace.h>
18 
19 using namespace dealii;
20 using namespace LocalIntegrators;
21 using namespace MeshWorker;
22 
23 namespace AdvectionDiffusion
24 {
35 template <int dim>
37 {
38 public:
39  PolynomialBoundaryRHS(const Parameters& par,
40  const std::vector<Polynomials::Polynomial<double>> potentials_1d,
41  double factor1, double factor2, std::vector<std::vector<double>> direction,
42  double x1, double x2, double y1, double y2);
43 
44  virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
45  virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
46 
47 private:
48  dealii::SmartPointer<const Parameters, class PolynomialBoundaryRHS<dim>> parameters;
49  std::vector<Polynomials::Polynomial<double>> potentials_1d;
50  std::vector<std::vector<double>> direction;
51  double factor1;
52  double factor2;
53  double x1;
54  double x2;
55  double y1;
56  double y2;
57 };
58 
59 //----------------------------------------------------------------------//
60 
61 template <int dim>
63  const Parameters& par, const std::vector<Polynomials::Polynomial<double>> potentials_1d,
64  double factor1, double factor2, std::vector<std::vector<double>> direction, double x1, double x2,
65  double y1, double y2)
66  : parameters(&par)
67  , potentials_1d(potentials_1d)
68  , direction(direction)
69  , factor1(factor1)
70  , factor2(factor2)
71  , x1(x1)
72  , x2(x2)
73  , y1(y1)
74  , y2(y2)
75 {
76  this->use_face = false;
77  this->use_boundary = false;
78 }
79 
80 template <int dim>
81 void
82 PolynomialBoundaryRHS<dim>::cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
83 {
84 
85  std::vector<double> rhs(info.fe_values(0).n_quadrature_points, 0.);
86 
87  std::vector<double> px(2);
88  std::vector<double> py(2);
89  for (unsigned int k = 0; k < info.fe_values(0).n_quadrature_points; ++k)
90  {
91  const double x = info.fe_values(0).quadrature_point(k)(0);
92  const double y = info.fe_values(0).quadrature_point(k)(1);
93  potentials_1d[0].value(x, px);
94  potentials_1d[0].value(y, py);
95 
96  // different right-hand-sides:
97  rhs[k] = 1;
98  // rhs[k]= x;
99  // rhs[k] = 0.2*x + 0.2*x*y*y + 0.4*y + 0.4*x*x*y - 8 - 4*y*y - 4*x*x;
100  // rhs[k] = direction[0][0]*(2*x+2*x*y*y) + direction[1][0]*(2*y+2*x*x*y) - factor1*
101  // (4+2*y*y+2*x*x);
102  // rhs[k] = direction[0][0]*(2*px[1]+2*px[1]*py[0]*py[0]) +
103  // direction[1][0]*(2*py[1]+2*px[0]*px[0]*py[1]) - factor1* (4+2*py[1]*py[1]+2*px[0]*px[0]);
104  }
105 
106  L2::L2(dinfo.vector(0).block(0), info.fe_values(0), rhs);
107 }
108 
109 template <int dim>
110 void
111 PolynomialBoundaryRHS<dim>::boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
112 {
113 
114  const FEValuesBase<dim>& fe = info.fe_values();
115  Vector<double>& local_vector = dinfo.vector(0).block(0);
116 
117  // Boundary Values with function 'g' defined in boundary_values.h
118  std::vector<double> g(fe.n_quadrature_points);
119  static BoundaryValues<dim> boundary_function;
120  boundary_function.value_list(fe.get_quadrature_points(), g);
121 
122  const unsigned int deg = fe.get_fe().tensor_degree();
123  const double penalty = 2. * deg * (deg + 1) * dinfo.face->measure() / dinfo.cell->measure();
124 
125  const std::vector<Tensor<1, dim>>& normals = fe.get_normal_vectors();
126  Point<dim> dir;
127  dir(0) = direction[0][0];
128  dir(1) = direction[1][0];
129 
130  std::vector<double> rhs2(info.fe_values(0).n_quadrature_points, 0.);
131 
132  std::vector<double> px(2);
133  std::vector<double> py(2);
134 
135  for (unsigned k = 0; k < fe.n_quadrature_points; ++k)
136  {
137  const double dir_n = dir * normals[k];
138 
139  // Boundary condition holds at the inflow-boundary:
140  if (dir_n < 0)
141  for (unsigned int i = 0; i < fe.dofs_per_cell; ++i)
142  {
143  if (x1 < dinfo.cell->center()[0] && dinfo.cell->center()[0] < x2 &&
144  y1 < dinfo.cell->center()[1] && dinfo.cell->center()[1] < y2)
145  local_vector(i) += ((factor2 * ((fe.shape_value(i, k) * penalty * g[k]) -
146  (fe.normal_vector(k) * fe.shape_grad(i, k) * g[k]))) -
147  (dir_n * g[k] * fe.shape_value(i, k))) *
148  fe.JxW(k);
149  else
150  local_vector(i) += ((factor1 * ((fe.shape_value(i, k) * penalty * g[k]) -
151  (fe.normal_vector(k) * fe.shape_grad(i, k) * g[k]))) -
152  (dir_n * g[k] * fe.shape_value(i, k))) *
153  fe.JxW(k);
154  }
155  }
156 }
157 }
158 
159 #endif
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: polynomial_boundary.h:82
double x1
Definition: polynomial_boundary.h:53
Definition: boundary_values.h:22
double x2
Definition: polynomial_boundary.h:54
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const
Definition: boundary_values.h:31
std::vector< Polynomials::Polynomial< double > > potentials_1d
Definition: polynomial_boundary.h:49
double y2
Definition: polynomial_boundary.h:56
Definition: advection-diffusion/matrix.h:17
Definition: polynomial_boundary.h:36
dealii::SmartPointer< const Parameters, class PolynomialBoundaryRHS< dim > > parameters
Definition: polynomial_boundary.h:48
double y1
Definition: polynomial_boundary.h:55
double factor1
Definition: polynomial_boundary.h:51
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: polynomial_boundary.h:111
std::vector< std::vector< double > > direction
Definition: polynomial_boundary.h:50
double factor2
Definition: polynomial_boundary.h:52
Definition: integrator.h:29