MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
gravity.h
Go to the documentation of this file.
1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/struct/gravity.h,v 1.45 2017/01/12 14:46:43 masarati Exp $ */
2 /*
3  * MBDyn (C) is a multibody analysis code.
4  * http://www.mbdyn.org
5  *
6  * Copyright (C) 1996-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 /* Accelerazione di gravita'
33  *
34  * Elemento Gravity: contiene direzione e modulo, espresso mediante un driver,
35  * dell'accelerazione di gravita'. E' un elemento unico (ne puo' essere
36  * dichiarato uno solo) ed e' puntato da tutti gli elementi della classe
37  * ElemGravityOwner, ovvero elementi che generano forze di inerzia
38  * (per ora: Body, Beam).
39  *
40  * Vi e' poi la classe GravityOwner, che contiene il puntatore all'elemento
41  * Gravity. Da essa e' derivata la classe ElemGravityOwner. Quando l'elemento
42  * viene costruito il puntatore e' nullo. Al termine della generazione
43  * degli elementi, se e' definito l'elemento Gravity, tutti gli elementi
44  * ElemGravityOwner vengono inizializzati con il puntatore all'elemento
45  * Gravity.
46  *
47  * Si e' scelta la soluzione di un elemento per contenere questi dati
48  * perche' in questo modo si acquista in generalita'. Infatti e' possibile
49  * dare una dinamica all'accelerazione (in vista della generalizzazione del
50  * tipo di elemento) mediante l'aggiunta di gradi di liberta', ecc.
51  *
52  * L'accelerazione e' ottenuta mediante la chiamata della funzione propria
53  * bool bGetGravity(Vec3&) da parte degli elementi ElemGravityOwner.
54  * Il flag dice se e' definita l'accelerazione.
55  * In caso positivo, viene copiata nel vettore passato per reference.
56  */
57 
58 #ifndef GRAVITY_H
59 #define GRAVITY_H
60 
61 #include "elem.h"
62 #include "tpldrive.h"
63 
64 /* Gravity - begin */
65 
66 class Gravity : virtual public Elem {
67 public:
68  Gravity(flag fOut);
69 
70  virtual ~Gravity(void);
71 
72  /* Tipo dell'elemento (usato solo per debug ecc.) */
73  virtual Elem::Type GetElemType(void) const {
74  return Elem::GRAVITY;
75  };
76 
77  /* funzioni di servizio */
78 
79  /* Il metodo iGetNumDof() serve a ritornare il numero di gradi di liberta'
80  * propri che l'elemento definisce. Non e' virtuale in quanto serve a
81  * ritornare 0 per gli elementi che non possiedono gradi di liberta'.
82  * Viene usato nella costruzione dei DofOwner e quindi deve essere
83  * indipendente da essi. In genere non comporta overhead in quanto il
84  * numero di dof aggiunti da un tipo e' una costante e non richede dati
85  * propri.
86  * Il metodo pGetDofOwner() ritorna il puntatore al DofOwner dell'oggetto.
87  * E' usato da tutti quelli che agiscono direttamente sui DofOwner.
88  * Non e' virtuale in quanto ritorna NULL per tutti i tipi che non hanno
89  * dof propri.
90  * Il metodo GetDofType() ritorna, per ogni dof dell'elemento, l'ordine.
91  * E' usato per completare i singoli Dof relativi all'elemento.
92  */
93 
94  /* funzioni proprie */
95 
96  /* Dimensioni del workspace */
97  virtual void WorkSpaceDim(integer* piNumRows, integer* piNumCols) const {
98  *piNumRows = 0;
99  *piNumCols = 0;
100  };
101 
102  /* assemblaggio jacobiano */
103  virtual VariableSubMatrixHandler&
105  doublereal dCoef,
106  const VectorHandler& XCurr,
107  const VectorHandler& XPrimeCurr);
108 
109  /* assemblaggio residuo */
110  virtual SubVectorHandler& AssRes(SubVectorHandler& WorkVec,
111  doublereal dCoef,
112  const VectorHandler& XCurr,
113  const VectorHandler& XPrimeCurr);
114 
115  virtual Vec3 GetAcceleration(const Vec3& /* X */ ) const = 0;
116 
117  virtual inline int GetNumConnectedNodes(void) const {
118  return 0;
119  };
120 };
121 
122 /* Gravity - end */
123 
124 
125 /* UniformGravity - begin */
126 
127 class UniformGravity : virtual public Elem, public Gravity, public TplDriveOwner<Vec3> {
128 protected:
130 
131 public:
132  UniformGravity(const TplDriveCaller<Vec3>* pDC, flag fOut);
133 
134  virtual ~UniformGravity(void);
135 
136  /* Scrive il contributo dell'elemento al file di restart */
137  virtual std::ostream& Restart(std::ostream& out) const;
138 
139  /* funzioni di servizio */
140 
141  /* Il metodo iGetNumDof() serve a ritornare il numero di gradi di liberta'
142  * propri che l'elemento definisce. Non e' virtuale in quanto serve a
143  * ritornare 0 per gli elementi che non possiedono gradi di liberta'.
144  * Viene usato nella costruzione dei DofOwner e quindi deve essere
145  * indipendente da essi. In genere non comporta overhead in quanto il
146  * numero di dof aggiunti da un tipo e' una costante e non richede dati
147  * propri.
148  * Il metodo pGetDofOwner() ritorna il puntatore al DofOwner dell'oggetto.
149  * E' usato da tutti quelli che agiscono direttamente sui DofOwner.
150  * Non e' virtuale in quanto ritorna NULL per tutti i tipi che non hanno
151  * dof propri.
152  * Il metodo GetDofType() ritorna, per ogni dof dell'elemento, l'ordine.
153  * E' usato per completare i singoli Dof relativi all'elemento.
154  */
155 
156  /* funzioni proprie */
157 
158  /* assemblaggio residuo */
159  virtual SubVectorHandler& AssRes(SubVectorHandler& WorkVec,
160  doublereal dCoef,
161  const VectorHandler& XCurr,
162  const VectorHandler& XPrimeCurr);
163 
164  virtual void Output(OutputHandler& OH) const;
165 
166  virtual Vec3 GetAcceleration(const Vec3& /* X */ ) const {
167  return Acc;
168  };
169 };
170 
171 /* UniformGravity - end */
172 
173 
174 /* CentralGravity - begin */
175 
176 class CentralGravity : virtual public Elem, public Gravity {
177 protected:
182 
183 public:
184  CentralGravity(const Vec3& X0, doublereal dM, doublereal dG, flag fOut);
185 
186  virtual ~CentralGravity(void);
187 
188  /* Scrive il contributo dell'elemento al file di restart */
189  virtual std::ostream& Restart(std::ostream& out) const;
190 
191  /* funzioni proprie */
192 
193  virtual void Output(OutputHandler& OH) const;
194 
195  virtual Vec3 GetAcceleration(const Vec3& X) const;
196 };
197 
198 /* CentralGravity - end */
199 
200 
201 /* GravityOwner - begin */
202 
203 /* Classe base di elementi che generano forze di inerzia */
204 
206 protected:
207  mutable Gravity* pGravity;
208 
209 public:
210  GravityOwner(void);
211  virtual ~GravityOwner(void);
212 
213  void PutGravity(const Gravity* pG);
214  virtual bool bGetGravity(const Vec3& X, Vec3& Acc) const;
215 };
216 
217 /* GravityOwner - end */
218 
219 
220 /* ElemGravityOwner - begin */
221 
222 class ElemGravityOwner : virtual public Elem, public GravityOwner {
223  friend class NestedElem;
224 
225 protected:
226 
227  /*
228  * momento statico e momento di inerzia nel sistema globale
229  */
230  virtual Vec3 GetS_int(void) const {
231  pedantic_cerr("ElemGravityOwner(" << GetLabel() << "): "
232  "warning, using default GetS_int()" << std::endl);
234  };
235 
236  virtual Mat3x3 GetJ_int(void) const {
237  pedantic_cerr("ElemGravityOwner(" << GetLabel() << "): "
238  "warning, using default GetJ_int()" << std::endl);
240  };
241 
242  virtual Vec3 GetB_int(void) const {
243  pedantic_cerr("ElemGravityOwner(" << GetLabel() << "): "
244  "warning, using default GetB_int()" << std::endl);
246  };
247 
248  // NOTE: gravity owners must provide the momenta moment
249  // with respect to the origin of the global reference frame!
250  virtual Vec3 GetG_int(void) const {
251  pedantic_cerr("ElemGravityOwner(" << GetLabel() << "): "
252  "warning, using default GetG_int()" << std::endl);
254  };
255 
256 public:
257  ElemGravityOwner(unsigned int uL, flag fOut);
258  virtual ~ElemGravityOwner(void);
259 
260  /* Usata per inizializzare la quantita' di moto */
261  virtual void
262  SetValue(DataManager *pDM,
264  SimulationEntity::Hints *ph = 0) = 0;
265 
266  /*
267  * massa
268  */
269  virtual doublereal dGetM(void) const {
270  return 0.;
271  };
272 
273  Vec3 GetS(void) const {
274  return GetS_int();
275  };
276 
277  Mat3x3 GetJ(void) const {
278  return GetJ_int();
279  };
280 
281  Vec3 GetB(void) const {
282  return GetB_int();
283  };
284 
285  Vec3 GetG(void) const {
286  return GetG_int();
287  };
288 
289 #ifdef DEBUG
290  virtual flag fIsElemGravityOwner(void) const {
291  return flag(1);
292  };
293 #endif // DEBUG
294 };
295 
296 /* ElemGravityOwner - end */
297 
298 extern Elem *
300 
301 #endif // GRAVITY_H
doublereal m_dM
Definition: gravity.h:179
virtual doublereal dGetM(void) const
Definition: gravity.h:269
virtual Vec3 GetG_int(void) const
Definition: gravity.h:250
const Vec3 Zero3(0., 0., 0.)
long int flag
Definition: mbdyn.h:43
Definition: matvec3.h:98
virtual ~Gravity(void)
Definition: gravity.cc:47
void PutGravity(const Gravity *pG)
Definition: gravity.cc:201
virtual void Output(OutputHandler &OH) const
Definition: gravity.cc:160
virtual ~CentralGravity(void)
Definition: gravity.cc:143
virtual Vec3 GetS_int(void) const
Definition: gravity.h:230
virtual Elem::Type GetElemType(void) const
Definition: gravity.h:73
doublereal m_dG
Definition: gravity.h:180
virtual bool bGetGravity(const Vec3 &X, Vec3 &Acc) const
Definition: gravity.cc:208
ElemGravityOwner(unsigned int uL, flag fOut)
Definition: gravity.cc:223
std::vector< Hint * > Hints
Definition: simentity.h:89
virtual Mat3x3 GetJ_int(void) const
Definition: gravity.h:236
Vec3 GetB(void) const
Definition: gravity.h:281
virtual VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Definition: gravity.cc:54
virtual Vec3 GetAcceleration(const Vec3 &) const =0
Gravity(flag fOut)
Definition: gravity.cc:41
Mat3x3 GetJ(void) const
Definition: gravity.h:277
const Mat3x3 Zero3x3(0., 0., 0., 0., 0., 0., 0., 0., 0.)
Elem * ReadGravity(DataManager *pDM, MBDynParser &HP)
Definition: gravity.cc:237
virtual ~GravityOwner(void)
Definition: gravity.cc:194
virtual Vec3 GetAcceleration(const Vec3 &X) const
Definition: gravity.cc:175
Gravity * pGravity
Definition: gravity.h:207
virtual std::ostream & Restart(std::ostream &out) const
Definition: gravity.cc:150
virtual void SetValue(DataManager *pDM, VectorHandler &X, VectorHandler &XP, SimulationEntity::Hints *ph=0)=0
UniformGravity(const TplDriveCaller< Vec3 > *pDC, flag fOut)
Definition: gravity.cc:81
virtual std::ostream & Restart(std::ostream &out) const
Definition: gravity.cc:94
virtual void Output(OutputHandler &OH) const
Definition: gravity.cc:121
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Definition: gravity.h:97
Vec3 GetS(void) const
Definition: gravity.h:273
GravityOwner(void)
Definition: gravity.cc:187
doublereal m_dThreshold
Definition: gravity.h:181
CentralGravity(const Vec3 &X0, doublereal dM, doublereal dG, flag fOut)
Definition: gravity.cc:136
virtual ~UniformGravity(void)
Definition: gravity.cc:87
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Definition: gravity.cc:102
Definition: elem.h:75
Type
Definition: elem.h:91
virtual Vec3 GetB_int(void) const
Definition: gravity.h:242
virtual Vec3 GetAcceleration(const Vec3 &) const
Definition: gravity.h:166
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Definition: gravity.cc:66
double doublereal
Definition: colamd.c:52
Vec3 GetG(void) const
Definition: gravity.h:285
long int integer
Definition: colamd.c:51
unsigned int GetLabel(void) const
Definition: withlab.cc:62
virtual int GetNumConnectedNodes(void) const
Definition: gravity.h:117
virtual ~ElemGravityOwner(void)
Definition: gravity.cc:229