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

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