7 #ifndef __darcy_estimator_h 8 #define __darcy_estimator_h 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> 31 #include <amandus/integrator.h> 44 const dealii::DoFHandler<dim>& solution_dofh,
45 const dealii::TensorFunction<2, dim>&
weight);
47 void postprocess(dealii::Vector<double>& pp,
const dealii::Vector<double>& solution);
49 virtual void cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
50 dealii::MeshWorker::IntegrationInfo<dim>& info)
const;
54 const dealii::FEValuesBase<dim>& fe_vals)
const;
56 const dealii::FEValuesBase<dim>& fe_vals,
57 const dealii::Function<dim>& approximation_function)
const;
59 const dealii::FEValuesBase<dim>& fe_vals,
60 const dealii::TensorFunction<2, dim>& weight)
const;
62 const dealii::FEValuesBase<dim>& fe_vals)
const;
64 const dealii::SmartPointer<const dealii::DoFHandler<dim>>
pp_dofh;
65 const dealii::SmartPointer<const dealii::TensorFunction<2, dim>>
weight;
69 dealii::MeshWorker::IntegrationInfoBox<dim>
info_box;
77 const dealii::DoFHandler<dim>& solution_dofh,
78 const dealii::TensorFunction<2, dim>&
weight)
85 info_box.add_update_flags_all(dealii::update_values | dealii::update_gradients |
86 dealii::update_quadrature_points | dealii::update_JxW_values);
89 this->use_cell =
true;
90 this->use_boundary =
false;
91 this->use_face =
false;
98 vector.reinit(
pp_dofh->n_dofs());
106 out.add<dealii::Vector<double>*>(&pp,
"result");
107 dealii::MeshWorker::Assembler::ResidualSimple<dealii::Vector<double>> assembler;
108 assembler.initialize(out);
110 dealii::MeshWorker::integration_loop(
118 dealii::MeshWorker::IntegrationInfo<dim>& info)
const 120 dealii::FullMatrix<double> local_system(info.fe_values(0).dofs_per_cell + 1,
121 info.fe_values(0).dofs_per_cell + 1);
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);
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);
139 dealii::Vector<double> local_result(info.fe_values(0).dofs_per_cell + 1);
140 inverse_local_system.vmult(local_result, local_rhs);
142 for (
unsigned int i = 0; i < info.fe_values(0).dofs_per_cell; ++i)
144 dinfo.vector(0).block(0)(i) = local_result(i);
151 const dealii::FEValuesBase<dim>& fe_vals)
const 153 dealii::FullMatrix<double> local_stiffness(fe_vals.dofs_per_cell, fe_vals.dofs_per_cell);
156 dealii::FullMatrix<double> local_mixed_mass(1, fe_vals.dofs_per_cell);
159 for (
unsigned int i = 0; i < fe_vals.dofs_per_cell; ++i)
161 for (
unsigned int j = 0; j < fe_vals.dofs_per_cell; ++j)
163 local_system.set(i, j, local_stiffness(i, j));
166 for (
unsigned int j = 0; j < fe_vals.dofs_per_cell; ++j)
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));
176 const dealii::FEValuesBase<dim>& fe_vals,
177 const dealii::TensorFunction<2, dim>&
weight)
const 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);
185 for (
unsigned int q = 0; q < fe_vals.n_quadrature_points; ++q)
188 for (
unsigned int i = 0; i < fe_vals.dofs_per_cell; ++i)
190 for (
unsigned int j = 0; j < fe_vals.dofs_per_cell; ++j)
192 for (
unsigned int k = 0; k < dim; ++k)
194 for (
unsigned int l = 0; l < dim; ++l)
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);
208 const dealii::FEValuesBase<dim>& fe_vals)
const 210 AssertDimension(1, result.m());
211 AssertDimension(fe_vals.dofs_per_cell, result.n());
214 for (
unsigned int q = 0; q < fe_vals.n_quadrature_points; ++q)
217 for (
unsigned int j = 0; j < fe_vals.dofs_per_cell; ++j)
219 result(0, j) += (fe_vals.shape_value(j, q) * 1 * dx);
227 const dealii::FEValuesBase<dim>& fe_vals,
228 const dealii::Function<dim>& approximation_function)
const 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);
235 for (
unsigned int q = 0; q < fe_vals.n_quadrature_points; ++q)
238 for (
unsigned int i = 0; i < fe_vals.dofs_per_cell; ++i)
240 for (
unsigned int k = 0; k < dim; ++k)
242 local_rhs(i) += (-1 * approximation_values[q][k] * fe_vals.shape_grad(i, q)[k] * dx);
245 local_rhs(fe_vals.dofs_per_cell) += (approximation_values[q][dim] * 1 * dx);
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);
260 const dealii::FE_Q<dim>& get_fe()
const;
261 const dealii::DoFHandler<dim>& get_dofh()
const;
263 void interpolate(dealii::Vector<double>& result,
const dealii::Vector<double>& input);
265 virtual void cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
266 dealii::MeshWorker::IntegrationInfo<dim>& info)
const;
269 dealii::FE_Q<dim>
fe;
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;
279 void init_normalization();
280 double squared_max_ev(
typename dealii::Triangulation<dim>::cell_iterator cell)
const;
285 unsigned int interpolation_degree,
286 const dealii::TensorFunction<2, dim>&
weight,
287 const dealii::Function<dim>* bdry)
288 : fe(interpolation_degree)
291 , input_dofh(&input_dofh)
293 dofh.initialize(input_dofh.get_tria(),
fe);
295 this->use_cell =
true;
296 this->use_boundary =
false;
297 this->use_face =
false;
301 const dealii::FE_Q<dim>&
308 const dealii::DoFHandler<dim>&
318 result.reinit(
dofh.n_dofs());
326 result.reinit(
dofh.n_dofs());
330 out.add<dealii::Vector<double>*>(&result,
"result");
332 dealii::MeshWorker::Assembler::ResidualSimple<dealii::Vector<double>> assembler;
333 assembler.initialize(out);
337 dealii::Quadrature<dim> continuous_support_points(
fe.get_unit_support_points());
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);
346 dealii::MeshWorker::integration_loop(
347 dofh.begin_active(),
dofh.end(), dof_info, info_box, *
this, assembler);
353 std::map<dealii::types::global_dof_index, double> bdry_values;
354 dealii::VectorTools::interpolate_boundary_values(
dofh, 0, *
bdry, bdry_values);
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)
360 result(bdry_pair->first) = bdry_pair->second;
373 std::vector<unsigned int> global_dof_indices(
fe.dofs_per_cell);
375 for (
typename dealii::DoFHandler<dim>::active_cell_iterator
cell =
dofh.begin_active();
379 cell->get_dof_indices(global_dof_indices);
380 for (
unsigned int i = 0; i <
fe.dofs_per_cell; ++i)
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)
398 for (
unsigned int j = 0; j < dim; ++j)
400 lapack_cell_value(i, j) = cell_value[i][j];
403 lapack_cell_value.compute_eigenvalues();
404 double ev2 = std::abs(lapack_cell_value.eigenvalue(1));
407 ev2 = std::max(ev2, std::abs(lapack_cell_value.eigenvalue(2)));
410 return std::sqrt(std::max(std::abs(lapack_cell_value.eigenvalue(0)), ev2));
416 dealii::MeshWorker::IntegrationInfo<dim>& info)
const 418 dealii::Quadrature<dim> continuous_support_points(
dofh.get_fe().get_unit_support_points());
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);
426 std::vector<double> input_vals(info.fe_values(0).dofs_per_cell);
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);
436 for (
unsigned int i = 0; i < info.fe_values(0).dofs_per_cell; ++i)
438 dinfo.vector(0).block(0)(i) = (ev * input_vals[i] /
normalization_map[global_dof_indices[i]]);
457 void reinit(
const dealii::Vector<double>& input);
459 virtual void cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
460 dealii::MeshWorker::IntegrationInfo<dim>& info)
const;
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);
482 const dealii::TensorFunction<2, dim>&
weight;
485 const dealii::Function<dim>*
bdry;
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)
496 , input_dofh(input_dofh)
499 , interpolation_degree(interpolation_degree)
506 : parameters(¶meters)
518 this->use_cell =
true;
519 this->use_boundary =
false;
520 this->use_face =
false;
522 this->
add_flags(dealii::update_JxW_values | dealii::update_values |
523 dealii::update_quadrature_points);
540 dealii::MeshWorker::IntegrationInfo<dim>& info)
const 542 const dealii::FEValuesBase<dim>& velocity_fev = info.fe_values(0);
543 const unsigned int n_quadrature_points = velocity_fev.n_quadrature_points;
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];
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);
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(),
559 pp.set_active_cell(cell);
560 pp.gradient_list(velocity_fev.get_quadrature_points(), pp_gradients);
563 for (
unsigned int q = 0; q < n_quadrature_points; ++q)
565 dx = velocity_fev.JxW(q);
566 for (
unsigned int i = 0; i < dim; ++i)
568 dinfo.value(0) += (2 * approximation_values[i][q] * pp_gradients[q][i]) * dx;
569 for (
unsigned int k = 0; k < dim; ++k)
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]) *
578 dinfo.value(0) = std::sqrt(dinfo.value(0));
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 ¶meters)
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