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

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