Amandus: Simulations based on multilevel Schwarz methods
estimator.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 __darcy_estimator_h
8 #define __darcy_estimator_h
9 
10 #include <deal.II/algorithms/any_data.h>
11 #include <deal.II/base/smartpointer.h>
12 #include <deal.II/base/subscriptor.h>
13 #include <deal.II/base/tensor_function.h>
14 #include <deal.II/dofs/dof_handler.h>
15 #include <deal.II/fe/fe_q.h>
16 #include <deal.II/fe/fe_values.h>
17 #include <deal.II/fe/fe_values_extractors.h>
18 #include <deal.II/fe/mapping.h>
19 #include <deal.II/fe/mapping_q1.h>
20 #include <deal.II/lac/full_matrix.h>
21 #include <deal.II/lac/lapack_full_matrix.h>
22 #include <deal.II/lac/vector.h>
23 #include <deal.II/meshworker/assembler.h>
24 #include <deal.II/meshworker/dof_info.h>
25 #include <deal.II/meshworker/integration_info.h>
26 #include <deal.II/meshworker/local_integrator.h>
27 #include <deal.II/meshworker/loop.h>
28 #include <deal.II/numerics/fe_field_function.h>
29 #include <deal.II/numerics/vector_tools.h>
30 
31 #include <amandus/integrator.h>
32 
34 {
39 template <int dim>
40 class Postprocessor : public AmandusIntegrator<dim>
41 {
42 public:
43  Postprocessor(const dealii::DoFHandler<dim>& pp_dofh,
44  const dealii::DoFHandler<dim>& solution_dofh,
45  const dealii::TensorFunction<2, dim>& weight);
46  void init_vector(dealii::Vector<double>& vector);
47  void postprocess(dealii::Vector<double>& pp, const dealii::Vector<double>& solution);
48 
49  virtual void cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
50  dealii::MeshWorker::IntegrationInfo<dim>& info) const;
51 
52 private:
53  void assemble_local_system(dealii::FullMatrix<double>& local_system,
54  const dealii::FEValuesBase<dim>& fe_vals) const;
55  void assemble_local_rhs(dealii::Vector<double>& local_rhs,
56  const dealii::FEValuesBase<dim>& fe_vals,
57  const dealii::Function<dim>& approximation_function) const;
58  void weighted_stiffness_matrix(dealii::FullMatrix<double>& result,
59  const dealii::FEValuesBase<dim>& fe_vals,
60  const dealii::TensorFunction<2, dim>& weight) const;
61  void mixed_mass_matrix(dealii::FullMatrix<double>& result,
62  const dealii::FEValuesBase<dim>& fe_vals) const;
63 
64  const dealii::SmartPointer<const dealii::DoFHandler<dim>> pp_dofh;
65  const dealii::SmartPointer<const dealii::TensorFunction<2, dim>> weight;
66 
67  const dealii::MappingQ1<dim> mapping;
68  dealii::MeshWorker::DoFInfo<dim> dof_info;
69  dealii::MeshWorker::IntegrationInfoBox<dim> info_box;
70 
71  const dealii::SmartPointer<const dealii::DoFHandler<dim>> approximation_dofh;
72  dealii::SmartPointer<const dealii::Vector<double>> approximate_solution;
73 };
74 
75 template <int dim>
76 Postprocessor<dim>::Postprocessor(const dealii::DoFHandler<dim>& pp_dofh,
77  const dealii::DoFHandler<dim>& solution_dofh,
78  const dealii::TensorFunction<2, dim>& weight)
79  : pp_dofh(&pp_dofh)
80  , weight(&weight)
81  , dof_info(pp_dofh)
82  , approximation_dofh(&solution_dofh)
83 {
84  info_box.initialize_update_flags();
85  info_box.add_update_flags_all(dealii::update_values | dealii::update_gradients |
86  dealii::update_quadrature_points | dealii::update_JxW_values);
87  info_box.initialize(pp_dofh.get_fe(), mapping);
88 
89  this->use_cell = true;
90  this->use_boundary = false;
91  this->use_face = false;
92 }
93 
94 template <int dim>
95 void
96 Postprocessor<dim>::init_vector(dealii::Vector<double>& vector)
97 {
98  vector.reinit(pp_dofh->n_dofs());
99 }
100 
101 template <int dim>
102 void
103 Postprocessor<dim>::postprocess(dealii::Vector<double>& pp, const dealii::Vector<double>& solution)
104 {
105  dealii::AnyData out;
106  out.add<dealii::Vector<double>*>(&pp, "result");
107  dealii::MeshWorker::Assembler::ResidualSimple<dealii::Vector<double>> assembler;
108  assembler.initialize(out);
109  approximate_solution = &solution;
110  dealii::MeshWorker::integration_loop(
111  pp_dofh->begin_active(), pp_dofh->end(), dof_info, info_box, *this, assembler);
113 }
114 
115 template <int dim>
116 void
117 Postprocessor<dim>::cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
118  dealii::MeshWorker::IntegrationInfo<dim>& info) const
119 {
120  dealii::FullMatrix<double> local_system(info.fe_values(0).dofs_per_cell + 1,
121  info.fe_values(0).dofs_per_cell + 1);
122  assemble_local_system(local_system, info.fe_values(0));
123 
124  dealii::Functions::FEFieldFunction<dim> approximation_function(*approximation_dofh,
126  typename dealii::DoFHandler<dim>::active_cell_iterator cell(
127  &(info.fe_values(0).get_cell()->get_triangulation()),
128  info.fe_values(0).get_cell()->level(),
129  info.fe_values(0).get_cell()->index(),
131  approximation_function.set_active_cell(cell);
132  dealii::Vector<double> local_rhs(info.fe_values(0).dofs_per_cell + 1);
133  assemble_local_rhs(local_rhs, info.fe_values(0), approximation_function);
134 
135  dealii::FullMatrix<double> inverse_local_system(info.fe_values(0).dofs_per_cell + 1,
136  info.fe_values(0).dofs_per_cell + 1);
137  inverse_local_system.invert(local_system);
138 
139  dealii::Vector<double> local_result(info.fe_values(0).dofs_per_cell + 1);
140  inverse_local_system.vmult(local_result, local_rhs);
141 
142  for (unsigned int i = 0; i < info.fe_values(0).dofs_per_cell; ++i)
143  {
144  dinfo.vector(0).block(0)(i) = local_result(i);
145  }
146 }
147 
148 template <int dim>
149 void
150 Postprocessor<dim>::assemble_local_system(dealii::FullMatrix<double>& local_system,
151  const dealii::FEValuesBase<dim>& fe_vals) const
152 {
153  dealii::FullMatrix<double> local_stiffness(fe_vals.dofs_per_cell, fe_vals.dofs_per_cell);
154  weighted_stiffness_matrix(local_stiffness, fe_vals, *weight);
155 
156  dealii::FullMatrix<double> local_mixed_mass(1, fe_vals.dofs_per_cell);
157  mixed_mass_matrix(local_mixed_mass, fe_vals);
158 
159  for (unsigned int i = 0; i < fe_vals.dofs_per_cell; ++i)
160  {
161  for (unsigned int j = 0; j < fe_vals.dofs_per_cell; ++j)
162  {
163  local_system.set(i, j, local_stiffness(i, j));
164  }
165  }
166  for (unsigned int j = 0; j < fe_vals.dofs_per_cell; ++j)
167  {
168  local_system.set(fe_vals.dofs_per_cell, j, local_mixed_mass(0, j));
169  local_system.set(j, fe_vals.dofs_per_cell, local_mixed_mass(0, j));
170  }
171 }
172 
173 template <int dim>
174 void
175 Postprocessor<dim>::weighted_stiffness_matrix(dealii::FullMatrix<double>& result,
176  const dealii::FEValuesBase<dim>& fe_vals,
177  const dealii::TensorFunction<2, dim>& weight) const
178 {
179  AssertDimension(fe_vals.dofs_per_cell, result.m());
180  AssertDimension(fe_vals.dofs_per_cell, result.n());
181  std::vector<dealii::Tensor<2, dim>> local_weight_values(fe_vals.n_quadrature_points);
182  weight.value_list(fe_vals.get_quadrature_points(), local_weight_values);
183 
184  double dx;
185  for (unsigned int q = 0; q < fe_vals.n_quadrature_points; ++q)
186  {
187  dx = fe_vals.JxW(q);
188  for (unsigned int i = 0; i < fe_vals.dofs_per_cell; ++i)
189  {
190  for (unsigned int j = 0; j < fe_vals.dofs_per_cell; ++j)
191  {
192  for (unsigned int k = 0; k < dim; ++k)
193  {
194  for (unsigned int l = 0; l < dim; ++l)
195  {
196  result(i, j) += (local_weight_values[q][k][l] * fe_vals.shape_grad(j, q)[k] *
197  fe_vals.shape_grad(i, q)[l] * dx);
198  }
199  }
200  }
201  }
202  }
203 }
204 
205 template <int dim>
206 void
207 Postprocessor<dim>::mixed_mass_matrix(dealii::FullMatrix<double>& result,
208  const dealii::FEValuesBase<dim>& fe_vals) const
209 {
210  AssertDimension(1, result.m());
211  AssertDimension(fe_vals.dofs_per_cell, result.n());
212 
213  double dx;
214  for (unsigned int q = 0; q < fe_vals.n_quadrature_points; ++q)
215  {
216  dx = fe_vals.JxW(q);
217  for (unsigned int j = 0; j < fe_vals.dofs_per_cell; ++j)
218  {
219  result(0, j) += (fe_vals.shape_value(j, q) * 1 * dx);
220  }
221  }
222 }
223 
224 template <int dim>
225 void
226 Postprocessor<dim>::assemble_local_rhs(dealii::Vector<double>& local_rhs,
227  const dealii::FEValuesBase<dim>& fe_vals,
228  const dealii::Function<dim>& approximation_function) const
229 {
230  std::vector<dealii::Vector<double>> approximation_values(fe_vals.n_quadrature_points,
231  dealii::Vector<double>(dim + 1));
232  approximation_function.vector_value_list(fe_vals.get_quadrature_points(), approximation_values);
233 
234  double dx;
235  for (unsigned int q = 0; q < fe_vals.n_quadrature_points; ++q)
236  {
237  dx = fe_vals.JxW(q);
238  for (unsigned int i = 0; i < fe_vals.dofs_per_cell; ++i)
239  {
240  for (unsigned int k = 0; k < dim; ++k)
241  {
242  local_rhs(i) += (-1 * approximation_values[q][k] * fe_vals.shape_grad(i, q)[k] * dx);
243  }
244  }
245  local_rhs(fe_vals.dofs_per_cell) += (approximation_values[q][dim] * 1 * dx);
246  }
247 }
248 
253 template <int dim>
254 class Interpolator : public dealii::MeshWorker::LocalIntegrator<dim>
255 {
256 public:
257  Interpolator(const dealii::DoFHandler<dim>& input_dofh, unsigned int interpolation_degree,
258  const dealii::TensorFunction<2, dim>& weight, const dealii::Function<dim>* bdry = 0);
259 
260  const dealii::FE_Q<dim>& get_fe() const;
261  const dealii::DoFHandler<dim>& get_dofh() const;
262  void init_vector(dealii::Vector<double>& result);
263  void interpolate(dealii::Vector<double>& result, const dealii::Vector<double>& input);
264 
265  virtual void cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
266  dealii::MeshWorker::IntegrationInfo<dim>& info) const;
267 
268 private:
269  dealii::FE_Q<dim> fe;
270  dealii::DoFHandler<dim> dofh;
271  dealii::SmartPointer<const dealii::TensorFunction<2, dim>> weight;
272  dealii::SmartPointer<const dealii::Function<dim>> bdry;
273  dealii::SmartPointer<const dealii::DoFHandler<dim>> input_dofh;
274 
275  std::vector<double> normalization_map;
276 
277  dealii::SmartPointer<const dealii::Vector<double>> input_fe_vector;
278 
279  void init_normalization();
280  double squared_max_ev(typename dealii::Triangulation<dim>::cell_iterator cell) const;
281 };
282 
283 template <int dim>
284 Interpolator<dim>::Interpolator(const dealii::DoFHandler<dim>& input_dofh,
285  unsigned int interpolation_degree,
286  const dealii::TensorFunction<2, dim>& weight,
287  const dealii::Function<dim>* bdry)
288  : fe(interpolation_degree)
289  , weight(&weight)
290  , bdry(bdry)
291  , input_dofh(&input_dofh)
292 {
293  dofh.initialize(input_dofh.get_tria(), fe);
294 
295  this->use_cell = true;
296  this->use_boundary = false;
297  this->use_face = false;
298 }
299 
300 template <int dim>
301 const dealii::FE_Q<dim>&
303 {
304  return fe;
305 }
306 
307 template <int dim>
308 const dealii::DoFHandler<dim>&
310 {
311  return dofh;
312 }
313 
314 template <int dim>
315 void
316 Interpolator<dim>::init_vector(dealii::Vector<double>& result)
317 {
318  result.reinit(dofh.n_dofs());
319 }
320 
321 template <int dim>
322 void
323 Interpolator<dim>::interpolate(dealii::Vector<double>& result, const dealii::Vector<double>& input)
324 {
325  dofh.initialize(dofh.get_tria(), dofh.get_fe());
326  result.reinit(dofh.n_dofs());
328 
329  dealii::AnyData out;
330  out.add<dealii::Vector<double>*>(&result, "result");
331 
332  dealii::MeshWorker::Assembler::ResidualSimple<dealii::Vector<double>> assembler;
333  assembler.initialize(out);
334 
335  input_fe_vector = &input;
336 
337  dealii::Quadrature<dim> continuous_support_points(fe.get_unit_support_points());
338 
339  dealii::MappingQ1<dim> mapping;
340  dealii::MeshWorker::DoFInfo<dim> dof_info(dofh);
341  dealii::MeshWorker::IntegrationInfoBox<dim> info_box;
342  info_box.initialize_update_flags();
343  info_box.add_update_flags_all(dealii::update_values | dealii::update_quadrature_points);
344  info_box.initialize(fe, mapping);
345 
346  dealii::MeshWorker::integration_loop(
347  dofh.begin_active(), dofh.end(), dof_info, info_box, *this, assembler);
348 
349  input_fe_vector = 0;
350 
351  if (bdry != 0)
352  {
353  std::map<dealii::types::global_dof_index, double> bdry_values;
354  dealii::VectorTools::interpolate_boundary_values(dofh, 0, *bdry, bdry_values);
355 
356  typedef typename std::map<dealii::types::global_dof_index, double>::const_iterator map_iterator;
357  map_iterator bdry_pair = bdry_values.begin(), bdry_end = bdry_values.end();
358  for (; bdry_pair != bdry_end; ++bdry_pair)
359  {
360  result(bdry_pair->first) = bdry_pair->second;
361  }
362  }
363 }
364 
365 template <int dim>
366 void
368 {
369  // TODO: this should really be done in the meshworker interface, too,
370  // in order to parallelize this step.
371  normalization_map.assign(dofh.n_dofs(), 0.0);
372 
373  std::vector<unsigned int> global_dof_indices(fe.dofs_per_cell);
374 
375  for (typename dealii::DoFHandler<dim>::active_cell_iterator cell = dofh.begin_active();
376  cell != dofh.end();
377  ++cell)
378  {
379  cell->get_dof_indices(global_dof_indices);
380  for (unsigned int i = 0; i < fe.dofs_per_cell; ++i)
381  {
382  normalization_map[global_dof_indices[i]] += squared_max_ev(cell);
383  }
384  }
385 }
386 
387 template <int dim>
388 double
389 Interpolator<dim>::squared_max_ev(typename dealii::Triangulation<dim>::cell_iterator cell) const
390 {
391  // TODO: in theory we should be looking for the maximum eigenvalue on
392  // the whole cell, but we just assume that the weight is constant on
393  // the cell and use the maximum eigenvalue at the center of the cell.
394  dealii::Tensor<2, dim> cell_value = weight->value(cell->center());
395  dealii::LAPACKFullMatrix<double> lapack_cell_value(dim, dim);
396  for (unsigned int i = 0; i < dim; ++i)
397  {
398  for (unsigned int j = 0; j < dim; ++j)
399  {
400  lapack_cell_value(i, j) = cell_value[i][j];
401  }
402  }
403  lapack_cell_value.compute_eigenvalues();
404  double ev2 = std::abs(lapack_cell_value.eigenvalue(1));
405  if (dim == 3)
406  {
407  ev2 = std::max(ev2, std::abs(lapack_cell_value.eigenvalue(2)));
408  }
409 
410  return std::sqrt(std::max(std::abs(lapack_cell_value.eigenvalue(0)), ev2));
411 }
412 
413 template <int dim>
414 void
415 Interpolator<dim>::cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
416  dealii::MeshWorker::IntegrationInfo<dim>& info) const
417 {
418  dealii::Quadrature<dim> continuous_support_points(dofh.get_fe().get_unit_support_points());
419 
420  dealii::FEValues<dim> input_fe_vals(
421  input_dofh->get_fe(), continuous_support_points, dealii::update_values);
422  typename dealii::DoFHandler<dim>::active_cell_iterator cell(
423  &(dinfo.cell->get_triangulation()), dinfo.cell->level(), dinfo.cell->index(), input_dofh);
424  input_fe_vals.reinit(cell);
425 
426  std::vector<double> input_vals(info.fe_values(0).dofs_per_cell);
427  input_fe_vals.get_function_values(*input_fe_vector, input_vals);
428 
429  typename dealii::DoFHandler<dim>::active_cell_iterator cell_pp(
430  &(dinfo.cell->get_triangulation()), dinfo.cell->level(), dinfo.cell->index(), &dofh);
431  std::vector<unsigned int> global_dof_indices(fe.dofs_per_cell);
432  cell_pp->get_dof_indices(global_dof_indices);
433 
434  double ev = squared_max_ev(dinfo.cell);
435 
436  for (unsigned int i = 0; i < info.fe_values(0).dofs_per_cell; ++i)
437  {
438  dinfo.vector(0).block(0)(i) = (ev * input_vals[i] / normalization_map[global_dof_indices[i]]);
439  }
440 }
441 
449 template <int dim>
450 class Estimator : public AmandusIntegrator<dim>
451 {
452 public:
453  class Parameters;
454 
455  Estimator(Parameters& parameters);
456 
457  void reinit(const dealii::Vector<double>& input);
458 
459  virtual void cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
460  dealii::MeshWorker::IntegrationInfo<dim>& info) const;
461 
462 private:
463  void init();
464 
465  dealii::SmartPointer<const Parameters> parameters;
468  dealii::Vector<double> pp_vector;
469  dealii::Vector<double> dc_pp_vector;
470 };
471 
472 template <int dim>
473 class Estimator<dim>::Parameters : public dealii::Subscriptor
474 {
475 public:
476  Parameters(dealii::DoFHandler<dim>& pp_dofh, const dealii::DoFHandler<dim>& input_dofh,
477  const dealii::TensorFunction<2, dim>& weight,
478  const dealii::TensorFunction<2, dim>& i_weight, unsigned int interpolation_degree,
479  const dealii::Function<dim>* bdry = 0);
480  dealii::DoFHandler<dim>& pp_dofh;
481  const dealii::DoFHandler<dim>& input_dofh;
482  const dealii::TensorFunction<2, dim>& weight;
483  const dealii::TensorFunction<2, dim>& i_weight;
484  unsigned int interpolation_degree;
485  const dealii::Function<dim>* bdry;
486 };
487 
488 template <int dim>
489 Estimator<dim>::Parameters::Parameters(dealii::DoFHandler<dim>& pp_dofh,
490  const dealii::DoFHandler<dim>& input_dofh,
491  const dealii::TensorFunction<2, dim>& weight,
492  const dealii::TensorFunction<2, dim>& i_weight,
493  unsigned int interpolation_degree,
494  const dealii::Function<dim>* bdry)
495  : pp_dofh(pp_dofh)
496  , input_dofh(input_dofh)
497  , weight(weight)
498  , i_weight(i_weight)
499  , interpolation_degree(interpolation_degree)
500  , bdry(bdry)
501 {
502 }
503 
504 template <int dim>
506  : parameters(&parameters)
507  , postprocessor(parameters.pp_dofh, parameters.input_dofh, parameters.weight)
508  , interpolator(parameters.pp_dofh, parameters.interpolation_degree, parameters.weight,
509  parameters.bdry)
510 {
511  init();
512 }
513 
514 template <int dim>
515 void
517 {
518  this->use_cell = true;
519  this->use_boundary = false;
520  this->use_face = false;
521 
522  this->add_flags(dealii::update_JxW_values | dealii::update_values |
523  dealii::update_quadrature_points);
524 }
525 
526 template <int dim>
527 void
528 Estimator<dim>::reinit(const dealii::Vector<double>& input)
529 {
530  parameters->pp_dofh.initialize(parameters->pp_dofh.get_tria(), parameters->pp_dofh.get_fe());
531  postprocessor.init_vector(dc_pp_vector);
532  postprocessor.postprocess(dc_pp_vector, input);
533  interpolator.init_vector(pp_vector);
534  interpolator.interpolate(pp_vector, dc_pp_vector);
535 }
536 
537 template <int dim>
538 void
539 Estimator<dim>::cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
540  dealii::MeshWorker::IntegrationInfo<dim>& info) const
541 {
542  const dealii::FEValuesBase<dim>& velocity_fev = info.fe_values(0);
543  const unsigned int n_quadrature_points = velocity_fev.n_quadrature_points;
544 
545  std::vector<dealii::Tensor<2, dim>> weight_values(n_quadrature_points);
546  std::vector<dealii::Tensor<2, dim>> i_weight_values(n_quadrature_points);
547  std::vector<dealii::Tensor<1, dim>> pp_gradients(n_quadrature_points);
548  std::vector<std::vector<double>>& approximation_values = info.values[0];
549 
550  parameters->weight.value_list(velocity_fev.get_quadrature_points(), weight_values);
551  parameters->i_weight.value_list(velocity_fev.get_quadrature_points(), i_weight_values);
552 
553  dealii::Functions::FEFieldFunction<dim> pp(interpolator.get_dofh(), pp_vector);
554  typename dealii::DoFHandler<dim>::active_cell_iterator cell(
555  &(info.fe_values(0).get_cell()->get_triangulation()),
556  info.fe_values(0).get_cell()->level(),
557  info.fe_values(0).get_cell()->index(),
558  &(interpolator.get_dofh()));
559  pp.set_active_cell(cell);
560  pp.gradient_list(velocity_fev.get_quadrature_points(), pp_gradients);
561 
562  double dx;
563  for (unsigned int q = 0; q < n_quadrature_points; ++q)
564  {
565  dx = velocity_fev.JxW(q);
566  for (unsigned int i = 0; i < dim; ++i)
567  {
568  dinfo.value(0) += (2 * approximation_values[i][q] * pp_gradients[q][i]) * dx;
569  for (unsigned int k = 0; k < dim; ++k)
570  {
571  dinfo.value(0) +=
572  (pp_gradients[q][i] * weight_values[q][i][k] * pp_gradients[q][k] +
573  i_weight_values[q][i][k] * approximation_values[k][q] * approximation_values[i][q]) *
574  dx;
575  }
576  }
577  }
578  dinfo.value(0) = std::sqrt(dinfo.value(0));
579 }
580 }
581 
582 #endif
dealii::SmartPointer< const dealii::Function< dim > > bdry
Definition: estimator.h:272
Parameters(dealii::DoFHandler< dim > &pp_dofh, const dealii::DoFHandler< dim > &input_dofh, const dealii::TensorFunction< 2, dim > &weight, const dealii::TensorFunction< 2, dim > &i_weight, unsigned int interpolation_degree, const dealii::Function< dim > *bdry=0)
Definition: estimator.h:489
const dealii::Function< dim > * bdry
Definition: estimator.h:485
double squared_max_ev(typename dealii::Triangulation< dim >::cell_iterator cell) const
Definition: estimator.h:389
std::vector< double > normalization_map
Definition: estimator.h:275
const dealii::FE_Q< dim > & get_fe() const
Definition: estimator.h:302
dealii::SmartPointer< const dealii::DoFHandler< dim > > input_dofh
Definition: estimator.h:273
void init_vector(dealii::Vector< double > &vector)
Definition: estimator.h:96
dealii::Vector< double > pp_vector
Definition: estimator.h:468
dealii::MeshWorker::DoFInfo< dim > dof_info
Definition: estimator.h:68
const dealii::DoFHandler< dim > & get_dofh() const
Definition: estimator.h:309
dealii::SmartPointer< const dealii::Vector< double > > approximate_solution
Definition: estimator.h:72
Postprocessor(const dealii::DoFHandler< dim > &pp_dofh, const dealii::DoFHandler< dim > &solution_dofh, const dealii::TensorFunction< 2, dim > &weight)
Definition: estimator.h:76
void interpolate(dealii::Vector< double > &result, const dealii::Vector< double > &input)
Definition: estimator.h:323
Definition: estimator.h:450
const dealii::SmartPointer< const dealii::DoFHandler< dim > > pp_dofh
Definition: estimator.h:64
void init()
Definition: estimator.h:516
Definition: estimator.h:254
const dealii::TensorFunction< 2, dim > & i_weight
Definition: estimator.h:483
dealii::DoFHandler< dim > dofh
Definition: estimator.h:270
const dealii::SmartPointer< const dealii::DoFHandler< dim > > approximation_dofh
Definition: estimator.h:71
Interpolator(const dealii::DoFHandler< dim > &input_dofh, unsigned int interpolation_degree, const dealii::TensorFunction< 2, dim > &weight, const dealii::Function< dim > *bdry=0)
Definition: estimator.h:284
dealii::MeshWorker::IntegrationInfoBox< dim > info_box
Definition: estimator.h:69
virtual void cell(dealii::MeshWorker::DoFInfo< dim > &dinfo, dealii::MeshWorker::IntegrationInfo< dim > &info) const
Definition: estimator.h:539
virtual void cell(dealii::MeshWorker::DoFInfo< dim > &dinfo, dealii::MeshWorker::IntegrationInfo< dim > &info) const
Definition: estimator.h:415
Estimator(Parameters &parameters)
Definition: estimator.h:505
void postprocess(dealii::Vector< double > &pp, const dealii::Vector< double > &solution)
Definition: estimator.h:103
virtual void cell(dealii::MeshWorker::DoFInfo< dim > &dinfo, dealii::MeshWorker::IntegrationInfo< dim > &info) const
Definition: estimator.h:117
dealii::SmartPointer< const dealii::TensorFunction< 2, dim > > weight
Definition: estimator.h:271
void mixed_mass_matrix(dealii::FullMatrix< double > &result, const dealii::FEValuesBase< dim > &fe_vals) const
Definition: estimator.h:207
void weighted_stiffness_matrix(dealii::FullMatrix< double > &result, const dealii::FEValuesBase< dim > &fe_vals, const dealii::TensorFunction< 2, dim > &weight) const
Definition: estimator.h:175
void assemble_local_rhs(dealii::Vector< double > &local_rhs, const dealii::FEValuesBase< dim > &fe_vals, const dealii::Function< dim > &approximation_function) const
Definition: estimator.h:226
Definition: estimator.h:473
Definition: estimator.h:33
dealii::SmartPointer< const Parameters > parameters
Definition: estimator.h:465
Postprocessor< dim > postprocessor
Definition: estimator.h:466
void reinit(const dealii::Vector< double > &input)
Definition: estimator.h:528
dealii::SmartPointer< const dealii::Vector< double > > input_fe_vector
Definition: estimator.h:277
dealii::DoFHandler< dim > & pp_dofh
Definition: estimator.h:480
void assemble_local_system(dealii::FullMatrix< double > &local_system, const dealii::FEValuesBase< dim > &fe_vals) const
Definition: estimator.h:150
const dealii::TensorFunction< 2, dim > & weight
Definition: estimator.h:482
dealii::FE_Q< dim > fe
Definition: estimator.h:269
Definition: estimator.h:40
const dealii::MappingQ1< dim > mapping
Definition: estimator.h:67
void init_normalization()
Definition: estimator.h:367
void init_vector(dealii::Vector< double > &result)
Definition: estimator.h:316
dealii::Vector< double > dc_pp_vector
Definition: estimator.h:469
Interpolator< dim > interpolator
Definition: estimator.h:467
const dealii::SmartPointer< const dealii::TensorFunction< 2, dim > > weight
Definition: estimator.h:65
unsigned int interpolation_degree
Definition: estimator.h:484
void add_flags(const dealii::UpdateFlags flags)
Add update flags on all objects.
Definition: integrator.h:454
const dealii::DoFHandler< dim > & input_dofh
Definition: estimator.h:481
Definition: integrator.h:29