Concrete02.cpp

Go to the documentation of this file.
00001 /* ****************************************************************** **
00002 **    OpenSees - Open System for Earthquake Engineering Simulation    **
00003 **          Pacific Earthquake Engineering Research Center            **
00004 **                                                                    **
00005 **                                                                    **
00006 ** (C) Copyright 1999, The Regents of the University of California    **
00007 ** All Rights Reserved.                                               **
00008 **                                                                    **
00009 ** Commercial use of this program without express permission of the   **
00010 ** University of California, Berkeley, is strictly prohibited.  See   **
00011 ** file 'COPYRIGHT'  in main directory for information on usage and   **
00012 ** redistribution,  and for a DISCLAIMER OF ALL WARRANTIES.           **
00013 **                                                                    **
00014 ** Developed by:                                                      **
00015 **   Frank McKenna (fmckenna@ce.berkeley.edu)                         **
00016 **   Gregory L. Fenves (fenves@ce.berkeley.edu)                       **
00017 **   Filip C. Filippou (filippou@ce.berkeley.edu)                     **
00018 **                                                                    **
00019 ** ****************************************************************** */
00020                                                                         
00021 // $Revision: 1.1 $
00022 // $Date: 2006/03/03 18:52:40 $
00023 // $Source: /usr/local/cvs/OpenSees/SRC/material/uniaxial/Concrete02.cpp,v $
00024                                                                       
00025 // Written: fmk
00026 // Created: 03/06
00027 //
00028 // Description: This file contains the class implementation of Concrete02. 
00029 // This Concrete02 is based on an f2c of the FEDEAS material
00030 // Concr2.f which is:
00031 //-----------------------------------------------------------------------
00032 // concrete model with damage modulus    
00033 //       by MOHD YASSIN (1993)
00034 // adapted to FEDEAS material library
00035 // by D. Sze and Filip C. Filippou in 1994
00036 //-----------------------------------------------------------------------
00037 
00038 
00039 #include <stdlib.h>
00040 #include <Concrete02.h>
00041 #include <OPS_Globals.h>
00042 #include <float.h>
00043 #include <Channel.h>
00044 
00045 Concrete02::Concrete02(int tag, double _fc, double _epsc0, double _fcu,
00046                        double _epscu, double _rat, double _ft, double _Ets):
00047   UniaxialMaterial(tag, MAT_TAG_Concrete02),
00048   fc(_fc), epsc0(_epsc0), fcu(_fcu), epscu(_epscu), rat(_rat), ft(_ft), Ets(_Ets)
00049 {
00050   ecminP = 0.0;
00051   deptP = 0.0;
00052 
00053   eP = 2.0*fc/epsc0;
00054   epsP = 0.0;
00055   sigP = 0.0;
00056   eps = 0.0;
00057   sig = 0.0;
00058   e = 2.0*fc/epsc0;
00059 }
00060 
00061 Concrete02::Concrete02(void):
00062   UniaxialMaterial(0, MAT_TAG_Concrete02)
00063 {
00064  
00065 }
00066 
00067 Concrete02::~Concrete02(void)
00068 {
00069   // Does nothing
00070 }
00071 
00072 UniaxialMaterial*
00073 Concrete02::getCopy(void)
00074 {
00075   Concrete02 *theCopy = new Concrete02(this->getTag(), fc, epsc0, fcu, epscu, rat, ft, Ets);
00076   
00077   return theCopy;
00078 }
00079 
00080 double
00081 Concrete02::getInitialTangent(void)
00082 {
00083   return 2.0*fc/epsc0;
00084 }
00085 
00086 int
00087 Concrete02::setTrialStrain(double trialStrain, double strainRate)
00088 {
00089   double        ec0 = fc * 2. / epsc0;
00090 
00091   // retrieve concrete hitory variables
00092 
00093   ecmin = ecminP;
00094   dept = deptP;
00095 
00096   // calculate current strain
00097 
00098   eps = trialStrain;
00099   double deps = eps - epsP;
00100 
00101   // if the current strain is less than the smallest previous strain 
00102   // call the monotonic envelope in compression and reset minimum strain 
00103 
00104   if (eps < ecmin) {
00105     this->Compr_Envlp(eps, sig, e);
00106     ecmin = eps;
00107   } else {;
00108 
00109     // else, if the current strain is between the minimum strain and ept 
00110     // (which corresponds to zero stress) the material is in the unloading- 
00111     // reloading branch and the stress remains between sigmin and sigmax 
00112     
00113     // calculate strain-stress coordinates of point R that determines 
00114     // the reloading slope according to Fig.2.11 in EERC Report 
00115     // (corresponding equations are 2.31 and 2.32 
00116     // the strain of point R is epsR and the stress is sigmR 
00117     
00118     double epsr = (fcu - rat * ec0 * epscu) / (ec0 * (1.0 - rat));
00119     double sigmr = ec0 * epsr;
00120     
00121     // calculate the previous minimum stress sigmm from the minimum 
00122     // previous strain ecmin and the monotonic envelope in compression 
00123     
00124     double sigmm;
00125     double dumy;
00126     this->Compr_Envlp(ecmin, sigmm, dumy);
00127     
00128     // calculate current reloading slope Er (Eq. 2.35 in EERC Report) 
00129     // calculate the intersection of the current reloading slope Er 
00130     // with the zero stress axis (variable ept) (Eq. 2.36 in EERC Report) 
00131     
00132     double er = (sigmm - sigmr) / (ecmin - epsr);
00133     double ept = ecmin - sigmm / er;
00134     
00135     if (eps <= ept) {
00136       double sigmin = sigmm + er * (eps - ecmin);
00137       double sigmax = er * .5f * (eps - ept);
00138       sig = sigP + ec0 * deps;
00139       e = ec0;
00140       if (sig <= sigmin) {
00141         sig = sigmin;
00142         e = er;
00143       }
00144       if (sig >= sigmax) {
00145         sig = sigmax;
00146         e = 0.5 * er;
00147       }
00148     } else {
00149       
00150       // else, if the current strain is between ept and epn 
00151       // (which corresponds to maximum remaining tensile strength) 
00152       // the response corresponds to the reloading branch in tension 
00153       // Since it is not saved, calculate the maximum remaining tensile 
00154       // strength sicn (Eq. 2.43 in EERC Report) 
00155       
00156       // calculate first the strain at the peak of the tensile stress-strain 
00157       // relation epn (Eq. 2.42 in EERC Report) 
00158       
00159       double epn = ept + dept;
00160       double sicn;
00161       if (eps <= epn) {
00162         this->Tens_Envlp(dept, sicn, e);
00163         if (dept != 0.0) {
00164           e = sicn / dept;
00165         } else {
00166           e = ec0;
00167         }
00168         sig = e * (eps - ept);
00169       } else {
00170         
00171         // else, if the current strain is larger than epn the response 
00172         // corresponds to the tensile envelope curve shifted by ept 
00173         
00174         double epstmp = eps - ept;
00175         this->Tens_Envlp(epstmp, sig, e);
00176         dept = eps - ept;
00177       }
00178     }
00179   }
00180 
00181   return 0;
00182 }
00183 
00184 
00185 
00186 double 
00187 Concrete02::getStrain(void)
00188 {
00189   return eps;
00190 }
00191 
00192 double 
00193 Concrete02::getStress(void)
00194 {
00195   return sig;
00196 }
00197 
00198 double 
00199 Concrete02::getTangent(void)
00200 {
00201   return e;
00202 }
00203 
00204 int 
00205 Concrete02::commitState(void)
00206 {
00207   ecminP = ecmin;
00208   deptP = dept;
00209   
00210   eP = e;
00211   sigP = sig;
00212   epsP = eps;
00213   return 0;
00214 }
00215 
00216 int 
00217 Concrete02::revertToLastCommit(void)
00218 {
00219   ecmin = ecminP;;
00220   dept = deptP;
00221   
00222   e = eP;
00223   sig = sigP;
00224   eps = epsP;
00225   return 0;
00226 }
00227 
00228 int 
00229 Concrete02::revertToStart(void)
00230 {
00231   ecminP = 0.0;
00232   deptP = 0.0;
00233 
00234   eP = 2.0*fc/epsc0;
00235   epsP = 0.0;
00236   sigP = 0.0;
00237   eps = 0.0;
00238   sig = 0.0;
00239   e = 2.0*fc/epsc0;
00240 
00241   return 0;
00242 }
00243 
00244 int 
00245 Concrete02::sendSelf(int commitTag, Channel &theChannel)
00246 {
00247   static Vector data(13);
00248   data(0) =fc;    
00249   data(1) =epsc0; 
00250   data(2) =fcu;   
00251   data(3) =epscu; 
00252   data(4) =rat;   
00253   data(5) =ft;    
00254   data(6) =Ets;   
00255   data(7) =ecminP;
00256   data(8) =deptP; 
00257   data(9) =epsP;  
00258   data(10) =sigP; 
00259   data(11) =eP;   
00260   data(12) = this->getTag();
00261 
00262   if (theChannel.sendVector(this->getDbTag(), commitTag, data) < 0) {
00263     opserr << "Concrete02::sendSelf() - failed to sendSelf\n";
00264     return -1;
00265   }
00266   return 0;
00267 }
00268 
00269 int 
00270 Concrete02::recvSelf(int commitTag, Channel &theChannel, 
00271              FEM_ObjectBroker &theBroker)
00272 {
00273 
00274   static Vector data(13);
00275 
00276   if (theChannel.sendVector(this->getDbTag(), commitTag, data) < 0) {
00277     opserr << "Concrete02::recvSelf() - failed to recvSelf\n";
00278     return -1;
00279   }
00280 
00281   fc = data(0);
00282   epsc0 = data(1);
00283   fcu = data(2);
00284   epscu = data(3);
00285   rat = data(4);
00286   ft = data(5);
00287   Ets = data(6);
00288   ecminP = data(7);
00289   deptP = data(8);
00290   epsP = data(9);
00291   sigP = data(10);
00292   eP = data(11);
00293   this->setTag(data(12));
00294 
00295   e = eP;
00296   sig = sigP;
00297   eps = epsP;
00298   
00299   return 0;
00300 }
00301 
00302 void 
00303 Concrete02::Print(OPS_Stream &s, int flag)
00304 {
00305   s << "Concrete02:(strain, stress, tangent) " << eps << " " << sig << " " << e << endln;
00306 }
00307 
00308 
00309 void
00310 Concrete02::Tens_Envlp (double epsc, double &sigc, double &Ect)
00311 {
00312 /*-----------------------------------------------------------------------
00313 ! monotonic envelope of concrete in tension (positive envelope)
00314 !
00315 !   ft    = concrete tensile strength
00316 !   Ec0   = initial tangent modulus of concrete 
00317 !   Ets   = tension softening modulus
00318 !   eps   = strain
00319 !
00320 !   returned variables
00321 !    sigc  = stress corresponding to eps
00322 !    Ect  = tangent concrete modulus
00323 !-----------------------------------------------------------------------*/
00324   
00325   double Ec0  = 2.0*fc/epsc0;
00326 
00327   double eps0 = ft/Ec0;
00328   double epsu = ft*(1.0/Ets+1.0/Ec0);
00329   if (epsc<=eps0) {
00330     sigc = epsc*Ec0;
00331     Ect  = Ec0;
00332   } else {
00333     if (epsc<=epsu) {
00334       Ect  = -Ets;
00335       sigc = ft-Ets*(epsc-eps0);
00336     } else {
00337       //      Ect  = 0.0
00338       Ect  = 1.0e-10;
00339       sigc = 0.0;
00340     }
00341   }
00342   return;
00343 }
00344 
00345   
00346 void
00347 Concrete02::Compr_Envlp (double epsc, double &sigc, double &Ect) 
00348 {
00349 /*-----------------------------------------------------------------------
00350 ! monotonic envelope of concrete in compression (negative envelope)
00351 !
00352 !   fc    = concrete compressive strength
00353 !   epsc0 = strain at concrete compressive strength
00354 !   fcu   = stress at ultimate (crushing) strain 
00355 !   epscu = ultimate (crushing) strain
00356 !   Ec0   = initial concrete tangent modulus
00357 !   epsc  = strain
00358 !
00359 !   returned variables
00360 !   sigc  = current stress
00361 !   Ect   = tangent concrete modulus
00362 -----------------------------------------------------------------------*/
00363 
00364   double Ec0  = 2.0*fc/epsc0;
00365 
00366   double ratLocal = epsc/epsc0;
00367   if (epsc>=epsc0) {
00368     sigc = fc*ratLocal*(2.0-ratLocal);
00369     Ect  = Ec0*(1.0-ratLocal);
00370   } else {
00371     
00372     //   linear descending branch between epsc0 and epscu
00373     if (epsc>epscu) {
00374       sigc = (fcu-fc)*(epsc-epsc0)/(epscu-epsc0)+fc;
00375       Ect  = (fcu-fc)/(epscu-epsc0);
00376     } else {
00377            
00378       // flat friction branch for strains larger than epscu
00379       
00380       sigc = fcu;
00381       Ect  = 1.0e-10;
00382       //       Ect  = 0.0
00383     }
00384   }
00385   return;
00386 }

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