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 4.29 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
    
    /** \brief
     * destructor
     */
    ~UmfPackSolver();
  protected:
    /** \brief
     * Implements OEMSolver<VectorType>::init().
     */
    void init() {
      p = this->vectorCreator->create();
      r = this->vectorCreator->create();
85
    }
86
87
88
89
90
91
92
    
    /** \brief
     * Implements OEMSolver<VectorType>::exit().
     */
    void exit() {
      this->vectorCreator->free(p);
      this->vectorCreator->free(r);
93
    }
94
95
96
97
    
    /** \brief
     * Implements OEMSolver<VectorType>::solve().
     */
98
    int solveSystem(MatVecMultiplier<VectorType> *mv, VectorType *x, VectorType *b, bool reuseMatrix);
99
100
101
102
103
104
    
  private:
    /** \brief
     * These vectors are justed to calculate the final residual of the solution.
     */
    VectorType *r, *p;
105
106
107
108
109
110
111

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

112
113
114
115
116
    /** \brief
     * Stores the result of umfpack_di_numeric, if multiple right hand sides will occure.
     */
    void *numeric;

117
118
119
120
121
122
123
    /** \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_;
124
125
126
127
128
129

    /** \brief
     * If not zero, Umfpack is prepared to solve multiple following systems with equal
     * system matrix but different right hand side vectors.
     */
    int multipleRhs;
130
131
132
133
134
135
136
137
138
  };
  
}

#include "UmfPackSolver.hh"

#endif // HAVE_UMFPACK

#endif // AMDIS_UMFPACKSOLVER_H