TclModelBuilderDamageModelCommand.cpp

Go to the documentation of this file.
00001 /* ****************************************************************** **
00002 **    OpenSees - Open System for Earthquake Engineering Simulation    **
00003 **          Pacific Earthquake Engineering Research Center            **
00004 **                                                                    **
00005 **                                                                    **
00006 ** (C) Copyright 1999, The Regents of the University of California    **
00007 ** All Rights Reserved.                                               **
00008 **                                                                    **
00009 ** Commercial use of this program without express permission of the   **
00010 ** University of California, Berkeley, is strictly prohibited.  See   **
00011 ** file 'COPYRIGHT'  in main directory for information on usage and   **
00012 ** redistribution,  and for a DISCLAIMER OF ALL WARRANTIES.           **
00013 **                                                                    **
00014 ** Developed by:                                                      **
00015 **   Frank McKenna (fmckenna@ce.berkeley.edu)                         **
00016 **   Gregory L. Fenves (fenves@ce.berkeley.edu)                       **
00017 **   Filip C. Filippou (filippou@ce.berkeley.edu)                     **
00018 **                                                                    **
00019 ** ****************************************************************** */
00020                                                                         
00021 // $Revision: 1.2 $
00022 // $Date: 2004/09/03 15:07:41 $
00023 // $Source: /usr/local/cvs/OpenSees/SRC/damage/TclModelBuilderDamageModelCommand.cpp,v $                                                                        
00024 // Written: Arash Altoontash, Gregory Deierlein
00025 // Created: 08/02
00026 // Revision: AA
00027 //
00028 // Description: This file contains the function invoked when the user invokes
00029 // the DamageModel command in the interpreter. 
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;           // fmk for accessing the modelbuilder
00054 
00055 int
00056 TclModelBuilderDamageModelCommand (ClientData clientData, Tcl_Interp *interp, int argc,
00057                                    TCL_Char **argv, TclModelBuilder *theTclBuilder )
00058 {
00059   theDamageTclModelBuilder = theTclBuilder;             // fmk for accessing the modelbuilder
00060   
00061   // Make sure there is a minimum number of arguments
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   // Pointer to a damage model that will be added to the model builder
00069   DamageModel *theDamage = 0;
00070   
00071   
00072   // Check argv[2] for damage model type
00073   
00074   // Mehanny damage model
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     // Parsing was successful, allocate the damage model
00161     theDamage = new Mehanny(tag, alpha , beta, gamma , ultimatePosDisp, ultimateNegDisp, abstol, reltol, posmodifier, negmodifier);
00162   }
00163   // end of Mehanny damage model
00164   
00165   // Kratzig damage model
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     // Parsing was successful, allocate the damage model
00196     theDamage = new Kratzig(tag, ultimatePosDisp, ultimateNegDisp);       
00197   }
00198   // end of Kratzig damage model
00199   
00200   
00201   // NormalizedPeak damage model
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     // Parsing was successful, allocate the damage model
00235     theDamage = new NormalizedPeak( tag, maxVal, minVal, responsetype);
00236   }
00237   // end of NormalizedPeak damage model
00238   
00239   
00240   // HystereticEnergy damage model
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     // Parsing was successful, allocate the damage model
00271     theDamage = new HystereticEnergy( tag, Etot, Cpow );
00272   }
00273   // end of NormalizedPeak damage model
00274   
00275   
00276   // ParkAng damage model
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     // Parsing was successful, allocate the damage model
00314     theDamage = new ParkAng( tag, deltaU,  beta,  sigmaY );
00315   }
00316   // end of NormalizedPeak damage model
00317   
00318   else {
00319     opserr << "WARNING the damage model specified does not exist " << argv[1] << endln;
00320     return TCL_ERROR;
00321   }
00322   
00323   
00324   // check if the damage model is constructed or not
00325   if (theDamage == 0) {
00326     opserr << "WARNING could not create DamageModel, out of memory " << argv[1] << endln;
00327     return TCL_ERROR;
00328   }
00329   
00330   // Now add the damage model to the modelBuilder
00331   if (theTclBuilder->addDamageModel(*theDamage) < 0) {
00332     opserr << "WARNING could not add DamageModel to the domain\n";
00333     opserr << *theDamage << endln;
00334     delete theDamage; // invoke the material objects destructor, otherwise mem leak
00335     return TCL_ERROR;
00336   }
00337   
00338   return TCL_OK;
00339 }

Generated on Mon Oct 23 15:05:00 2006 for OpenSees by doxygen 1.5.0