Kratzig.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.1 $
00022 // $Date: 2004/09/01 03:54:28 $
00023 // $Source: /usr/local/cvs/OpenSees/SRC/damage/Kratzig.cpp,v $
00024                                                                         
00025 // Written: AA,GGD 
00026 // Created: 08/02
00027 // Revision: AA
00028 //
00029 // Description: This file contains the class implementation for Damage model  .
00030 //
00031 
00032 #include <Kratzig.h>
00033 #include <DamageResponse.h>
00034 
00035 
00036 Kratzig::Kratzig( int tag, double ultimatePosVal ,  double ultimateNegVal )
00037 :DamageModel(tag,DMG_TAG_Kratzig),
00038 UltimatePosValue(ultimatePosVal) , UltimateNegValue(ultimateNegVal)
00039 {
00040         if ( UltimatePosValue <= 0.0 )  {
00041                 opserr << "Kratzig::Kratzig : Incorrect arguments for the damage model"<<endln;
00042                 exit (-1);
00043         }
00044         if ( UltimateNegValue < 0.0 ) UltimateNegValue = fabs( UltimateNegValue);
00045         if ( UltimateNegValue == 0.0 ) UltimateNegValue = UltimatePosValue;
00046         
00047         this->revertToStart();
00048 }
00049 
00050 
00051 Kratzig::Kratzig()
00052 :DamageModel(0,DMG_TAG_Kratzig)
00053 {
00054         // Does nothing
00055 }
00056 
00057 
00058 Kratzig::~Kratzig()
00059 {
00060         // Does nothing
00061 }
00062 
00063 
00064 int
00065 Kratzig::setTrial ( Vector trialVector )
00066 {
00067         // Trial step variables
00068         double TDefo, TForce, TKunload, TSumPosFHC, TPosPHC, TSumNegFHC, TNegPHC, TMaxPosDefo, TMinNegDefo, TDamage;
00069         
00070         // retrieve history data
00071         double  CDefo                   = CommitInfo[0];
00072         double  CForce                  = CommitInfo[1];
00073         double  CKunload                = CommitInfo[2];
00074         double  CSumPosFHC              = CommitInfo[3];
00075         double  CPosPHC                 = CommitInfo[4];
00076         double  CSumNegFHC              = CommitInfo[5];
00077         double  CNegPHC                 = CommitInfo[6];
00078         double  CMaxPosDefo             = CommitInfo[7];
00079         double  CMinNegDefo             = CommitInfo[8];
00080         double  CDamage                 = CommitInfo[9];
00081 
00082         if ( trialVector.Size() < 3 ) {
00083                 opserr << "WARNING: Kratzig::setTrial Wrong vector size for trial data" << endln;
00084                 return -1;
00085         }
00086                 
00087         TDefo           = trialVector(0);
00088         TForce          = trialVector(1);
00089         TKunload        = trialVector(2);
00090 
00091         if ( TDefo > 0.0 ) {
00092                 if ( CDefo < 0.0 ) {
00093                         
00094                         double ZeroDispForce;
00095                         if ( fabs ( TDefo - CDefo ) > 1.0e-6 ) {
00096                                 ZeroDispForce = CForce - (TForce - CForce) * CDefo / (TDefo - CDefo );
00097                         } else {
00098                                 ZeroDispForce = 0.5*( CForce + TForce );
00099                         }
00100                         
00101                         TSumNegFHC = CSumNegFHC + 0.5*( ZeroDispForce + CForce )*( 0.0 - CDefo );
00102                         
00103                         if ( TDefo <= CMaxPosDefo ) {
00104                                 TSumPosFHC = CSumPosFHC + 0.5*( TForce + ZeroDispForce )*( TDefo - 0.0);
00105                                 TPosPHC = CPosPHC;
00106                         } else
00107                         {
00108                                 TMaxPosDefo = TDefo;
00109                                 double MaxDispForce = CForce +(TForce - CForce ) * ( TMaxPosDefo - CDefo)/( TDefo - CDefo );
00110                                 TPosPHC = CPosPHC + 0.5*( TForce + MaxDispForce )*( TDefo - TMaxPosDefo);
00111                                 TSumPosFHC = CSumPosFHC + 0.5*( MaxDispForce + CForce )*( TMaxPosDefo - CDefo);
00112                         }
00113 
00114                 } else {
00115         
00116                         if ( TDefo <= CMaxPosDefo ) {
00117                                 TSumPosFHC = CSumPosFHC + 0.5*( TForce + CDefo )*( TDefo - CDefo );
00118                                 TPosPHC = CPosPHC;
00119                         } else
00120                         {
00121                                 double MaxDispForce = CForce +(TForce - CForce ) * ( CMaxPosDefo - CDefo)/( TDefo - CDefo );
00122                                 TPosPHC = CPosPHC + 0.5*( TForce + MaxDispForce )*( TDefo - CMaxPosDefo);
00123                                 TSumPosFHC = CSumPosFHC + 0.5*( MaxDispForce + CForce )*( CMaxPosDefo - CDefo);
00124                                 TMaxPosDefo = TDefo;
00125                         }                       
00126                 }
00127                 
00128         } else if (TDefo < 0.0 ) {
00129 
00130                 if ( CDefo > 0.0 ) {
00131                         
00132                         double ZeroDispForce;
00133                         if ( fabs( TDefo - CDefo ) > 1.0e-6 ) {
00134                                 ZeroDispForce = CForce - (TForce - CForce) * CDefo / (TDefo - CDefo );
00135                         } else {
00136                                 ZeroDispForce = 0.5*( CForce + TForce );
00137                         }
00138                         
00139                         TSumPosFHC = CSumPosFHC + 0.5*( ZeroDispForce + CForce )*( 0.0 - CDefo );
00140                         
00141                         if ( TDefo >= CMinNegDefo ) {
00142                                 TSumNegFHC = CSumNegFHC + 0.5*( TForce + ZeroDispForce )*( TDefo - 0.0);
00143                                 TNegPHC = CNegPHC;
00144                         } else
00145                         {
00146                                 TMinNegDefo = TDefo;
00147                                 double MinDispForce = CForce +(TForce - CForce ) * ( TMinNegDefo - CDefo)/( TDefo - CDefo );
00148                                 TNegPHC = CNegPHC + 0.5*( TForce + MinDispForce )*( TDefo - TMinNegDefo);
00149                                 TSumNegFHC = CSumNegFHC + 0.5*( MinDispForce + CForce )*( TMinNegDefo - CDefo);
00150                         }
00151 
00152                 } else {
00153                         
00154                         if ( TDefo >= CMinNegDefo ) {
00155                                 TSumNegFHC = CSumNegFHC + 0.5*( TForce + CDefo )*( TDefo - CDefo );
00156                                 TNegPHC = CNegPHC;
00157                         } else
00158                         {
00159                                 double MinDispForce = CForce +(TForce - CForce ) * ( CMinNegDefo - CDefo)/( TDefo - CDefo );
00160                                 TNegPHC = CNegPHC + 0.5*( TForce + MinDispForce )*( TDefo - CMinNegDefo);
00161                                 TSumNegFHC = CSumNegFHC + 0.5*( MinDispForce + CForce )*( CMinNegDefo - CDefo);
00162                                 TMinNegDefo = TDefo;
00163                         }
00164                 }
00165                         
00166         } else { 
00167                 // TDefo = 0.0
00168                 if ( CDefo < 0.0 ) {
00169                         
00170                         TSumNegFHC = CSumNegFHC + 0.5*( TForce + CForce )*( TDefo - CDefo );
00171                 } else if ( CDefo > 0.0 ) {
00172                         TSumPosFHC = CSumPosFHC + 0.5*( TForce + CForce )*( TDefo - CDefo );
00173                 } else TSumPosFHC = CSumPosFHC;
00174         }
00175 
00176         double PosDamage , NegDamage;
00177         PosDamage = ( TPosPHC + TSumPosFHC ) / ( UltimatePosValue + TSumPosFHC ) ;
00178 
00179         NegDamage = ( TNegPHC + TSumNegFHC ) / ( UltimateNegValue + TSumNegFHC ) ;
00180         
00181         TDamage = PosDamage + NegDamage - PosDamage * NegDamage;
00182 
00183         if ( TDamage < CDamage ) TDamage = CDamage;
00184 
00185         
00186         TrialInfo[0] = TDefo;
00187         TrialInfo[1] = TForce;
00188         TrialInfo[2] = TKunload;
00189         TrialInfo[3] = TSumPosFHC;
00190         TrialInfo[4] = TPosPHC;
00191         TrialInfo[5] = TSumNegFHC;
00192         TrialInfo[6] = TNegPHC;
00193         TrialInfo[7] = TMaxPosDefo;
00194         TrialInfo[8] = TMinNegDefo;
00195         TrialInfo[9] = TDamage;
00196 
00197         return 0;
00198 }
00199 
00200 
00201 double
00202 Kratzig::getDamage (void)
00203 {
00204         return TrialInfo[9];
00205 }
00206     
00207 
00208 double Kratzig::getPosDamage (void)
00209 {
00210         double PosDamage = ( TrialInfo[4] + TrialInfo[3] ) / ( UltimatePosValue + TrialInfo[3] ) ;
00211         return PosDamage;
00212 }
00213 
00214 
00215 double Kratzig::getNegDamage (void)
00216 {
00217         double  NegDamage = ( fabs(TrialInfo[6]) + fabs(TrialInfo[5]) ) / ( fabs(UltimateNegValue) + fabs(TrialInfo[5]) ) ;
00218         return NegDamage;
00219 }
00220 
00221 
00222 int
00223 Kratzig::commitState (void)
00224 {
00225         for ( int i=0 ; i<10 ; i++ )
00226         {
00227                 LastCommitInfo[i] = CommitInfo[i];
00228                 CommitInfo[i] = TrialInfo[i];
00229         }
00230 
00231         return 0;
00232 }
00233 
00234 int
00235 Kratzig::revertToLastCommit (void)
00236 {
00237         for ( int i=0 ; i<10 ; i++ )
00238         {
00239                 CommitInfo[i] = LastCommitInfo[i];
00240         }
00241 
00242         return 0;
00243 }
00244 
00245 int
00246 Kratzig::revertToStart (void)
00247 {
00248         for ( int i = 0 ; i< 10 ; i++ ){
00249                 TrialInfo[i] = 0.0;
00250                 CommitInfo[i] = 0.0;
00251                 LastCommitInfo[i] = 0.0;
00252         }
00253 
00254         return 0;
00255 }
00256 
00257 
00258 DamageModel*
00259 Kratzig::getCopy (void)
00260 {
00261         Kratzig *theCopy = new Kratzig(this->getTag() , UltimatePosValue , UltimateNegValue );
00262     
00263         for ( int i=0 ; i<10 ; i++ )
00264         {
00265                 theCopy->TrialInfo[i] = TrialInfo[i];
00266                 theCopy->CommitInfo[i] = CommitInfo[i];
00267                 theCopy->LastCommitInfo[i] = LastCommitInfo[i];
00268         }
00269 
00270         return theCopy;
00271 }
00272 
00273 int
00274 Kratzig::setVariable(const char *argv)
00275 {
00276         return -1;
00277 }
00278 
00279 int
00280 Kratzig::getVariable(int variableID, double &info)
00281 {
00282         return -1;
00283 }
00284 
00285 int
00286 Kratzig::setParameter(char **argv, int argc, Information &eleInformation)
00287 {
00288     return -1;
00289 }
00290 
00291 int
00292 Kratzig::updateParameter(int responseID, Information &eleInformation)
00293 {
00294     return -1;
00295 }
00296 
00297 Response*
00298 Kratzig::setResponse(char **argv, int argc, Information &info)
00299 {
00300 //
00301 // we compare argv[0] for known response types for the Truss
00302 //
00303 
00304         if ( strcmp(argv[0],"damage") == 0 || strcmp(argv[0],"damageindex") == 0 )
00305     return new DamageResponse( this , 1 , 0.0 );
00306 
00307         else if ( strcmp(argv[0],"defo") == 0 || strcmp(argv[0],"deformation") == 0 )
00308     return new DamageResponse( this , 2 , 0.0 );
00309 
00310         else if (strcmp(argv[0],"trial") == 0 || strcmp(argv[0],"trialinfo") == 0 )
00311     return new DamageResponse( this , 3 , Vector(4) );
00312 
00313         else 
00314                 return 0;
00315 
00316 }
00317 
00318 int 
00319 Kratzig::getResponse(int responseID, Information &info)
00320 {
00321         switch (responseID) {
00322         case -1:
00323                 return -1;
00324         
00325         case 1:
00326                 return info.setDouble( this->getDamage() );
00327 
00328         case 2:
00329                 return info.setDouble( TrialInfo[0] );
00330 
00331         case 3:
00332                 if(info.theVector!=0)
00333                 {
00334                         (*(info.theVector))(0) = TrialInfo[4];
00335                         (*(info.theVector))(1) = TrialInfo[3];
00336                         (*(info.theVector))(2) = TrialInfo[6];
00337                         (*(info.theVector))(3) = TrialInfo[5];
00338                 }
00339                 return 0;
00340 
00341         default:
00342                 return -1;
00343         }
00344 }
00345 
00346 
00347 int
00348 Kratzig::sendSelf(int commitTag, Channel &theChannel)
00349 {
00350         return 0;
00351 }
00352 
00353 
00354 int
00355 Kratzig::recvSelf(int commitTag, Channel &theChannel,
00356                                                                 FEM_ObjectBroker &theBroker)
00357 {
00358         return 0;
00359 }
00360 
00361 
00362 void
00363 Kratzig::Print(OPS_Stream &s, int flag )
00364 {
00365     s << "CumulativePeak tag: " << this->getTag() << endln;
00366         s << " UltimatePosValue: " << UltimatePosValue << " UltimateNegValue: " << UltimateNegValue << endln;
00367 }
00368 
00369 
00370 int Kratzig::setInputResponse ( Element *elem , const char **argv , int argc, int ndof )
00371 {
00372         return -1;
00373 }

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