CGSolver.h 3.73 KB
 Peter Gottschling committed Feb 15, 2008 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 ``````// ============================================================================ // == == // == AMDiS - Adaptive multidimensional simulations == // == == // ============================================================================ // == == // == crystal growth group == // == == // == Stiftung caesar == // == Ludwig-Erhard-Allee 2 == // == 53175 Bonn == // == germany == // == == // ============================================================================ // == == // == http://www.caesar.de/cg/AMDiS == // == == // ============================================================================ /** \file CGSolver.h */ #ifndef AMDIS_CGSOLVER_H #define AMDIS_CGSOLVER_H namespace AMDiS { #include "OEMSolver.h" #include "MemoryManager.h" // ============================================================================ // ===== class CGSolver ======================================================= // ============================================================================ /** * \ingroup Solver * * \brief * Solves a linear system by the conjugate gradient method and can be used for * symmetric positive definite system matrices. * * The implementation is based on the following book: "Numerik linearer * Gleichungssystene", 2. Auflage, Andreas Meister. The algorithm is described * on page 124. The extension to the preconditioned cg method (pcg) is described * on page 207 in the same book. We here use the same variable names, but without * subscription. */ template class CGSolver : public OEMSolver { public: MEMORY_MANAGED(CGSolver); /** \brief * Creator class used in the OEMSolverMap. */ class Creator : public OEMSolverCreator { public: MEMORY_MANAGED(Creator); virtual ~Creator() {}; /** \brief * Returns a new CGSolver object. */ OEMSolver* create() { return NEW CGSolver(this->name); }; }; /** \brief * constructor */ `````` Thomas Witkowski committed Aug 29, 2008 74 `````` CGSolver(std::string name); `````` Peter Gottschling committed Feb 15, 2008 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 `````` /** \brief * destructor */ ~CGSolver(); protected: /** \brief * Implements OEMSolver::init(). */ void init() { p = this->vectorCreator->create(); r = this->vectorCreator->create(); v = this->vectorCreator->create(); z = this->vectorCreator->create(); }; /** \brief * Implements OEMSolver::exit(). */ void exit() { this->vectorCreator->free(p); this->vectorCreator->free(r); this->vectorCreator->free(v); this->vectorCreator->free(z); }; /** \brief * Implements OEMSolver::solve(). */ int solveSystem(MatVecMultiplier *mv, VectorType *x, VectorType *b); private: VectorType *p, *r, *v, *z; }; } #include "CGSolver.hh" #endif // AMDIS_CGSOLVER_H``````