/opensees-websocket/SRC/element/elastomericBearing/TclElastomericBearingCommand.cpp

https://code.google.com/ · C++ · 458 lines · 381 code · 28 blank · 49 comment · 149 complexity · 8dd31adece56b693067feb79030759b4 MD5 · raw file

  1. /* ****************************************************************** **
  2. ** OpenSees - Open System for Earthquake Engineering Simulation **
  3. ** Pacific Earthquake Engineering Research Center **
  4. ** **
  5. ** **
  6. ** (C) Copyright 1999, The Regents of the University of California **
  7. ** All Rights Reserved. **
  8. ** **
  9. ** Commercial use of this program without express permission of the **
  10. ** University of California, Berkeley, is strictly prohibited. See **
  11. ** file 'COPYRIGHT' in main directory for information on usage and **
  12. ** redistribution, and for a DISCLAIMER OF ALL WARRANTIES. **
  13. ** **
  14. ** Developed by: **
  15. ** Frank McKenna (fmckenna@ce.berkeley.edu) **
  16. ** Gregory L. Fenves (fenves@ce.berkeley.edu) **
  17. ** Filip C. Filippou (filippou@ce.berkeley.edu) **
  18. ** **
  19. ** ****************************************************************** */
  20. // $Revision: 1.3 $
  21. // $Date: 2009-04-17 23:00:48 $
  22. // $Source: /usr/local/cvs/OpenSees/SRC/element/elastomericBearing/TclElastomericBearingCommand.cpp,v $
  23. // Written: Andreas Schellenberg (andreas.schellenberg@gmx.net)
  24. // Created: 02/06
  25. // Revision: A
  26. //
  27. // Description: This file contains the function to parse the TCL input
  28. // for the elastomericBearing element.
  29. //
  30. // What: "@(#) TclElastomericBearingCommand.cpp, revA"
  31. #include <TclModelBuilder.h>
  32. #include <stdlib.h>
  33. #include <string.h>
  34. #include <Domain.h>
  35. #include <ID.h>
  36. #include <Vector.h>
  37. #include <ElastomericBearing2d.h>
  38. #include <ElastomericBearing3d.h>
  39. #include <UniaxialMaterial.h>
  40. extern void printCommand(int argc, TCL_Char **argv);
  41. int TclModelBuilder_addElastomericBearing(ClientData clientData,
  42. Tcl_Interp *interp, int argc, TCL_Char **argv, Domain *theTclDomain,
  43. TclModelBuilder *theTclBuilder, int eleArgStart)
  44. {
  45. // ensure the destructor has not been called
  46. if (theTclBuilder == 0) {
  47. opserr << "WARNING builder has been destroyed - elastomericBearing\n";
  48. return TCL_ERROR;
  49. }
  50. Element *theElement = 0;
  51. int ndm = theTclBuilder->getNDM();
  52. int ndf = theTclBuilder->getNDF();
  53. int tag;
  54. if (ndm == 2) {
  55. // check plane frame problem has 3 dof per node
  56. if (ndf != 3) {
  57. opserr << "WARNING invalid ndf: " << ndf;
  58. opserr << ", for plane problem need 3 - elastomericBearing\n";
  59. return TCL_ERROR;
  60. }
  61. // check the number of arguments is correct
  62. if ((argc-eleArgStart) < 11) {
  63. opserr << "WARNING insufficient arguments\n";
  64. printCommand(argc, argv);
  65. opserr << "Want: elastomericBearing eleTag iNode jNode ke fy alpha -P matTag -Mz matTag <-orient x1 x2 x3 y1 y2 y3> <-mass m>\n";
  66. return TCL_ERROR;
  67. }
  68. // get the id and end nodes
  69. int iNode, jNode, matTag, argi, i, j;
  70. int recvMat = 0;
  71. double ke, fy, alpha;
  72. double mass = 0.0;
  73. if (Tcl_GetInt(interp, argv[1+eleArgStart], &tag) != TCL_OK) {
  74. opserr << "WARNING invalid elastomericBearing eleTag\n";
  75. return TCL_ERROR;
  76. }
  77. if (Tcl_GetInt(interp, argv[2+eleArgStart], &iNode) != TCL_OK) {
  78. opserr << "WARNING invalid iNode\n";
  79. opserr << "elastomericBearing element: " << tag << endln;
  80. return TCL_ERROR;
  81. }
  82. if (Tcl_GetInt(interp, argv[3+eleArgStart], &jNode) != TCL_OK) {
  83. opserr << "WARNING invalid jNode\n";
  84. opserr << "elastomericBearing element: " << tag << endln;
  85. return TCL_ERROR;
  86. }
  87. if (Tcl_GetDouble(interp, argv[4+eleArgStart], &ke) != TCL_OK) {
  88. opserr << "WARNING invalid ke\n";
  89. opserr << "elastomericBearing element: " << tag << endln;
  90. return TCL_ERROR;
  91. }
  92. if (Tcl_GetDouble(interp, argv[5+eleArgStart], &fy) != TCL_OK) {
  93. opserr << "WARNING invalid fy\n";
  94. opserr << "elastomericBearing element: " << tag << endln;
  95. return TCL_ERROR;
  96. }
  97. if (Tcl_GetDouble(interp, argv[6+eleArgStart], &alpha) != TCL_OK) {
  98. opserr << "WARNING invalid alpha\n";
  99. opserr << "elastomericBearing element: " << tag << endln;
  100. return TCL_ERROR;
  101. }
  102. UniaxialMaterial *theMaterials[2];
  103. for (i = 7+eleArgStart; i < argc; i++) {
  104. if (i+1 < argc && strcmp(argv[i], "-P") == 0) {
  105. theMaterials[0] = 0;
  106. if (Tcl_GetInt(interp, argv[i+1], &matTag) != TCL_OK) {
  107. opserr << "WARNING invalid matTag\n";
  108. opserr << "elastomericBearing element: " << tag << endln;
  109. return TCL_ERROR;
  110. }
  111. theMaterials[0] = OPS_getUniaxialMaterial(matTag);
  112. if (theMaterials[0] == 0) {
  113. opserr << "WARNING material model not found\n";
  114. opserr << "uniaxialMaterial: " << matTag << endln;
  115. opserr << "elastomericBearing element: " << tag << endln;
  116. return TCL_ERROR;
  117. }
  118. recvMat++;
  119. }
  120. }
  121. for (i = 7+eleArgStart; i < argc; i++) {
  122. if (i+1 < argc && strcmp(argv[i], "-Mz") == 0) {
  123. if (Tcl_GetInt(interp, argv[i+1], &matTag) != TCL_OK) {
  124. opserr << "WARNING invalid matTag\n";
  125. opserr << "elastomericBearing element: " << tag << endln;
  126. return TCL_ERROR;
  127. }
  128. theMaterials[1] = OPS_getUniaxialMaterial(matTag);
  129. if (theMaterials[1] == 0) {
  130. opserr << "WARNING material model not found\n";
  131. opserr << "uniaxialMaterial: " << matTag << endln;
  132. opserr << "elastomericBearing element: " << tag << endln;
  133. return TCL_ERROR;
  134. }
  135. recvMat++;
  136. }
  137. }
  138. if (recvMat != 2) {
  139. opserr << "WARNING wrong number of materials\n";
  140. opserr << "got " << recvMat << " materials, but want 2 materials\n";
  141. opserr << "elastomericBearing element: " << tag << endln;
  142. return TCL_ERROR;
  143. }
  144. // check for optional arguments
  145. Vector x = 0;
  146. Vector y = 0;
  147. for (i = 7+eleArgStart; i < argc; i++) {
  148. if (strcmp(argv[i],"-orient") == 0) {
  149. j = i+1;
  150. int numOrient = 0;
  151. while (j < argc &&
  152. strcmp(argv[j],"-mass") != 0) {
  153. numOrient++;
  154. j++;
  155. }
  156. if (numOrient == 6) {
  157. argi = i+1;
  158. x.resize(3);
  159. y.resize(3);
  160. double value;
  161. // read the x values
  162. for (j=0; j<3; j++) {
  163. if (Tcl_GetDouble(interp, argv[argi], &value) != TCL_OK) {
  164. opserr << "WARNING invalid -orient value\n";
  165. opserr << "elastomericBearing element: " << tag << endln;
  166. return TCL_ERROR;
  167. } else {
  168. argi++;
  169. x(j) = value;
  170. }
  171. }
  172. // read the y values
  173. for (j=0; j<3; j++) {
  174. if (Tcl_GetDouble(interp, argv[argi], &value) != TCL_OK) {
  175. opserr << "WARNING invalid -orient value\n";
  176. opserr << "elastomericBearing element: " << tag << endln;
  177. return TCL_ERROR;
  178. } else {
  179. argi++;
  180. y(j) = value;
  181. }
  182. }
  183. }
  184. else {
  185. opserr << "WARNING insufficient arguments after -orient flag\n";
  186. opserr << "elastomericBearing element: " << tag << endln;
  187. return TCL_ERROR;
  188. }
  189. }
  190. }
  191. for (i = 7+eleArgStart; i < argc; i++) {
  192. if (i+1 < argc && strcmp(argv[i], "-mass") == 0) {
  193. if (Tcl_GetDouble(interp, argv[i+1], &mass) != TCL_OK) {
  194. opserr << "WARNING invalid mass\n";
  195. opserr << "elastomericBearing element: " << tag << endln;
  196. return TCL_ERROR;
  197. }
  198. }
  199. }
  200. // now create the elastomericBearing
  201. theElement = new ElastomericBearing2d(tag, iNode, jNode, ke, fy, alpha, theMaterials, y, x, mass);
  202. if (theElement == 0) {
  203. opserr << "WARNING ran out of memory creating element\n";
  204. opserr << "elastomericBearing element: " << tag << endln;
  205. return TCL_ERROR;
  206. }
  207. // then add the elastomericBearing to the domain
  208. if (theTclDomain->addElement(theElement) == false) {
  209. opserr << "WARNING could not add element to the domain\n";
  210. opserr << "elastomericBearing element: " << tag << endln;
  211. delete theElement;
  212. return TCL_ERROR;
  213. }
  214. }
  215. else if (ndm == 3) {
  216. // check space frame problem has 6 dof per node
  217. if (ndf != 6) {
  218. opserr << "WARNING invalid ndf: " << ndf;
  219. opserr << ", for space problem need 6 - elastomericBearing \n";
  220. return TCL_ERROR;
  221. }
  222. // check the number of arguments is correct
  223. if ((argc-eleArgStart) < 15) {
  224. opserr << "WARNING insufficient arguments\n";
  225. printCommand(argc, argv);
  226. opserr << "Want: elastomericBearing eleTag iNode jNode ke fy alpha -P matTag -T matTag -My matTag -Mz matTag <-orient <x1 x2 x3> y1 y2 y3> <-mass m>\n";
  227. return TCL_ERROR;
  228. }
  229. // get the id and end nodes
  230. int iNode, jNode, matTag, argi, i, j;
  231. int recvMat = 0;
  232. double ke, fy, alpha;
  233. double mass = 0.0;
  234. if (Tcl_GetInt(interp, argv[1+eleArgStart], &tag) != TCL_OK) {
  235. opserr << "WARNING invalid elastomericBearing eleTag\n";
  236. return TCL_ERROR;
  237. }
  238. if (Tcl_GetInt(interp, argv[2+eleArgStart], &iNode) != TCL_OK) {
  239. opserr << "WARNING invalid iNode\n";
  240. opserr << "elastomericBearing element: " << tag << endln;
  241. return TCL_ERROR;
  242. }
  243. if (Tcl_GetInt(interp, argv[3+eleArgStart], &jNode) != TCL_OK) {
  244. opserr << "WARNING invalid jNode\n";
  245. opserr << "elastomericBearing element: " << tag << endln;
  246. return TCL_ERROR;
  247. }
  248. if (Tcl_GetDouble(interp, argv[4+eleArgStart], &ke) != TCL_OK) {
  249. opserr << "WARNING invalid ke\n";
  250. opserr << "elastomericBearing element: " << tag << endln;
  251. return TCL_ERROR;
  252. }
  253. if (Tcl_GetDouble(interp, argv[5+eleArgStart], &fy) != TCL_OK) {
  254. opserr << "WARNING invalid fy\n";
  255. opserr << "elastomericBearing element: " << tag << endln;
  256. return TCL_ERROR;
  257. }
  258. if (Tcl_GetDouble(interp, argv[6+eleArgStart], &alpha) != TCL_OK) {
  259. opserr << "WARNING invalid alpha\n";
  260. opserr << "elastomericBearing element: " << tag << endln;
  261. return TCL_ERROR;
  262. }
  263. UniaxialMaterial *theMaterials[4];
  264. for (i = 7+eleArgStart; i < argc; i++) {
  265. if (i+1 < argc && strcmp(argv[i], "-P") == 0) {
  266. if (Tcl_GetInt(interp, argv[i+1], &matTag) != TCL_OK) {
  267. opserr << "WARNING invalid axial matTag\n";
  268. opserr << "elastomericBearing element: " << tag << endln;
  269. return TCL_ERROR;
  270. }
  271. theMaterials[0] = OPS_getUniaxialMaterial(matTag);
  272. if (theMaterials[0] == 0) {
  273. opserr << "WARNING material model not found\n";
  274. opserr << "uniaxialMaterial: " << matTag << endln;
  275. opserr << "elastomericBearing element: " << tag << endln;
  276. return TCL_ERROR;
  277. }
  278. recvMat++;
  279. }
  280. }
  281. for (i = 7+eleArgStart; i < argc; i++) {
  282. if (i+1 < argc && strcmp(argv[i], "-T") == 0) {
  283. if (Tcl_GetInt(interp, argv[i+1], &matTag) != TCL_OK) {
  284. opserr << "WARNING invalid torsional matTag\n";
  285. opserr << "elastomericBearing element: " << tag << endln;
  286. return TCL_ERROR;
  287. }
  288. theMaterials[1] = OPS_getUniaxialMaterial(matTag);
  289. if (theMaterials[1] == 0) {
  290. opserr << "WARNING material model not found\n";
  291. opserr << "uniaxialMaterial: " << matTag << endln;
  292. opserr << "elastomericBearing element: " << tag << endln;
  293. return TCL_ERROR;
  294. }
  295. recvMat++;
  296. }
  297. }
  298. for (i = 7+eleArgStart; i < argc; i++) {
  299. if (i+1 < argc && strcmp(argv[i], "-My") == 0) {
  300. if (Tcl_GetInt(interp, argv[i+1], &matTag) != TCL_OK) {
  301. opserr << "WARNING invalid moment y matTag\n";
  302. opserr << "elastomericBearing element: " << tag << endln;
  303. return TCL_ERROR;
  304. }
  305. theMaterials[2] = OPS_getUniaxialMaterial(matTag);
  306. if (theMaterials[2] == 0) {
  307. opserr << "WARNING material model not found\n";
  308. opserr << "uniaxialMaterial: " << matTag << endln;
  309. opserr << "elastomericBearing element: " << tag << endln;
  310. return TCL_ERROR;
  311. }
  312. recvMat++;
  313. }
  314. }
  315. for (i = 7+eleArgStart; i < argc; i++) {
  316. if (i+1 < argc && strcmp(argv[i], "-Mz") == 0) {
  317. if (Tcl_GetInt(interp, argv[i+1], &matTag) != TCL_OK) {
  318. opserr << "WARNING invalid moment z matTag\n";
  319. opserr << "elastomericBearing element: " << tag << endln;
  320. return TCL_ERROR;
  321. }
  322. theMaterials[3] = OPS_getUniaxialMaterial(matTag);
  323. if (theMaterials[3] == 0) {
  324. opserr << "WARNING material model not found\n";
  325. opserr << "uniaxialMaterial: " << matTag << endln;
  326. opserr << "elastomericBearing element: " << tag << endln;
  327. return TCL_ERROR;
  328. }
  329. recvMat++;
  330. }
  331. }
  332. if (recvMat != 4) {
  333. opserr << "WARNING wrong number of materials\n";
  334. opserr << "got " << recvMat << " materials, but want 4 materials\n";
  335. opserr << "elastomericBearing element: " << tag << endln;
  336. return TCL_ERROR;
  337. }
  338. // check for optional arguments
  339. Vector x(0);
  340. Vector y(3); y(0) = 0.0; y(1) = 1.0; y(2) = 0.0;
  341. for (i = 7+eleArgStart; i < argc; i++) {
  342. if (strcmp(argv[i],"-orient") == 0) {
  343. j = i+1;
  344. int numOrient = 0;
  345. while (j < argc &&
  346. strcmp(argv[j],"-mass") != 0) {
  347. numOrient++;
  348. j++;
  349. }
  350. if (numOrient == 3) {
  351. argi = i+1;
  352. double value;
  353. // read the y values
  354. for (j=0; j<3; j++) {
  355. if (Tcl_GetDouble(interp, argv[argi], &value) != TCL_OK) {
  356. opserr << "WARNING invalid -orient value\n";
  357. opserr << "elastomericBearing element: " << tag << endln;
  358. return TCL_ERROR;
  359. } else {
  360. argi++;
  361. y(j) = value;
  362. }
  363. }
  364. }
  365. else if (numOrient == 6) {
  366. argi = i+1;
  367. x.resize(3);
  368. double value;
  369. // read the x values
  370. for (j=0; j<3; j++) {
  371. if (Tcl_GetDouble(interp, argv[argi], &value) != TCL_OK) {
  372. opserr << "WARNING invalid -orient value\n";
  373. opserr << "elastomericBearing element: " << tag << endln;
  374. return TCL_ERROR;
  375. } else {
  376. argi++;
  377. x(j) = value;
  378. }
  379. }
  380. // read the y values
  381. for (j=0; j<3; j++) {
  382. if (Tcl_GetDouble(interp, argv[argi], &value) != TCL_OK) {
  383. opserr << "WARNING invalid -orient value\n";
  384. opserr << "elastomericBearing element: " << tag << endln;
  385. return TCL_ERROR;
  386. } else {
  387. argi++;
  388. y(j) = value;
  389. }
  390. }
  391. }
  392. else {
  393. opserr << "WARNING insufficient arguments after -orient flag\n";
  394. opserr << "elastomericBearing element: " << tag << endln;
  395. return TCL_ERROR;
  396. }
  397. }
  398. }
  399. for (i = 7+eleArgStart; i < argc; i++) {
  400. if (i+1 < argc && strcmp(argv[i], "-mass") == 0) {
  401. if (Tcl_GetDouble(interp, argv[i+1], &mass) != TCL_OK) {
  402. opserr << "WARNING invalid mass\n";
  403. opserr << "elastomericBearing element: " << tag << endln;
  404. return TCL_ERROR;
  405. }
  406. }
  407. }
  408. // now create the elastomericBearing
  409. theElement = new ElastomericBearing3d(tag, iNode, jNode, ke, fy, alpha, theMaterials, y, x, mass);
  410. if (theElement == 0) {
  411. opserr << "WARNING ran out of memory creating element\n";
  412. opserr << "elastomericBearing element: " << tag << endln;
  413. return TCL_ERROR;
  414. }
  415. // then add the elastomericBearing to the domain
  416. if (theTclDomain->addElement(theElement) == false) {
  417. opserr << "WARNING could not add element to the domain\n";
  418. opserr << "elastomericBearing element: " << tag << endln;
  419. delete theElement;
  420. return TCL_ERROR;
  421. }
  422. }
  423. else {
  424. opserr << "WARNING elastomericBearing command only works when ndm is 2 or 3, ndm: ";
  425. opserr << ndm << endln;
  426. return TCL_ERROR;
  427. }
  428. // if get here we have sucessfully created the elastomericBearing and added it to the domain
  429. return TCL_OK;
  430. }