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

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