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 #include <TclModelBuilder.h>
00033 #include <DamageModel.h>
00034
00035 #include <NormalizedPeak.h>
00036 #include <Kratzig.h>
00037 #include <Mehanny.h>
00038 #include <ParkAng.h>
00039 #include <HystereticEnergy.h>
00040 #include <TclModelBuilder.h>
00041
00042 #include <Vector.h>
00043 #include <string.h>
00044
00045 static void printCommand(int argc, TCL_Char **argv)
00046 {
00047 opserr << "Input command: ";
00048 for (int i=0; i<argc; i++)
00049 opserr << argv[i] << " ";
00050 opserr << endln;
00051 }
00052
00053 TclModelBuilder *theDamageTclModelBuilder =0;
00054
00055 int
00056 TclModelBuilderDamageModelCommand (ClientData clientData, Tcl_Interp *interp, int argc,
00057 TCL_Char **argv, TclModelBuilder *theTclBuilder )
00058 {
00059 theDamageTclModelBuilder = theTclBuilder;
00060
00061
00062 if (argc < 3) {
00063 opserr << "WARNING insufficient number of damage model arguments\n";
00064 opserr << "Want: damageModel type? tag? <specific material args>" << endln;
00065 return TCL_ERROR;
00066 }
00067
00068
00069 DamageModel *theDamage = 0;
00070
00071
00072
00073
00074
00075 if (strcmp(argv[1],"Mehanny") == 0) {
00076 if ( argc != 8 && argc != 10 && argc != 12 ) {
00077 opserr << "WARNING invalid number of arguments\n";
00078 printCommand(argc,argv);
00079 opserr << "Want: damageModel Mehanny tag? Alpha? Beta? Gamma? ultimatePosDisp? ultimateNegDisp? AbsTol? RelTol?" << endln;
00080 return TCL_ERROR;
00081 }
00082
00083 int tag;
00084 double alpha,beta,gamma,ultimatePosDisp, ultimateNegDisp, abstol, reltol, posmodifier,negmodifier;
00085 if (Tcl_GetInt(interp, argv[2], &tag) != TCL_OK) {
00086 opserr << "WARNING invalid tag\n";
00087 opserr << "Damage model Mehanny " << endln;
00088 return TCL_ERROR;
00089 }
00090
00091 if (Tcl_GetDouble(interp, argv[3], &alpha) != TCL_OK) {
00092 opserr << "WARNING invalid Alpha\n";
00093 opserr << "Damage model Mehanny : " << tag << endln;
00094 return TCL_ERROR;
00095 }
00096
00097 if (Tcl_GetDouble(interp, argv[4], &beta) != TCL_OK) {
00098 opserr << "WARNING invalid Beta\n";
00099 opserr << "Damage Mehanny : " << tag << endln;
00100 return TCL_ERROR;
00101 }
00102
00103 if (Tcl_GetDouble(interp, argv[5], &gamma) != TCL_OK) {
00104 opserr << "WARNING invalid Gamma\n";
00105 opserr << "Damage Mehanny : " << tag << endln;
00106 return TCL_ERROR;
00107 }
00108
00109 if (Tcl_GetDouble(interp, argv[6], &ultimatePosDisp) != TCL_OK) {
00110 opserr << "WARNING invalid ultimatePosDisp\n";
00111 opserr << "Damage Mehanny : " << tag << endln;
00112 return TCL_ERROR;
00113 }
00114
00115 if (Tcl_GetDouble(interp,argv[7], &ultimateNegDisp) != TCL_OK) {
00116 opserr << "WARNING invalid ultimateNegDisp\n";
00117 opserr << "Damage Mehanny : " << tag << endln;
00118 return TCL_ERROR;
00119 }
00120
00121 if ( argc > 8 )
00122 {
00123 if (Tcl_GetDouble(interp, argv[8], &abstol) != TCL_OK) {
00124 opserr << "WARNING invalid AbsTol\n";
00125 opserr << "Damage Mehanny : " << tag << endln;
00126 return TCL_ERROR;
00127 }
00128
00129 if (Tcl_GetDouble(interp,argv[9], &reltol) != TCL_OK) {
00130 opserr << "WARNING invalid RelTol\n";
00131 opserr << "Damage Mehanny : " << tag << endln;
00132 return TCL_ERROR;
00133 }
00134
00135
00136 if ( argc == 12 )
00137 {
00138
00139 if (Tcl_GetDouble(interp,argv[10], &posmodifier) != TCL_OK) {
00140 opserr << "WARNING invalid posmodifier\n";
00141 opserr << "Damage Mehanny : " << tag << endln;
00142 return TCL_ERROR;
00143 }
00144
00145 if (Tcl_GetDouble(interp,argv[11], &negmodifier) != TCL_OK) {
00146 opserr << "WARNING invalid negmodifier\n";
00147 opserr << "Damage Mehanny : " << tag << endln;
00148 return TCL_ERROR;
00149 }
00150 } else
00151 {
00152 posmodifier = negmodifier = 1.0;
00153 }
00154 } else
00155 {
00156 abstol = reltol = 0.0;
00157 posmodifier = negmodifier = 1.0;
00158 }
00159
00160
00161 theDamage = new Mehanny(tag, alpha , beta, gamma , ultimatePosDisp, ultimateNegDisp, abstol, reltol, posmodifier, negmodifier);
00162 }
00163
00164
00165
00166 else if (strcmp(argv[1],"Kratzig") == 0) {
00167 if ( argc != 7 && argc != 8) {
00168 opserr << "WARNING invalid number of arguments\n";
00169 printCommand(argc,argv);
00170 opserr << "Want: damageModel Kratzig tag? Alpha? Beta? <Gamma?> ultimatePosDisp? ultimateNegDisp?" << endln;
00171 return TCL_ERROR;
00172 }
00173
00174 int tag;
00175 double ultimatePosDisp,ultimateNegDisp;
00176
00177 if (Tcl_GetInt(interp, argv[2], &tag) != TCL_OK) {
00178 opserr << "WARNING invalid tag\n";
00179 opserr << "Damage model Kratzig " << endln;
00180 return TCL_ERROR;
00181 }
00182
00183 if (Tcl_GetDouble(interp, argv[3], &ultimatePosDisp) != TCL_OK) {
00184 opserr << "WARNING invalid ultimatePosDisp\n";
00185 opserr << "Damage Kratzig : " << tag << endln;
00186 return TCL_ERROR;
00187 }
00188
00189 if (Tcl_GetDouble(interp,argv[4], &ultimateNegDisp) != TCL_OK) {
00190 opserr << "WARNING invalid ultimateNegDisp\n";
00191 opserr << "Damage Kratzig : " << tag << endln;
00192 return TCL_ERROR;
00193 }
00194
00195
00196 theDamage = new Kratzig(tag, ultimatePosDisp, ultimateNegDisp);
00197 }
00198
00199
00200
00201
00202 else if (strcmp(argv[1],"NormalizedPeak") == 0) {
00203 if (argc != 6 ) {
00204 opserr << "WARNING invalid number of arguments\n";
00205 printCommand(argc,argv);
00206 opserr << "Want: damageModel NormalizedPeak tag? maxValue? minValue? response?" << endln;
00207 return TCL_ERROR;
00208 }
00209
00210 int tag;
00211 double maxVal, minVal;
00212
00213 if (Tcl_GetInt(interp, argv[2], &tag) != TCL_OK) {
00214 opserr << "WARNING invalid tag\n";
00215 opserr << "Damage model NormalizedPeak " << endln;
00216 return TCL_ERROR;
00217 }
00218
00219 if (Tcl_GetDouble(interp, argv[3], &maxVal) != TCL_OK) {
00220 opserr << "WARNING invalid maxVal\n";
00221 opserr << "Damage model NormalizedPeak : " << tag << endln;
00222 return TCL_ERROR;
00223 }
00224
00225 if (Tcl_GetDouble(interp, argv[4], &minVal) != TCL_OK) {
00226 opserr << "WARNING invalid Beta\n";
00227 opserr << "Damage NormalizedPeak : " << tag << endln;
00228 return TCL_ERROR;
00229 }
00230
00231
00232 const char *responsetype = argv[5];
00233
00234
00235 theDamage = new NormalizedPeak( tag, maxVal, minVal, responsetype);
00236 }
00237
00238
00239
00240
00241 else if (strcmp(argv[1],"HystereticEnergy") == 0) {
00242 if (argc != 5 ) {
00243 opserr << "WARNING invalid number of arguments\n";
00244 printCommand(argc,argv);
00245 opserr << "Want: damageModel HystereticEnergy tag? Etotal? Cpower?" << endln;
00246 return TCL_ERROR;
00247 }
00248
00249 int tag;
00250 double Etot,Cpow;
00251
00252 if (Tcl_GetInt(interp, argv[2], &tag) != TCL_OK) {
00253 opserr << "WARNING invalid tag\n";
00254 opserr << "Damage model HystereticEnergy " << endln;
00255 return TCL_ERROR;
00256 }
00257
00258 if (Tcl_GetDouble(interp, argv[3], &Etot) != TCL_OK) {
00259 opserr << "WARNING invalid Total energy\n";
00260 opserr << "Damage model HystereticEnergy : " << tag << endln;
00261 return TCL_ERROR;
00262 }
00263
00264 if (Tcl_GetDouble(interp, argv[4], &Cpow) != TCL_OK) {
00265 opserr << "WARNING invalid Constant exponent\n";
00266 opserr << "Damage HystereticEnergy : " << tag << endln;
00267 return TCL_ERROR;
00268 }
00269
00270
00271 theDamage = new HystereticEnergy( tag, Etot, Cpow );
00272 }
00273
00274
00275
00276
00277 else if (strcmp(argv[1],"ParkAng") == 0) {
00278 if (argc != 6 ) {
00279 opserr << "WARNING invalid number of arguments\n";
00280 printCommand(argc,argv);
00281 opserr << "Want: damageModel ParkAng tag? deltaU? beta? sigmaY?" << endln;
00282 return TCL_ERROR;
00283 }
00284
00285 int tag;
00286 double deltaU, beta, sigmaY;
00287
00288 if (Tcl_GetInt(interp, argv[2], &tag) != TCL_OK) {
00289 opserr << "WARNING invalid tag\n";
00290 opserr << "Damage model NormalizedPeak " << endln;
00291 return TCL_ERROR;
00292 }
00293
00294 if (Tcl_GetDouble(interp, argv[3], &deltaU) != TCL_OK) {
00295 opserr << "WARNING invalid deltaU\n";
00296 opserr << "Damage model ParkAng : " << tag << endln;
00297 return TCL_ERROR;
00298 }
00299
00300 if (Tcl_GetDouble(interp, argv[4], &beta) != TCL_OK) {
00301 opserr << "WARNING invalid beta\n";
00302 opserr << "Damage ParkAng : " << tag << endln;
00303 return TCL_ERROR;
00304 }
00305
00306 if (Tcl_GetDouble(interp, argv[5], &sigmaY) != TCL_OK) {
00307 opserr << "WARNING invalid sigmaY\n";
00308 opserr << "Damage ParkAng : " << tag << endln;
00309 return TCL_ERROR;
00310 }
00311
00312
00313
00314 theDamage = new ParkAng( tag, deltaU, beta, sigmaY );
00315 }
00316
00317
00318 else {
00319 opserr << "WARNING the damage model specified does not exist " << argv[1] << endln;
00320 return TCL_ERROR;
00321 }
00322
00323
00324
00325 if (theDamage == 0) {
00326 opserr << "WARNING could not create DamageModel, out of memory " << argv[1] << endln;
00327 return TCL_ERROR;
00328 }
00329
00330
00331 if (theTclBuilder->addDamageModel(*theDamage) < 0) {
00332 opserr << "WARNING could not add DamageModel to the domain\n";
00333 opserr << *theDamage << endln;
00334 delete theDamage;
00335 return TCL_ERROR;
00336 }
00337
00338 return TCL_OK;
00339 }