MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
matvecexp.h
Go to the documentation of this file.
1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/libraries/libmbmath/matvecexp.h,v 1.29 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) 1996-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  * HmFe (C) is a FEM analysis code.
35  *
36  * Copyright (C) 1996-2017
37  *
38  * Marco Morandini <morandini@aero.polimi.it>
39  * Teodoro Merlini <merlini@aero.polimi.it>
40  *
41  * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano
42  * via La Masa, 34 - 20156 Milano, Italy
43  * http://www.aero.polimi.it
44  *
45  * Changing this copyright notice is forbidden.
46  * This program is distributed in the hope that it will be useful,
47  * but WITHOUT ANY WARRANTY; without even the implied warranty of
48  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
49  *
50  */
51 
52 #ifndef MATVECEXP_H
53 #define MATVECEXP_H
54 
55 #include "matvec3.h"
56 #include "matvec6.h"
57 
58 /* forward declaration */
59 class ScalExp;
60 class VecExp;
61 class MatExp;
62 
63 class ScalExp {
64 protected:
67 
68 public:
69  ScalExp(void) {
70  NO_OP;
71  };
72 
73  ~ScalExp(void) {
74  NO_OP;
75  };
76 
77  ScalExp(const ScalExp& vin) {
78  vec = vin.vec;
79  mom = vin.mom;
80  };
81 
83  const doublereal& d1,
84  const doublereal& d2 = 0.
85  ) {
86  vec = d1;
87  mom = d2;
88  };
89 
90  inline const doublereal& GetVec(void) const {
91  return vec;
92  };
93 
94  inline const doublereal& GetMom(void) const {
95  return mom;
96  };
97 
98  inline void PutVec(const doublereal& x) {
99  vec = x;
100  };
101 
102  inline void PutMom(const doublereal& x) {
103  mom = x;
104  };
105 
106  inline ScalExp& operator = (const ScalExp& v) {
107  vec = v.vec;
108  mom = v.mom;
109  return *this;
110  };
111 
112  inline ScalExp& operator += (const ScalExp& v) {
113  vec += v.vec;
114  mom += v.mom;
115  return *this;
116  };
117 
118  inline ScalExp& operator -= (const ScalExp& v) {
119  vec -= v.vec;
120  mom -= v.mom;
121  return *this;
122  };
123 
124  inline ScalExp operator + (void) const {
125  return *this;
126  };
127 
128  inline ScalExp operator - (void) const {
129  return ScalExp(-vec, -mom);
130  };
131 
132  inline ScalExp operator + (const ScalExp& v) const {
133  return ScalExp(vec+v.vec, mom+v.mom);
134  };
135 
136  inline ScalExp operator - (const ScalExp& v) const {
137  return ScalExp(vec-v.vec, mom-v.mom);
138  };
139 
140  inline ScalExp operator * (const ScalExp& v) const {
141  return ScalExp(vec*v.vec,mom*v.vec+vec*v.mom);;
142  };
143 
144  inline ScalExp operator / (const ScalExp& v) const {
145  return ScalExp(vec/v.vec,(mom*v.vec-vec*v.mom)/(v.vec*v.vec));
146  };
147 
148 
149  std::ostream&
150  Write(std::ostream& out, const char* sFill = " ") const;
151 };
152 
153 extern ScalExp pow(const ScalExp &d, const doublereal &e);
154 extern ScalExp sqrt(const ScalExp &d);
155 extern ScalExp sin(const ScalExp &d);
156 extern ScalExp cos(const ScalExp &d);
157 extern ScalExp exp(const ScalExp &d);
158 //extern ScalExp operator + (const ScalExp& v);
159 //extern ScalExp operator - (const ScalExp& v);
160 extern std::ostream& operator << (std::ostream& out, const ScalExp& v);
161 extern std::ostream& Write(std::ostream& out, const ScalExp& v, const char* sFill = " ");
162 
163 
164 
165 class VecExp {
166 protected:
169 
170 public:
171  VecExp(void) {
172  NO_OP;
173  };
174 
175  ~VecExp(void) {
176  NO_OP;
177  };
178 
179  VecExp(const VecExp& vin) : vec(vin.vec), mom(vin.mom) {
180  NO_OP;
181  };
182 
183  VecExp(const Vec6& vin) : vec(vin.GetVec1()), mom(vin.GetVec2()) {
184  NO_OP;
185  };
186 
187  VecExp(const doublereal& d1, const doublereal& d2,
188  const doublereal& d3, const doublereal& d4,
189  const doublereal& d5, const doublereal& d6)
190  : vec(Vec3(d1, d2, d3)), mom(Vec3(d4, d5, d6)) {
191  NO_OP;
192  };
193 
194  VecExp(const Vec3& v1, const Vec3& v2) : vec(v1), mom(v2) {
195  NO_OP;
196  };
197 
198  inline const Vec3& GetVec(void) const {
199  return vec;
200  };
201 
202  inline const Vec3& GetMom(void) const {
203  return mom;
204  };
205 
206  inline void PutVec(const Vec3& x) {
207  vec = x;
208  };
209 
210  inline void PutMom(const Vec3& x) {
211  mom = x;
212  };
213 
214  inline VecExp& operator = (const VecExp& v) {
215  vec = v.vec;
216  mom = v.mom;
217  return *this;
218  };
219 
220  inline VecExp& operator += (const VecExp& v) {
221  vec += v.vec;
222  mom += v.mom;
223  return *this;
224  };
225 
226  inline VecExp& operator -= (const VecExp& v) {
227  vec -= v.vec;
228  mom -= v.mom;
229  return *this;
230  };
231 
233  //M> ma si guadagna? spero di no, chi e' cosi' fessacchiotto
234  //M> da moltiplicare spesso
235  //M> per 1. o per zero di questi tempi?
236  //P> tutte le volte che moltiplichi per una variabile
237  //P> di cui non conosci il valore (forse sono paranoico ...)
238 #ifdef __MBDYN_PARANOID__
239  if (d == 1.) {
240  return *this; /* No operations */
241  }
242  if (d == 0.) {
243  vec = Vec3(0.); /* Reset vector */
244  mom = Vec3(0.);
245  return *this;
246  }
247  /* else */
248 #endif /* __MBDYN_PARANOID__ */
249  vec *= d; /* Multiply */
250  mom *= d;
251  return *this;
252  };
253 
255 #ifdef __MBDYN_PARANOID__
256  if (d == 1.) {
257  return *this; /* No operations */
258  }
259  if (d == 0.) {
260  throw ErrDivideByZero(MBDYN_EXCEPT_ARGS); /* error */
261  }
262  /* else */
263 #endif /* __MBDYN_PARANOID__ */
264  vec /= d; /* divide */
265  mom /= d;
266  return *this;
267  };
268 
269  inline VecExp operator + (const VecExp& v) const {
270  return VecExp(vec+v.vec, mom+v.mom);
271  };
272 
273  inline VecExp operator - (const VecExp& v) const {
274  return VecExp(vec-v.vec, mom-v.mom);
275  };
276 
277  inline VecExp operator * (const doublereal& d) const {
278  return VecExp(vec*d, mom*d);
279  };
280 
281  inline VecExp operator / (const doublereal& d) const {
282  ASSERT(d != 0.);
283  return VecExp(vec/d, mom/d);
284  };
285 
286  inline VecExp operator * (const ScalExp& d) const {
287  return VecExp(vec*d.GetVec(), mom*d.GetVec()+vec*d.GetMom());
288  };
289 
290  inline VecExp operator / (const ScalExp& d) const {
291  ASSERT(d.GetVec() != 0.);
292  return VecExp(vec/d.GetVec(),
293  (mom*d.GetVec()-vec*d.GetMom())/(d.GetVec()*d.GetVec()));
294  };
295 
296  inline ScalExp operator * (const VecExp& v) const {
297  return ScalExp(vec*v.vec, mom*v.vec+vec*v.mom);
298  };
299 
300  inline VecExp Cross(const VecExp &v) const {
301  return VecExp(vec.Cross(v.vec),
302  vec.Cross(v.mom)+mom.Cross(v.vec));
303  };
304 
305  inline MatExp Cross(void) const;
306 
307  inline MatExp Tens(const VecExp &v) const;
308 
309  std::ostream& Write(std::ostream& out, const char* sFill = " ") const;
310 };
311 
312 extern VecExp operator + (const VecExp& v);
313 extern VecExp operator - (const VecExp& v);
314 extern std::ostream& operator << (std::ostream& out, const VecExp& v);
315 extern std::ostream& Write(std::ostream& out, const VecExp& v, const char* sFill = " ");
316 
317 
318 class MatExp {
319 protected:
322 
323 public:
324  MatExp(void) {
325  NO_OP;
326  };
327 
328  ~MatExp(void) {
329  NO_OP;
330  };
331 
332  MatExp(const MatExp& min) : vec(min.vec), mom(min.mom) {
333  NO_OP;
334  };
335 
336  MatExp(const VecExp& vin) {
337  vec = Mat3x3(MatCross, vin.GetVec());
338  mom = Mat3x3(MatCross, vin.GetMom());
339  };
340 
341  MatExp(const VecExp& v1, const VecExp& v2) {
342  vec = Mat3x3(MatCrossCross, v1.GetVec(), v2.GetVec());
343  mom = Mat3x3(MatCrossCross, v1.GetMom(), v2.GetVec());
344  mom += Mat3x3(MatCrossCross, v1.GetVec(), v2.GetMom());
345  };
346 
347  MatExp(const doublereal& d, const VecExp& v2) {
348  vec = Mat3x3(d, v2.GetVec());
349  mom = Mat3x3(MatCross, v2.GetMom());
350  };
351 
352  MatExp(const Mat3x3& ma, const Mat3x3& mxa) : vec(ma), mom(mxa) {
353  NO_OP;
354  };
355 
356  inline const Mat3x3& GetVec(void) const {
357  return vec;
358  };
359 
360  inline const Mat3x3& GetMom(void) const {
361  return mom;
362  };
363 
364  inline void PutVec(const Mat3x3& x) {
365  vec = x;
366  };
367 
368  inline void PutMom(const Mat3x3& x) {
369  mom = x;
370  };
371 
372  inline MatExp& operator = (const MatExp& m) {
373  vec = m.vec;
374  mom = m.mom;
375  return *this;
376  };
377 
378  inline MatExp& operator += (const MatExp& v) {
379  vec += v.vec;
380  mom += v.mom;
381  return *this;
382  };
383 
384  inline MatExp& operator -= (const MatExp& v) {
385  vec -= v.vec;
386  mom -= v.mom;
387  return *this;
388  };
389 
390  MatExp operator * (const doublereal& d) const {
391  return MatExp(vec*d, mom*d);
392  };
393 
394  MatExp operator / (const doublereal& d) const {
395  ASSERT(d != 0.);
396  return MatExp(vec/d, mom/d);
397  };
398 
399  VecExp operator * (const VecExp& v) const {
400  return VecExp(vec*v.GetVec(), vec*v.GetMom()+mom*v.GetVec());
401  };
402 
403  MatExp operator * (const MatExp& m) const {
404  return MatExp(vec*m.vec, vec*m.mom+mom*m.vec);
405  };
406 
407  MatExp Transpose(void) const {
408  return MatExp(vec.Transpose(), mom.Transpose());
409  };
410 
411  VecExp Ax(void) const {
412  return VecExp(vec.Ax(),mom.Ax());
413  };
414 
415  /* Scrittura su ostream della matrice */
416  std::ostream& Write(std::ostream& out, const char* sFill = " ",
417  const char* sFill2 = NULL) const;
418 };
419 
420 inline MatExp
421 VecExp::Cross(void) const {
422  return MatExp(Mat3x3(MatCross, vec), Mat3x3(MatCross, mom));
423 }
424 
425 
426 extern std::ostream& operator << (std::ostream& out, const MatExp& m);
427 extern std::ostream& Write(std::ostream& out, const MatExp& m,
428  const char* sFill = " ", const char* sFill2 = NULL);
429 
430 inline MatExp
431 VecExp::Tens(const VecExp &v) const {
432  return MatExp(vec.Tens(v.GetVec()), mom.Tens(v.GetMom()));
433 };
434 
435 
436 //M> questi no ho capito a cosa servono
437 //P> moltiplicano destra/sinistra/entrambi per R e R^t
438 #if 0
439 extern VecExp MultRV(const VecExp& v, const Mat3x3& R);
440 extern MatExp MultRM(const MatExp& m, const Mat3x3& R);
441 extern MatExp MultMRt(const MatExp& m, const Mat3x3& R);
442 extern MatExp MultRMRt(const MatExp& m, const Mat3x3& R);
443 #endif /* 0 */
444 
445 extern const VecExp ZeroExp;
446 extern const MatExp EyeExp;
447 
448 #endif /* MATVECEXP_H */
449 
const Vec3 & GetVec(void) const
Definition: matvecexp.h:198
Mat3x3 MultRMRt(const Mat3x3 &m, const Mat3x3 &R)
Definition: matvec3.cc:1162
VecExp operator+(const VecExp &v)
VecExp operator+(const VecExp &v) const
Definition: matvecexp.h:269
Vec3 Ax(void) const
Definition: matvec3.h:827
std::ostream & Write(std::ostream &out, const ScalExp &v, const char *sFill=" ")
Definition: matvecexp.cc:133
Mat3x3 MultRM(const Mat3x3 &m, const Mat3x3 &R)
Definition: matvec3.cc:1150
Vec3 Cross(const Vec3 &v) const
Definition: matvec3.h:218
const Mat3x3 & GetVec(void) const
Definition: matvecexp.h:356
Vec3 MultRV(const Vec3 &v, const Mat3x3 &R)
Definition: matvec3.cc:1144
VecExp operator-(const VecExp &v)
Definition: matvecexp.cc:151
ScalExp pow(const ScalExp &d, const doublereal &e)
Definition: matvecexp.cc:66
#define MBDYN_EXCEPT_ARGS
Definition: except.h:63
Definition: matvec3.h:98
Mat3x3 MultMRt(const Mat3x3 &m, const Mat3x3 &R)
Definition: matvec3.cc:1156
~ScalExp(void)
Definition: matvecexp.h:73
const MatCross_Manip MatCross
Definition: matvec3.cc:639
MatExp(void)
Definition: matvecexp.h:324
MatExp operator/(const doublereal &d) const
Definition: matvecexp.h:394
VecExp(const Vec3 &v1, const Vec3 &v2)
Definition: matvecexp.h:194
~MatExp(void)
Definition: matvecexp.h:328
ScalExp & operator=(const ScalExp &v)
Definition: matvecexp.h:106
const Vec3 & GetMom(void) const
Definition: matvecexp.h:202
void PutMom(const doublereal &x)
Definition: matvecexp.h:102
ScalExp operator+(void) const
Definition: matvecexp.h:124
#define NO_OP
Definition: myassert.h:74
std::ostream & Write(std::ostream &out, const char *sFill=" ") const
Definition: matvecexp.cc:139
MatExp(const Mat3x3 &ma, const Mat3x3 &mxa)
Definition: matvecexp.h:352
ScalExp(const doublereal &d1, const doublereal &d2=0.)
Definition: matvecexp.h:82
ScalExp(void)
Definition: matvecexp.h:69
MatExp Tens(const VecExp &v) const
Definition: matvecexp.h:431
VecExp(const VecExp &vin)
Definition: matvecexp.h:179
VecExp & operator*=(const doublereal &d)
Definition: matvecexp.h:232
Mat3x3 mom
Definition: matvecexp.h:321
MatExp Cross(void) const
Definition: matvecexp.h:421
const VecExp ZeroExp
VecExp & operator+=(const VecExp &v)
Definition: matvecexp.h:220
std::ostream & Write(std::ostream &out, const char *sFill=" ") const
Definition: matvecexp.cc:110
VecExp & operator-=(const VecExp &v)
Definition: matvecexp.h:226
void PutMom(const Mat3x3 &x)
Definition: matvecexp.h:368
void PutVec(const doublereal &x)
Definition: matvecexp.h:98
Definition: matvec6.h:37
Mat3x3 vec
Definition: matvecexp.h:320
ScalExp & operator+=(const ScalExp &v)
Definition: matvecexp.h:112
const doublereal & GetVec(void) const
Definition: matvecexp.h:90
const doublereal & GetMom(void) const
Definition: matvecexp.h:94
MatExp(const VecExp &v1, const VecExp &v2)
Definition: matvecexp.h:341
VecExp(const doublereal &d1, const doublereal &d2, const doublereal &d3, const doublereal &d4, const doublereal &d5, const doublereal &d6)
Definition: matvecexp.h:187
MatExp & operator-=(const MatExp &v)
Definition: matvecexp.h:384
ScalExp operator*(const ScalExp &v) const
Definition: matvecexp.h:140
ScalExp operator-(void) const
Definition: matvecexp.h:128
VecExp operator*(const doublereal &d) const
Definition: matvecexp.h:277
void PutVec(const Mat3x3 &x)
Definition: matvecexp.h:364
VecExp operator-(const VecExp &v) const
Definition: matvecexp.h:273
MatExp(const doublereal &d, const VecExp &v2)
Definition: matvecexp.h:347
~VecExp(void)
Definition: matvecexp.h:175
#define ASSERT(expression)
Definition: colamd.c:977
Mat3x3 Tens(const Vec3 &v) const
Definition: matvec3.cc:53
VecExp & operator=(const VecExp &v)
Definition: matvecexp.h:214
VecExp operator/(const doublereal &d) const
Definition: matvecexp.h:281
ScalExp sin(const ScalExp &d)
Definition: matvecexp.cc:86
void PutVec(const Vec3 &x)
Definition: matvecexp.h:206
MatExp operator*(const doublereal &d) const
Definition: matvecexp.h:390
MatExp(const MatExp &min)
Definition: matvecexp.h:332
void PutMom(const Vec3 &x)
Definition: matvecexp.h:210
std::ostream & operator<<(std::ostream &out, const ScalExp &v)
Definition: matvecexp.cc:125
MatExp & operator=(const MatExp &m)
Definition: matvecexp.h:372
Vec3 mom
Definition: matvecexp.h:168
doublereal vec
Definition: matvecexp.h:65
doublereal mom
Definition: matvecexp.h:66
VecExp(void)
Definition: matvecexp.h:171
ScalExp & operator-=(const ScalExp &v)
Definition: matvecexp.h:118
Mat3x3 Transpose(void) const
Definition: matvec3.h:816
const MatCrossCross_Manip MatCrossCross
Definition: matvec3.cc:640
MatExp & operator+=(const MatExp &v)
Definition: matvecexp.h:378
VecExp Ax(void) const
Definition: matvecexp.h:411
MatExp(const VecExp &vin)
Definition: matvecexp.h:336
MatExp Transpose(void) const
Definition: matvecexp.h:407
ScalExp exp(const ScalExp &d)
Definition: matvecexp.cc:100
std::ostream & Write(std::ostream &out, const char *sFill=" ", const char *sFill2=NULL) const
Definition: matvecexp.cc:177
const MatExp EyeExp
VecExp Cross(const VecExp &v) const
Definition: matvecexp.h:300
ScalExp(const ScalExp &vin)
Definition: matvecexp.h:77
Vec3 vec
Definition: matvecexp.h:167
double doublereal
Definition: colamd.c:52
VecExp(const Vec6 &vin)
Definition: matvecexp.h:183
const Mat3x3 & GetMom(void) const
Definition: matvecexp.h:360
VecExp & operator/=(const doublereal &d)
Definition: matvecexp.h:254
ScalExp operator/(const ScalExp &v) const
Definition: matvecexp.h:144
Mat3x3 R
ScalExp cos(const ScalExp &d)
Definition: matvecexp.cc:93
ScalExp sqrt(const ScalExp &d)
Definition: matvecexp.cc:79