1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/libraries/libmbc/mbc_py.cc,v 1.14 2017/01/12 14:43: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 #include "mbc_py.h"
33
34 #include <iostream>
35 #include <cstring>
36 #include <vector>
37
38 /* reference node global data */
39
40 uint32_t *mbc_r_k_label;
41 double *mbc_r_x;
42 double *mbc_r_theta;
43 double *mbc_r_r;
44 double *mbc_r_euler_123;
45 double *mbc_r_xp;
46 double *mbc_r_omega;
47 double *mbc_r_xpp;
48 double *mbc_r_omegap;
49 uint32_t *mbc_r_d_label;
50 double *mbc_r_f;
51 double *mbc_r_m;
52
53 uint32_t mbc_r_k_label_size;
54 uint32_t mbc_r_x_size;
55 uint32_t mbc_r_theta_size;
56 uint32_t mbc_r_r_size;
57 uint32_t mbc_r_euler_123_size;
58 uint32_t mbc_r_xp_size;
59 uint32_t mbc_r_omega_size;
60 uint32_t mbc_r_xpp_size;
61 uint32_t mbc_r_omegap_size;
62 uint32_t mbc_r_d_label_size;
63 uint32_t mbc_r_f_size;
64 uint32_t mbc_r_m_size;
65
66 /* nodal element global data */
67
68 uint32_t *mbc_n_k_labels;
69 double *mbc_n_x;
70 double *mbc_n_theta;
71 double *mbc_n_r;
72 double *mbc_n_euler_123;
73 double *mbc_n_xp;
74 double *mbc_n_omega;
75 double *mbc_n_xpp;
76 double *mbc_n_omegap;
77 uint32_t *mbc_n_d_labels;
78 double *mbc_n_f;
79 double *mbc_n_m;
80
81 uint32_t mbc_n_k_labels_size;
82 uint32_t mbc_n_x_size;
83 uint32_t mbc_n_theta_size;
84 uint32_t mbc_n_r_size;
85 uint32_t mbc_n_euler_123_size;
86 uint32_t mbc_n_xp_size;
87 uint32_t mbc_n_omega_size;
88 uint32_t mbc_n_xpp_size;
89 uint32_t mbc_n_omegap_size;
90 uint32_t mbc_n_d_labels_size;
91 uint32_t mbc_n_f_size;
92 uint32_t mbc_n_m_size;
93
94 static std::vector<mbc_nodal_t> n_mbc;
95
96 int
mbc_py_nodal_initialize(const char * const path,const char * const host,unsigned port,int timeout,unsigned verbose,unsigned data_and_next,unsigned refnode,unsigned nodes,unsigned labels,unsigned rot,unsigned accels)97 mbc_py_nodal_initialize(const char *const path,
98 const char *const host, unsigned port,
99 int timeout, unsigned verbose, unsigned data_and_next,
100 unsigned refnode, unsigned nodes,
101 unsigned labels, unsigned rot, unsigned accels)
102 {
103 mbc_nodal_t mbc;
104 std::memset(&mbc, 0, sizeof(mbc_nodal_t));
105
106 mbc.mbc.data_and_next = data_and_next;
107 mbc.mbc.verbose = verbose;
108 mbc.mbc.timeout = timeout;
109
110 if (mbc.mbc.verbose) {
111 if (path && path[0]) {
112 std::cout << "connecting to path=" << path << std::endl;
113 } else {
114 std::cout << "connecting to host=" << host << ":" << port << std::endl;
115 }
116
117 if (mbc.mbc.timeout < 0) {
118 std::cout << "timeout=forever" << std::endl;
119 } else {
120 std::cout << "timeout=" << mbc.mbc.timeout << std::endl;
121 }
122 }
123
124 if (path && path[0]) {
125 if (mbc_unix_init((mbc_t *)&mbc, path)) {
126 return -1;
127 }
128
129 } else if (host && host[0]) {
130 if (mbc_inet_init((mbc_t *)&mbc, host, port)) {
131 return -1;
132 }
133
134 } else {
135 return -1;
136 }
137
138 if (mbc_nodal_init(&mbc, refnode, nodes, labels, rot, accels)) {
139 return -1;
140 }
141
142 int id = ::n_mbc.size();
143 ::n_mbc.push_back(mbc);
144
145 return id;
146 }
147
148 int
mbc_py_nodal_negotiate(unsigned id)149 mbc_py_nodal_negotiate(unsigned id)
150 {
151 if (id >= n_mbc.size()) {
152 return -1;
153 }
154
155 mbc_nodal_t *mbcp = &::n_mbc[id];
156
157 if (mbc_nodal_negotiate_request(mbcp)) {
158 return -1;
159 }
160
161 if (MBC_F_REF_NODE(mbcp)) {
162 if (MBC_F_LABELS(mbcp)) {
163 mbc_r_k_label = &MBC_R_K_LABEL(mbcp);
164 mbc_r_k_label_size = 1;
165
166 mbc_r_d_label = &MBC_R_D_LABEL(mbcp);
167 mbc_r_d_label_size = 1;
168 }
169
170 mbc_r_x = MBC_R_X(mbcp);
171 mbc_r_x_size = 3;
172
173 switch (MBC_F_ROT_REF_NODE(mbcp)) {
174 case MBC_ROT_THETA:
175 mbc_r_theta = MBC_R_THETA(mbcp);
176 mbc_r_theta_size = 3;
177 break;
178
179 case MBC_ROT_MAT:
180 mbc_r_r = MBC_R_R(mbcp);
181 mbc_r_r_size = 9;
182 break;
183
184 case MBC_ROT_EULER_123:
185 mbc_r_euler_123 = MBC_R_EULER_123(mbcp);
186 mbc_r_euler_123_size = 3;
187 break;
188
189 default:
190 std::cerr << "mbc_py_nodal_negotiate: unknown reference node orientation" << std::endl;
191 return -1;
192 }
193
194 mbc_r_xp = MBC_R_XP(mbcp);
195 mbc_r_xp_size = 3;
196 mbc_r_omega = MBC_R_OMEGA(mbcp);
197 mbc_r_omega_size = 3;
198
199 if (MBC_F_ACCELS(mbcp)) {
200 mbc_r_xpp = MBC_R_XPP(mbcp);
201 mbc_r_xpp_size = 3;
202 mbc_r_omegap = MBC_R_OMEGAP(mbcp);
203 mbc_r_omegap_size = 3;
204 }
205
206 mbc_r_f = MBC_R_F(mbcp);
207 mbc_r_f_size = 3;
208 mbc_r_m = MBC_R_M(mbcp);
209 mbc_r_m_size = 3;
210 }
211
212 if (mbcp->nodes > 0) {
213 if (MBC_F_LABELS(mbcp)) {
214 mbc_n_k_labels = MBC_N_K_LABELS(mbcp);
215 mbc_n_k_labels_size = mbcp->nodes;
216 mbc_n_d_labels = MBC_N_D_LABELS(mbcp);
217 mbc_n_d_labels_size = mbcp->nodes;
218 }
219
220 mbc_n_x = MBC_N_X(mbcp);
221 mbc_n_x_size = 3*mbcp->nodes;
222
223 switch (MBC_F_ROT(mbcp)) {
224 case MBC_ROT_THETA:
225 mbc_n_theta = MBC_N_THETA(mbcp);
226 mbc_n_theta_size = 3*mbcp->nodes;
227 break;
228
229 case MBC_ROT_MAT:
230 mbc_n_r = MBC_N_R(mbcp);
231 mbc_n_r_size = 9*mbcp->nodes;
232 break;
233
234 case MBC_ROT_EULER_123:
235 mbc_n_euler_123 = MBC_N_EULER_123(mbcp);
236 mbc_n_euler_123_size = 3*mbcp->nodes;
237
238 case MBC_ROT_NONE:
239 break;
240
241 default:
242 std::cerr << "mbc_py_nodal_negotiate: unknown node orientation " << MBC_F_ROT(mbcp) << std::endl;
243 return -1;
244 }
245
246 mbc_n_xp = MBC_N_XP(mbcp);
247 mbc_n_xp_size = 3*mbcp->nodes;
248 mbc_n_omega = MBC_N_OMEGA(mbcp);
249 mbc_n_omega_size = 3*mbcp->nodes;
250
251 if (MBC_F_ACCELS(mbcp)) {
252 mbc_n_xpp = MBC_N_XPP(mbcp);
253 mbc_n_xpp_size = 3*mbcp->nodes;
254 mbc_n_omegap = MBC_N_OMEGAP(mbcp);
255 mbc_n_omegap_size = 3*mbcp->nodes;
256 }
257
258 mbc_n_f = MBC_N_F(mbcp);
259 mbc_n_f_size = 3*mbcp->nodes;
260 mbc_n_m = MBC_N_M(mbcp);
261 mbc_n_m_size = 3*mbcp->nodes;
262 }
263
264 return id;
265 }
266
267 int
mbc_py_nodal_send(unsigned id,int last)268 mbc_py_nodal_send(unsigned id, int last)
269 {
270 if (id >= n_mbc.size()) {
271 return -1;
272 }
273
274 return mbc_nodal_put_forces(&::n_mbc[id], last);
275 }
276
277 int
mbc_py_nodal_recv(unsigned id)278 mbc_py_nodal_recv(unsigned id)
279 {
280 if (id >= n_mbc.size()) {
281 return -1;
282 }
283
284 return mbc_nodal_get_motion(&::n_mbc[id]);
285 }
286
287 int
mbc_py_nodal_destroy(unsigned id)288 mbc_py_nodal_destroy(unsigned id)
289 {
290 if (id >= n_mbc.size()) {
291 return -1;
292 }
293
294 mbc_nodal_destroy(&::n_mbc[id]);
295
296 return 0;
297 }
298
299 /* modal element global data */
300
301 double *mbc_m_q;
302 double *mbc_m_qp;
303 double *mbc_m_p;
304
305 uint32_t mbc_m_q_size;
306 uint32_t mbc_m_qp_size;
307 uint32_t mbc_m_p_size;
308
309 static std::vector<mbc_modal_t> m_mbc;
310
311 int
mbc_py_modal_initialize(const char * const path,const char * const host,unsigned port,int timeout,unsigned verbose,unsigned data_and_next,unsigned refnode,unsigned modes)312 mbc_py_modal_initialize(const char *const path,
313 const char *const host, unsigned port,
314 int timeout, unsigned verbose, unsigned data_and_next,
315 unsigned refnode, unsigned modes)
316 {
317 mbc_modal_t mbc;
318 std::memset(&mbc, 0, sizeof(mbc_modal_t));
319
320 mbc.mbc.data_and_next = data_and_next;
321 mbc.mbc.verbose = verbose;
322 mbc.mbc.timeout = timeout;
323
324 if (mbc.mbc.verbose) {
325 if (path && path[0]) {
326 std::cout << "connecting to path=" << path << std::endl;
327 } else {
328 std::cout << "connecting to host=" << host << ":" << port << std::endl;
329 }
330
331 if (mbc.mbc.timeout < 0) {
332 std::cout << "timeout=forever" << std::endl;
333 } else {
334 std::cout << "timeout=" << mbc.mbc.timeout << std::endl;
335 }
336 }
337
338 if (path && path[0]) {
339 if (mbc_unix_init((mbc_t *)&mbc, path)) {
340 return -1;
341 }
342
343 } else if (host && host[0]) {
344 if (mbc_inet_init((mbc_t *)&mbc, host, port)) {
345 return -1;
346 }
347
348 } else {
349 return -1;
350 }
351
352 if (mbc_modal_init(&mbc, refnode, modes)) {
353 return -1;
354 }
355
356 int id = m_mbc.size();
357 m_mbc.push_back(mbc);
358
359 return id;
360 }
361
362 int
mbc_py_modal_negotiate(unsigned id)363 mbc_py_modal_negotiate(unsigned id)
364 {
365 if (id >= m_mbc.size()) {
366 return -1;
367 }
368
369 mbc_modal_t *mbcp = &::m_mbc[id];
370
371 if (mbc_modal_negotiate_request(mbcp)) {
372 return -1;
373 }
374
375 if (MBC_F_REF_NODE(mbcp)) {
376 mbc_r_x = MBC_R_X(mbcp);
377 mbc_r_x_size = 3;
378 mbc_r_r = MBC_R_R(mbcp);
379 mbc_r_r_size = 9;
380
381 mbc_r_xp = MBC_R_XP(mbcp);
382 mbc_r_xp_size = 3;
383 mbc_r_omega = MBC_R_OMEGA(mbcp);
384 mbc_r_omega_size = 3;
385
386 mbc_r_f = MBC_R_F(mbcp);
387 mbc_r_f_size = 3;
388 mbc_r_m = MBC_R_M(mbcp);
389 mbc_r_m_size = 3;
390 }
391
392 if (mbcp->modes > 0) {
393 mbc_m_q = MBC_Q(mbcp);
394 mbc_m_q_size = mbcp->modes;
395 mbc_m_qp = MBC_QP(mbcp);
396 mbc_m_qp_size = mbcp->modes;
397
398 mbc_m_p = MBC_P(mbcp);
399 mbc_m_p_size = mbcp->modes;
400 }
401
402 return id;
403 }
404
405 int
mbc_py_modal_send(unsigned id,int last)406 mbc_py_modal_send(unsigned id, int last)
407 {
408 if (id >= m_mbc.size()) {
409 return -1;
410 }
411
412 return mbc_modal_put_forces(&m_mbc[id], last);
413 }
414
415 int
mbc_py_modal_recv(unsigned id)416 mbc_py_modal_recv(unsigned id)
417 {
418 if (id >= m_mbc.size()) {
419 return -1;
420 }
421
422 return mbc_modal_get_motion(&m_mbc[id]);
423 }
424
425 int
mbc_py_modal_destroy(unsigned id)426 mbc_py_modal_destroy(unsigned id)
427 {
428 if (id >= m_mbc.size()) {
429 return -1;
430 }
431
432 mbc_modal_destroy(&m_mbc[id]);
433
434 return 0;
435 }
436