MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
loadable.h
Go to the documentation of this file.
1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/base/loadable.h,v 1.51 2017/05/12 17:28:14 morandini 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 #ifndef LOADABLE_H
33 #define LOADABLE_H
34 
35 /*
36  * Policy for LOADABLE_VERSION changes:
37  * <maj> is increased when major changes in element API occur
38  * <min> is increased when loadable elements data structure
39  * changes (e.g. a new call is added)
40  * <fix> is increased when minor fixes are added to loadable
41  * elements handling, which do not involve data
42  * structure changes.
43  */
44 
45 #define LOADABLE_VERSION_SET(maj, min, fix) \
46  (((maj) << 24) | ((min) << 16) | (fix))
47 #define LOADABLE_VERSION LOADABLE_VERSION_SET(1, 5, 0)
48 #define LOADABLE_VERSION_OUT(v) \
49  ((v & 0xFF000000U) >> 24) << '.' << ((v & 0x00FF0000U) >> 16) << '.' << (v & 0x0000FFFFU)
50 /*
51  * CHANGELOG:
52  * 2006-02-08: 1.5.0 changed connectivity API
53  * 2005-10-11: 1.4.0 changed SetValue API (hints and so...)
54  * 2004-06-13: 1.3.0 allow modules to be statically linked
55  * 2004-05-21: 1.2.0 added hooks for dummy part output calls
56  * 2003-02-25: 1.1.0 added hook for iGetPrivDataIdx()
57  * 2002-XX-XX: 1.0.0 added versioning system to detect structure conflicts
58  */
59 
60 #ifdef USE_RUNTIME_LOADING
61 #include <ltdl.h>
62 #endif // USE_RUNTIME_LOADING
63 
64 #include "userelem.h"
65 
66 /*
67  * Dynamically loadable element
68  *
69  * fornisce l'interfaccia ad un modulo a parte e compilato come shared library
70  * che deve provvedere le funzioni desiderate dell'elemento, altrimenti
71  * vengono usate funzioni di default.
72  * Deve provvedere altresi' una routine di input che legge da MBDynParser i
73  * dati richiesti dall'interno del costruttore e li mette in una struttura
74  * di dati privati che l'elemento vede come un (void *) .
75  * Le funzioni da fornire seguono uno schema di denominazione standard.
76  * Al momento: un modulo contiene un solo elemento, le funzioni
77  * hanno il nome in "stile C", ovvero AssRes diventa ass_res.
78  * Gli argomenti sono gli stessi della funzione della classe Elem,
79  * ma sono preceduti da un puntatore all'elemento stesso:
80  *
81  * LoadableElem::AssRes(SubVectorHandler&,
82  * doublereal,
83  * const VectorHandler&,
84  * const VectorHandler&)
85  *
86  * diventa
87  *
88  * ass_res(LoadableElem*,
89  * SubVectorHandler&,
90  * doublereal,
91  * const VectorHandler&,
92  * const VectorHandler&)
93  *
94  * La funzione di ingresso dati e':
95  *
96  * void *read(LoadableElem*,
97  * DataManager*,
98  * MBDynParser&)
99  *
100  * in questo modo, tramite il puntatore all'elemento, si ha accesso
101  * a tutti i dati dell'elemento;
102  * rimane da studiare la questione dei diritti di accesso.
103  */
104 
105 class LoadableElem;
106 
107 typedef void *
109 typedef unsigned int (* p_i_get_num_dof)(const LoadableElem*);
110 typedef DofOrder::Order (* p_set_dof)(const LoadableElem*, unsigned int);
111 typedef void (* p_output)(const LoadableElem*, OutputHandler&);
112 typedef std::ostream& (* p_restart)(const LoadableElem*, std::ostream&);
113 typedef void (* p_work_space_dim)(const LoadableElem*, integer*, integer*);
116  const VectorHandler&, const VectorHandler&);
117 typedef void
119  VariableSubMatrixHandler&,
120  const VectorHandler&, const VectorHandler&);
121 typedef SubVectorHandler&
123  const VectorHandler&, const VectorHandler&);
124 typedef void
125 (* p_before_predict)(const LoadableElem* pEl,
126  VectorHandler& X, VectorHandler& XP,
127  VectorHandler& XPrev, VectorHandler& XPPrev);
128 typedef void
129 (* p_after_predict)(const LoadableElem* pEl,
130  VectorHandler& X, VectorHandler& XP);
131 typedef void
132 (* p_update)(LoadableElem* pEl,
133  const VectorHandler& X, const VectorHandler& XP);
134 typedef void
135 (* p_after_convergence)(const LoadableElem* pEl,
136  const VectorHandler& X, const VectorHandler& XP);
137 typedef unsigned int (* p_i_get_initial_num_dof)(const LoadableElem*);
138 typedef void
139 (* p_initial_work_space_dim)(const LoadableElem*, integer*, integer*);
140 typedef VariableSubMatrixHandler&
141 (* p_initial_ass_jac)(LoadableElem*, VariableSubMatrixHandler &,
142  const VectorHandler&);
143 typedef SubVectorHandler&
144 (* p_initial_ass_res)(LoadableElem*, SubVectorHandler&, const VectorHandler&);
145 typedef void
146 (* p_set_value)(const LoadableElem*, DataManager *pDM,
147  VectorHandler&, VectorHandler&,
149 typedef void (* p_set_initial_value)(const LoadableElem*, VectorHandler&);
150 typedef unsigned int (* p_i_get_num_priv_data)(const LoadableElem* pEl);
151 typedef unsigned int
152 (* p_i_get_priv_data_idx)(const LoadableElem* pEl, const char *);
153 typedef doublereal
154 (* p_d_get_priv_data)(const LoadableElem* pEl, unsigned int i);
155 typedef int (* p_i_get_num_connected_nodes)(const LoadableElem*);
156 typedef void
157 (* p_get_connected_nodes)(const LoadableElem*,
158  std::vector<const Node *>& connectedNodes);
159 typedef void (* p_destroy)(LoadableElem*);
160 
161 /*
162  * Struttura che contiene le chiamate alle funzioni del modulo;
163  * e' l'unico contatto tra modulo ed elemento caricato runtime.
164  * Se un puntatore e' vuoto, viene riempito con il metodo di default.
165  */
167  /*
168  * This is mandatory; use the macro
169 
170  LOADABLE_VERSION_SET(major, minor, fix)
171 
172  * to initialize to the API version your module is using.
173  */
174  unsigned long loadable_version;
175 
176  /*
177  * These are optional; they are printed at module loading
178  * for informational purposes.
179  */
180  const char * name;
181  const char * version;
182  const char * vendor;
183  const char * description;
184 
185  /*
186  * This is mandatory; use it to initialize and read any data
187  * from the input stream.
188  */
190 
191  /*
192  * These are optional; fill-in as required by your module.
193  */
217 
219 
220 };
221 
222 class LoadableElem :
223  virtual public Elem,
224  public UserDefinedElem
225 {
226 protected:
227  void* priv_data; /* Dati privati passati alle funzioni */
228  char* module_name; /* Nome del modulo */
229 #ifdef USE_RUNTIME_LOADING
230  lt_dlhandle handle;
231 #endif // USE_RUNTIME_LOADING
232  LoadableCalls *calls; /* Simboli delle funzioni attese */
233 
234  void GetCalls(MBDynParser& HP);
235  void BindCalls(DataManager* pDM, MBDynParser& HP);
236 
237 public:
238  LoadableElem(unsigned int uLabel, const DofOwner* pDO,
239  DataManager* pDM, MBDynParser& HP);
240  LoadableElem(unsigned int uLabel, const DofOwner* pDO,
241  const LoadableCalls *c,
242  DataManager* pDM, MBDynParser& HP);
243  ~LoadableElem(void);
244 
245  inline void* pGetData(void) const;
246 
247  virtual unsigned int iGetNumDof(void) const;
248  virtual DofOrder::Order GetDofType(unsigned int i) const;
249 
250  virtual void Output(OutputHandler& OH) const;
251  virtual std::ostream& Restart(std::ostream& out) const;
252 
253  virtual void WorkSpaceDim(integer* piNumRows, integer* piNumCols) const;
254  virtual VariableSubMatrixHandler&
255  AssJac(VariableSubMatrixHandler& WorkMat,
256  doublereal dCoef,
257  const VectorHandler& XCurr,
258  const VectorHandler& XPrimeCurr);
259  virtual void
260  AssMats(VariableSubMatrixHandler& WorkMatA,
261  VariableSubMatrixHandler& WorkMatB,
262  const VectorHandler& XCurr,
263  const VectorHandler& XPrimeCurr);
264  virtual SubVectorHandler& AssRes(SubVectorHandler& WorkVec,
265  doublereal dCoef,
266  const VectorHandler& XCurr,
267  const VectorHandler& XPrimeCurr);
268 
269  virtual void BeforePredict(VectorHandler& X,
270  VectorHandler& XP,
271  VectorHandler& XPrev,
272  VectorHandler& XPPrev) const;
273  virtual void AfterPredict(VectorHandler& X,
274  VectorHandler& XP);
275  virtual void Update(const VectorHandler& XCurr,
276  const VectorHandler& XPrimeCurr);
277  virtual void AfterConvergence(const VectorHandler& X,
278  const VectorHandler& XP);
279 
280  virtual unsigned int iGetInitialNumDof(void) const;
281  virtual void
282  InitialWorkSpaceDim(integer* piNumRows, integer* piNumCols) const;
283  VariableSubMatrixHandler&
284  InitialAssJac(VariableSubMatrixHandler& WorkMat,
285  const VectorHandler& XCurr);
286  SubVectorHandler&
287  InitialAssRes(SubVectorHandler& WorkVec, const VectorHandler& XCurr);
288  virtual void SetInitialValue(VectorHandler& X);
289 
290  virtual void SetValue(DataManager *pDM,
291  VectorHandler& X, VectorHandler& XP,
292  SimulationEntity::Hints *ph = 0);
293 
294  virtual unsigned int iGetNumPrivData(void) const;
295  virtual unsigned int iGetPrivDataIdx(const char *s) const;
296  virtual doublereal dGetPrivData(unsigned int i) const;
297 
298  /* *******PER IL SOLUTORE BLOCK JACOBI-BROYDEN******** */
299  /*
300  * Fornisce il tipo e la label dei nodi che sono connessi all'elemento
301  * utile per l'assemblaggio della matrice di connessione fra i dofs
302  */
303  virtual int GetNumConnectedNodes(void) const;
304  virtual void GetConnectedNodes(std::vector<const Node *>& connectedNodes) const;
305  /* ************************************************ */
306 
307 };
308 
309 inline void*
311 {
312  return priv_data;
313 }
314 
315 class DataManager;
316 class MBDynParser;
317 
318 // base class for user-defined element parsing
320  virtual ~LoadableElemRead( void ) { NO_OP; };
321  virtual UserDefinedElem *
322  Read(unsigned uLabel, const DofOwner* pDO,
323  DataManager* const pDM, MBDynParser& HP) const;
324 };
325 
326 extern Elem*
328  const DofOwner* pDO, unsigned int uLabel);
329 
330 #endif // LOADABLE_H
virtual int GetNumConnectedNodes(void) const
Definition: loadable.cc:667
p_set_dof set_dof
Definition: loadable.h:195
void(* p_destroy)(LoadableElem *)
Definition: loadable.h:159
doublereal(* p_d_get_priv_data)(const LoadableElem *pEl, unsigned int i)
Definition: loadable.h:154
p_work_space_dim work_space_dim
Definition: loadable.h:198
~LoadableElem(void)
Definition: loadable.cc:479
p_set_initial_value set_initial_value
Definition: loadable.h:211
virtual unsigned int iGetInitialNumDof(void) const
Definition: loadable.cc:600
p_get_connected_nodes get_connected_nodes
Definition: loadable.h:216
p_i_get_num_dof i_get_num_dof
Definition: loadable.h:194
void(* p_work_space_dim)(const LoadableElem *, integer *, integer *)
Definition: loadable.h:113
const char * version
Definition: loadable.h:181
void * pGetData(void) const
Definition: loadable.h:310
virtual void GetConnectedNodes(std::vector< const Node * > &connectedNodes) const
Definition: loadable.cc:674
unsigned int(* p_i_get_num_dof)(const LoadableElem *)
Definition: loadable.h:109
unsigned int(* p_i_get_priv_data_idx)(const LoadableElem *pEl, const char *)
Definition: loadable.h:152
virtual std::ostream & Restart(std::ostream &out) const
Definition: loadable.cc:519
virtual unsigned int iGetPrivDataIdx(const char *s) const
Definition: loadable.cc:653
p_read read
Definition: loadable.h:189
virtual void AssMats(VariableSubMatrixHandler &WorkMatA, VariableSubMatrixHandler &WorkMatB, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Definition: loadable.cc:545
virtual VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Definition: loadable.cc:535
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Definition: loadable.cc:555
p_i_get_priv_data_idx i_get_priv_data_idx
Definition: loadable.h:213
const char * description
Definition: loadable.h:183
void(* p_after_predict)(const LoadableElem *pEl, VectorHandler &X, VectorHandler &XP)
Definition: loadable.h:129
#define NO_OP
Definition: myassert.h:74
p_i_get_num_connected_nodes i_get_num_connected_nodes
Definition: loadable.h:215
virtual void Output(OutputHandler &OH) const
Definition: loadable.cc:512
std::vector< Hint * > Hints
Definition: simentity.h:89
SubVectorHandler &(* p_initial_ass_res)(LoadableElem *, SubVectorHandler &, const VectorHandler &)
Definition: loadable.h:144
p_restart restart
Definition: loadable.h:197
void(* p_initial_work_space_dim)(const LoadableElem *, integer *, integer *)
Definition: loadable.h:139
Elem * ReadLoadable(DataManager *pDM, MBDynParser &HP, const DofOwner *pDO, unsigned int uLabel)
Definition: userelem.cc:87
virtual ~LoadableElemRead(void)
Definition: loadable.h:320
LoadableCalls * calls
Definition: loadable.h:232
virtual DofOrder::Order GetDofType(unsigned int i) const
Definition: loadable.cc:504
virtual UserDefinedElem * Read(unsigned uLabel, const DofOwner *pDO, DataManager *const pDM, MBDynParser &HP) const
Definition: loadable.cc:680
void(* p_output)(const LoadableElem *, OutputHandler &)
Definition: loadable.h:111
unsigned int(* p_i_get_num_priv_data)(const LoadableElem *pEl)
Definition: loadable.h:150
int(* p_i_get_num_connected_nodes)(const LoadableElem *)
Definition: loadable.h:155
void(* p_update)(LoadableElem *pEl, const VectorHandler &X, const VectorHandler &XP)
Definition: loadable.h:132
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Definition: loadable.cc:607
void GetCalls(MBDynParser &HP)
Definition: loadable.cc:270
p_i_get_initial_num_dof i_get_initial_num_dof
Definition: loadable.h:206
p_ass_res ass_res
Definition: loadable.h:201
void(* p_set_initial_value)(const LoadableElem *, VectorHandler &)
Definition: loadable.h:149
std::ostream &(* p_restart)(const LoadableElem *, std::ostream &)
Definition: loadable.h:112
SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
Definition: loadable.cc:622
VariableSubMatrixHandler &(* p_initial_ass_jac)(LoadableElem *, VariableSubMatrixHandler &, const VectorHandler &)
Definition: loadable.h:141
VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
Definition: loadable.cc:614
p_i_get_num_priv_data i_get_num_priv_data
Definition: loadable.h:212
virtual void SetValue(DataManager *pDM, VectorHandler &X, VectorHandler &XP, SimulationEntity::Hints *ph=0)
Definition: loadable.cc:637
virtual unsigned int iGetNumDof(void) const
Definition: loadable.cc:497
p_before_predict before_predict
Definition: loadable.h:202
VariableSubMatrixHandler &(* p_ass_jac)(LoadableElem *, VariableSubMatrixHandler &, doublereal, const VectorHandler &, const VectorHandler &)
Definition: loadable.h:115
p_destroy destroy
Definition: loadable.h:218
unsigned int uLabel
Definition: withlab.h:44
p_ass_mats ass_mats
Definition: loadable.h:200
void(* p_after_convergence)(const LoadableElem *pEl, const VectorHandler &X, const VectorHandler &XP)
Definition: loadable.h:135
p_d_get_priv_data d_get_priv_data
Definition: loadable.h:214
unsigned long loadable_version
Definition: loadable.h:174
virtual void SetInitialValue(VectorHandler &X)
Definition: loadable.cc:630
p_initial_ass_jac initial_ass_jac
Definition: loadable.h:208
void(* p_set_value)(const LoadableElem *, DataManager *pDM, VectorHandler &, VectorHandler &, SimulationEntity::Hints *ph)
Definition: loadable.h:146
p_after_convergence after_convergence
Definition: loadable.h:205
p_initial_ass_res initial_ass_res
Definition: loadable.h:209
virtual doublereal dGetPrivData(unsigned int i) const
Definition: loadable.cc:660
virtual void BeforePredict(VectorHandler &X, VectorHandler &XP, VectorHandler &XPrev, VectorHandler &XPPrev) const
Definition: loadable.cc:566
static std::stack< cleanup * > c
Definition: cleanup.cc:59
void * priv_data
Definition: loadable.h:227
void BindCalls(DataManager *pDM, MBDynParser &HP)
Definition: loadable.cc:335
const char * vendor
Definition: loadable.h:182
void(* p_get_connected_nodes)(const LoadableElem *, std::vector< const Node * > &connectedNodes)
Definition: loadable.h:157
Definition: elem.h:75
LoadableElem(unsigned int uLabel, const DofOwner *pDO, DataManager *pDM, MBDynParser &HP)
Definition: loadable.cc:231
p_ass_jac ass_jac
Definition: loadable.h:199
SubVectorHandler &(* p_ass_res)(LoadableElem *, SubVectorHandler &, doublereal, const VectorHandler &, const VectorHandler &)
Definition: loadable.h:122
virtual unsigned int iGetNumPrivData(void) const
Definition: loadable.cc:646
p_update update
Definition: loadable.h:204
unsigned int(* p_i_get_initial_num_dof)(const LoadableElem *)
Definition: loadable.h:137
virtual void Update(const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Definition: loadable.cc:584
char * module_name
Definition: loadable.h:228
void(* p_before_predict)(const LoadableElem *pEl, VectorHandler &X, VectorHandler &XP, VectorHandler &XPrev, VectorHandler &XPPrev)
Definition: loadable.h:125
virtual void AfterPredict(VectorHandler &X, VectorHandler &XP)
Definition: loadable.cc:576
double doublereal
Definition: colamd.c:52
long int integer
Definition: colamd.c:51
p_output output
Definition: loadable.h:196
p_set_value set_value
Definition: loadable.h:210
DofOrder::Order(* p_set_dof)(const LoadableElem *, unsigned int)
Definition: loadable.h:110
p_initial_work_space_dim initial_work_space_dim
Definition: loadable.h:207
void(* p_ass_mats)(LoadableElem *, VariableSubMatrixHandler &, VariableSubMatrixHandler &, const VectorHandler &, const VectorHandler &)
Definition: loadable.h:118
const char * name
Definition: loadable.h:180
p_after_predict after_predict
Definition: loadable.h:203
virtual void AfterConvergence(const VectorHandler &X, const VectorHandler &XP)
Definition: loadable.cc:592
void *(* p_read)(LoadableElem *, DataManager *, MBDynParser &)
Definition: loadable.h:108
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Definition: loadable.cc:528