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