00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__trilinos_solver_h
00013 #define __deal2__trilinos_solver_h
00014
00015
00016 #include <deal.II/base/config.h>
00017
00018 #ifdef DEAL_II_USE_TRILINOS
00019
00020 # include <deal.II/base/std_cxx1x/shared_ptr.h>
00021 # include <deal.II/lac/exceptions.h>
00022 # include <deal.II/lac/solver_control.h>
00023 # include <deal.II/lac/vector.h>
00024
00025 # include <Epetra_LinearProblem.h>
00026 # include <AztecOO.h>
00027 # include <Epetra_Operator.h>
00028 # include <Amesos.h>
00029
00030 DEAL_II_NAMESPACE_OPEN
00031
00032 namespace TrilinosWrappers
00033 {
00034
00035 class SparseMatrix;
00036 class VectorBase;
00037 class PreconditionBase;
00038
00039
00060 class SolverBase
00061 {
00062 public:
00063
00078 enum SolverName {cg, cgs, gmres, bicgstab, tfqmr} solver_name;
00079
00086 struct AdditionalData
00087 {
00101 AdditionalData (const bool output_solver_details = false,
00102 const unsigned int gmres_restart_parameter = 30);
00103
00109 const bool output_solver_details;
00110
00115 const unsigned int gmres_restart_parameter;
00116 };
00117
00123 SolverBase (SolverControl &cn);
00124
00133 SolverBase (const enum SolverName solver_name,
00134 SolverControl &cn);
00135
00139 virtual ~SolverBase ();
00140
00152 void
00153 solve (const SparseMatrix &A,
00154 VectorBase &x,
00155 const VectorBase &b,
00156 const PreconditionBase &preconditioner);
00157
00176 void
00177 solve (const SparseMatrix &A,
00178 ::Vector<double> &x,
00179 const ::Vector<double> &b,
00180 const PreconditionBase &preconditioner);
00181
00186 SolverControl & control() const;
00187
00191 DeclException1 (ExcTrilinosError,
00192 int,
00193 << "An error with error number " << arg1
00194 << " occured while calling a Trilinos function");
00195
00196 protected:
00197
00210 SolverControl &solver_control;
00211
00212 private:
00213
00222 std_cxx1x::shared_ptr<Epetra_LinearProblem> linear_problem;
00223
00229 AztecOO solver;
00230
00235 const AdditionalData additional_data;
00236
00237 };
00238
00239
00240
00248 class SolverCG : public SolverBase
00249 {
00250 public:
00257 struct AdditionalData
00258 {
00263 AdditionalData (const bool output_solver_details = false);
00264
00270 bool output_solver_details;
00271 };
00272
00283 SolverCG (SolverControl &cn,
00284 const AdditionalData &data = AdditionalData());
00285
00286 protected:
00291 const AdditionalData additional_data;
00292 };
00293
00294
00295
00303 class SolverCGS : public SolverBase
00304 {
00305 public:
00311 struct AdditionalData
00312 {
00317 AdditionalData (const bool output_solver_details = false);
00318
00324 bool output_solver_details;
00325 };
00326
00337 SolverCGS (SolverControl &cn,
00338 const AdditionalData &data = AdditionalData());
00339
00340 protected:
00345 const AdditionalData additional_data;
00346 };
00347
00348
00349
00356 class SolverGMRES : public SolverBase
00357 {
00358 public:
00364 struct AdditionalData
00365 {
00372 AdditionalData (const bool output_solver_details = false,
00373 const unsigned int restart_parameter = 30);
00374
00380 bool output_solver_details;
00381
00386 unsigned int restart_parameter;
00387 };
00388
00399 SolverGMRES (SolverControl &cn,
00400 const AdditionalData &data = AdditionalData());
00401
00402 protected:
00407 const AdditionalData additional_data;
00408 };
00409
00410
00411
00419 class SolverBicgstab : public SolverBase
00420 {
00421 public:
00427 struct AdditionalData
00428 {
00433 AdditionalData (const bool output_solver_details = false);
00434
00440 bool output_solver_details;
00441 };
00442
00453 SolverBicgstab (SolverControl &cn,
00454 const AdditionalData &data = AdditionalData());
00455
00456 protected:
00461 const AdditionalData additional_data;
00462 };
00463
00464
00465
00473 class SolverTFQMR : public SolverBase
00474 {
00475 public:
00481 struct AdditionalData
00482 {
00487 AdditionalData (const bool output_solver_details = false);
00488
00494 bool output_solver_details;
00495 };
00496
00507 SolverTFQMR (SolverControl &cn,
00508 const AdditionalData &data = AdditionalData());
00509
00510 protected:
00515 const AdditionalData additional_data;
00516 };
00517
00518
00519
00527 class SolverDirect
00528 {
00529 public:
00530
00537 struct AdditionalData
00538 {
00543 AdditionalData (const bool output_solver_details = false);
00544
00550 bool output_solver_details;
00551 };
00552
00558 SolverDirect (SolverControl &cn,
00559 const AdditionalData &data = AdditionalData());
00560
00564 virtual ~SolverDirect ();
00565
00574 void
00575 solve (const SparseMatrix &A,
00576 VectorBase &x,
00577 const VectorBase &b);
00578
00597 void
00598 solve (const SparseMatrix &A,
00599 ::Vector<double> &x,
00600 const ::Vector<double> &b);
00601
00606 SolverControl & control() const;
00607
00611 DeclException1 (ExcTrilinosError,
00612 int,
00613 << "An error with error number " << arg1
00614 << " occured while calling a Trilinos function");
00615
00616 private:
00617
00630 SolverControl &solver_control;
00631
00640 std_cxx1x::shared_ptr<Epetra_LinearProblem> linear_problem;
00641
00647 std_cxx1x::shared_ptr<Amesos_BaseSolver> solver;
00648
00653 const AdditionalData additional_data;
00654
00655 };
00656
00657 }
00658
00659 DEAL_II_NAMESPACE_CLOSE
00660
00661 #endif // DEAL_II_USE_TRILINOS
00662
00663
00664
00665 #endif
00666
00667