00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__petsc_precondition_h
00013 #define __deal2__petsc_precondition_h
00014
00015
00016 #include <deal.II/base/config.h>
00017
00018 #ifdef DEAL_II_USE_PETSC
00019
00020 # include <deal.II/lac/exceptions.h>
00021 # include <petscpc.h>
00022
00023 DEAL_II_NAMESPACE_OPEN
00024
00025
00026
00027 namespace PETScWrappers
00028 {
00029
00030 class MatrixBase;
00031 class VectorBase;
00032 class SolverBase;
00033
00034
00051 class PreconditionerBase
00052 {
00053 public:
00057 PreconditionerBase ();
00058
00062 virtual ~PreconditionerBase ();
00063
00068 void vmult (VectorBase &dst,
00069 const VectorBase &src) const;
00070
00071
00076 const PC & get_pc () const;
00077
00078 protected:
00082 PC pc;
00083
00088 Mat matrix;
00089
00095 void create_pc ();
00096
00105 operator Mat () const;
00106
00112 friend class SolverBase;
00113 };
00114
00115
00116
00127 class PreconditionJacobi : public PreconditionerBase
00128 {
00129 public:
00135 struct AdditionalData
00136 {};
00137
00143 PreconditionJacobi ();
00144
00145
00152 PreconditionJacobi (const MatrixBase &matrix,
00153 const AdditionalData &additional_data = AdditionalData());
00154
00166 void initialize (const MatrixBase &matrix,
00167 const AdditionalData &additional_data = AdditionalData());
00168
00169 protected:
00174 AdditionalData additional_data;
00175 };
00176
00177
00178
00196 class PreconditionBlockJacobi : public PreconditionerBase
00197 {
00198 public:
00204 struct AdditionalData
00205 {};
00206
00212 PreconditionBlockJacobi ();
00213
00220 PreconditionBlockJacobi (const MatrixBase &matrix,
00221 const AdditionalData &additional_data = AdditionalData());
00222
00234 void initialize (const MatrixBase &matrix,
00235 const AdditionalData &additional_data = AdditionalData());
00236
00237 protected:
00242 AdditionalData additional_data;
00243 };
00244
00245
00246
00257 class PreconditionSOR : public PreconditionerBase
00258 {
00259 public:
00265 struct AdditionalData
00266 {
00272 AdditionalData (const double omega = 1);
00273
00277 double omega;
00278 };
00279
00285 PreconditionSOR ();
00286
00293 PreconditionSOR (const MatrixBase &matrix,
00294 const AdditionalData &additional_data = AdditionalData());
00295
00307 void initialize (const MatrixBase &matrix,
00308 const AdditionalData &additional_data = AdditionalData());
00309
00310 protected:
00315 AdditionalData additional_data;
00316 };
00317
00318
00319
00330 class PreconditionSSOR : public PreconditionerBase
00331 {
00332 public:
00338 struct AdditionalData
00339 {
00345 AdditionalData (const double omega = 1);
00346
00350 double omega;
00351 };
00352
00358 PreconditionSSOR ();
00359
00366 PreconditionSSOR (const MatrixBase &matrix,
00367 const AdditionalData &additional_data = AdditionalData());
00368
00380 void initialize (const MatrixBase &matrix,
00381 const AdditionalData &additional_data = AdditionalData());
00382
00383 protected:
00388 AdditionalData additional_data;
00389 };
00390
00391
00392
00403 class PreconditionEisenstat : public PreconditionerBase
00404 {
00405 public:
00411 struct AdditionalData
00412 {
00418 AdditionalData (const double omega = 1);
00419
00423 double omega;
00424 };
00425
00431 PreconditionEisenstat ();
00432
00439 PreconditionEisenstat (const MatrixBase &matrix,
00440 const AdditionalData &additional_data = AdditionalData());
00441
00453 void initialize (const MatrixBase &matrix,
00454 const AdditionalData &additional_data = AdditionalData());
00455
00456 protected:
00461 AdditionalData additional_data;
00462 };
00463
00464
00465
00476 class PreconditionICC : public PreconditionerBase
00477 {
00478 public:
00484 struct AdditionalData
00485 {
00491 AdditionalData (const unsigned int levels = 0);
00492
00496 unsigned int levels;
00497 };
00498
00504 PreconditionICC ();
00505
00512 PreconditionICC (const MatrixBase &matrix,
00513 const AdditionalData &additional_data = AdditionalData());
00514
00526 void initialize (const MatrixBase &matrix,
00527 const AdditionalData &additional_data = AdditionalData());
00528
00529 protected:
00534 AdditionalData additional_data;
00535 };
00536
00537
00538
00549 class PreconditionILU : public PreconditionerBase
00550 {
00551 public:
00557 struct AdditionalData
00558 {
00564 AdditionalData (const unsigned int levels = 0);
00565
00569 unsigned int levels;
00570 };
00571
00577 PreconditionILU ();
00578
00585 PreconditionILU (const MatrixBase &matrix,
00586 const AdditionalData &additional_data = AdditionalData());
00587
00599 void initialize (const MatrixBase &matrix,
00600 const AdditionalData &additional_data = AdditionalData());
00601
00602 protected:
00607 AdditionalData additional_data;
00608 };
00609
00610
00611
00624 class PreconditionLU : public PreconditionerBase
00625 {
00626 public:
00632 struct AdditionalData
00633 {
00639 AdditionalData (const double pivoting = 1.e-6,
00640 const double zero_pivot = 1.e-12,
00641 const double damping = 0.0);
00642
00651 double pivoting;
00652
00659 double zero_pivot;
00660
00666 double damping;
00667 };
00668
00674 PreconditionLU ();
00675
00682 PreconditionLU (const MatrixBase &matrix,
00683 const AdditionalData &additional_data = AdditionalData());
00684
00696 void initialize (const MatrixBase &matrix,
00697 const AdditionalData &additional_data = AdditionalData());
00698
00699 protected:
00704 AdditionalData additional_data;
00705 };
00706
00707
00708
00709
00721 class PreconditionBoomerAMG : public PreconditionerBase
00722 {
00723 public:
00729 struct AdditionalData
00730 {
00736 AdditionalData (
00737 const bool symmetric_operator = false,
00738 const double strong_threshold = 0.25,
00739 const double max_row_sum = 0.9,
00740 const unsigned int aggressive_coarsening_num_levels = 0,
00741 const bool output_details = false
00742 );
00743
00754 bool symmetric_operator;
00755
00765 double strong_threshold;
00766
00788 double max_row_sum;
00789
00796 unsigned int aggressive_coarsening_num_levels;
00797
00804 bool output_details;
00805 };
00806
00807
00808
00814 PreconditionBoomerAMG ();
00815
00822 PreconditionBoomerAMG (const MatrixBase &matrix,
00823 const AdditionalData &additional_data = AdditionalData());
00824
00836 void initialize (const MatrixBase &matrix,
00837 const AdditionalData &additional_data = AdditionalData());
00838
00839 protected:
00844 AdditionalData additional_data;
00845 };
00846 }
00847
00848
00849
00850 DEAL_II_NAMESPACE_CLOSE
00851
00852
00853 #endif // DEAL_II_USE_PETSC
00854
00855
00856
00857 #endif
00858
00859