00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef KRYLOV_SOLVER_OPTIONS_HPP
00021 #define KRYLOV_SOLVER_OPTIONS_HPP
00022
00023 #include <ParametrizableObject.hpp>
00024
00025 class KrylovSolverOptions
00026 : public ParametrizableObject
00027 {
00028 private:
00029 std::ostream& put(std::ostream& os) const
00030 {
00031 os << this->identifier();
00032 return os;
00033 }
00034
00035 public:
00036 enum Type {
00037 conjugateGradient,
00038 biConjugateGradient,
00039 biConjugateGradientStabilized,
00040 fgmres,
00041 gmres,
00042 iterativeLUFactorization
00043 };
00044
00045 enum PreconditionerType {
00046 diagonal,
00047 incompleteCholeski,
00048 multiGrid,
00049 spectralFEM,
00050 none
00051 };
00052
00053 Type type()
00054 {
00055 KrylovSolverOptions::Type t = conjugateGradient;
00056 get("type", t);
00057 return t;
00058 }
00059
00060 PreconditionerType precond()
00061 {
00062 KrylovSolverOptions::PreconditionerType t = none;
00063 get("precond", t);
00064 return t;
00065 }
00066
00067 static const char * identifier()
00068 {
00069
00070 return "krylov";
00071 }
00072
00073 explicit KrylovSolverOptions()
00074 {
00075
00076 EnumParameter<Type>* E1
00077 = new EnumParameter<Type>(KrylovSolverOptions::
00078 conjugateGradient,"type");
00079
00080
00081 (*E1).addSwitch("cg",
00082 KrylovSolverOptions::conjugateGradient);
00083
00084 (*E1).addSwitch("bicg",
00085 KrylovSolverOptions::biConjugateGradient);
00086
00087 (*E1).addSwitch("bicgstab",
00088 KrylovSolverOptions::biConjugateGradientStabilized);
00089
00090 (*E1).addSwitch("fgmres",
00091 KrylovSolverOptions::fgmres);
00092
00093 (*E1).addSwitch("gmres",
00094 KrylovSolverOptions::gmres);
00095
00096 (*E1).addSwitch("ilufact",
00097 KrylovSolverOptions::iterativeLUFactorization);
00098 add(E1);
00099
00100
00101
00102 EnumParameter<PreconditionerType>* E2
00103 = new EnumParameter<PreconditionerType>(KrylovSolverOptions::none,
00104 "precond");
00105
00106
00107 (*E2).addSwitch("diagonal",
00108 KrylovSolverOptions::diagonal);
00109
00110 (*E2).addSwitch("ichol",
00111 KrylovSolverOptions::incompleteCholeski);
00112
00113 (*E2).addSwitch("multigrid",
00114 KrylovSolverOptions::multiGrid);
00115
00116 (*E2).addSwitch("sfem",
00117 KrylovSolverOptions::spectralFEM);
00118
00119 (*E2).addSwitch("none",
00120 KrylovSolverOptions::none);
00121 add(E2);
00122 }
00123
00124 ~KrylovSolverOptions()
00125 {
00126 ;
00127 }
00128 };
00129
00130 #endif // KRYLOV_SOLVER_OPTIONS_HPP