Amandus: Simulations based on multilevel Schwarz methods
amandus.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  **********************************************************************/
8 
9 #ifndef amandus_amandus_h
10 #define amandus_amandus_h
11 
12 #include <deal.II/lac/arpack_solver.h>
13 #include <deal.II/lac/block_vector.h>
14 #include <deal.II/lac/dynamic_sparsity_pattern.h>
15 #include <deal.II/lac/precondition.h>
16 #include <deal.II/lac/precondition_block.h>
17 #include <deal.II/lac/relaxation_block.h>
18 #include <deal.II/lac/solver_cg.h>
19 #include <deal.II/lac/solver_control.h>
20 #include <deal.II/lac/solver_gmres.h>
21 #include <deal.II/lac/solver_richardson.h>
22 #include <deal.II/lac/sparse_direct.h>
23 #include <deal.II/lac/sparse_matrix.h>
24 
25 #include <deal.II/grid/grid_generator.h>
26 #include <deal.II/grid/grid_out.h>
27 #include <deal.II/grid/grid_refinement.h>
28 
29 #include <deal.II/dofs/dof_tools.h>
30 
31 #include <deal.II/meshworker/dof_info.h>
32 #include <deal.II/meshworker/integration_info.h>
33 #include <deal.II/meshworker/loop.h>
34 #include <deal.II/meshworker/output.h>
35 #include <deal.II/meshworker/simple.h>
36 
37 #include <deal.II/multigrid/mg_coarse.h>
38 #include <deal.II/multigrid/mg_matrix.h>
39 #include <deal.II/multigrid/mg_smoother.h>
40 #include <deal.II/multigrid/mg_tools.h>
41 #include <deal.II/multigrid/mg_transfer.h>
42 #include <deal.II/multigrid/multigrid.h>
43 
44 #include <deal.II/algorithms/operator.h>
45 #include <deal.II/base/flow_function.h>
46 #include <deal.II/base/function_lib.h>
47 #include <deal.II/base/parameter_handler.h>
48 #include <deal.II/base/quadrature_lib.h>
49 #include <deal.II/numerics/data_out.h>
50 #include <deal.II/numerics/vector_tools.h>
51 
52 #include <amandus/integrator.h>
53 
54 #include <fstream>
55 #include <iostream>
56 
61 DeclExceptionMsg(ExcNeedArpack,
62  "To use this functionality, deal.II must be configured with Arpack.");
63 
67 class AmandusParameters : public dealii::ParameterHandler
68 {
69 public:
75 
81  void read(int argc, const char** argv);
82 };
83 
114 template <int dim>
115 class AmandusApplicationSparse : public dealii::Subscriptor
116 {
117 public:
118  typedef dealii::MeshWorker::IntegrationInfo<dim> CellInfo;
119 
131  AmandusApplicationSparse(dealii::Triangulation<dim>& triangulation,
132  const dealii::FiniteElement<dim>& fe, bool use_umfpack = false);
133 
137  virtual void parse_parameters(dealii::ParameterHandler& param);
138 
144  void set_number_of_matrices(unsigned int n);
145 
162  void set_boundary(dealii::types::boundary_id index,
163  dealii::ComponentMask mask = dealii::ComponentMask());
164 
171  void set_meanvalue(dealii::ComponentMask mask = dealii::ComponentMask());
172 
177  virtual void setup_vector(dealii::Vector<double>& v) const;
178 
184  virtual void update_vector_inhom_boundary(dealii::Vector<double>& v,
185  const dealii::Function<dim>& inhom_boundary,
186  bool projection = false) const;
187 
195  virtual void setup_system();
196 
202  void assemble_right_hand_side(dealii::AnyData& out, const dealii::AnyData& in,
203  const AmandusIntegrator<dim>& integrator) const;
204 
209  void refine_mesh(const bool global = false);
210 
214  const dealii::DoFHandler<dim>& dofs() const;
215 
219  const dealii::ConstraintMatrix& constraints() const;
220 
225  const dealii::ConstraintMatrix& hanging_nodes() const;
226 
232  virtual void setup_constraints();
236  void assemble_matrix(const dealii::AnyData& in, const AmandusIntegrator<dim>& integrator);
240  virtual void assemble_mg_matrix(const dealii::AnyData& in,
241  const AmandusIntegrator<dim>& integrator);
242 
246  const dealii::Vector<double>& indicators() const;
247 
253  double estimate(const dealii::AnyData& in, AmandusIntegrator<dim>& integrator);
266  void error(dealii::BlockVector<double>& out, const dealii::AnyData& in,
267  const AmandusIntegrator<dim>& integrator);
268 
276  void error(dealii::BlockVector<double>& out, const dealii::AnyData& in,
277  const ErrorIntegrator<dim>& integrator);
278 
282  void error(const dealii::AnyData& in, const AmandusIntegrator<dim>& integrator,
283  unsigned int num_errs);
288  virtual void solve(dealii::Vector<double>& sol, const dealii::Vector<double>& rhs);
289 
295  virtual void arpack_solve(std::vector<std::complex<double>>& eigenvalues,
296  std::vector<dealii::Vector<double>>& eigenvectors);
297 
298  void output_results(unsigned int refinement_cycle, const dealii::AnyData* data = 0) const;
299 
305  void verify_residual(dealii::AnyData& out, const dealii::AnyData& in,
306  const AmandusIntegrator<dim>& integrator) const;
307 
311  dealii::ReductionControl control;
312 
316  dealii::SmartPointer<dealii::ParameterHandler> param;
317 
318  typename dealii::Triangulation<dim>::Signals& signals;
319 
320 protected:
322  dealii::SmartPointer<dealii::Triangulation<dim>, AmandusApplicationSparse<dim>> triangulation;
323 
325  const dealii::MappingQ1<dim> mapping;
326 
328  dealii::SmartPointer<const dealii::FiniteElement<dim>, AmandusApplicationSparse<dim>> fe;
329 
331  dealii::DoFHandler<dim> dof_handler;
332 
337  std::map<dealii::types::boundary_id, dealii::ComponentMask> boundary_masks;
338 
339  dealii::ComponentMask meanvalue_mask;
340 
342  dealii::ConstraintMatrix constraint_matrix;
343 
345  dealii::ConstraintMatrix hanging_node_constraints;
346 
347  dealii::SparsityPattern sparsity;
348  std::vector<dealii::SparseMatrix<double>> matrix;
349  const bool use_umfpack;
350  dealii::SparseDirectUMFPACK inverse;
351 
352  dealii::BlockVector<double> estimates;
353 
354  std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation> output_data_types;
355 };
356 
387 template <int dim, typename RELAXATION = dealii::RelaxationBlockSSOR<dealii::SparseMatrix<double>>>
389 {
390 public:
391  typedef dealii::MeshWorker::IntegrationInfo<dim> CellInfo;
392 
399  AmandusApplication(dealii::Triangulation<dim>& triangulation,
400  const dealii::FiniteElement<dim>& fe);
401 
402  virtual void parse_parameters(dealii::ParameterHandler& param);
403 
410  void set_advection_directions(std::vector<dealii::Tensor<1, dim>>& adv_dir);
411 
419  void setup_system();
420 
421  void setup_constraints();
422 
428  void assemble_mg_matrix(const dealii::AnyData& in, const AmandusIntegrator<dim>& integrator);
429 
434  void solve(dealii::Vector<double>& sol, const dealii::Vector<double>& rhs);
435 
441  virtual void arpack_solve(std::vector<std::complex<double>>& eigenvalues,
442  std::vector<dealii::Vector<double>>& eigenvectors);
443 
448  bool vertex_patches = true;
456  bool boundary_patches = false;
457 
458 protected:
459  dealii::MGConstrainedDoFs mg_constraints;
460 
461  dealii::MGLevelObject<dealii::SparsityPattern> mg_sparsity;
462  dealii::MGLevelObject<dealii::SparsityPattern> mg_sparsity_fluxes;
463  dealii::MGLevelObject<dealii::SparseMatrix<double>> mg_matrix;
464 
465  dealii::MGLevelObject<dealii::SparseMatrix<double>> mg_matrix_down;
466  dealii::MGLevelObject<dealii::SparseMatrix<double>> mg_matrix_up;
467  dealii::MGLevelObject<dealii::SparseMatrix<double>> mg_matrix_flux_down;
468  dealii::MGLevelObject<dealii::SparseMatrix<double>> mg_matrix_flux_up;
469 
470  dealii::MGTransferPrebuilt<dealii::Vector<double>> mg_transfer;
471 
472  dealii::FullMatrix<double> coarse_matrix;
473  dealii::MGCoarseGridSVD<double, dealii::Vector<double>> mg_coarse;
474 
475  dealii::MGLevelObject<typename RELAXATION::AdditionalData> smoother_data;
476  dealii::mg::SmootherRelaxation<RELAXATION, dealii::Vector<double>> mg_smoother;
477 
480  std::vector<dealii::Tensor<1, dim>> advection_directions;
481 
483  bool log_smoother_statistics = false;
485  bool right_preconditioning = true;
487  bool use_default_residual = true;
489  double smoother_relaxation = 1.0;
490 };
491 
498 template <int dim>
500 {
501 public:
502  AmandusUMFPACK(dealii::Triangulation<dim>& triangulation, const dealii::FiniteElement<dim>& fe);
503 };
504 
512 template <int dim>
513 class AmandusResidual : public dealii::Algorithms::OperatorBase
514 {
515 public:
521  AmandusIntegrator<dim>& integrator);
522 
533  virtual void operator()(dealii::AnyData& out, const dealii::AnyData& in);
534 
535 protected:
537  dealii::SmartPointer<const AmandusApplicationSparse<dim>, AmandusResidual<dim>> application;
539  dealii::SmartPointer<AmandusIntegrator<dim>, AmandusResidual<dim>> integrator;
540 };
541 
547 template <int dim>
548 class AmandusSolve : public dealii::Algorithms::OperatorBase
549 {
550 public:
560  virtual void operator()(dealii::AnyData& out, const dealii::AnyData& in);
561 
562 private:
564  dealii::SmartPointer<AmandusApplicationSparse<dim>, AmandusSolve<dim>> application;
566  dealii::SmartPointer<AmandusIntegrator<dim>, AmandusSolve<dim>> integrator;
567 };
568 
569 template <int dim>
570 inline void
572 {
573  matrix.resize(n);
574 }
575 
576 template <int dim>
577 inline const dealii::DoFHandler<dim>&
579 {
580  return dof_handler;
581 }
582 
583 template <int dim>
584 inline const dealii::ConstraintMatrix&
586 {
587  return constraint_matrix;
588 }
589 
590 template <int dim>
591 inline const dealii::ConstraintMatrix&
593 {
594  return hanging_node_constraints;
595 }
596 
597 template <int dim>
598 inline const dealii::Vector<double>&
600 {
601  return estimates.block(0);
602 }
603 
604 template <int dim, typename RELAXATION>
606  std::vector<dealii::Tensor<1, dim>>& adv_dir)
607 {
608  advection_directions = adv_dir;
609 }
610 
611 #endif
const dealii::ConstraintMatrix & hanging_nodes() const
The object describing the constraints for hanging nodes, not for the boundary.
Definition: amandus.h:592
dealii::ConstraintMatrix constraint_matrix
The object holding the constraints for the active mesh.
Definition: amandus.h:342
dealii::SmartPointer< dealii::ParameterHandler > param
Definition: amandus.h:316
dealii::MGLevelObject< dealii::SparseMatrix< double > > mg_matrix_flux_down
Definition: amandus.h:467
Definition: amandus.h:499
Definition: integrator.h:137
dealii::SmartPointer< AmandusIntegrator< dim >, AmandusResidual< dim > > integrator
Pointer to the local integrator defining the model.
Definition: amandus.h:539
Definition: amandus.h:548
dealii::SmartPointer< AmandusApplicationSparse< dim >, AmandusSolve< dim > > application
The pointer to the application object.
Definition: amandus.h:564
dealii::MGLevelObject< dealii::SparseMatrix< double > > mg_matrix_up
Definition: amandus.h:466
const dealii::DoFHandler< dim > & dofs() const
The object describing the finite element space.
Definition: amandus.h:578
const bool use_umfpack
Definition: amandus.h:349
dealii::mg::SmootherRelaxation< RELAXATION, dealii::Vector< double > > mg_smoother
Definition: amandus.h:476
dealii::MGLevelObject< dealii::SparseMatrix< double > > mg_matrix
Definition: amandus.h:463
dealii::MGLevelObject< dealii::SparsityPattern > mg_sparsity_fluxes
Definition: amandus.h:462
dealii::MGConstrainedDoFs mg_constraints
Definition: amandus.h:459
void verify_residual(unsigned int n_refinements, AmandusApplicationSparse< dim > &app, AmandusIntegrator< dim > &matrix_integrator, AmandusIntegrator< dim > &residual_integrator)
Definition: tests.h:305
dealii::SmartPointer< const AmandusApplicationSparse< dim >, AmandusResidual< dim > > application
Pointer to the application computing the residual.
Definition: amandus.h:537
dealii::ReductionControl control
Definition: amandus.h:311
dealii::MeshWorker::IntegrationInfo< dim > CellInfo
Definition: amandus.h:391
dealii::SparseDirectUMFPACK inverse
Definition: amandus.h:350
dealii::FullMatrix< double > coarse_matrix
Definition: amandus.h:472
dealii::DoFHandler< dim > dof_handler
The object handling the degrees of freedom.
Definition: amandus.h:331
DeclExceptionMsg(ExcNeedArpack,"To use this functionality, deal.II must be configured with Arpack.")
dealii::SmartPointer< AmandusIntegrator< dim >, AmandusSolve< dim > > integrator
The pointer to the local integrator for assembling matrices.
Definition: amandus.h:566
void set_number_of_matrices(unsigned int n)
Definition: amandus.h:571
dealii::SmartPointer< dealii::Triangulation< dim >, AmandusApplicationSparse< dim > > triangulation
The mesh.
Definition: amandus.h:322
dealii::MGTransferPrebuilt< dealii::Vector< double > > mg_transfer
Definition: amandus.h:470
dealii::SmartPointer< const dealii::FiniteElement< dim >, AmandusApplicationSparse< dim > > fe
The finite element constructed from the string.
Definition: amandus.h:328
dealii::SparsityPattern sparsity
Definition: amandus.h:347
dealii::Triangulation< dim >::Signals & signals
Definition: amandus.h:318
std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > output_data_types
Definition: amandus.h:354
dealii::MGLevelObject< typename RELAXATION::AdditionalData > smoother_data
Definition: amandus.h:475
std::vector< dealii::Tensor< 1, dim > > advection_directions
Definition: amandus.h:480
dealii::MeshWorker::IntegrationInfo< dim > CellInfo
Definition: amandus.h:118
void set_advection_directions(std::vector< dealii::Tensor< 1, dim >> &adv_dir)
Definition: amandus.h:605
dealii::MGLevelObject< dealii::SparseMatrix< double > > mg_matrix_down
Definition: amandus.h:465
std::map< dealii::types::boundary_id, dealii::ComponentMask > boundary_masks
The masks used to set boundary conditions, indexed by the boundary indicator.
Definition: amandus.h:337
const dealii::ConstraintMatrix & constraints() const
The object describing the constraints.
Definition: amandus.h:585
void read(int argc, const char **argv)
Definition: amandus_parameters.cc:61
Definition: amandus.h:388
Definition: amandus.h:115
dealii::ConstraintMatrix hanging_node_constraints
The object holding the hanging node constraints for the active mesh.
Definition: amandus.h:345
dealii::MGCoarseGridSVD< double, dealii::Vector< double > > mg_coarse
Definition: amandus.h:473
dealii::BlockVector< double > estimates
Definition: amandus.h:352
const dealii::MappingQ1< dim > mapping
The default mapping.
Definition: amandus.h:325
dealii::MGLevelObject< dealii::SparseMatrix< double > > mg_matrix_flux_up
Definition: amandus.h:468
const dealii::Vector< double > & indicators() const
The error indicators.
Definition: amandus.h:599
AmandusParameters()
Definition: amandus_parameters.cc:17
dealii::MGLevelObject< dealii::SparsityPattern > mg_sparsity
Definition: amandus.h:461
Definition: amandus.h:67
Definition: amandus.h:513
std::vector< dealii::SparseMatrix< double > > matrix
Definition: amandus.h:348
dealii::ComponentMask meanvalue_mask
Definition: amandus.h:339
Definition: integrator.h:29