00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <stdlib.h>
00036 #include <string.h>
00037 #include <Domain.h>
00038
00039 #include <Joint2D.h>
00040 #include <TclModelBuilder.h>
00041 #include <DamageModel.h>
00042
00043 extern void printCommand(int argc, char **argv);
00044
00045 int
00046 TclModelBuilder_addJoint2D(ClientData clientData, Tcl_Interp *interp,
00047 int argc,
00048 TCL_Char **argv,
00049 Domain *theTclDomain,
00050 TclModelBuilder *theTclBuilder)
00051 {
00052
00053 if (theTclBuilder == 0) {
00054 opserr << "WARNING builder has been destroyed\n";
00055 return TCL_ERROR;
00056 }
00057
00058 if (theTclBuilder->getNDM() != 2 || theTclBuilder->getNDF() != 3) {
00059 opserr << "WARNING -- model dimensions and/or nodal DOF not compatible with BCconnect element\n";
00060 return TCL_ERROR;
00061 }
00062
00063
00064 int argStart = 2;
00065
00066 if ( (argc-argStart) != 8 && (argc-argStart) != 10 && (argc-argStart) != 12 && (argc-argStart) != 18) {
00067 opserr << "WARNING incorrect number of arguments\n";
00068 opserr << "Want:\n";
00069 opserr << "element Joint2D Tag? NodI? NodJ? NodK? NodL? NodC? MatC? LrgDsp?\n";
00070 opserr << "or:\n";
00071 opserr << "element Joint2D Tag? NodI? NodJ? NodK? NodL? NodC? MatC? LrgDsp? -damage DmgTag?\n";
00072 opserr << "or:\n";
00073 opserr << "element Joint2D Tag? NodI? NodJ? NodK? NodL? NodC? MatI? MatJ? MatK? MatL? MatC? LrgDsp?\n";
00074 opserr << "or:\n";
00075 opserr << "element Joint2D Tag? NodI? NodJ? NodK? NodL? NodC? MatI? MatJ? MatK? MatL? MatC? LrgDsp? -damage DmgI DmgJ DmgK DmgL DmgC\n";
00076 return TCL_ERROR;
00077 }
00078
00079
00080 int Joint2DId, iNode, jNode, kNode, lNode;
00081 if (Tcl_GetInt(interp, argv[argStart], &Joint2DId) != TCL_OK) {
00082 opserr << "WARNING invalid Joint2D eleTag" << endln;
00083 return TCL_ERROR;
00084 }
00085
00086 if (Tcl_GetInt(interp, argv[1+argStart], &iNode) != TCL_OK) {
00087 opserr << "WARNING invalid iNode\n";
00088 opserr << "Joint2D element: " << Joint2DId << endln;
00089 return TCL_ERROR;
00090 }
00091
00092 if (Tcl_GetInt(interp, argv[2+argStart], &jNode) != TCL_OK) {
00093 opserr << "WARNING invalid jNode\n";
00094 opserr << "Joint2D element: " << Joint2DId << endln;
00095 return TCL_ERROR;
00096 }
00097
00098 if (Tcl_GetInt(interp, argv[3+argStart], &kNode) != TCL_OK) {
00099 opserr << "WARNING invalid kNode\n";
00100 opserr << "Joint2D element: " << Joint2DId << endln;
00101 return TCL_ERROR;
00102 }
00103
00104 if (Tcl_GetInt(interp, argv[4+argStart], &lNode) != TCL_OK) {
00105 opserr << "WARNING invalid lNode\n";
00106 opserr << "Joint2D element: " << Joint2DId << endln;
00107 return TCL_ERROR;
00108 }
00109
00110
00111 int CenterNodeTag;
00112 if (Tcl_GetInt(interp, argv[5+argStart], &CenterNodeTag) != TCL_OK) {
00113 opserr << "WARNING invalid tag for center node\n";
00114 opserr << "Joint2D element: " << Joint2DId << endln;
00115 return TCL_ERROR;
00116 }
00117
00118
00119 Node *CenterNode = theTclDomain->getNode(CenterNodeTag);
00120 if (CenterNode != 0) {
00121 opserr << "WARNING node tag specified for the center node already exists.\n";
00122 opserr << "Use a new node tag.\n";
00123 opserr << "Joint2D element: " << Joint2DId << endln;
00124 return TCL_ERROR;
00125 }
00126
00127 UniaxialMaterial *MatI = NULL;
00128 UniaxialMaterial *MatJ = NULL;
00129 UniaxialMaterial *MatK = NULL;
00130 UniaxialMaterial *MatL = NULL;
00131 UniaxialMaterial *PanelMaterial = NULL;
00132 Joint2D *theJoint2D;
00133 int LargeDisp;
00134
00135
00136
00137 if ( (argc-argStart) == 8 || (argc-argStart) == 12 ) {
00138
00139
00140
00141 if ( (argc-argStart) == 8 )
00142 {
00143 int PanelMatId;
00144 if (Tcl_GetInt(interp, argv[6+argStart], &PanelMatId) != TCL_OK) {
00145 opserr << "WARNING invalid matID\n";
00146 opserr << "Joint2D element: " << Joint2DId << endln;
00147 return TCL_ERROR;
00148 }
00149
00150 if (Tcl_GetInt(interp, argv[7+argStart], &LargeDisp) != TCL_OK) {
00151
00152 LargeDisp = 0;
00153 }
00154
00155 PanelMaterial = theTclBuilder->getUniaxialMaterial(PanelMatId);
00156
00157 if ( PanelMaterial == 0 ) {
00158 opserr << "WARNING material not found\n";
00159 opserr << "Material: " << PanelMatId;
00160 opserr << "\nJoint2D element: " << Joint2DId << endln;
00161 return TCL_ERROR;
00162 }
00163 }
00164
00165 else
00166 {
00167 int MatIid;
00168 if (Tcl_GetInt(interp, argv[6+argStart], &MatIid) != TCL_OK) {
00169 opserr << "WARNING invalid material ID for spring I\n";
00170 opserr << "Joint2D element: " << Joint2DId << endln;
00171 return TCL_ERROR;
00172 }
00173
00174 if ( MatIid != 0 ) {
00175 MatI = theTclBuilder->getUniaxialMaterial(MatIid);
00176
00177 if ( MatI == NULL )
00178 {
00179 opserr << "WARNING material not found\n";
00180 opserr << "Material: " << MatIid;
00181 opserr << "\nJoint2D element: " << Joint2DId << endln;
00182 return TCL_ERROR;
00183 }
00184 } else MatI = NULL;
00185
00186 int MatJid;
00187 if (Tcl_GetInt(interp, argv[7+argStart], &MatJid) != TCL_OK) {
00188 opserr << "WARNING invalid material ID for spring J\n";
00189 opserr << "Joint2D element: " << Joint2DId << endln;
00190 return TCL_ERROR;
00191 }
00192
00193 if ( MatJid != 0 ) {
00194 MatJ = theTclBuilder->getUniaxialMaterial(MatJid);
00195
00196 if ( MatJ == NULL )
00197 {
00198 opserr << "WARNING material not found\n";
00199 opserr << "Material: " << MatJid;
00200 opserr << "\nJoint2D element: " << Joint2DId << endln;
00201 return TCL_ERROR;
00202 }
00203 } else MatJ = NULL;
00204
00205
00206 int MatKid;
00207 if (Tcl_GetInt(interp, argv[8+argStart], &MatKid) != TCL_OK) {
00208 opserr << "WARNING invalid material ID for spring K\n";
00209 opserr << "Joint2D element: " << Joint2DId << endln;
00210
00211 return TCL_ERROR;
00212 }
00213 if ( MatKid != 0 ) {
00214 MatK = theTclBuilder->getUniaxialMaterial(MatKid);
00215
00216 if ( MatK == NULL )
00217 {
00218 opserr << "WARNING material not found\n";
00219 opserr << "Material: " << MatKid;
00220 opserr << "\nJoint2D element: " << Joint2DId << endln;
00221 return TCL_ERROR;
00222 }
00223 } else MatK = NULL;
00224
00225 int MatLid;
00226 if (Tcl_GetInt(interp, argv[9+argStart], &MatLid) != TCL_OK) {
00227 opserr << "WARNING invalid material ID for spring L\n";
00228 opserr << "Joint2D element: " << Joint2DId << endln;
00229 return TCL_ERROR;
00230 }
00231 if ( MatLid != 0 ) {
00232 MatL = theTclBuilder->getUniaxialMaterial(MatLid);
00233
00234 if ( MatL == NULL )
00235 {
00236 opserr << "WARNING material not found\n";
00237 opserr << "Material: " << MatLid;
00238 opserr << "\nJoint2D element: " << Joint2DId << endln;
00239 return TCL_ERROR;
00240 }
00241 } else MatL = NULL;
00242
00243 int PanelMatId;
00244 if (Tcl_GetInt(interp, argv[10+argStart], &PanelMatId) != TCL_OK) {
00245 opserr << "WARNING invalid matID\n";
00246 opserr << "Joint2D element: " << Joint2DId << endln;
00247 return TCL_ERROR;
00248 }
00249 PanelMaterial = theTclBuilder->getUniaxialMaterial(PanelMatId);
00250
00251 if ( PanelMaterial == 0 ) {
00252 opserr << "WARNING material not found\n";
00253 opserr << "Material: " << PanelMatId;
00254 opserr << "\nJoint2D element: " << Joint2DId << endln;
00255 return TCL_ERROR;
00256 }
00257
00258 if (Tcl_GetInt(interp, argv[11+argStart], &LargeDisp) != TCL_OK) {
00259
00260 LargeDisp = 0;
00261 }
00262 }
00263
00264 theJoint2D = new Joint2D( Joint2DId,
00265 iNode,jNode,kNode,lNode,CenterNodeTag,
00266 *MatI,*MatJ,*MatK,*MatL,*PanelMaterial,
00267 theTclDomain,
00268 LargeDisp);
00269
00270 if (theJoint2D == 0) {
00271 opserr << "WARNING ran out of memory creating element\n";
00272 opserr << "Joint2D element: " << Joint2DId << endln;
00273 return TCL_ERROR;
00274 }
00275
00276 if (theTclDomain->addElement(theJoint2D) == false) {
00277 opserr << "WARNING could not add element to the domain\n";
00278 opserr << "Joint2D element: " << Joint2DId << endln;
00279 delete theJoint2D;
00280 return TCL_ERROR;
00281 }
00282
00283
00284 return TCL_OK;
00285 }
00286
00287 else if ( (argc-argStart) == 10 || (argc-argStart) == 18 )
00288 {
00289
00290 DamageModel *DmgI = NULL;
00291 DamageModel *DmgJ = NULL;
00292 DamageModel *DmgK = NULL;
00293 DamageModel *DmgL = NULL;
00294 DamageModel *PanelDamage = NULL;
00295
00296
00297 if ( (argc-argStart) == 10 )
00298 {
00299 int PanelMatId;
00300 if (Tcl_GetInt(interp, argv[6+argStart], &PanelMatId) != TCL_OK) {
00301 opserr << "WARNING invalid matID\n";
00302 opserr << "Joint2D element: " << Joint2DId << endln;
00303 return TCL_ERROR;
00304 }
00305
00306 if (Tcl_GetInt(interp, argv[7+argStart], &LargeDisp) != TCL_OK) {
00307
00308 LargeDisp = 0;
00309 }
00310
00311 PanelMaterial = theTclBuilder->getUniaxialMaterial(PanelMatId);
00312
00313 if ( PanelMaterial == 0 ) {
00314 opserr << "WARNING material not found\n";
00315 opserr << "Material: " << PanelMatId;
00316 opserr << "\nJoint2D element: " << Joint2DId << endln;
00317 return TCL_ERROR;
00318 }
00319
00320
00321 if ( strcmp ( argv[8+argStart] , "-damage") != 0 &&
00322 strcmp ( argv[8+argStart] , "-Damage") != 0 )
00323 {
00324 opserr << "WARNING incorrect command line\n";
00325 opserr << "\nJoint2D element: " << Joint2DId << endln;
00326 return TCL_ERROR;
00327
00328 }
00329
00330 int PanelDamageId;
00331 if (Tcl_GetInt(interp, argv[9+argStart], &PanelDamageId) != TCL_OK) {
00332 opserr << "WARNING invalid damageID\n";
00333 opserr << "Joint2D element: " << Joint2DId << endln;
00334 return TCL_ERROR;
00335 }
00336
00337 DamageModel *PanelDamage;
00338 PanelDamage = theTclBuilder->getDamageModel(PanelDamageId);
00339
00340 if ( PanelDamage == 0 ) {
00341 opserr << "WARNING damage model not found\n";
00342 opserr << "Damage Model: " << PanelDamageId;
00343 opserr << "\nJoint2D element: " << Joint2DId << endln;
00344 return TCL_ERROR;
00345 }
00346 }
00347
00348 else
00349 {
00350 int MatIid;
00351 if (Tcl_GetInt(interp, argv[6+argStart], &MatIid) != TCL_OK) {
00352 opserr << "WARNING invalid material ID for spring I\n";
00353 opserr << "Joint2D element: " << Joint2DId << endln;
00354 return TCL_ERROR;
00355 }
00356
00357 if ( MatIid != 0 ) {
00358 MatI = theTclBuilder->getUniaxialMaterial(MatIid);
00359
00360 if ( MatI == NULL )
00361 {
00362 opserr << "WARNING material not found\n";
00363 opserr << "Material: " << MatIid;
00364 opserr << "\nJoint2D element: " << Joint2DId << endln;
00365 return TCL_ERROR;
00366 }
00367 } else MatI = NULL;
00368
00369 int MatJid;
00370 if (Tcl_GetInt(interp, argv[7+argStart], &MatJid) != TCL_OK) {
00371 opserr << "WARNING invalid material ID for spring J\n";
00372 opserr << "Joint2D element: " << Joint2DId << endln;
00373 return TCL_ERROR;
00374 }
00375
00376 if ( MatJid != 0 ) {
00377 MatJ = theTclBuilder->getUniaxialMaterial(MatJid);
00378
00379 if ( MatJ == NULL )
00380 {
00381 opserr << "WARNING material not found\n";
00382 opserr << "Material: " << MatJid;
00383 opserr << "\nJoint2D element: " << Joint2DId << endln;
00384 return TCL_ERROR;
00385 }
00386 } else MatJ = NULL;
00387
00388
00389 int MatKid;
00390 if (Tcl_GetInt(interp, argv[8+argStart], &MatKid) != TCL_OK) {
00391 opserr << "WARNING invalid material ID for spring K\n";
00392 opserr << "Joint2D element: " << Joint2DId << endln;
00393
00394 return TCL_ERROR;
00395 }
00396 if ( MatKid != 0 ) {
00397 MatK = theTclBuilder->getUniaxialMaterial(MatKid);
00398
00399 if ( MatK == NULL )
00400 {
00401 opserr << "WARNING material not found\n";
00402 opserr << "Material: " << MatKid;
00403 opserr << "\nJoint2D element: " << Joint2DId << endln;
00404 return TCL_ERROR;
00405 }
00406 } else MatK = NULL;
00407
00408 int MatLid;
00409 if (Tcl_GetInt(interp, argv[9+argStart], &MatLid) != TCL_OK) {
00410 opserr << "WARNING invalid material ID for spring L\n";
00411 opserr << "Joint2D element: " << Joint2DId << endln;
00412 return TCL_ERROR;
00413 }
00414 if ( MatLid != 0 ) {
00415 MatL = theTclBuilder->getUniaxialMaterial(MatLid);
00416
00417 if ( MatL == NULL )
00418 {
00419 opserr << "WARNING material not found\n";
00420 opserr << "Material: " << MatLid;
00421 opserr << "\nJoint2D element: " << Joint2DId << endln;
00422 return TCL_ERROR;
00423 }
00424 } else MatL = NULL;
00425
00426 int PanelMatId;
00427 if (Tcl_GetInt(interp, argv[10+argStart], &PanelMatId) != TCL_OK) {
00428 opserr << "WARNING invalid matID\n";
00429 opserr << "Joint2D element: " << Joint2DId << endln;
00430 return TCL_ERROR;
00431 }
00432 PanelMaterial = theTclBuilder->getUniaxialMaterial(PanelMatId);
00433
00434 if ( PanelMaterial == 0 ) {
00435 opserr << "WARNING material not found\n";
00436 opserr << "Material: " << PanelMatId;
00437 opserr << "\nJoint2D element: " << Joint2DId << endln;
00438 return TCL_ERROR;
00439 }
00440
00441 if (Tcl_GetInt(interp, argv[11+argStart], &LargeDisp) != TCL_OK) {
00442
00443 LargeDisp = 0;
00444 }
00445
00446
00447 if ( strcmp ( argv[12+argStart] , "-damage") != 0 &&
00448 strcmp ( argv[12+argStart] , "-Damage") != 0 )
00449 {
00450 opserr << "WARNING incorrect command line\n";
00451 opserr << "\nJoint2D element: " << Joint2DId << endln;
00452 return TCL_ERROR;
00453
00454 }
00455
00456 int DmgIid;
00457 if (Tcl_GetInt(interp, argv[13+argStart], &DmgIid) != TCL_OK) {
00458 opserr << "WARNING invalid damage model ID for spring I\n";
00459 opserr << "Joint2D element: " << Joint2DId << endln;
00460 return TCL_ERROR;
00461 }
00462
00463 if ( DmgIid != 0 && MatI != 0 ) {
00464 DmgI = theTclBuilder->getDamageModel(DmgIid);
00465
00466 if ( DmgI == NULL )
00467 {
00468 opserr << "WARNING damage model not found\n";
00469 opserr << "Damage Model: " << DmgIid;
00470 opserr << "\nJoint2D element: " << Joint2DId << endln;
00471 return TCL_ERROR;
00472 }
00473 } else DmgI = NULL;
00474
00475
00476 int DmgJid;
00477 if (Tcl_GetInt(interp, argv[14+argStart], &DmgJid) != TCL_OK) {
00478 opserr << "WARNING invalid damage model ID for spring J\n";
00479 opserr << "Joint2D element: " << Joint2DId << endln;
00480 return TCL_ERROR;
00481 }
00482
00483 if ( DmgJid != 0 && MatJ != 0 ) {
00484 DmgJ = theTclBuilder->getDamageModel(DmgJid);
00485
00486 if ( DmgJ == NULL )
00487 {
00488 opserr << "WARNING damage model not found\n";
00489 opserr << "Damage Model: " << DmgJid;
00490 opserr << "\nJoint2D element: " << Joint2DId << endln;
00491 return TCL_ERROR;
00492 }
00493 } else DmgJ = NULL;
00494
00495
00496 int DmgKid;
00497 if (Tcl_GetInt(interp, argv[15+argStart], &DmgKid) != TCL_OK) {
00498 opserr << "WARNING invalid damage model ID for spring K\n";
00499 opserr << "Joint2D element: " << Joint2DId << endln;
00500 return TCL_ERROR;
00501 }
00502
00503 if ( DmgKid != 0 && MatK != 0 ) {
00504 DmgK = theTclBuilder->getDamageModel(DmgKid);
00505
00506 if ( DmgK == NULL )
00507 {
00508 opserr << "WARNING damage model not found\n";
00509 opserr << "Damage Model: " << DmgKid;
00510 opserr << "\nJoint2D element: " << Joint2DId << endln;
00511 return TCL_ERROR;
00512 }
00513 } else DmgK = NULL;
00514
00515
00516 int DmgLid;
00517 if (Tcl_GetInt(interp, argv[16+argStart], &DmgLid) != TCL_OK) {
00518 opserr << "WARNING invalid damage model ID for spring L\n";
00519 opserr << "Joint2D element: " << Joint2DId << endln;
00520 return TCL_ERROR;
00521 }
00522
00523 if ( DmgLid != 0 && MatL != 0 ) {
00524 DmgL = theTclBuilder->getDamageModel(DmgLid);
00525
00526 if ( DmgL == NULL )
00527 {
00528 opserr << "WARNING damage model not found\n";
00529 opserr << "Damage Model: " << DmgLid;
00530 opserr << "\nJoint2D element: " << Joint2DId << endln;
00531 return TCL_ERROR;
00532 }
00533 } else DmgL = NULL;
00534
00535 int PanelDmgId;
00536 if (Tcl_GetInt(interp, argv[17+argStart], &PanelDmgId) != TCL_OK) {
00537 opserr << "WARNING invalid panel DmgID\n";
00538 opserr << "Joint2D element: " << Joint2DId << endln;
00539 return TCL_ERROR;
00540 }
00541
00542 if ( PanelDmgId != 0 && PanelMaterial != 0 ) {
00543 PanelDamage = theTclBuilder->getDamageModel(PanelDmgId);
00544
00545 if ( PanelDamage == NULL )
00546 {
00547 opserr << "WARNING damage model not found\n";
00548 opserr << "Damage Model: " << PanelDmgId;
00549 opserr << "\nJoint2D element: " << Joint2DId << endln;
00550 return TCL_ERROR;
00551 }
00552 } else DmgL = NULL;
00553
00554 }
00555
00556 theJoint2D = new Joint2D( Joint2DId,
00557 iNode,jNode,kNode,lNode,CenterNodeTag,
00558 *MatI,*MatJ,*MatK,*MatL,*PanelMaterial,
00559 theTclDomain, LargeDisp,
00560 *DmgI,*DmgJ,*DmgK,*DmgL,*PanelDamage);
00561
00562 if (theJoint2D == 0) {
00563 opserr << "WARNING ran out of memory creating element\n";
00564 opserr << "Joint2D element: " << Joint2DId << endln;
00565 return TCL_ERROR;
00566 }
00567
00568 if (theTclDomain->addElement(theJoint2D) == false) {
00569 opserr << "WARNING could not add element to the domain\n";
00570 opserr << "Joint2D element: " << Joint2DId << endln;
00571 delete theJoint2D;
00572 return TCL_ERROR;
00573 }
00574
00575
00576 return TCL_OK;
00577 }
00578 else
00579 {
00580 return TCL_ERROR;
00581 }
00582 }
00583