9 #ifndef amandus_integrator_h 10 #define amandus_integrator_h 12 #include <deal.II/algorithms/any_data.h> 13 #include <deal.II/base/function.h> 14 #include <deal.II/base/quadrature.h> 15 #include <deal.II/base/smartpointer.h> 16 #include <deal.II/base/vector_slice.h> 17 #include <deal.II/fe/block_mask.h> 18 #include <deal.II/integrators/l2.h> 19 #include <deal.II/meshworker/integration_info.h> 20 #include <deal.II/meshworker/local_integrator.h> 80 void add_flags(
const dealii::UpdateFlags flags);
141 : block_idx(
dealii::numbers::invalid_unsigned_int)
146 : block_idx(
dealii::numbers::invalid_unsigned_int)
147 , solution(&solution)
149 this->use_cell =
false;
150 this->use_face =
false;
151 this->use_boundary =
false;
157 return error_integrators.size();
163 dealii::ComponentMask new_component_mask(this->solution->n_components,
true);
164 this->add(error_integrator, new_component_mask);
171 error_integrator->
solution = this->solution;
172 error_integrator->
block_idx = error_integrators.size();
173 error_integrators.push_back(error_integrator);
175 this->use_cell = this->use_cell || error_integrator->use_cell;
176 this->use_face = this->use_face || error_integrator->use_face;
177 this->use_boundary = this->use_boundary || error_integrator->use_boundary;
181 cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
182 dealii::MeshWorker::IntegrationInfo<dim>& info)
const 184 for (std::size_t i = 0; i < error_integrators.size(); ++i)
186 if (error_integrators[i]->use_cell)
188 error_integrators[i]->cell(dinfo, info);
195 dealii::MeshWorker::IntegrationInfo<dim>& info)
const 197 for (std::size_t i = 0; i < error_integrators.size(); ++i)
199 if (error_integrators[i]->use_boundary)
201 error_integrators[i]->boundary(dinfo, info);
207 face(dealii::MeshWorker::DoFInfo<dim>& dinfo1, dealii::MeshWorker::DoFInfo<dim>& dinfo2,
208 dealii::MeshWorker::IntegrationInfo<dim>& info1,
209 dealii::MeshWorker::IntegrationInfo<dim>& info2)
const 211 for (std::size_t i = 0; i < error_integrators.size(); ++i)
213 if (error_integrators[i]->use_face)
215 error_integrators[i]->face(dinfo1, dinfo2, info1, info2);
223 dealii::SmartPointer<const dealii::Function<dim>>
solution;
287 dealii::BlockMask blocks = dealii::BlockMask(),
bool enforce_homogenity =
false);
291 virtual void cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
292 dealii::MeshWorker::IntegrationInfo<dim>& info)
const;
293 virtual void boundary(dealii::MeshWorker::DoFInfo<dim>& dinfo,
294 dealii::MeshWorker::IntegrationInfo<dim>& info)
const;
295 virtual void face(dealii::MeshWorker::DoFInfo<dim>& dinfo1,
296 dealii::MeshWorker::DoFInfo<dim>& dinfo2,
297 dealii::MeshWorker::IntegrationInfo<dim>& info1,
298 dealii::MeshWorker::IntegrationInfo<dim>& info2)
const;
311 this->use_cell =
true;
312 this->use_face =
false;
313 this->use_boundary =
false;
314 this->
add_flags(dealii::update_JxW_values | dealii::update_values |
315 dealii::update_quadrature_points);
317 virtual void cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
318 dealii::MeshWorker::IntegrationInfo<dim>& info)
const;
324 dealii::MeshWorker::IntegrationInfo<dim>& info)
const 326 Assert(info.values.size() >= 1, dealii::ExcDimensionMismatch(info.values.size(), 1));
328 const unsigned int fev_idx = 0;
329 const unsigned int approximation_idx = 0;
331 const std::vector<dealii::Point<dim>>& q_points = info.fe_values(fev_idx).get_quadrature_points();
332 const std::vector<double>& q_weights = info.fe_values(fev_idx).get_JxW_values();
334 std::vector<double> solution_values(q_points.size());
335 for (
unsigned int component = 0; component < this->component_mask.size(); ++component)
337 if (this->component_mask[component])
339 this->solution->value_list(q_points, solution_values, component);
340 const std::vector<double>& approximation_values = info.values[approximation_idx][component];
341 for (std::size_t q = 0; q < q_points.size(); ++q)
343 double error = solution_values[q] - approximation_values[q];
344 dinfo.value(this->block_idx) += error * error * q_weights[q];
348 dinfo.value(this->block_idx) = std::sqrt(dinfo.value(this->block_idx));
357 this->use_cell =
true;
358 this->use_face =
false;
359 this->use_boundary =
false;
360 this->
add_flags(dealii::update_JxW_values | dealii::update_gradients |
361 dealii::update_quadrature_points);
364 virtual void cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
365 dealii::MeshWorker::IntegrationInfo<dim>& info)
const;
371 dealii::MeshWorker::IntegrationInfo<dim>& info)
const 373 Assert(info.values.size() >= 1, dealii::ExcDimensionMismatch(info.values.size(), 1));
375 const unsigned int fev_idx = 0;
376 const unsigned int approximation_idx = 0;
378 const std::vector<dealii::Point<dim>>& q_points = info.fe_values(fev_idx).get_quadrature_points();
379 const std::vector<double>& q_weights = info.fe_values(fev_idx).get_JxW_values();
381 std::vector<dealii::Tensor<1, dim, double>> solution_grads(q_points.size());
382 for (
unsigned int component = 0; component < this->component_mask.size(); ++component)
384 if (this->component_mask[component])
386 this->solution->gradient_list(q_points, solution_grads, component);
387 const std::vector<dealii::Tensor<1, dim, double>>& approximation_grads =
388 info.gradients[approximation_idx][component];
389 for (std::size_t q = 0; q < q_points.size(); ++q)
391 double error = (solution_grads[q] - approximation_grads[q]).norm();
392 dinfo.value(this->block_idx) += error * error * q_weights[q];
396 dinfo.value(this->block_idx) = std::sqrt(dinfo.value(this->block_idx));
410 dealii::update_quadrature_points)
415 inline dealii::UpdateFlags
422 inline dealii::UpdateFlags
449 return std::string();
470 const double* ts = data.try_read_ptr<
double>(
"Timestep");
481 bool enforce_homogenity)
484 , enforce_homogenity(enforce_homogenity)
487 this->use_cell =
client->use_cell;
488 this->use_boundary =
client->use_boundary;
489 this->use_face =
client->use_face;
498 client->extract_data(data);
499 const double* ts = data.try_read_ptr<
double>(
"Timestep");
509 dealii::MeshWorker::IntegrationInfo<dim>& info)
const 511 client->cell(dinfo, info);
513 for (
unsigned int i = 0; i < dinfo.n_vectors(); ++i)
514 dinfo.vector(i) *= factor;
515 for (
unsigned int i = 0; i < dinfo.n_matrices(); ++i)
516 dinfo.matrix(i,
false).matrix *= factor;
518 const dealii::FiniteElement<dim>& fe = info.finite_element();
520 unsigned int comp = 0;
521 for (
unsigned int b = 0; b < fe.n_base_elements(); ++b)
523 unsigned int k = fe.first_block_of_base(b);
524 const dealii::FiniteElement<dim>& base = fe.base_element(b);
525 for (
unsigned int m = 0; m < fe.element_multiplicity(b); ++m)
527 unsigned int block_idx = k + m;
530 for (
unsigned int i = 0; i < dinfo.n_vectors(); ++i)
532 dealii::LocalIntegrators::L2::L2(
533 dinfo.vector(i).block(block_idx),
535 dealii::make_slice(info.values[0], comp, base.n_components()));
538 for (
unsigned int i = 0; i < dinfo.n_matrices(); ++i)
540 dealii::MatrixBlock<dealii::FullMatrix<double>>& local_matrix_block =
541 dinfo.matrix(i,
false);
542 if (local_matrix_block.row == block_idx && local_matrix_block.column == block_idx)
544 dealii::LocalIntegrators::L2::mass_matrix(local_matrix_block.matrix, info.fe_values(b));
550 for (
unsigned int i = 0; i < dinfo.n_vectors(); ++i)
552 dinfo.vector(i).block(block_idx) = 0.0;
555 comp += base.n_components();
563 dealii::MeshWorker::IntegrationInfo<dim>& info)
const 565 client->boundary(dinfo, info);
567 for (
unsigned int i = 0; i < dinfo.n_vectors(); ++i)
568 dinfo.vector(i) *= factor;
569 for (
unsigned int i = 0; i < dinfo.n_matrices(); ++i)
570 dinfo.matrix(i,
false).matrix *= factor;
575 Theta<dim>::face(dealii::MeshWorker::DoFInfo<dim>& dinfo1, dealii::MeshWorker::DoFInfo<dim>& dinfo2,
576 dealii::MeshWorker::IntegrationInfo<dim>& info1,
577 dealii::MeshWorker::IntegrationInfo<dim>& info2)
const 579 client->face(dinfo1, dinfo2, info1, info2);
581 for (
unsigned int i = 0; i < dinfo2.n_vectors(); ++i)
583 dinfo1.vector(i) *= factor;
584 dinfo2.vector(i) *= factor;
586 for (
unsigned int i = 0; i < dinfo1.n_matrices(); ++i)
588 dinfo1.matrix(i,
false).matrix *= factor;
589 dinfo1.matrix(i,
true).matrix *= factor;
590 dinfo2.matrix(i,
false).matrix *= factor;
591 dinfo2.matrix(i,
true).matrix *= factor;
608 cell(dealii::MeshWorker::DoFInfo<dim>& dinfo,
609 dealii::MeshWorker::IntegrationInfo<dim>& info)
const 612 const std::vector<double> one(info.fe_values(0).n_quadrature_points, 1.0);
613 for (
unsigned int i = 0; i < dinfo.vector(0).n_blocks(); ++i)
614 if (info.fe_values(i).get_fe().n_components() == 1)
615 dealii::LocalIntegrators::L2::L2(dinfo.vector(0).block(i), info.fe_values(i), one);
dealii::SmartPointer< const dealii::Function< dim > > solution
Definition: integrator.h:223
Definition: integrator.h:137
dealii::SmartPointer< dealii::Quadrature< dim > > cell_quadrature
Quadrature rule used on cells.
Definition: integrator.h:93
Definition: integrator.h:237
void add(ErrorIntegrator< dim > *error_integrator)
Definition: integrator.h:161
ErrorIntegrator()
Definition: integrator.h:140
std::vector< std::string > error_names
Definition: integrator.h:120
L2ErrorIntegrator()
Definition: integrator.h:309
Definition: integrator.h:352
dealii::ComponentMask component_mask
Definition: integrator.h:221
dealii::SmartPointer< dealii::Quadrature< dim-1 > > boundary_quadrature
Quadrature rule used on boundary faces.
Definition: integrator.h:99
virtual void extract_data(const dealii::AnyData &data)
Extract data independent of the cell.
Definition: integrator.h:496
Definition: integrator.h:229
dealii::UpdateFlags f_flags
Definition: integrator.h:124
AmandusIntegrator()
Definition: integrator.h:404
dealii::UpdateFlags update_flags_face() const
Returns the update flags to be used on boundary and interior faces.
Definition: integrator.h:423
double timestep
Current timestep if applicable.
Definition: integrator.h:48
unsigned int size() const
Definition: integrator.h:155
dealii::SmartPointer< dealii::Quadrature< dim-1 > > face_quadrature
Quadrature rule used on faces.
Definition: integrator.h:105
std::string error_name(unsigned int i) const
Definition: integrator.h:445
bool enforce_homogenity
Definition: integrator.h:302
virtual void face(dealii::MeshWorker::DoFInfo< dim > &dinfo1, dealii::MeshWorker::DoFInfo< dim > &dinfo2, dealii::MeshWorker::IntegrationInfo< dim > &info1, dealii::MeshWorker::IntegrationInfo< dim > &info2) const
Definition: integrator.h:207
H1ErrorIntegrator()
Definition: integrator.h:355
void add_flags_face(const dealii::UpdateFlags flags)
Add update flags on boundary and internal faces.
Definition: integrator.h:461
virtual void cell(dealii::MeshWorker::DoFInfo< dim > &dinfo, dealii::MeshWorker::IntegrationInfo< dim > &info) const
Definition: integrator.h:508
virtual void face(dealii::MeshWorker::DoFInfo< dim > &dinfo1, dealii::MeshWorker::DoFInfo< dim > &dinfo2, dealii::MeshWorker::IntegrationInfo< dim > &info1, dealii::MeshWorker::IntegrationInfo< dim > &info2) const
Definition: integrator.h:575
MeanIntegrator()
Definition: integrator.h:602
bool is_implicit
Definition: integrator.h:300
dealii::UpdateFlags update_flags() const
Returns the update flags to be used.
Definition: integrator.h:416
virtual void boundary(dealii::MeshWorker::DoFInfo< dim > &dinfo, dealii::MeshWorker::IntegrationInfo< dim > &info) const
Definition: integrator.h:194
std::vector< dealii::SmartPointer< ErrorIntegrator< dim > > > error_integrators
Definition: integrator.h:226
virtual void cell(dealii::MeshWorker::DoFInfo< dim > &dinfo, dealii::MeshWorker::IntegrationInfo< dim > &info) const
Definition: integrator.h:181
std::vector< unsigned int > error_types
Definition: integrator.h:113
Definition: integrator.h:306
Definition: integrator.h:599
unsigned int n_errors() const
Definition: integrator.h:430
void add(ErrorIntegrator< dim > *error_integrator, dealii::ComponentMask new_component_mask)
Definition: integrator.h:168
virtual void cell(dealii::MeshWorker::DoFInfo< dim > &dinfo, dealii::MeshWorker::IntegrationInfo< dim > &info) const
Definition: integrator.h:608
ErrorIntegrator(const dealii::Function< dim > &solution)
Definition: integrator.h:145
unsigned int block_idx
Definition: integrator.h:222
virtual void boundary(dealii::MeshWorker::DoFInfo< dim > &dinfo, dealii::MeshWorker::IntegrationInfo< dim > &info) const
Definition: integrator.h:562
virtual void extract_data(const dealii::AnyData &data)
Extract data independent of the cell.
Definition: integrator.h:468
dealii::BlockMask block_mask
Definition: integrator.h:301
unsigned int error_type(unsigned int i) const
Definition: integrator.h:437
void add_flags(const dealii::UpdateFlags flags)
Add update flags on all objects.
Definition: integrator.h:454
dealii::SmartPointer< AmandusIntegrator< dim >, Theta< dim > > client
Definition: integrator.h:299
Definition: integrator.h:29
dealii::UpdateFlags u_flags
Definition: integrator.h:123