MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
superluwrap.h
Go to the documentation of this file.
1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/libraries/libmbwrap/superluwrap.h,v 1.16 2017/01/12 14:44:25 masarati Exp $ */
2 /*
3  * MBDyn (C) is a multibody analysis code.
4  * http://www.mbdyn.org
5  *
6  * Copyright (C) 2004-2017
7  *
8  * Pierangelo Masarati <masarati@aero.polimi.it>
9  * Paolo Mantegazza <mantegazza@aero.polimi.it>
10  *
11  * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano
12  * via La Masa, 34 - 20156 Milano, Italy
13  * http://www.aero.polimi.it
14  *
15  * Changing this copyright notice is forbidden.
16  *
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation (version 2 of the License).
20  *
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25  * GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this program; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30  */
31 
32 /*****************************************************************************
33  * *
34  * SuperLU C++ WRAPPER *
35  * *
36  *****************************************************************************/
37 
38 /*
39  * Wrapper for SuperLU sparse smp LU solution
40  * http://www.cs.berkeley.edu/~xiaoye/superlu_mt.html
41  */
42 
43 #ifndef SUPERLUWRAP_H
44 #define SUPERLUWRAP_H
45 
46 #ifdef USE_SUPERLU
47 #ifndef USE_SUPERLU_MT /* SUPERLU and SUPERLU_MT are incompatible */
48 
49 #include <iostream>
50 #include "ac/pthread.h"
51 #include <vector>
52 
53 #include "myassert.h"
54 #include "mynewmem.h"
55 #include "except.h"
56 #include "solman.h"
57 #include "submat.h"
58 #include "spmapmh.h"
59 #include "ls.h"
60 
61 /* SuperLUSolver - begin */
62 
63 /*
64  * Solutore LU per matrici sparse. usa spazio messo a disposizione da altri
65  * e si aspetta le matrici gia' bell'e preparate
66  */
67 
68 struct SuperLUSolverData;
69 
70 class SuperLUSolver : public LinearSolver {
71 public:
72 private:
73  mutable integer *Aip;
74  mutable integer *App;
75  mutable doublereal *Axp;
76 
77  mutable integer iN; /* ordine della matrice */
78  mutable integer iNonZeroes;
79 
80  doublereal dPivotFactor;
81  unsigned permutation;
82 
83  mutable bool bFirstSol; /* true se prima backsubst */
84  mutable bool bRegenerateMatrix; /* true se prima backsubst */
85 
86  SuperLUSolverData *sld;
87 
88  /* Fattorizza la matrice */
89  void Factor(void);
90 
91 public:
92  enum {
93  SUPERLU_COLAMD = 0x01U,
94  SUPERLU_MMDATA = 0x02U
95  };
96 
97  /* Costruttore: si limita ad allocare la memoria */
98  SuperLUSolver(integer iMatOrd, const doublereal &dPivot, unsigned ptype);
99 
100  /* Distruttore */
101  ~SuperLUSolver(void);
102 
103 #ifdef DEBUG
104  void IsValid(void) const;
105 #endif /* DEBUG */
106 
107  /* Risolve */
108  void Solve(void) const;
109 
110  /* Index Form */
112  std::vector<doublereal>& Ax,
113  std::vector<integer>& Ar,
114  std::vector<integer>& Ac,
115  std::vector<integer>& Ap) const;
116 };
117 
118 /* SuperLUSolver - end */
119 
120 
121 
122 /* SuperLUSparseSolutionManager - begin */
123 
124 /*
125  * Gestisce la soluzione del problema; alloca le matrici occorrenti
126  * e gli oggetti dedicati alla gestione delle matrici ed alla soluzione
127  */
128 
129 class SuperLUSparseSolutionManager : public SolutionManager {
130 protected:
131  integer iMatSize; /* ordine della matrice */
132  std::vector<integer> Ai; /* array di interi con
133  * indici di riga di SuperLUSolver */
134  std::vector<integer> Adummy; /* dummy */
135  std::vector<integer> Ap; /* array di interi con
136  * indici di colonna CC */
137  std::vector<doublereal> Ax; /* reali con la matrice */
138  std::vector<doublereal> xb; /* reali con residuo/soluzione */
139 
140  mutable SpMapMatrixHandler MH; /* sparse MatrixHandler */
141  mutable MyVectorHandler VH; /* puntatore a VectorHandler */
142 
143  /* Fattorizza la matrice (non viene mai chiamato direttamente,
144  * ma da Solve se la matrice ancora non e' stata fattorizzata) */
145  void Factor(void);
146 
147 #ifdef DEBUG
148  /* Usata per il debug */
149  void IsValid(void) const;
150 #endif /* DEBUG */
151 
152  virtual void MakeCompressedColumnForm(void);
153 public:
154  /* Costruttore: usa e mette a disposizione matrici che gli sono date */
155  SuperLUSparseSolutionManager(integer iSize,
156  const doublereal& dPivotFactor = 1.0,
157  unsigned ptype = SuperLUSolver::SUPERLU_COLAMD);
158 
159  /* Distruttore: dealloca le matrici e distrugge gli oggetti propri */
160  ~SuperLUSparseSolutionManager(void);
161 
162  /* Inizializza il gestore delle matrici */
163  void MatrReset(void);
164 
165  /* Risolve il sistema */
166  void Solve(void);
167 
168  /* Rende disponibile l'handler per la matrice */
169  MatrixHandler* pMatHdl(void) const {
170  return &MH;
171  };
172 
173  /* Rende disponibile l'handler per il termine noto */
174  VectorHandler* pResHdl(void) const {
175 #ifdef DEBUG
176  VH.IsValid();
177 #endif /* DEBUG */
178  return &VH;
179  };
180 
181  /* Rende disponibile l'handler per la soluzione (e' lo stesso
182  * del termine noto, ma concettualmente sono separati) */
183  VectorHandler* pSolHdl(void) const {
184 #ifdef DEBUG
185  VH.IsValid();
186 #endif /* DEBUG */
187  return &VH;
188  };
189 };
190 
191 /* SuperLUSparseSolutionManager - end */
192 
193 /* SuperLUSparseCCSolutionManager - begin */
194 template <class CC>
195 class SuperLUSparseCCSolutionManager: public SuperLUSparseSolutionManager {
196 protected:
197  bool CCReady;
199 
200  virtual void MatrReset(void);
201  virtual void MakeCompressedColumnForm(void);
202 
203 public:
204  SuperLUSparseCCSolutionManager(integer Dim,
205  const doublereal &dPivot = 1.,
206  unsigned ptype = SuperLUSolver::SUPERLU_COLAMD);
207  virtual ~SuperLUSparseCCSolutionManager(void);
208 
209  /* Inizializzatore "speciale" */
210  virtual void MatrInitialize(void);
211 
212  /* Rende disponibile l'handler per la matrice */
213  virtual MatrixHandler* pMatHdl(void) const;
214 };
215 
216 /* SuperLUSparseCCSolutionManager - end */
217 
218 #endif /* !USE_SUPERLU_MT */
219 #endif /* USE_SUPERLU */
220 
221 #endif /* SUPERLUWRAP_H */
222 
virtual VectorHandler * pResHdl(void) const =0
virtual MatrixHandler * pMatHdl(void) const =0
virtual void MatrReset(void)=0
virtual void Solve(void)=0
virtual void Solve(void) const =0
virtual VectorHandler * pSolHdl(void) const =0
double doublereal
Definition: colamd.c:52
long int integer
Definition: colamd.c:51
virtual void MakeCompactForm(SparseMatrixHandler &mh, std::vector< doublereal > &Ax, std::vector< integer > &Ar, std::vector< integer > &Ac, std::vector< integer > &Ap) const
Definition: ls.cc:123