Am Montag, 13. Mai 2022, finden Wartungsarbeiten am Gitlab-Server (Update auf neue Version statt). Der Dienst wird daher am Montag für einige Zeit nicht verfügbar sein.
On Monday, May 13th 2022, the Gitlab server will be updated. The service will therefore not be accessible for some time on Monday.

UmfPackSolver.h 3.95 KB
Newer Older
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
// ============================================================================
// ==                                                                        ==
// == AMDiS - Adaptive multidimensional simulations                          ==
// ==                                                                        ==
// ============================================================================
// ==                                                                        ==
// ==  crystal growth group                                                  ==
// ==                                                                        ==
// ==  Stiftung caesar                                                       ==
// ==  Ludwig-Erhard-Allee 2                                                 ==
// ==  53175 Bonn                                                            ==
// ==  germany                                                               ==
// ==                                                                        ==
// ============================================================================
// ==                                                                        ==
// ==  http://www.caesar.de/cg/AMDiS                                         ==
// ==                                                                        ==
// ============================================================================

/** \file UmfPackSolver.h */

#ifndef AMDIS_UMFPACKSOLVER_H
#define AMDIS_UMFPACKSOLVER_H

#ifdef HAVE_UMFPACK

#include "OEMSolver.h"
#include "MemoryManager.h"

namespace AMDiS {

  // ============================================================================
  // ===== class UmfPackSolver ==================================================
  // ============================================================================
  
  /**
   * \ingroup Solver
   * 
   * \brief
   * Wrapper for the external UMFPACK solver:
   *   http://www.cise.ufl.edu/research/sparse/umfpack/
   *
   * This is a direct solver for large sparse matrices.
   */
  template<typename VectorType>
  class UmfPackSolver : public OEMSolver<VectorType>
  {
  public:
    MEMORY_MANAGED(UmfPackSolver<VectorType>);

    /** \brief
     * Creator class used in the OEMSolverMap.
     */
    class Creator : public OEMSolverCreator<VectorType>
    {
    public:
      MEMORY_MANAGED(Creator);
      
      virtual ~Creator() {};
      
      /** \brief
       * Returns a new UmfPackSolver object.
       */
      OEMSolver<VectorType>* create() { 
	return NEW UmfPackSolver<VectorType>(this->name); 
      };
    };

    /** \brief
     * constructor
     */
72
    UmfPackSolver(std::string name);
73
74
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
    
    /** \brief
     * destructor
     */
    ~UmfPackSolver();
  protected:
    /** \brief
     * Implements OEMSolver<VectorType>::init().
     */
    void init() {
      p = this->vectorCreator->create();
      r = this->vectorCreator->create();
    };
    
    /** \brief
     * Implements OEMSolver<VectorType>::exit().
     */
    void exit() {
      this->vectorCreator->free(p);
      this->vectorCreator->free(r);
    };
    
    /** \brief
     * Implements OEMSolver<VectorType>::solve().
     */
    int solveSystem(MatVecMultiplier<VectorType> *mv, VectorType *x, VectorType *b);
    
  private:
    /** \brief
     * These vectors are justed to calculate the final residual of the solution.
     */
    VectorType *r, *p;
105
106
107
108
109
110
111
112
113
114
115
116
117
118

    /** \brief
     * Stores the result of umfpack_di_symbolic (the symbolic analysis which is needed
     * for the numeric factorization).
     */
    void *symbolic_;

    /** \brief
     * If the symbolic analysis should be done only once (for example, if the matrices
     * to solve have all the same pattern because of no adaptivity), this variable 
     * is one, otherwise 0 and the symbolic analysis will be performed at every call
     * of solveSystem().
     */
    int storeSymbolic_;
119
120
121
122
123
124
125
126
127
  };
  
}

#include "UmfPackSolver.hh"

#endif // HAVE_UMFPACK

#endif // AMDIS_UMFPACKSOLVER_H