PinchingDamage.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: 2006/08/03 23:44:38 $
00023 // $Source: /usr/local/cvs/OpenSees/SRC/material/uniaxial/snap/PinchingDamage.cpp,v $
00024 //
00025 //
00026 // PinchingDamage.cpp: implementation of the PinchingDamage class from Fortran version.
00027 // Originally from SNAP PROGRAM by Prof H.K. Krawinkler
00028 //
00029 // Written: A. Altoontash & Prof. G. Deierlein 12/01
00030 // Revised: 05/03
00031 //
00032 // Purpose: This file contains the implementation for the PinchingDamage class.
00033 //
00035 
00036 #include <PinchingDamage.h>
00037 #include <DamageModel.h>
00038 #include <stdlib.h>
00039 #include <Channel.h>
00040 #include <math.h>
00041 
00042 #include <string.h>
00043 
00044 #define DEBG 0
00045 
00047 // Construction/Destruction
00049 
00050 PinchingDamage::PinchingDamage(int tag, Vector inputParam , DamageModel *strength, DamageModel *stiffness,DamageModel *accelerated,DamageModel *capping)
00051   :UniaxialMaterial(tag,MAT_TAG_SnapPinchingDamage)
00052 {
00053         if( (inputParam.Size()) < 11) 
00054                 opserr << "Error: PinchingDamage(): inputParam, size <19\n" << "\a";
00055   
00056         /*
00057         Input parameters
00058 
00059         elstk      =  initial elastic stiffness
00060         fyieldPos  =  positive yield strength
00061         fyieldNeg  =  yield strength in compression
00062         alpha      =  strain hardening ratio (fraction of elstk)
00063         elstk      =  initial elastic stiffness
00064         Resfac     =  residual stress after collapse
00065         dyieldPos  =  positive yield displacement
00066         dyieldNeg  =  negative yield displacement
00067 
00068         ecaps, ecapd, ecapk, ecapa = parameter expressing the hystetic
00069                     energy dissipacion capacity.
00070         Enrgts, Enrgtd, Enrgtk, Enrgta = hysteretic energy dissipation
00071                         capacity
00072         */
00073         elstk                   = inputParam[0];
00074         fyieldPos               = inputParam[1];
00075         fyieldNeg               = inputParam[2];
00076         alpha                   = inputParam[3];
00077         Resfac                  = inputParam[4];
00078         capSlope                = inputParam[5];
00079         capDispPos              = inputParam[6];
00080         capDispNeg              = inputParam[7];
00081         fpPos                   = inputParam[8];
00082         fpNeg                   = inputParam[9];
00083         a_pinch                 = inputParam[10];
00084   
00085         // Error check
00086         
00087         if ( capSlope > 0.0 )
00088     {
00089                 opserr << "Error: PinchingDamage::PinchingDamage  : CapSlope must be < 0\n" << "\a";
00090     }           
00091         
00092         if ( Resfac <  0.0  || Resfac > 1.0)
00093     {
00094                 opserr << "Error: PinchingDamage::PinchingDamage  : Residual must be > 0 and <= 1\n" << "\a";
00095     }           
00096         
00097         if ( a_pinch < 0.0 || a_pinch > 1.0)
00098     {
00099                 opserr << "Error: PinchingDamage::PinchingDamage  : kappad (dev. point)must be > 0 and <= 1\n" << "\a";
00100     }
00101         
00102         if ( alpha > 0.8 || alpha < -0.8 )
00103     {
00104                 opserr << "Error: PinchingDamage::PinchingDamage  : alpha must be < 0.8 and > -0.8\n" << "\a";  
00105     }
00106         
00107         if ( alpha == capSlope )
00108     {
00109                 opserr << "Error: PinchingDamage::PinchingDamage  : Error: alpha Hard. can not be equal to alphaCap\n" << "\a"; 
00110     }
00111   
00112         StrDamage = StfDamage = AccDamage = CapDamage = NULL;
00113         if ( strength != NULL )
00114         {
00115                 StrDamage = strength->getCopy();
00116                 if ( StrDamage == NULL ) {
00117                         opserr << "Error: CloughDamage::CloughDamage  : Can not make a copy of strength damage model\n" << "\a";        
00118                         exit(-1);
00119                 }
00120         }
00121 
00122         if ( stiffness != NULL )
00123         {
00124                 StfDamage = stiffness->getCopy();
00125                 if ( StfDamage == NULL ) {
00126                         opserr << "Error: CloughDamage::CloughDamage  : Can not make a copy of stiffness damage model\n" << "\a";       
00127                         exit(-1);
00128                 }
00129         }
00130         
00131         if ( accelerated != NULL )
00132         {
00133                 AccDamage = accelerated->getCopy();
00134                 if ( AccDamage == NULL ) {
00135                         opserr << "Error: CloughDamage::CloughDamage  : Can not make a copy of accelerated stiffness degradation damage model\n" << "\a";       
00136                         exit(-1);
00137                 }
00138         }       
00139 
00140         if ( capping != NULL )
00141         {
00142                 CapDamage = capping->getCopy();
00143                 if ( CapDamage == NULL ) {
00144                         opserr << "Error: CloughDamage::CloughDamage  : Can not make a copy of capping damage model\n" << "\a"; 
00145                         exit(-1);
00146                 }
00147         }
00148 
00149         
00150         // Initialice history data
00151         this->revertToStart();
00152 }
00153 
00154 
00155 PinchingDamage::PinchingDamage()
00156   :UniaxialMaterial(0,MAT_TAG_SnapPinchingDamage) 
00157 {
00158 
00159 }
00160 
00161 
00162 
00163 PinchingDamage::~PinchingDamage()
00164 {
00165         if ( StrDamage != 0 ) delete StrDamage;
00166         if ( StfDamage != 0 ) delete StfDamage;
00167         if ( AccDamage != 0 ) delete AccDamage;
00168         if ( CapDamage != 0 ) delete CapDamage;
00169 }
00170 
00171 
00172 int PinchingDamage::revertToStart()
00173 {
00174         dyieldPos = fyieldPos / elstk;
00175         dyieldNeg = fyieldNeg / elstk;
00176         
00177         double ekhard = elstk * alpha;
00178 
00179         double fPeakPos = fyieldPos + ekhard * ( capDispPos - dyieldPos );
00180         double fPeakNeg = fyieldNeg + ekhard * ( capDispNeg - dyieldNeg );
00181         
00182         hsCommit[0] = 0.0;                      // d
00183         hsCommit[1] = 0.0;                      // f
00184         hsCommit[2] = elstk;            // ek
00185         hsCommit[3] = elstk;            // ekunload
00186         hsCommit[4] = elstk;            // ekexcurs
00187         hsCommit[5] = 0.0;                      // Enrgtot
00188         hsCommit[6] = 0.0;                      // Enrgc
00189         hsCommit[7] = 0.0;                      // sp
00190         hsCommit[8] = 0.0;                      // sn
00191         hsCommit[9] = 0.0;                      // kon
00192         hsCommit[10] = dyieldPos;       // dmax
00193         hsCommit[11] = dyieldNeg;       // dmin
00194         hsCommit[12] = fyieldPos;       // fyPos
00195         hsCommit[13] = fyieldNeg;       // fyNeg
00196         hsCommit[14] = capDispPos;      // cpPos
00197         hsCommit[15] = capDispNeg;      // cpNeg
00198         hsCommit[16] = fyieldPos;       // fmax
00199         hsCommit[17] = fyieldNeg;       // fmin
00200         hsCommit[18] = alpha;           // alphaPos
00201         hsCommit[19] = alpha;           // alphaNeg
00202         hsCommit[20] = -capSlope * elstk * capDispPos + fPeakPos;       // fCapRefPos
00203         hsCommit[21] = -capSlope * elstk * capDispNeg + fPeakNeg;       // fCapRefNeg
00204         hsCommit[22] = dyieldPos;       // dmaxDeg
00205         hsCommit[23] = dyieldNeg;       // dminDeg
00206         for( int i=0 ; i<24; i++) {
00207                 hsTrial[i]              = hsCommit[i];
00208                 hsLastCommit[i] = hsCommit[i];
00209         }
00210         if ( StrDamage != NULL ) StrDamage->revertToStart();
00211         if ( StfDamage != NULL ) StfDamage->revertToStart();
00212         if ( AccDamage != NULL ) AccDamage->revertToStart();
00213         if ( CapDamage != NULL ) CapDamage->revertToStart();
00214         
00215         return 0;
00216 }
00217 
00218 
00219 void PinchingDamage::Print(OPS_Stream &s, int flag)
00220 {
00221 
00222         s << "BondSlipMaterial Tag: " << this->getTag() << endln;
00223         s << "D : " << hsTrial[0] << endln;
00224         s << "F : " << hsTrial[1] << endln;
00225         s << "EK: " << hsTrial[2]  << endln;
00226         s << "Input Parameters:\n";
00227         s << endln;
00228 }
00229 
00230 
00231 int PinchingDamage::revertToLastCommit()
00232 {
00233         for(int i=0; i<24; i++) {
00234                 hsTrial[i]      = hsCommit[i];
00235                 hsCommit[i] = hsLastCommit[i];
00236         }
00237         if ( StrDamage != NULL ) StrDamage->revertToLastCommit();
00238         if ( StfDamage != NULL ) StfDamage->revertToLastCommit();
00239         if ( AccDamage != NULL ) AccDamage->revertToLastCommit();
00240         if ( CapDamage != NULL ) CapDamage->revertToLastCommit();
00241         
00242         return 0;
00243 }
00244 
00245 
00246 double PinchingDamage::getTangent()
00247 {
00248         return hsTrial[2];
00249 }
00250 
00251 double PinchingDamage::getInitialTangent (void)
00252 {
00253         return elstk;
00254 }
00255 
00256 double PinchingDamage::getStress()
00257 {
00258         return hsTrial[1];
00259 }
00260 
00261 
00262 double PinchingDamage::getStrain (void)
00263 {
00264         return hsTrial[0];
00265 }
00266 
00267 
00268 int PinchingDamage::recvSelf(int cTag, Channel &theChannel, 
00269                                FEM_ObjectBroker &theBroker)
00270 {
00271         return 0;
00272 }
00273 
00274 
00275 int PinchingDamage::sendSelf(int cTag, Channel &theChannel)
00276 {
00277         return 0;
00278 }
00279 
00280 
00281 UniaxialMaterial *PinchingDamage::getCopy(void)
00282 {
00283         Vector inp(11);
00284         
00285         inp[0] = elstk;
00286         inp[1] = fyieldPos;
00287         inp[2] = fyieldNeg;
00288         inp[3] = alpha;
00289         inp[4] = Resfac;
00290         inp[5] = capSlope;
00291         inp[6] = capDispPos;
00292         inp[7] = capDispNeg;
00293         inp[8] = fpPos;
00294         inp[9] = fpNeg;
00295         inp[10] = a_pinch;
00296 
00297         
00298         PinchingDamage *theCopy = new PinchingDamage(this->getTag(), inp, StrDamage, StfDamage, AccDamage, CapDamage  );
00299 
00300         for (int i=0; i<24; i++) {
00301                 theCopy->hsTrial[i] = hsTrial[i];
00302                 theCopy->hsCommit[i] = hsCommit[i];
00303                 theCopy->hsLastCommit[i] = hsLastCommit[i];
00304         }
00305         
00306         return theCopy;
00307 }
00308 
00309 
00310 int PinchingDamage::setTrialStrain( double d, double strainRate)
00311 {
00312         int flagDeg , flgstop , Unl, kon;
00313         double deltaD;
00314         double ekP,ekunload,ekexcurs,Enrgtot,Enrgc,sp,sn,dmax,dmin,fyPos,fyNeg,fP,dP;
00315         double ek,f,betaa,betad,betak,betas,ekLim;
00316         double ekt,f1,f2,fpinch,dCap1Pos,dCap2Pos,dCap1Neg,dCap2Neg;
00317         double dyPos,dyNeg,dch,ekpinch, cpPos, cpNeg;
00318         double ekhardNeg,ekhardPos,fmax,fmin,dmaxDeg,dminDeg;
00319         double alphaPos, alphaNeg, fCapRefPos, fCapRefNeg;
00320         
00321         //      Updating of information in each new call to this Model ----------
00322 
00323         flagDeg = 0;
00324         flgstop = 0;
00325         Unl = 1;
00326         
00327         dP                      = hsCommit[0];
00328         fP                      = hsCommit[1];
00329         ekP                     = hsCommit[2];
00330         ekunload        = hsCommit[3];
00331         ekexcurs        = hsCommit[4];
00332         Enrgtot         = hsCommit[5];
00333         Enrgc           = hsCommit[6];
00334         sp                      = hsCommit[7];
00335         sn                      = hsCommit[8];
00336         kon                     = (int) hsCommit[9];
00337         dmax            = hsCommit[10];
00338         dmin            = hsCommit[11];
00339         fyPos           = hsCommit[12];
00340         fyNeg           = hsCommit[13];                    
00341         cpPos           = hsCommit[14];
00342         cpNeg           = hsCommit[15];
00343         fmax            = hsCommit[16];
00344         fmin            = hsCommit[17];
00345         alphaPos        = hsCommit[18];
00346         alphaNeg        = hsCommit[19];
00347         fCapRefPos      = hsCommit[20];
00348         fCapRefNeg      = hsCommit[21];
00349         dmaxDeg         = hsCommit[22];
00350         dminDeg         = hsCommit[23];
00351         
00352         ekhardPos       = alphaPos * elstk;
00353         ekhardNeg       = alphaNeg * elstk;
00354         deltaD          = d-dP;
00355 
00356         betas = betak = betaa = betad = 0.0;
00357 
00358         //      Loop to initialize parameters 
00359         if ( kon == 0 )
00360     {
00361                 if( deltaD >= 0.0)
00362                 {
00363                         kon = 1;
00364                 }
00365                 else
00366                 {
00367                         kon = 2;
00368                 }
00369     }
00370 
00371         //      Modification to the origin of the deviation point
00372         // a_pinch = 1 - a_pinch;
00373 
00374 
00375         //      STARTS BIG LOOP
00376         //      Positive Delta indicating loading
00377 
00378         if ( deltaD >= 0.0 ) {
00379                 if ( kon == 2 ) {
00380                         kon = 1;
00381                         Unl = 0;
00382                         
00383                         if( StfDamage != NULL ) {                               
00384         
00385                                 betak = StfDamage->getDamage();
00386                                 if( betak>=1.0 ) {
00387                                         opserr << "Total loss for stiffness degradation\n";
00388                                         betak = 1.0;
00389                                 }
00390                                 ekunload = elstk * ( 1 - betak );
00391                                 ekLim = ( fmax - fmin ) / ( dmaxDeg - dminDeg );
00392                                 if( ekunload <= ekLim ) ekunload = ekLim;
00393                                 //      if( ekunload <= ekhardNeg ) flgstop = 1;
00394                         }
00395                         
00396                         //      Determination of sn according to the hysteresis status
00397                         
00398                         if( ekunload <= 1.e-7 ) flgstop = 1;
00399                         
00400                         if(fP < 0.0) {
00401                                 if( (fabs(dmaxDeg-dyieldPos) >= 1.e-10) && (fabs(dP - fP / ekunload) <= 1.e-10) ) {
00402                                         sn = 1.e-9;
00403                                 }
00404                                 else {
00405                                         sn = dP - fP / ekunload;
00406                                 }
00407                         }
00408 
00409             if( fabs( dminDeg - dP ) <= 1.e-10) sp = sn + 1.e-10;
00410                 }
00411                 
00412                 //      LOADING
00413                 //      Push envelope
00414                 
00415                 if ( d >= dmaxDeg ) {
00416                         this->envelPosCap ( fyPos, alphaPos, capSlope, cpPos, d, &f, &ek );
00417                         dmax = d;
00418                         dmaxDeg = d;
00419                         fmax = f;
00420                 } else if ( fabs(sn) > 1.e-10) {
00421                         this->envelPosCap ( fyPos, alphaPos, capSlope, cpPos, dmaxDeg, &fmax, &ekt );
00422                         dch = dmaxDeg - fmax / ekunload;
00423                         double fpdegPos = fmax * fpPos;
00424                         ekpinch = fpdegPos / ( dmaxDeg - sn );
00425                         fpinch = ekpinch * ( a_pinch * dch - sn );
00426                         
00427                         if(sn <= a_pinch * dch ) {
00428                                 if ( d < sn ) {
00429                                         ek = ekunload;
00430                                         f  = fP + ek * deltaD;
00431                                 }
00432                                 else if ( d >= sn  &&  d < a_pinch * dch ) {
00433                                         ek = ekpinch;
00434                                         f2 = ek * ( d - sn );
00435                                         f1 = fP + ekunload * deltaD;
00436                                         f= (f1<f2) ? f1 : f2;
00437                                         if( ekunload < ek ) flgstop = 1;
00438                                         if ( fabs(f-f1) < 1.e-10) ek=ekunload;
00439                                 }
00440                                 else {
00441                                         ek = (fmax-fpinch) / (dmaxDeg - a_pinch * dch);
00442                                         f2 = fpinch + ek * ( d - a_pinch * dch );
00443                                         f1 = fP + ekunload * deltaD;
00444                                         f = (f1<f2) ? f1 : f2;
00445                                         if( ekunload < ek) flgstop = 1;
00446                                         if ( fabs( f - f1 )  <  1.e-10) ek = ekunload;
00447                                 }
00448                         }
00449                         else if( sn  >  a_pinch * dch) {
00450                                 //      If d is larger than sn
00451                                 
00452                                 if( d  <  sn ) {
00453                                         ek = ekunload;
00454                                         f = fP + ek * deltaD;
00455                                 }
00456                                 else {
00457                                         ek = fmax / ( dmaxDeg - sn );
00458                                         f2 = ek * ( d - sn );
00459                                         f1 = fP + ekunload * deltaD;
00460                                         f = (f1 < f2) ? f1 : f2;
00461                                         if ( ekunload  <  ek) flgstop = 1;
00462                                         if ( fabs(f-f1)  <  1.e-10) ek = ekunload;
00463                                 }
00464                         }
00465                 }
00466                 else {
00467                         if (d  >  0.0) { 
00468                                 this->envelPosCap ( fyPos, alphaPos, capSlope, cpPos, d, &f, &ek );
00469                         }
00470                         else {
00471                                 this->envelNegCap ( fyNeg, alphaNeg, capSlope, cpNeg, d, &f, &ek );
00472                         }
00473                 }
00474                 
00475                 //      UNLOADING (deltaD<0) ---------------------------------------------
00476         } 
00477         else {
00478 
00479                 if ( kon  == 1) {
00480                         kon = 2;
00481                         Unl = 0;
00482 
00483                         if( StfDamage != NULL ) {
00484 
00485                                 betak = StfDamage->getDamage();
00486                                 if( betak>=1.0 ) {
00487                                         opserr << "Total loss for stiffness degradation\n";
00488                                         betak = 1.0;
00489                                 }
00490                                 ekunload = elstk * ( 1 - betak );
00491                                 ekLim= ( fmax - fmin ) / ( dmaxDeg - dminDeg );
00492                                 if( ekunload <= ekLim) ekunload = ekLim;
00493                                 //      if( ekunload <= ekhardPos) flgstop = 1;
00494                         }
00495                         
00496                         // Determination of sn according to the hysteresis status
00497 
00498                         if( ekunload <= 1.e-7) return 0;
00499                         
00500                         if( fP > 0.0) {
00501                                 if( fabs( dminDeg-dyieldNeg ) >= 1.e-10  && fabs(dP - fP / ekunload) <= 1.e-10) {
00502                                         sp = 1.e-9;
00503                                 }
00504                                 else
00505                                 {
00506                                         sp = dP - fP / ekunload;
00507                                 }
00508                         }
00509                         
00510                         if( fabs( dmaxDeg - dP ) <= 1.e-10 ) sn = sp - 1.e-10;
00511                         
00512                 }
00513                 
00514                 //      UNLOADING (deltaD<0) ---------------------------------------------
00515                 
00516                 //      Push envelope
00517                 
00518                 if ( d < dminDeg ) {
00519                         this->envelNegCap ( fyNeg, alphaNeg, capSlope, cpNeg, d, &f, &ek );
00520                         dmin = d;
00521                         dminDeg = d;
00522                         fmin = f;
00523                 }
00524                 else if ( fabs(sp) > 1.e-10 ) {
00525                         this->envelNegCap ( fyNeg, alphaNeg, capSlope, cpNeg, dminDeg, &fmin, &ekt );
00526                         dch = dminDeg - fmin / ekunload;
00527                         double fpdegNeg = fmin * fpNeg;
00528                         ekpinch = fpdegNeg / ( dminDeg - sp );
00529                         fpinch = ekpinch * ( a_pinch * dch - sp );
00530                         
00531                         if( sp >= a_pinch * dch ) {
00532                                 if ( d > sp ) {
00533                                         ek = ekunload;
00534                                         f  = fP + ek * deltaD;
00535                                 }
00536                                 else if ( d <= sp  &&  d > a_pinch * dch) {
00537                                         ek = ekpinch;
00538                                         f2 = ek * ( d - sp );
00539                                         f1 = fP + ekunload * deltaD;
00540                                         
00541                                         f = (f1>f2) ? f1 : f2;
00542                                         if ( ekunload < ek ) flgstop = 1;
00543                                         if ( fabs ( f - f1 ) < 1.e-10 ) ek = ekunload;
00544                                 }
00545                                 else {
00546                                         ek = ( fmin - fpinch ) / ( dminDeg - a_pinch * dch );
00547                                         f2 = fpinch + ek * ( d - a_pinch * dch );
00548                                         f1 = fP + ekunload * deltaD ;
00549                                         f = (f1>f2) ? f1 : f2;
00550                                         if( ekunload < ek ) flgstop = 1;
00551                                         if ( fabs( f - f1 ) < 1.e-10 ) ek = ekunload;
00552                                 }
00553                         }
00554                         else if( sp < a_pinch * dch ) {
00555                                 if( d > sp ) {
00556                                         ek = ekunload;
00557                                         f = fP + ek * deltaD;
00558                                 }
00559                                 else {
00560                                         ek = fmin / ( dminDeg - sp );
00561                                         f2 = ek * ( d - sp );
00562                                         f1 = fP + ekunload * deltaD;
00563                                         f  = (f1 > f2) ? f1 : f2;
00564                                         if ( ekunload < ek) flgstop = 1;
00565                                         if ( fabs(f-f1) < 1.e-10) ek = ekunload;
00566                                         
00567                                 }
00568                         }
00569                 }
00570                 
00571                 else {
00572                         if (d > 0.0) {
00573                                 this->envelPosCap ( fyPos, alphaPos, capSlope, cpPos, d, &f, &ek );
00574                         }
00575                         else {
00576                                 this->envelNegCap ( fyNeg, alphaNeg, capSlope, cpNeg, d, &f, &ek );
00577                         }
00578                 }
00579         }
00580 
00581         //      ENDS BIG LOOP ---------------------------------------------------       
00582 
00583         //      DAMAGE CALCULATIONS ---------------------------------------------
00584         // Calling the damage object
00585         if ( StfDamage != NULL ) { 
00586                 betak = StfDamage->getDamage();
00587                 if( fabs(betak) >= 1.0) betak = 1.0;
00588         }
00589 
00590         if ( StrDamage != NULL ) { 
00591                 betas = StrDamage->getDamage();
00592                 if( fabs(betas) >= 1.0) betas = 1.0;
00593         }
00594 
00595         if ( AccDamage != NULL ) {
00596                 betaa = AccDamage->getDamage();
00597                 if( fabs(betaa) >= 1.0) betaa = 1.0;
00598         }
00599         if ( CapDamage != NULL ) {
00600                 betad = CapDamage->getDamage();
00601                 if( fabs(betad) >= 1.0) betad = 1.0;
00602         }
00603 
00604         //      Flag to deteriorate parameters on the opposite side of the loop --      
00605 
00606         if( f * fP < 0.0) {
00607                 if( fP >0.0 && dmaxDeg >dyieldPos) flagDeg = 1; // positive half cycle
00608                 if( fP < 0.0 && dminDeg < dyieldNeg) flagDeg = 2;       // negative half cycle 
00609         }
00610                 
00611         //      UPDATING OF DETERIORATION PARAMETERS ----------------------------
00612         //      Check the remaining capacity of the system
00613         
00614         if( flagDeg == 1 || flagDeg == 2 ) {
00615                 // Initialize energy of the cycle and Kstif for next loop -------
00616                 ekexcurs = ekunload;
00617                 Enrgc = 0.0;
00618                 
00619                 //Deteriorate parameters for the next half cycle ---------------
00620 
00621                 if( deltaD < 0.0) {
00622                         
00623                         //Update beta values for strength, acc. stiff. and capping
00624                         if( StrDamage != NULL ) betas = StrDamage->getNegDamage();
00625                         if( betas>=1.0 ) {
00626                                 opserr << "Total loss for strength degradation\n";
00627                                 betas = 1.0;
00628                         }
00629                         if( AccDamage != NULL ) betaa = AccDamage->getNegDamage();
00630                         if( betaa>=1.0 ) {
00631                                 opserr << "Total loss for accelerated stiffness degradation\n";
00632                                 betaa = 1.0;
00633                         }
00634                         if( CapDamage != NULL ) betad = CapDamage->getNegDamage();
00635                         if( betad>=1.0 ) {
00636                                 opserr << "Total loss for capping degradation\n";
00637                                 betad = 1.0;
00638                         }
00639                 
00640 
00641                         fyNeg = fyieldNeg * ( 1 - betas );
00642                         alphaNeg = alpha * ( 1 - betas );
00643                         fCapRefNeg = (-capSlope * elstk * capDispNeg + fyieldNeg + elstk * alpha * ( capDispNeg - dyieldNeg) ) * ( 1 - betad );
00644                         dminDeg = dmin * ( 1 + betaa );
00645 
00646                         dyNeg = fyNeg / elstk;
00647                         ekhardNeg = alphaNeg * elstk;
00648 
00649                         dCap1Neg = fCapRefNeg / (elstk-capSlope*elstk);
00650                         dCap2Neg = (fCapRefNeg+ekhardNeg*dyNeg-fyNeg) / (ekhardNeg-capSlope*elstk);
00651                         cpNeg = (dCap1Neg < dCap2Neg) ? dCap1Neg : dCap2Neg;
00652                 }
00653                 
00654                 else {
00655                         
00656                         //Update beta values for strength, acc. stiff. and capping
00657 
00658                         if( StrDamage != NULL ) betas = StrDamage->getPosDamage();
00659                         if( betas>=1.0 ) {
00660                                 opserr << "Total loss for strength degradation\n";
00661                                 betas = 1.0;
00662                         }
00663                         if( AccDamage != NULL ) betaa = AccDamage->getPosDamage();
00664                         if( betaa>=1.0 ) {
00665                                 opserr << "Total loss for accelerated stiffness degradation\n";
00666                                 betaa = 1.0;
00667                         }
00668                         if( CapDamage != NULL ) betad = CapDamage->getPosDamage();
00669                         if( betad>=1.0 ) {
00670                                 opserr << "Total loss for capping degradation\n";
00671                                 betad = 1.0;
00672                         }
00673                 
00674                         fyPos = fyieldPos * ( 1 - betas );
00675                         alphaPos = alpha * ( 1 - betas );
00676                         fCapRefPos = (-capSlope * elstk * capDispPos + fyieldPos + elstk * alpha * ( capDispPos - dyieldPos ) ) * ( 1 - betad );
00677                         dmaxDeg = dmax * ( 1 + betaa );
00678 
00679                         dyPos = fyPos / elstk;
00680                         ekhardPos = alphaPos * elstk;
00681 
00682                         dCap1Pos = fCapRefPos / (elstk-capSlope*elstk);
00683                         dCap2Pos = (fCapRefPos+ekhardPos*dyPos-fyPos) / (ekhardPos-capSlope*elstk);
00684                         cpPos= (dCap1Pos>dCap2Pos) ? dCap1Pos:dCap2Pos;
00685                 }
00686                 flagDeg = 0;
00687         }
00688         
00689         // Relationship between basic variables and hstory array for next cycle
00690         hsTrial[0] = d;
00691         hsTrial[1] = f;
00692         hsTrial[2] = ek;
00693         hsTrial[3] = ekunload;
00694         hsTrial[4] = ekexcurs;
00695         hsTrial[5] = Enrgtot;
00696         hsTrial[6] = Enrgc;
00697         hsTrial[7] = sp;
00698         hsTrial[8] = sn;
00699         hsTrial[9] = (double) kon;
00700         hsTrial[10] = dmax;
00701         hsTrial[11] = dmin;
00702         hsTrial[12] = fyPos;
00703         hsTrial[13] = fyNeg;                       
00704         hsTrial[14] = cpPos;
00705         hsTrial[15] = cpNeg;
00706         hsTrial[16] = fmax;
00707         hsTrial[17] = fmin;
00708         hsTrial[18] = alphaPos;
00709         hsTrial[19] = alphaNeg;
00710         hsTrial[20] = fCapRefPos;
00711         hsTrial[21] = fCapRefNeg;
00712         hsTrial[22] = dmaxDeg;
00713         hsTrial[23] = dminDeg;
00714 
00715         return 0;
00716 }
00717 
00718 
00719 int PinchingDamage::commitState()
00720 {
00721 
00722   int i;
00723   for( i=0; i<24 ; i++ ) {
00724           hsLastCommit[i] = hsCommit[i];
00725           hsCommit[i] = hsTrial[i];
00726   }
00727   
00728         // Calling the damage object
00729         Vector InforForDamage(3);
00730         InforForDamage(0) = hsCommit[0];
00731         InforForDamage(1) = hsCommit[1];
00732         InforForDamage(2) = hsCommit[3];
00733 
00734         if ( StfDamage != NULL ) { 
00735                 StfDamage->setTrial(InforForDamage);
00736                 StfDamage->commitState();
00737         }
00738 
00739         InforForDamage(2) = 0.0;
00740 
00741         if ( StrDamage != NULL ) { 
00742                 StrDamage->setTrial(InforForDamage);
00743                 StrDamage->commitState();
00744         }
00745 
00746         if ( AccDamage != NULL ) {
00747                 AccDamage->setTrial(InforForDamage);
00748                 AccDamage->commitState();
00749         }
00750         if ( CapDamage != NULL ) {
00751                 CapDamage->setTrial(InforForDamage);
00752                 CapDamage->commitState();
00753         }
00754 
00755   this->recordInfo();
00756   
00757   return 0;
00758 }
00759 
00760 
00761 void PinchingDamage::recordInfo(int cond )
00762 {
00763 
00764 }
00765 
00766 
00767 void PinchingDamage::envelPosCap( double fy, double alphaPos, double alphaCap,
00768                             double cpDsp, double d, double *f, double *ek )
00769 {
00770         double dy,Res,rcap,dres;
00771         
00772         dy = fy / elstk;
00773         
00774         if (dy < cpDsp)
00775     {
00776                 Res = Resfac * fyieldPos;
00777                 rcap = fy+alphaPos * elstk * ( cpDsp - dy );
00778                 dres = cpDsp + ( Res - rcap ) / ( alphaCap * elstk );
00779                 
00780                 if ( d < 0.0 )  
00781                 {
00782                         *f = 0.0;
00783                         *ek = 0.0;
00784                 }
00785                 else
00786                 {
00787                         if ( d <= dy )
00788                         {
00789                                 *ek = elstk;
00790                                 *f = (*ek) * d;
00791                         }
00792                         else
00793                         {
00794                                 if( d <= cpDsp )
00795                                 {
00796                                         *ek = elstk * alphaPos;
00797                                         *f = fy + (*ek) * ( d - dy );
00798                                 }
00799                                 else
00800                                 {
00801                                         if( d <=  dres )
00802                                         {
00803                                                 *ek = alphaCap * elstk;
00804                                                 *f = rcap + (*ek) * ( d - cpDsp );
00805                                         }
00806                                         else
00807                                         {
00808                                                 *ek = 0;
00809                                                 // ek = 1.e-10;
00810                                                 *f = Res + d * (*ek);
00811                                         }
00812                                 }
00813                         }
00814                 }
00815     }
00816         else
00817     {
00818                 rcap = elstk * cpDsp;
00819                 Res = Resfac * rcap;
00820                 dres = cpDsp + ( Res - rcap ) / ( alphaCap * elstk );
00821                 
00822                 if ( d < 0.0 ) 
00823                 {
00824                         *f = 0.0;
00825                         *ek = 0.0;
00826                 }
00827                 else
00828                 {
00829                         if( d <= cpDsp )
00830                         {
00831                                 *ek = elstk;
00832                                 *f = (*ek) * d;
00833                         }
00834                         else
00835                         {
00836                                 if( d <= dres )
00837                                 {
00838                                         *ek = alphaCap * elstk;
00839                                         *f = rcap + (*ek) * ( d - cpDsp );
00840                                 }
00841                                 else
00842                                 {
00843                                         *ek = 0;
00844                                         // ek = 1.e-10;
00845                                         *f = Res + d * (*ek);
00846                                 }
00847                         }
00848                 }
00849     }
00850         
00851         return;
00852 }
00853 
00854 
00855 void PinchingDamage::envelNegCap( double fy, double alphaNeg, double alphaCap,
00856                             double cpDsp, double d, double *f, double *ek)
00857 {
00858         double dy,Res,rcap,dres;
00859         
00860         dy = fy / elstk;
00861         
00862         if( dy > cpDsp )
00863     {
00864                 Res = Resfac * fyieldNeg;
00865                 rcap = fy + alphaNeg * elstk * ( cpDsp - dy );
00866                 dres = cpDsp + ( Res - rcap ) / ( alphaCap * elstk );
00867                 
00868                 if (d > 0.0) 
00869                 {
00870                         *f = 0.0;
00871                         *ek = 0.0;
00872                 }
00873                 else
00874                 {
00875                         if ( d >= dy )
00876                         {
00877                                 *ek = elstk;
00878                                 *f = (*ek) * d;
00879                         }
00880                         else
00881                         {
00882                                 if ( d >= cpDsp )
00883                                 {
00884                                         *ek = elstk * alphaNeg;
00885                                         *f = fy + (*ek) * ( d - dy );
00886                                 }
00887                                 else
00888                                 {
00889                                         if ( d >= dres )
00890                                         {
00891                                                 *ek = elstk * alphaCap;
00892                                                 *f = rcap + (*ek) * ( d - cpDsp );
00893                                         }
00894                                         else
00895                                         {
00896                                                 *ek = 0;
00897                                                 // *ek = 1.d-10
00898                                                 *f = Res + (*ek) * d;
00899                                         }
00900                                 }
00901                         }
00902                 }
00903     }
00904         else
00905     {
00906                 rcap = elstk * cpDsp;
00907                 Res = Resfac * rcap;
00908                 dres = cpDsp + ( Res - rcap ) / ( alphaCap * elstk );
00909                 
00910                 if (d > 0.0) 
00911                 {
00912                         *f = 0.0;
00913                         *ek = 0.0;
00914                 }
00915                 else
00916                 {
00917                         if ( d >= cpDsp )
00918                         {
00919                                 *ek = elstk;
00920                                 *f = (*ek) * d;
00921                         }
00922                         else
00923                         {
00924                                 if ( d >= dres )
00925                                 {
00926                                         *ek = elstk * alphaCap;
00927                                         *f = rcap + (*ek) * ( d - cpDsp );
00928                                 }
00929                                 else
00930                                 {
00931                                         *ek = 0;
00932                                         // *ek = 1.e-10;
00933                                         *f = Res + (*ek) * d;
00934                                 }
00935                         }
00936                 }
00937     }
00938         return;
00939 }

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