Amandus: Simulations based on multilevel Schwarz methods
advection-diffusion/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 __advectiondiffusion_matrix_h
8 #define __advectiondiffusion_matrix_h
9 
10 #include <amandus/integrator.h>
11 #include <deal.II/integrators/advection.h>
12 #include <deal.II/integrators/l2.h>
13 #include <deal.II/integrators/laplace.h>
14 #include <deal.II/lac/full_matrix.h>
15 #include <deal.II/meshworker/integration_info.h>
16 
18 {
19 using namespace dealii;
20 using namespace MeshWorker;
21 using namespace LocalIntegrators;
22 
34 template <int dim>
35 class Matrix : public AmandusIntegrator<dim>
36 {
37 public:
38  Matrix(const Parameters& par, double factor1, double factor2,
39  std::vector<std::vector<double>> direction, double x1, double x2, double y1, double y2);
40 
41  virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
42  virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const;
43  virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
44  IntegrationInfo<dim>& info2) const;
45 
46 private:
47  dealii::SmartPointer<const Parameters, class Matrix<dim>> parameters;
48  double factor1;
49  double factor2;
50  std::vector<std::vector<double>> direction;
51  double x1;
52  double x2;
53  double y1;
54  double y2;
55 };
56 
57 template <int dim>
58 Matrix<dim>::Matrix(const Parameters& par, double factor1, double factor2,
59  std::vector<std::vector<double>> direction, double x1, double x2, double y1,
60  double y2)
61  : parameters(&par)
62  , factor1(factor1)
63  , factor2(factor2)
64  , direction(direction)
65  , x1(x1)
66  , x2(x2)
67  , y1(y1)
68  , y2(y2)
69 {
70  // this->input_vector_names.push_back("Newton iterate");
71 }
72 
73 template <int dim>
74 void
75 Matrix<dim>::cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
76 {
77  FullMatrix<double>& M1 = dinfo.matrix(0, false).matrix;
78  FullMatrix<double>& M2 = dinfo.matrix(0, false).matrix;
79 
80  AssertDimension(dinfo.n_matrices(), 1);
82  M1, info.fe_values(0), info.fe_values(0), direction);
83 
84  if (x1 < dinfo.cell->center()[0] && dinfo.cell->center()[0] < x2 &&
85  y1 < dinfo.cell->center()[1] && dinfo.cell->center()[1] < y2)
86  Laplace::cell_matrix(M2, info.fe_values(0), factor2);
87  else
88  Laplace::cell_matrix(M2, info.fe_values(0), factor1);
89 }
90 
91 template <int dim>
92 void
93 Matrix<dim>::boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info) const
94 {
95 
96  FullMatrix<double>& M1 = dinfo.matrix(0, false).matrix;
97  FullMatrix<double>& M2 = dinfo.matrix(0, false).matrix;
98 
99  dealii::LocalIntegrators::Advection::upwind_value_matrix(
100  M1, info.fe_values(0), info.fe_values(0), direction);
101 
102  const unsigned int deg = info.fe_values(0).get_fe().tensor_degree();
103 
104  Point<dim> dir;
105  dir(0) = direction[0][0];
106  dir(1) = direction[1][0];
107 
108  const Tensor<1, dim>& normal = info.fe_values(0).normal_vector(1);
109 
110  // Dirichlet boundary condition only at the inflow boundary
111  if (normal * dir < 0)
112  {
113  Laplace::nitsche_matrix(
114  M2, info.fe_values(0), Laplace::compute_penalty(dinfo, dinfo, deg, deg), factor1);
115  }
116 }
117 
118 template <int dim>
119 void
120 Matrix<dim>::face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
121  IntegrationInfo<dim>& info2) const
122 {
123 
124  FullMatrix<double>& M11 = dinfo1.matrix(0, false).matrix;
125  FullMatrix<double>& M12 = dinfo1.matrix(0, true).matrix;
126  FullMatrix<double>& M13 = dinfo2.matrix(0, true).matrix;
127  FullMatrix<double>& M14 = dinfo2.matrix(0, false).matrix;
128  FullMatrix<double>& M21 = dinfo1.matrix(0, false).matrix;
129  FullMatrix<double>& M22 = dinfo1.matrix(0, true).matrix;
130  FullMatrix<double>& M23 = dinfo2.matrix(0, true).matrix;
131  FullMatrix<double>& M24 = dinfo2.matrix(0, false).matrix;
132 
133  dealii::LocalIntegrators::Advection::upwind_value_matrix(M11,
134  M12,
135  M13,
136  M14,
137  info1.fe_values(0),
138  info2.fe_values(0),
139  info1.fe_values(0),
140  info2.fe_values(0),
141  direction);
142 
143  const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
144 
145  if (x1 < dinfo1.cell->center()[0] && dinfo1.cell->center()[0] < x2 &&
146  y1 < dinfo1.cell->center()[1] && dinfo1.cell->center()[1] < y2 &&
147  x1 < dinfo2.cell->center()[0] && dinfo2.cell->center()[0] < x2 &&
148  y1 < dinfo2.cell->center()[1] && dinfo2.cell->center()[1] < y2)
149  Laplace::ip_matrix(M21,
150  M22,
151  M23,
152  M24,
153  info1.fe_values(0),
154  info2.fe_values(0),
155  Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
156  factor2);
157  else
158  Laplace::ip_matrix(M21,
159  M22,
160  M23,
161  M24,
162  info1.fe_values(0),
163  info2.fe_values(0),
164  Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
165  factor1);
166 }
167 }
168 
169 #endif
double y2
Definition: advection-diffusion/matrix.h:54
double y1
Definition: advection-diffusion/matrix.h:53
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
double x1
Definition: advection-diffusion/matrix.h:51
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: advection-diffusion/matrix.h:75
Definition: advection-diffusion/matrix.h:35
std::vector< std::vector< double > > direction
Definition: advection-diffusion/matrix.h:50
Definition: advection-diffusion/matrix.h:17
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: advection-diffusion/matrix.h:120
double x2
Definition: advection-diffusion/matrix.h:52
Matrix(const Parameters &par, double factor1, double factor2, std::vector< std::vector< double >> direction, double x1, double x2, double y1, double y2)
Definition: advection-diffusion/matrix.h:58
dealii::SmartPointer< const Parameters, class Matrix< dim > > parameters
Definition: advection-diffusion/matrix.h:47
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: advection-diffusion/matrix.h:93
double factor2
Definition: advection-diffusion/matrix.h:49
Definition: integrator.h:29
double factor1
Definition: advection-diffusion/matrix.h:48