7 #ifndef __advectiondiffusion_polynomial_h 8 #define __advectiondiffusion_polynomial_h 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> 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);
44 virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
45 virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
48 dealii::SmartPointer<const Parameters, class PolynomialBoundaryRHS<dim>>
parameters;
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,
67 , potentials_1d(potentials_1d)
68 , direction(direction)
76 this->use_face =
false;
77 this->use_boundary =
false;
85 std::vector<double> rhs(info.fe_values(0).n_quadrature_points, 0.);
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)
91 const double x = info.fe_values(0).quadrature_point(k)(0);
92 const double y = info.fe_values(0).quadrature_point(k)(1);
106 L2::L2(dinfo.vector(0).block(0), info.fe_values(0), rhs);
114 const FEValuesBase<dim>& fe = info.fe_values();
115 Vector<double>& local_vector = dinfo.vector(0).block(0);
118 std::vector<double> g(fe.n_quadrature_points);
120 boundary_function.
value_list(fe.get_quadrature_points(), g);
122 const unsigned int deg = fe.get_fe().tensor_degree();
123 const double penalty = 2. * deg * (deg + 1) * dinfo.face->measure() / dinfo.cell->measure();
125 const std::vector<Tensor<1, dim>>& normals = fe.get_normal_vectors();
130 std::vector<double> rhs2(info.fe_values(0).n_quadrature_points, 0.);
132 std::vector<double> px(2);
133 std::vector<double> py(2);
135 for (
unsigned k = 0; k < fe.n_quadrature_points; ++k)
137 const double dir_n = dir * normals[k];
141 for (
unsigned int i = 0; i < fe.dofs_per_cell; ++i)
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))) *
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))) *
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