MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
naivemh.h
Go to the documentation of this file.
1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/libraries/libmbmath/naivemh.h,v 1.38 2017/01/12 14:43:54 masarati Exp $ */
2 /*
3  * MBDyn (C) is a multibody analysis code.
4  * http://www.mbdyn.org
5  *
6  * Copyright (C) 2003-2017
7  *
8  * This code is a partial merge of HmFe and MBDyn.
9  *
10  * Pierangelo Masarati <masarati@aero.polimi.it>
11  * Paolo Mantegazza <mantegazza@aero.polimi.it>
12  *
13  * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano
14  * via La Masa, 34 - 20156 Milano, Italy
15  * http://www.aero.polimi.it
16  *
17  * Changing this copyright notice is forbidden.
18  *
19  * This program is free software; you can redistribute it and/or modify
20  * it under the terms of the GNU General Public License as published by
21  * the Free Software Foundation (version 2 of the License).
22  *
23  *
24  * This program is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program; if not, write to the Free Software
31  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32  */
33 
34 #ifndef NAIVEMH_H
35 #define NAIVEMH_H
36 
37 #include <vector>
38 
39 #include "myassert.h"
40 #include "solman.h"
41 #include "spmh.h"
42 
43 class NaiveSolver;
44 class MultiThreadDataManager;
45 
46 /* Sparse Matrix */
48  friend void* sum_naive_matrices(void* arg);
49  friend class NaiveSolver;
50  friend class ParNaiveSolver;
51  friend class MultiThreadDataManager;
52 
53 private:
54  // don't allow copy constructor!
56 
57 protected:
62  char **ppnonzero;
64 
65 #ifdef DEBUG
66  void IsValid(void) const {
67  NO_OP;
68  };
69 #endif /* DEBUG */
70 
71 public:
73  friend class NaiveMatrixHandler;
74 
75  private:
77  mutable integer i_row;
79 
80  protected:
81  void reset(bool is_end = false);
82 
83  public:
84  const_iterator(const NaiveMatrixHandler& m, bool is_end = false);
85  ~const_iterator(void);
91  };
92 
93 protected:
95 
96 public:
98  return const_iterator(*this);
99  };
100 
102  return m_end;
103  };
104 
105 public:
106  /* FIXME: always square? yes! */
107  NaiveMatrixHandler(const integer n, NaiveMatrixHandler *const nmh = 0);
108 
109  virtual ~NaiveMatrixHandler(void);
110 
111  integer iGetNumRows(void) const {
112  return iSize;
113  };
114 
115  integer iGetNumCols(void) const {
116  return iSize;
117  };
118 
119  void Reset(void);
120 
121  /* Ridimensiona la matrice */
122  virtual void Resize(integer, integer) {
124  };
125 
126  virtual inline const doublereal&
127  operator () (integer iRow, integer iCol) const;
128 
129  virtual inline doublereal&
130  operator () (integer iRow, integer iCol);
131 
132  /* Overload di += usato per l'assemblaggio delle matrici */
133  virtual MatrixHandler& operator += (const SubMatrixHandler& SubMH);
134 
135  /* Overload di -= usato per l'assemblaggio delle matrici */
136  virtual MatrixHandler& operator -= (const SubMatrixHandler& SubMH);
137 
138  /* Overload di += usato per l'assemblaggio delle matrici
139  * questi li vuole ma non so bene perche'; force per la doppia
140  * derivazione di VariableSubMatrixHandler */
141  virtual MatrixHandler&
143  virtual MatrixHandler&
145 
146  void MakeCCStructure(std::vector<integer>& Ai,
147  std::vector<integer>& Ap);
148 
149 protected:
150  /* Matrix Matrix product */
151  virtual MatrixHandler&
152  MatMatMul_base(void (MatrixHandler::*op)(integer iRow, integer iCol,
153  const doublereal& dCoef),
154  MatrixHandler& out, const MatrixHandler& in) const;
155  virtual MatrixHandler&
156  MatTMatMul_base(void (MatrixHandler::*op)(integer iRow, integer iCol,
157  const doublereal& dCoef),
158  MatrixHandler& out, const MatrixHandler& in) const;
159 
160  /* Matrix Vector product */
161  virtual VectorHandler&
162  MatVecMul_base(void (VectorHandler::*op)(integer iRow,
163  const doublereal& dCoef),
164  VectorHandler& out, const VectorHandler& in) const;
165  virtual VectorHandler&
166  MatTVecMul_base(void (VectorHandler::*op)(integer iRow,
167  const doublereal& dCoef),
168  VectorHandler& out, const VectorHandler& in) const;
169 };
170 
171 
172 const doublereal&
174 {
175  ASSERT(iRow > 0);
176  ASSERT(iRow <= iGetNumRows());
177  ASSERT(iCol > 0);
178  ASSERT(iCol <= iGetNumCols());
179 
180  --iRow;
181  --iCol;
182  if (ppnonzero[iRow][iCol]) {
183  return ppdRows[iRow][iCol];
184  }
186 }
187 
188 doublereal&
190 {
191  ASSERT(iRow > 0);
192  ASSERT(iRow <= iGetNumRows());
193  ASSERT(iCol > 0);
194  ASSERT(iCol <= iGetNumCols());
195 
196  --iRow;
197  --iCol;
198  if (!(ppnonzero[iRow][iCol])) {
199  ppnonzero[iRow][iCol] = 1;
200  ppiRows[iCol][piNzr[iCol]] = iRow;
201  ppiCols[iRow][piNzc[iRow]] = iCol;
202  piNzr[iCol]++;
203  piNzc[iRow]++;
204  ppdRows[iRow][iCol] = 0.;
205  }
206 
207  return ppdRows[iRow][iCol];
208 }
209 
210 /* Sparse Matrix with unknowns permutation*/
212 protected:
213  const std::vector<integer>& perm;
214  const std::vector<integer>& invperm;
215 
216 #ifdef DEBUG
217  void IsValid(void) const {
218  NO_OP;
219  };
220 #endif /* DEBUG */
221 
222 public:
225 
226  private:
228  mutable integer i_row;
230 
231  protected:
232  void reset(bool is_end = false);
233 
234  public:
237  ~const_iterator(void);
243  };
244 
245 protected:
247 
248 public:
250  return const_iterator(*this);
251  };
252 
254  return m_end;
255  };
256 
257 public:
258  /* FIXME: always square? yes! */
260  const std::vector<integer>& tperm,
261  const std::vector<integer>& invperm);
262 
264  const std::vector<integer>& tperm,
265  const std::vector<integer>& invperm);
266 
267  virtual ~NaivePermMatrixHandler(void);
268 
269  const std::vector<integer>& GetPerm(void) const;
270 
271  const std::vector<integer>& GetInvPerm(void) const;
272 
273  virtual inline const doublereal&
274  operator () (integer iRow, integer iCol) const {
275  ASSERT(iRow > 0);
276  ASSERT(iRow <= iGetNumRows());
277  ASSERT(iCol > 0);
278  ASSERT(iCol <= iGetNumCols());
279 
280  ASSERT(perm.size() == (size_t)iGetNumRows());
281  ASSERT(perm.size() == (size_t)iGetNumCols());
282 
283  /* FIXME: stupid 0/1 based arrays... */
284  iCol = perm[iCol - 1] + 1;
285  return NaiveMatrixHandler::operator()(iRow, iCol);
286  };
287 
288  virtual inline doublereal&
290  ASSERT(iRow > 0);
291  ASSERT(iRow <= iGetNumRows());
292  ASSERT(iCol > 0);
293  ASSERT(iCol <= iGetNumCols());
294 
295  ASSERT(perm.size() == (size_t)iGetNumRows());
296  ASSERT(perm.size() == (size_t)iGetNumCols());
297 
298  /* FIXME: stupid 0/1 based arrays... */
299  iCol = perm[iCol - 1] + 1;
300  return NaiveMatrixHandler::operator()(iRow, iCol);
301  };
302 
303 protected:
304  /* Matrix Matrix product */
305  virtual MatrixHandler&
306  MatMatMul_base(void (MatrixHandler::*op)(integer iRow, integer iCol,
307  const doublereal& dCoef),
308  MatrixHandler& out, const MatrixHandler& in) const;
309  virtual MatrixHandler&
310  MatTMatMul_base(void (MatrixHandler::*op)(integer iRow, integer iCol,
311  const doublereal& dCoef),
312  MatrixHandler& out, const MatrixHandler& in) const;
313 
314  /* Matrix Vector product */
315  virtual VectorHandler&
316  MatVecMul_base(void (VectorHandler::*op)(integer iRow,
317  const doublereal& dCoef),
318  VectorHandler& out, const VectorHandler& in) const;
319  virtual VectorHandler&
320  MatTVecMul_base(void (VectorHandler::*op)(integer iRow,
321  const doublereal& dCoef),
322  VectorHandler& out, const VectorHandler& in) const;
323 };
324 
325 
326 #endif /* NAIVEMH_H */
327 
void Reset(void)
Definition: naivemh.cc:151
friend class MultiThreadDataManager
Definition: naivemh.h:51
integer iGetNumRows(void) const
Definition: naivemh.h:111
virtual MatrixHandler & MatTMatMul_base(void(MatrixHandler::*op)(integer iRow, integer iCol, const doublereal &dCoef), MatrixHandler &out, const MatrixHandler &in) const
Definition: naivemh.cc:398
virtual ~NaivePermMatrixHandler(void)
Definition: naivemh.cc:572
const NaiveMatrixHandler & m
Definition: naivemh.h:76
doublereal ** ppdRows
Definition: naivemh.h:60
virtual MatrixHandler & MatTMatMul_base(void(MatrixHandler::*op)(integer iRow, integer iCol, const doublereal &dCoef), MatrixHandler &out, const MatrixHandler &in) const
Definition: naivemh.cc:638
const NaiveMatrixHandler::const_iterator & operator++(void) const
Definition: naivemh.cc:492
SparseMatrixHandler::SparseMatrixElement elem
Definition: naivemh.h:78
integer * piNzr
Definition: naivemh.h:63
virtual void Resize(integer, integer)
Definition: naivemh.h:122
#define MBDYN_EXCEPT_ARGS
Definition: except.h:63
const_iterator m_end
Definition: naivemh.h:246
NaiveMatrixHandler::const_iterator begin(void) const
Definition: naivemh.h:97
integer iGetNumCols(void) const
Definition: naivemh.h:115
virtual const doublereal & operator()(integer iRow, integer iCol) const
Definition: naivemh.h:274
integer ** ppiRows
Definition: naivemh.h:61
const NaiveMatrixHandler::const_iterator & end(void) const
Definition: naivemh.h:101
virtual ~NaiveMatrixHandler(void)
Definition: naivemh.cc:109
integer * piNzc
Definition: naivemh.h:63
bool operator==(const NaivePermMatrixHandler::const_iterator &op) const
Definition: naivemh.cc:796
char ** ppnonzero
Definition: naivemh.h:62
const_iterator m_end
Definition: naivemh.h:94
bool operator==(const NaiveMatrixHandler::const_iterator &op) const
Definition: naivemh.cc:523
#define NO_OP
Definition: myassert.h:74
const SparseMatrixHandler::SparseMatrixElement & operator*(void) const
Definition: naivemh.cc:517
const NaivePermMatrixHandler::const_iterator & end(void) const
Definition: naivemh.h:253
const std::vector< integer > & perm
Definition: naivemh.h:213
virtual VectorHandler & MatTVecMul_base(void(VectorHandler::*op)(integer iRow, const doublereal &dCoef), VectorHandler &out, const VectorHandler &in) const
Definition: naivemh.cc:698
virtual MatrixHandler & MatMatMul_base(void(MatrixHandler::*op)(integer iRow, integer iCol, const doublereal &dCoef), MatrixHandler &out, const MatrixHandler &in) const
Definition: naivemh.cc:605
const SparseMatrixHandler::SparseMatrixElement & operator*(void) const
Definition: naivemh.cc:790
const std::vector< integer > & GetPerm(void) const
Definition: naivemh.cc:578
bool operator!=(const NaivePermMatrixHandler::const_iterator &op) const
Definition: naivemh.cc:802
friend class ParNaiveSolver
Definition: naivemh.h:50
NaiveMatrixHandler(const NaiveMatrixHandler &)
integer ** ppiCols
Definition: naivemh.h:61
friend void * sum_naive_matrices(void *arg)
const doublereal Zero1
SparseMatrixHandler::SparseMatrixElement elem
Definition: naivemh.h:229
void reset(bool is_end=false)
Definition: naivemh.cc:458
#define ASSERT(expression)
Definition: colamd.c:977
const SparseMatrixHandler::SparseMatrixElement * operator->(void) const
Definition: naivemh.cc:511
virtual const doublereal & operator()(integer iRow, integer iCol) const
Definition: naivemh.h:173
virtual VectorHandler & MatVecMul_base(void(VectorHandler::*op)(integer iRow, const doublereal &dCoef), VectorHandler &out, const VectorHandler &in) const
Definition: naivemh.cc:422
NaivePermMatrixHandler(integer iSize, const std::vector< integer > &tperm, const std::vector< integer > &invperm)
Definition: naivemh.cc:538
const NaivePermMatrixHandler::const_iterator & operator++(void) const
Definition: naivemh.cc:765
const_iterator(const NaivePermMatrixHandler &m)
Definition: naivemh.cc:739
virtual MatrixHandler & MatMatMul_base(void(MatrixHandler::*op)(integer iRow, integer iCol, const doublereal &dCoef), MatrixHandler &out, const MatrixHandler &in) const
Definition: naivemh.cc:375
virtual MatrixHandler & operator-=(const SubMatrixHandler &SubMH)
Definition: naivemh.cc:195
virtual VectorHandler & MatVecMul_base(void(VectorHandler::*op)(integer iRow, const doublereal &dCoef), VectorHandler &out, const VectorHandler &in) const
Definition: naivemh.cc:671
virtual MatrixHandler & operator+=(const SubMatrixHandler &SubMH)
Definition: naivemh.cc:168
const std::vector< integer > & invperm
Definition: naivemh.h:214
const SparseMatrixHandler::SparseMatrixElement * operator->(void) const
Definition: naivemh.cc:784
void MakeCCStructure(std::vector< integer > &Ai, std::vector< integer > &Ap)
Definition: naivemh.cc:353
virtual VectorHandler & MatTVecMul_base(void(VectorHandler::*op)(integer iRow, const doublereal &dCoef), VectorHandler &out, const VectorHandler &in) const
Definition: naivemh.cc:440
void reset(bool is_end=false)
Definition: naivemh.cc:725
double doublereal
Definition: colamd.c:52
const_iterator(const NaiveMatrixHandler &m, bool is_end=false)
Definition: naivemh.cc:480
long int integer
Definition: colamd.c:51
const NaivePermMatrixHandler & m
Definition: naivemh.h:227
bool operator!=(const NaiveMatrixHandler::const_iterator &op) const
Definition: naivemh.cc:529
integer iSize
Definition: naivemh.h:58
const std::vector< integer > & GetInvPerm(void) const
Definition: naivemh.cc:591
NaivePermMatrixHandler::const_iterator begin(void) const
Definition: naivemh.h:249