HardeningMaterial.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.12 $
00022 // $Date: 2006/09/05 22:22:58 $
00023 // $Source: /usr/local/cvs/OpenSees/SRC/material/uniaxial/HardeningMaterial.cpp,v $
00024 
00025 // Written: MHS
00026 // Created: May 2000
00027 // Revision: A
00028 //
00029 // Description: This file contains the class implementation for 
00030 // HardeningMaterial. 
00031 
00032 #include <HardeningMaterial.h>
00033 #include <Vector.h>
00034 #include <Channel.h>
00035 #include <Matrix.h>
00036 #include <Information.h>
00037 #include <Parameter.h>
00038 
00039 #include <math.h>
00040 #include <float.h>
00041 
00042 HardeningMaterial::HardeningMaterial(int tag, double e, double s,
00043                                      double hi, double hk, double n)
00044 :UniaxialMaterial(tag,MAT_TAG_Hardening),
00045  E(e), sigmaY(s), Hiso(hi), Hkin(hk), eta(n)
00046 {
00047 // AddingSensitivity:BEGIN /////////////////////////////////////
00048         parameterID = 0;
00049         SHVs = 0;
00050 // AddingSensitivity:END //////////////////////////////////////
00051 
00052         // Initialize variables
00053     this->revertToStart();
00054 }
00055 
00056 HardeningMaterial::HardeningMaterial()
00057 :UniaxialMaterial(0,MAT_TAG_Hardening),
00058  E(0.0), sigmaY(0.0), Hiso(0.0), Hkin(0.0), eta(0.0)
00059 {
00060 // AddingSensitivity:BEGIN /////////////////////////////////////
00061         parameterID = 0;
00062         SHVs = 0;
00063 // AddingSensitivity:END //////////////////////////////////////
00064 
00065         // Initialize variables
00066         this->revertToStart();
00067 }
00068 
00069 HardeningMaterial::~HardeningMaterial()
00070 {
00071 // AddingSensitivity:BEGIN /////////////////////////////////////
00072         if (SHVs != 0) 
00073                 delete SHVs;
00074 // AddingSensitivity:END //////////////////////////////////////
00075 }
00076 
00077 int 
00078 HardeningMaterial::setTrialStrain (double strain, double strainRate)
00079 {
00080 
00081     if (fabs(Tstrain-strain) < DBL_EPSILON)
00082       return 0;
00083 
00084     // Set total strain
00085     Tstrain = strain;
00086     
00087     // Elastic trial stress
00088     Tstress = E * (Tstrain-CplasticStrain);
00089 
00090     // Compute trial stress relative to committed back stress
00091     double xsi = Tstress - CbackStress;
00092 
00093     // Compute yield criterion
00094     double f = fabs(xsi) - (sigmaY + Hiso*Chardening);
00095 
00096     // Elastic step ... no updates required
00097     if (f <= -DBL_EPSILON * E) {
00098     //if (f <= 1.0e-8) {
00099         // Set trial tangent
00100         Ttangent = E;
00101     }
00102 
00103     // Plastic step ... perform return mapping algorithm
00104     else {
00105       double etadt = 0.0;
00106 
00107       if (eta != 0.0 || ops_Dt != 0)
00108           etadt = eta/ops_Dt;
00109 
00110       // Compute consistency parameter
00111       double dGamma = f / (E+Hiso+Hkin+etadt);
00112 
00113       // Find sign of xsi
00114       int sign = (xsi < 0) ? -1 : 1;
00115 
00116       // Bring trial stress back to yield surface
00117       Tstress -= dGamma*E*sign;
00118         
00119       // Update plastic strain
00120       TplasticStrain = CplasticStrain + dGamma*sign;
00121         
00122       // Update back stress
00123       TbackStress = CbackStress + dGamma*Hkin*sign;
00124         
00125       // Update internal hardening variable
00126       Thardening = Chardening + dGamma;
00127         
00128       // Set trial tangent
00129       Ttangent = E*(Hkin+Hiso+etadt) / (E+Hkin+Hiso+etadt);
00130     }
00131 
00132     return 0;
00133 }
00134 
00135 double 
00136 HardeningMaterial::getStress(void)
00137 {
00138     return Tstress;
00139 }
00140 
00141 double 
00142 HardeningMaterial::getTangent(void)
00143 {
00144     return Ttangent;
00145 }
00146 
00147 double 
00148 HardeningMaterial::getStrain(void)
00149 {
00150     return Tstrain;
00151 }
00152 
00153 int 
00154 HardeningMaterial::commitState(void)
00155 {
00156     // Commit trial history variables
00157     CplasticStrain = TplasticStrain;
00158     CbackStress = TbackStress;
00159     Chardening = Thardening;
00160     
00161     return 0;
00162 }
00163 
00164 int 
00165 HardeningMaterial::revertToLastCommit(void)
00166 {
00167   return 0;
00168 }
00169 
00170 int 
00171 HardeningMaterial::revertToStart(void)
00172 {
00173     // Reset committed history variables
00174     CplasticStrain = 0.0;
00175     CbackStress = 0.0;
00176     Chardening = 0.0;
00177 
00178     // Reset trial history variables
00179     TplasticStrain = 0.0;
00180     TbackStress = 0.0;
00181     Thardening = 0.0;
00182 
00183         // Initialize state variables
00184         Tstrain = 0.0;
00185         Tstress = 0.0;
00186         Ttangent = E;
00187 
00188 // AddingSensitivity:BEGIN /////////////////////////////////
00189         if (SHVs != 0) 
00190                 SHVs->Zero();
00191 // AddingSensitivity:END //////////////////////////////////
00192 
00193     return 0;
00194 }
00195 
00196 UniaxialMaterial *
00197 HardeningMaterial::getCopy(void)
00198 {
00199     HardeningMaterial *theCopy =
00200         new HardeningMaterial(this->getTag(), E, sigmaY, Hiso, Hkin, eta);
00201 
00202     // Copy committed history variables
00203     theCopy->CplasticStrain = CplasticStrain;
00204     theCopy->CbackStress = CbackStress;
00205     theCopy->Chardening = Chardening;
00206 
00207     // Copy trial history variables
00208     theCopy->TplasticStrain = TplasticStrain;
00209     theCopy->TbackStress = TbackStress;
00210     theCopy->Thardening = Thardening;
00211 
00212     // Copy trial state variables
00213     theCopy->Tstrain = Tstrain;
00214     theCopy->Tstress = Tstress;
00215     theCopy->Ttangent = Ttangent;
00216     
00217     return theCopy;
00218 }
00219 
00220 int 
00221 HardeningMaterial::sendSelf(int cTag, Channel &theChannel)
00222 {
00223   int res = 0;
00224   
00225   static Vector data(12);
00226   
00227   data(0) = this->getTag();
00228   data(1) = E;
00229   data(2) = sigmaY;
00230   data(3) = Hiso;
00231   data(4) = Hkin;
00232   data(5) = eta;
00233   data(6) = CplasticStrain;
00234   data(7) = CbackStress;
00235   data(8) = Chardening;
00236   data(9) = Tstrain;
00237   data(10) = Tstress;
00238   data(11) = Ttangent;
00239   
00240   res = theChannel.sendVector(this->getDbTag(), cTag, data);
00241   if (res < 0) 
00242     opserr << "HardeningMaterial::sendSelf() - failed to send data\n";
00243 
00244   return res;
00245 }
00246 
00247 int 
00248 HardeningMaterial::recvSelf(int cTag, Channel &theChannel, 
00249                                FEM_ObjectBroker &theBroker)
00250 {
00251   int res = 0;
00252   
00253   static Vector data(12);
00254   res = theChannel.recvVector(this->getDbTag(), cTag, data);
00255   
00256   if (res < 0) {
00257       opserr << "HardeningMaterial::recvSelf() - failed to receive data\n";
00258       E = 0; 
00259       this->setTag(0);      
00260   }
00261   else {
00262     this->setTag((int)data(0));
00263     E = data(1);
00264     sigmaY = data(2);
00265     Hiso = data(3);
00266     Hkin = data(4);
00267     eta = data(5);
00268     CplasticStrain = data(6);
00269     CbackStress = data(7);
00270     Chardening = data(8);
00271     Tstrain = data(9);
00272     Tstress = data(10);
00273     Ttangent = data(11);
00274   }
00275     
00276   return res;
00277 }
00278 
00279 void 
00280 HardeningMaterial::Print(OPS_Stream &s, int flag)
00281 {
00282     s << "HardeningMaterial, tag: " << this->getTag() << endln;
00283     s << "  E: " << E << endln;
00284     s << "  sigmaY: " << sigmaY << endln;
00285     s << "  Hiso: " << Hiso << endln;
00286     s << "  Hkin: " << Hkin << endln;
00287     s << "  eta: " << eta << endln;
00288 }
00289 
00290 
00291 // AddingSensitivity:BEGIN ///////////////////////////////////
00292 int
00293 HardeningMaterial::setParameter(const char **argv, int argc, Parameter &param)
00294 {
00295   if (argc < 1)
00296     return -1;
00297 
00298   if (strcmp(argv[0],"sigmaY") == 0 || strcmp(argv[0],"fy") == 0)
00299     return param.addObject(1, this);
00300 
00301   if (strcmp(argv[0],"E") == 0)
00302     return param.addObject(2, this);
00303 
00304   if (strcmp(argv[0],"H_kin") == 0)
00305     return param.addObject(3, this);
00306 
00307   if (strcmp(argv[0],"H_iso") == 0)
00308     return param.addObject(4, this);
00309 
00310   else
00311     opserr << "WARNING: Could not set parameter in HardeningMaterial. " << endln;
00312   return -1;
00313 }
00314 
00315 int
00316 HardeningMaterial::updateParameter(int parameterID, Information &info)
00317 {
00318         switch (parameterID) {
00319         case -1:
00320                 return -1;
00321         case 1:
00322                 this->sigmaY = info.theDouble;
00323                 break;
00324         case 2:
00325                 this->E = info.theDouble;
00326                 break;
00327         case 3:
00328                 this->Hkin = info.theDouble;
00329                 break;
00330         case 4:
00331                 this->Hiso = info.theDouble;
00332                 break;
00333         default:
00334                 return -1;
00335         }
00336 
00337         return 0;
00338 }
00339 
00340 
00341 
00342 int
00343 HardeningMaterial::activateParameter(int passedParameterID)
00344 {
00345         parameterID = passedParameterID;
00346 
00347         return 0;
00348 }
00349 
00350 
00351 
00352 
00353 double
00354 HardeningMaterial::getStressSensitivity(int gradNumber, bool conditional)
00355 {
00356 
00357         // First set values depending on what is random
00358         double SigmaYSensitivity = 0.0;
00359         double ESensitivity = 0.0;
00360         double HkinSensitivity = 0.0;
00361         double HisoSensitivity = 0.0;
00362 
00363         if (parameterID == 1) {  // sigmaY
00364                 SigmaYSensitivity = 1.0;
00365         }
00366         else if (parameterID == 2) {  // E
00367                 ESensitivity = 1.0;
00368         }
00369         else if (parameterID == 3) {  // Hkin
00370                 HkinSensitivity = 1.0;
00371         }
00372         else if (parameterID == 4) {  // Hiso
00373                 HisoSensitivity = 1.0;
00374         }
00375         else {
00376                 // Nothing random here, but may have to return something in any case
00377         }
00378 
00379         // Then pick up history variables for this gradient number
00380         double CplasticStrainSensitivity = 0.0;
00381         double CbackStressSensitivity    = 0.0;
00382         double ChardeningSensitivity     = 0.0;
00383         if (SHVs != 0) {
00384                 CplasticStrainSensitivity = (*SHVs)(0,(gradNumber-1));
00385                 CbackStressSensitivity   = (*SHVs)(1,(gradNumber-1));
00386                 ChardeningSensitivity    = (*SHVs)(2,(gradNumber-1));
00387         }
00388 
00389         // Elastic trial stress
00390         double Tstress = E * (Tstrain-CplasticStrain);
00391 
00392         // Compute trial stress relative to committed back stress
00393         double xsi = Tstress - CbackStress;
00394 
00395         // Compute yield criterion
00396         double f = fabs(xsi) - (sigmaY + Hiso*Chardening);
00397 
00398         double sensitivity;
00399 
00400         // Elastic step ... no updates required
00401         if (f <= -DBL_EPSILON * E) {
00402         //if (f <= 1.0e-8) {
00403 
00404                 sensitivity = ESensitivity*(Tstrain-CplasticStrain)-E*CplasticStrainSensitivity;
00405 
00406         }
00407 
00408         // Plastic step
00409         else { 
00410 
00411                 double TstressSensitivity = ESensitivity*(Tstrain-CplasticStrain)-E*CplasticStrainSensitivity;
00412                 
00413                 int sign = (xsi < 0) ? -1 : 1;
00414                 
00415                 double dGamma = f / (E+Hiso+Hkin);
00416                 
00417                 double fSensitivity = (TstressSensitivity-CbackStressSensitivity)*sign
00418                         - SigmaYSensitivity - HisoSensitivity*Chardening - Hiso*ChardeningSensitivity;
00419                 
00420                 double dGammaSensitivity = 
00421                         (fSensitivity*(E+Hkin+Hiso)-f*(ESensitivity+HkinSensitivity+HisoSensitivity))
00422                         /((E+Hkin+Hiso)*(E+Hkin+Hiso));
00423                 
00424                 sensitivity = (TstressSensitivity-dGammaSensitivity*E*sign-dGamma*ESensitivity*sign);
00425         }
00426 
00427         return sensitivity;
00428 }
00429 
00430 
00431 
00432 double
00433 HardeningMaterial::getInitialTangentSensitivity(int gradNumber)
00434 {
00435         // For now, assume that this is only called for initial stiffness 
00436         if (parameterID == 2) {
00437                 return 1.0; 
00438         }
00439         else {
00440                 return 0.0;
00441         }
00442 }
00443 
00444 
00445 int
00446 HardeningMaterial::commitSensitivity(double TstrainSensitivity, int gradNumber, int numGrads)
00447 {
00448         if (SHVs == 0) {
00449                 SHVs = new Matrix(3,numGrads);
00450         }
00451 
00452         // First set values depending on what is random
00453         double SigmaYSensitivity = 0.0;
00454         double ESensitivity = 0.0;
00455         double HkinSensitivity = 0.0;
00456         double HisoSensitivity = 0.0;
00457 
00458         if (parameterID == 1) {  // sigmaY
00459                 SigmaYSensitivity = 1.0;
00460         }
00461         else if (parameterID == 2) {  // E
00462                 ESensitivity = 1.0;
00463         }
00464         else if (parameterID == 3) {  // Hkin
00465                 HkinSensitivity = 1.0;
00466         }
00467         else if (parameterID == 4) {  // Hiso
00468                 HisoSensitivity = 1.0;
00469         }
00470         else {
00471                 // Nothing random here, but may have to save SHV's in any case
00472         }
00473 
00474         // Then pick up history variables for this gradient number
00475         double CplasticStrainSensitivity= (*SHVs)(0,(gradNumber-1));
00476         double CbackStressSensitivity   = (*SHVs)(1,(gradNumber-1));
00477         double ChardeningSensitivity    = (*SHVs)(2,(gradNumber-1));
00478 
00479         // Elastic trial stress
00480         double Tstress = E * (Tstrain-CplasticStrain);
00481 
00482         // Compute trial stress relative to committed back stress
00483         double xsi = Tstress - CbackStress;
00484 
00485         // Compute yield criterion
00486         double f = fabs(xsi) - (sigmaY + Hiso*Chardening);
00487 
00488         // Elastic step ... no updates required
00489         if (f <= -DBL_EPSILON * E) {
00490         //if (f <= 1.0e-8) {
00491                 // No changes in the sensitivity history variables
00492         }
00493 
00494         // Plastic step
00495         else { 
00496 
00497                 double TstressSensitivity = ESensitivity*(Tstrain-CplasticStrain)
00498                         + E*(TstrainSensitivity-CplasticStrainSensitivity);
00499 
00500                 int sign = (xsi < 0) ? -1 : 1;
00501 
00502                 double dGamma = f / (E+Hiso+Hkin);
00503 
00504                 double fSensitivity = (TstressSensitivity-CbackStressSensitivity)*sign
00505                         - SigmaYSensitivity - HisoSensitivity*Chardening - Hiso*ChardeningSensitivity;
00506 
00507                 double dGammaSensitivity = 
00508                         (fSensitivity*(E+Hkin+Hiso)-f*(ESensitivity+HkinSensitivity+HisoSensitivity))
00509                         /((E+Hkin+Hiso)*(E+Hkin+Hiso));
00510 
00511                 (*SHVs)(0,(gradNumber-1)) += dGammaSensitivity*sign;
00512                 (*SHVs)(1,(gradNumber-1)) += dGammaSensitivity*Hkin*sign + dGamma*HkinSensitivity*sign;
00513                 (*SHVs)(2,(gradNumber-1)) += dGammaSensitivity;
00514 
00515         }
00516 
00517         return 0;
00518 }
00519 // AddingSensitivity:END /////////////////////////////////////////////
00520 

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