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
00036 #include <Pinching.h>
00037 #include <Clough.h>
00038 #include <PinchingDamage.h>
00039 #include <CloughDamage.h>
00040 #include <Bilinear.h>
00041 #include <DamageModel.h>
00042
00043 #include <TclModelBuilder.h>
00044 #include <Vector.h>
00045 #include <string.h>
00046
00047 static void printCommand(int argc, TCL_Char **argv)
00048 {
00049 opserr << "Input command: ";
00050 for (int i=0; i<argc; i++)
00051 opserr << argv[i] << " ";
00052 opserr << endln;
00053 }
00054
00055 UniaxialMaterial *
00056 TclModelBuilder_addSnapMaterial(ClientData clientData, Tcl_Interp *interp, int argc,
00057 TCL_Char **argv, TclModelBuilder *theTclBuilder)
00058 {
00059 if (argc < 3) {
00060 opserr << "WARNING insufficient number of arguments for the Snap material model\n";
00061 printCommand(argc, argv);
00062 return 0;
00063 }
00064
00065 int tag;
00066 if (Tcl_GetInt(interp, argv[2], &tag) != TCL_OK) {
00067 opserr << "WARNING invalid uniaxialMaterial tag\n";
00068 printCommand(argc, argv);
00069 return 0;
00070 }
00071
00072 UniaxialMaterial *theMaterial = 0;
00073
00074 if (strcmp(argv[1],"Bilinear") == 0) {
00075 if (argc < 15) {
00076 opserr << "WARNING insufficient arguments\n";
00077 opserr << "Want: uniaxialMaterial Bilinear tag? ..." << endln;
00078 return 0;
00079 }
00080
00081 Vector input(12);
00082 double temp;
00083
00084 for (int i = 3, j = 0; j < 12; i++, j++) {
00085 if (Tcl_GetDouble(interp, argv[i], &temp) != TCL_OK) {
00086 opserr << "WARNING invalid input, data " << i << endln;
00087 printCommand(argc, argv);
00088 return 0;
00089 }
00090 input(j) = temp;
00091 }
00092
00093 DamageModel *strength;
00094 if ( (int) input(9) == 0 )
00095 {
00096 strength = NULL;
00097 }
00098 else
00099 {
00100 strength = theTclBuilder->getDamageModel( (int) input(9) );
00101
00102 if (strength == 0) {
00103 opserr << "WARNING damage model for strength deterioration not found\n";
00104 opserr << "Damage Model: " << input(9);
00105 opserr << "\nBinilear material: " << tag << endln;
00106 exit (-1);
00107 }
00108 }
00109
00110 DamageModel *stiffness;
00111 if ( (int) input(10) == 0 )
00112 {
00113 stiffness = NULL;
00114 }
00115 else
00116 {
00117 stiffness = theTclBuilder->getDamageModel( (int) input(10) );
00118
00119 if (stiffness == 0) {
00120 opserr << "WARNING damage model for stiffness deterioration not found\n";
00121 opserr << "Damage Model: " << input(10);
00122 opserr << "\nBinilear material: " << tag << endln;
00123 exit (-1);
00124 }
00125 }
00126
00127 DamageModel *capping;
00128 if ( (int) input(11) == 0 )
00129 {
00130 capping = NULL;
00131 }
00132 else
00133 {
00134 capping = theTclBuilder->getDamageModel( (int) input(11) );
00135
00136 if (capping == 0) {
00137 opserr << "WARNING damage model for capping deterioration not found\n";
00138 opserr << "Damage Model: " << input(11);
00139 opserr << "\nBinilear material: " << tag << endln;
00140 exit (-1);
00141 }
00142 }
00143
00144 theMaterial = new Bilinear(tag, input, strength, stiffness,capping);
00145 }
00146
00147 else if ( strcmp(argv[1],"Clough") == 0 || strcmp(argv[1],"clough") == 0 ) {
00148
00149 if ( argc < 19 ) {
00150 opserr << "WARNING insufficient arguments\n";
00151 printCommand(argc,argv);
00152 opserr << "Want: uniaxialMaterial Clough_Damage tag? ..." << endln;
00153 return 0;
00154 }
00155
00156 Vector input(16);
00157 double temp;
00158
00159 for (int i = 3, j = 0; j < 16; i++, j++) {
00160 if (Tcl_GetDouble(interp, argv[i], &temp) != TCL_OK) {
00161 opserr << "WARNING invalid input, data " << i << endln;
00162 printCommand(argc, argv);
00163 return 0;
00164 }
00165 input(j) = temp;
00166 }
00167
00168 theMaterial = new Clough(tag, input);
00169 }
00170
00171 else if ( strcmp(argv[1],"Clough_Damage") == 0 || strcmp(argv[1],"CloughDamage") == 0 ||
00172 strcmp(argv[1],"Clough_Damage") == 0 || strcmp(argv[1],"CloughDamage") == 0 ) {
00173 if ( argc < 15 ) {
00174 opserr << "WARNING insufficient arguments\n";
00175 printCommand(argc,argv);
00176 opserr << "Want: uniaxialMaterial Clough tag? ..." << endln;
00177 return 0;
00178 }
00179
00180 Vector input(12);
00181 double temp;
00182
00183 for (int i = 3, j = 0; j < 12; i++, j++) {
00184 if (Tcl_GetDouble(interp, argv[i], &temp) != TCL_OK) {
00185 opserr << "WARNING invalid input, data " << i << endln;
00186 printCommand(argc, argv);
00187 return 0;
00188 }
00189 input(j) = temp;
00190 }
00191
00192 DamageModel *strength;
00193 if ( (int) input(8) == 0 )
00194 {
00195 strength = NULL;
00196 }
00197 else
00198 {
00199 strength = theTclBuilder->getDamageModel( (int) input(8) );
00200
00201 if (strength == 0) {
00202 opserr << "WARNING damage model for strength deterioration not found\n";
00203 opserr << "Damage Model: " << input(8);
00204 opserr << "\nClough material: " << tag << endln;
00205 exit (-1);
00206 }
00207 }
00208
00209 DamageModel *stiffness;
00210 if ( (int) input(9) == 0 )
00211 {
00212 stiffness = NULL;
00213 }
00214 else
00215 {
00216 stiffness = theTclBuilder->getDamageModel( (int) input(9) );
00217
00218 if (stiffness == 0) {
00219 opserr << "WARNING damage model for stiffness deterioration not found\n";
00220 opserr << "Damage Model: " << input(9);
00221 opserr << "\nClough material: " << tag << endln;
00222 exit (-1);
00223 }
00224 }
00225
00226 DamageModel *accelerated;
00227 if ( (int) input(10) == 0 )
00228 {
00229 accelerated = NULL;
00230 }
00231 else
00232 {
00233 accelerated = theTclBuilder->getDamageModel( (int) input(10) );
00234
00235 if (accelerated == 0) {
00236 opserr << "WARNING damage model for accelerated stiffness deterioration not found\n";
00237 opserr << "Damage Model: " << input(10);
00238 opserr << "\nClough material: " << tag << endln;
00239 exit (-1);
00240 }
00241 }
00242
00243 DamageModel *capping;
00244 if ( (int) input(11) == 0 )
00245 {
00246 capping = NULL;
00247 }
00248 else
00249 {
00250 capping = theTclBuilder->getDamageModel( (int) input(11) );
00251
00252 if (capping == 0) {
00253 opserr << "WARNING damage model for capping deterioration not found\n";
00254 opserr << "Damage Model: " << input(11);
00255 opserr << "\nClough material: " << tag << endln;
00256 exit (-1);
00257 }
00258 }
00259 theMaterial = new CloughDamage (tag, input, strength, stiffness, accelerated, capping);
00260 }
00261
00262 else if ( strcmp(argv[1],"Pinching") == 0 || strcmp(argv[1],"pinching") == 0 ) {
00263 if ( argc < 22 ) {
00264 opserr << "WARNING insufficient arguments\n";
00265 printCommand(argc,argv);
00266 opserr << "Want: uniaxialMaterial Pinching tag? ..." << endln;
00267 return 0;
00268 }
00269
00270 Vector input(19);
00271 double temp;
00272
00273 for (int i = 3, j = 0; j < 19; i++, j++) {
00274 if (Tcl_GetDouble(interp, argv[i], &temp) != TCL_OK) {
00275 opserr << "WARNING invalid input, data " << i << endln;
00276 printCommand(argc, argv);
00277 return 0;
00278 }
00279 input(j) = temp;
00280 }
00281 theMaterial = new Pinching(tag, input);
00282 }
00283
00284 else if ( strcmp(argv[1],"Pinching_Damage") == 0 || strcmp(argv[1],"pinching_Damage") == 0 ||
00285 strcmp(argv[1],"PinchingDamage") == 0 || strcmp(argv[1],"pinchingDamage") == 0 ) {
00286 if ( argc < 18 ) {
00287 opserr << "WARNING insufficient arguments\n";
00288 printCommand(argc,argv);
00289 opserr << "Want: uniaxialMaterial Pinching tag? ..." << endln;
00290 return 0;
00291 }
00292
00293 Vector input(15);
00294 double temp;
00295
00296 for (int i = 3, j = 0; j < 15; i++, j++) {
00297 if (Tcl_GetDouble(interp, argv[i], &temp) != TCL_OK) {
00298 opserr << "WARNING invalid input, data " << i << endln;
00299 printCommand(argc, argv);
00300 return 0;
00301 }
00302 input(j) = temp;
00303 }
00304
00305 DamageModel *strength;
00306 if ( (int) input(11) == 0 )
00307 {
00308 strength = NULL;
00309 }
00310 else
00311 {
00312 strength = theTclBuilder->getDamageModel( (int) input(11) );
00313
00314 if (strength == 0) {
00315 opserr << "WARNING damage model for strength deterioration not found\n";
00316 opserr << "Damage Model: " << input(11);
00317 opserr << "\nPinching material: " << tag << endln;
00318 exit (-1);
00319 }
00320 }
00321
00322 DamageModel *stiffness;
00323 if ( (int) input(12) == 0 )
00324 {
00325 stiffness = NULL;
00326 }
00327 else
00328 {
00329 stiffness = theTclBuilder->getDamageModel( (int) input(12) );
00330 if (stiffness == 0) {
00331 opserr << "WARNING damage model for stiffness deterioration not found\n";
00332 opserr << "Damage Model: " << input(12);
00333 opserr << "\nPinching material: " << tag << endln;
00334 exit (-1);
00335 }
00336 }
00337
00338 DamageModel *accelerated;
00339 if ( (int) input(13) == 0 )
00340 {
00341 accelerated = NULL;
00342 }
00343 else
00344 {
00345 accelerated = theTclBuilder->getDamageModel( (int) input(13) );
00346 if (accelerated == 0) {
00347 opserr << "WARNING damage model for accelerated stiffness deterioration not found\n";
00348 opserr << "Damage Model: " << input(13);
00349 opserr << "\nPinching material: " << tag << endln;
00350 exit (-1);
00351 }
00352 }
00353
00354 DamageModel *capping;
00355 if ( (int) input(14) == 0 )
00356 {
00357 capping = NULL;
00358 }
00359 else
00360 {
00361 capping = theTclBuilder->getDamageModel( (int) input(14) );
00362
00363 if (capping == 0) {
00364 opserr << "WARNING damage model for capping deterioration not found\n";
00365 opserr << "Damage Model: " << input(14);
00366 opserr << "\nPinching material: " << tag << endln;
00367 exit (-1);
00368 }
00369 }
00370 theMaterial = new PinchingDamage(tag, input, strength, stiffness, accelerated, capping);
00371 }
00372
00373 return theMaterial;
00374 }
00375