00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <string.h>
00025 #include <TclModelBuilder.h>
00026
00027 #include <LinearCrdTransf2d.h>
00028 #include <LinearCrdTransf3d.h>
00029 #include <PDeltaCrdTransf2d.h>
00030 #include <PDeltaCrdTransf3d.h>
00031 #include <CorotCrdTransf2d.h>
00032 #include <CorotCrdTransf3d.h>
00033
00034 static Domain *theTclModelBuilderDomain = 0;
00035 static TclModelBuilder *theTclModelBuilder = 0;
00036
00037
00038
00039
00040 int
00041 TclModelBuilder_addGeomTransf(ClientData clientData, Tcl_Interp *interp,
00042 int argc, TCL_Char **argv,
00043 Domain *theDomain,
00044 TclModelBuilder *theBuilder)
00045
00046 {
00047
00048 if (argc < 2) {
00049 opserr << "WARNING insufficient number of geomTransf arguments\n";
00050 opserr << "Want: geomTransf type? tag? <specific transf args>" << endln;
00051 return TCL_ERROR;
00052 }
00053
00054 theTclModelBuilderDomain = theDomain;
00055 theTclModelBuilder = theBuilder;
00056
00057 int NDM, NDF;
00058
00059 NDM = theTclModelBuilder->getNDM();
00060 NDF = theTclModelBuilder->getNDF();
00061
00062
00063 if (NDM == 2 && NDF == 3) {
00064
00065 int crdTransfTag;
00066 Vector jntOffsetI(2), jntOffsetJ(2);
00067
00068 if (argc < 3) {
00069 opserr << "WARNING insufficient arguments - want: geomTransf type? tag? <-jntOffset dXi? dYi? dXj? dYj?>\n";
00070 return TCL_ERROR;
00071 }
00072
00073 int argi = 2;
00074 if (Tcl_GetInt(interp, argv[argi++], &crdTransfTag) != TCL_OK) {
00075 opserr << "WARNING invalid tag - want: geomTransf type? tag? <-jntOffset dXi? dYi? dXj? dYj?>\n";
00076 return TCL_ERROR;
00077 }
00078
00079
00080 int i;
00081
00082 while (argi != argc) {
00083 if (strcmp(argv[argi],"-jntOffset") == 0) {
00084 argi++;
00085 for (i = 0; i < 2; i++) {
00086 if (argi == argc || Tcl_GetDouble(interp, argv[argi++], &jntOffsetI(i)) != TCL_OK) {
00087 opserr << "WARNING invalid jntOffset value - want: geomTransf type? tag? <-jntOffset dXi? dYi? dXj? dYj?>\n";
00088 return TCL_ERROR;
00089 }
00090 }
00091
00092 for (i = 0; i < 2; i++) {
00093 if (argi == argc || Tcl_GetDouble(interp, argv[argi++], &jntOffsetJ(i)) != TCL_OK) {
00094 opserr << "WARNING invalid jntOffset value - want: geomTransf type? tag? <-jntOffset dXi? dYi? dXj? dYj?>\n";
00095 return TCL_ERROR;
00096 }
00097 }
00098 }
00099
00100 else {
00101 opserr << "WARNING bad command - want: geomTransf type? tag? <-jntOffset dXi? dYi? dXj? dYj?>\n";
00102 opserr << "invalid: " << argv[argi] << endln;
00103 return TCL_ERROR;
00104 }
00105 }
00106
00107
00108
00109 CrdTransf2d *crdTransf2d;
00110
00111 if (strcmp(argv[1],"Linear") == 0)
00112 crdTransf2d = new LinearCrdTransf2d(crdTransfTag, jntOffsetI, jntOffsetJ);
00113
00114 else if (strcmp(argv[1],"PDelta") == 0 || strcmp(argv[1],"LinearWithPDelta") == 0)
00115 crdTransf2d = new PDeltaCrdTransf2d(crdTransfTag, jntOffsetI, jntOffsetJ);
00116
00117 #ifdef _COROTATIONAL
00118 else if (strcmp(argv[1],"Corotational") == 0)
00119 crdTransf2d = new CorotCrdTransf2d(crdTransfTag, jntOffsetI, jntOffsetJ);
00120 #endif
00121 else {
00122 opserr << "WARNING TclElmtBuilder - addGeomTransf - invalid Type\n";
00123 opserr << argv[1] << endln;
00124 return TCL_ERROR;
00125 }
00126
00127 if (crdTransf2d == 0) {
00128 opserr << "WARNING TclElmtBuilder - addGeomTransf - ran out of memory to create geometric transformation object\n";
00129 return TCL_ERROR;
00130 }
00131
00132
00133 if (theTclModelBuilder->addCrdTransf2d(*crdTransf2d)) {
00134 opserr << "WARNING TclElmtBuilder - addGeomTransf - could not add geometric transformation to model Builder\n";
00135 return TCL_ERROR;
00136 }
00137 }
00138
00139 else if (NDM == 3 && NDF == 6) {
00140 int crdTransfTag;
00141 Vector vecxzPlane(3);
00142 Vector jntOffsetI(3), jntOffsetJ(3);
00143
00144 if (argc < 6) {
00145 opserr << "WARNING insufficient arguments - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ? <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00146 return TCL_ERROR;
00147 }
00148
00149 int argi = 2;
00150 if (Tcl_GetInt(interp, argv[argi++], &crdTransfTag) != TCL_OK) {
00151 opserr << "WARNING invalid tag - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ? <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00152 return TCL_ERROR;
00153 }
00154
00155 if (Tcl_GetDouble(interp, argv[argi++], &vecxzPlane(0)) != TCL_OK) {
00156 opserr << "WARNING invalid vecxzPlaneX - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ? <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00157 return TCL_ERROR;
00158 }
00159
00160 if (Tcl_GetDouble(interp, argv[argi++], &vecxzPlane(1)) != TCL_OK) {
00161 opserr << "WARNING invalid vecxzPlaneY - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ? <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00162 return TCL_ERROR;
00163 }
00164
00165 if (Tcl_GetDouble(interp, argv[argi++], &vecxzPlane(2)) != TCL_OK) {
00166 opserr << "WARNING invalid vecxzPlaneZ - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ? <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00167 return TCL_ERROR;
00168 }
00169
00170
00171 int i;
00172
00173 while (argi != argc) {
00174 if (strcmp(argv[argi],"-jntOffset") == 0) {
00175 argi++;
00176 for (i = 0; i < 3; i++) {
00177 if (argi == argc || Tcl_GetDouble(interp, argv[argi++], &jntOffsetI(i)) != TCL_OK) {
00178 opserr << "WARNING invalid jntOffset value - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ? <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00179 return TCL_ERROR;
00180 }
00181 }
00182
00183 for (i = 0; i < 3; i++) {
00184 if (argi == argc || Tcl_GetDouble(interp, argv[argi++], &jntOffsetJ(i)) != TCL_OK) {
00185 opserr << "WARNING invalid jntOffset value - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ? <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? >\n";
00186 return TCL_ERROR;
00187 }
00188 }
00189 }
00190 else {
00191 opserr << "WARNING bad command - want: geomTransf type? tag? vecxzPlaneX? vecxzPlaneY? vecxzPlaneZ? <-jntOffset dXi? dYi? dZi? dXj? dYj? dZj? > ";
00192 opserr << "invalid: " << argv[argi] << endln;
00193 return TCL_ERROR;
00194 }
00195 }
00196
00197
00198
00199 CrdTransf3d *crdTransf3d;
00200
00201 if (strcmp(argv[1],"Linear") == 0)
00202 crdTransf3d = new LinearCrdTransf3d(crdTransfTag, vecxzPlane, jntOffsetI, jntOffsetJ);
00203
00204 else if (strcmp(argv[1],"PDelta") == 0 || strcmp(argv[1],"LinearWithPDelta") == 0)
00205 crdTransf3d = new PDeltaCrdTransf3d(crdTransfTag, vecxzPlane, jntOffsetI, jntOffsetJ);
00206
00207 #ifdef _COROTATIONAL
00208 else if (strcmp(argv[1],"Corotational") == 0)
00209 crdTransf3d = new CorotCrdTransf3d(crdTransfTag, vecxzPlane, jntOffsetI, jntOffsetJ);
00210 #endif
00211
00212 else {
00213 opserr << "WARNING TclElmtBuilder - addGeomTransf - invalid Type\n";
00214 return TCL_ERROR;
00215 }
00216
00217 if (crdTransf3d == 0) {
00218 opserr << "WARNING TclElmtBuilder - addGeomTransf - ran out of memory to create geometric transformation object\n";
00219 return TCL_ERROR;
00220 }
00221
00222
00223 if (theTclModelBuilder->addCrdTransf3d(*crdTransf3d)) {
00224 opserr << "WARNING TclElmtBuilder - addGeomTransf - could not add geometric transformation to model Builder\n";
00225 return TCL_ERROR;
00226 }
00227 }
00228 else {
00229 opserr << "WARNING NDM = " << NDM << " and NDF = " << NDF << "is imcompatible with available frame elements\n";
00230 return TCL_ERROR;
00231 }
00232
00233
00234
00235
00236
00237 return TCL_OK;
00238 }