Concrete01.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.15 $
00022 // $Date: 2006/09/05 22:14:55 $
00023 // $Source: /usr/local/cvs/OpenSees/SRC/material/uniaxial/Concrete01.cpp,v $
00024                                                                         
00025 // Written: MHS 
00026 // Created: 06/99
00027 // Revision: A
00028 //
00029 // Description: This file contains the class implementation for 
00030 // Concrete01. 
00031 //
00032 // What: "@(#) Concrete01.C, revA"
00033 
00034 
00035 #include <Concrete01.h>
00036 #include <Vector.h>
00037 #include <Matrix.h>
00038 #include <Channel.h>
00039 #include <Information.h>
00040 #include <Parameter.h>
00041 
00042 #include <math.h>
00043 #include <float.h>
00044 
00045 int count = 0;
00046 
00047 Concrete01::Concrete01
00048 (int tag, double FPC, double EPSC0, double FPCU, double EPSCU)
00049   :UniaxialMaterial(tag, MAT_TAG_Concrete01),
00050    fpc(FPC), epsc0(EPSC0), fpcu(FPCU), epscu(EPSCU), 
00051    CminStrain(0.0), CendStrain(0.0),
00052    Cstrain(0.0), Cstress(0.0) 
00053 {
00054   count++;
00055   // Make all concrete parameters negative
00056   if (fpc > 0.0)
00057     fpc = -fpc;
00058   
00059   if (epsc0 > 0.0)
00060     epsc0 = -epsc0;
00061   
00062   if (fpcu > 0.0)
00063     fpcu = -fpcu;
00064   
00065   if (epscu > 0.0)
00066     epscu = -epscu;
00067   
00068   // Initial tangent
00069   double Ec0 = 2*fpc/epsc0;
00070   Ctangent = Ec0;
00071   CunloadSlope = Ec0;
00072   Ttangent = Ec0;
00073   
00074   // Set trial values
00075   this->revertToLastCommit();
00076   
00077   // AddingSensitivity:BEGIN /////////////////////////////////////
00078   parameterID = 0;
00079   SHVs = 0;
00080   // AddingSensitivity:END //////////////////////////////////////
00081 }
00082 
00083 Concrete01::Concrete01():UniaxialMaterial(0, MAT_TAG_Concrete01),
00084  fpc(0.0), epsc0(0.0), fpcu(0.0), epscu(0.0),
00085  CminStrain(0.0), CunloadSlope(0.0), CendStrain(0.0),
00086  Cstrain(0.0), Cstress(0.0)
00087 {
00088   // Set trial values
00089   this->revertToLastCommit();
00090   
00091   // AddingSensitivity:BEGIN /////////////////////////////////////
00092   parameterID = 0;
00093   SHVs = 0;
00094   // AddingSensitivity:END //////////////////////////////////////
00095 }
00096 
00097 Concrete01::~Concrete01 ()
00098 {
00099   // Does nothing
00100 }
00101 
00102 
00103 int Concrete01::setTrialStrain (double strain, double strainRate)
00104 {
00105    // Reset trial history variables to last committed state
00106    TminStrain = CminStrain;
00107    TendStrain = CendStrain;
00108    TunloadSlope = CunloadSlope;
00109    Tstress = Cstress;
00110    Ttangent = Ctangent;
00111    Tstrain = Cstrain;
00112 
00113   // Determine change in strain from last converged state
00114   double dStrain = strain - Cstrain;
00115 
00116   if (fabs(dStrain) < DBL_EPSILON)
00117     return 0;
00118 
00119   // Set trial strain
00120   Tstrain = strain;
00121   
00122   // check for a quick return
00123   if (Tstrain > 0.0) {
00124     Tstress = 0;
00125     Ttangent = 0;
00126     return 0;
00127   }
00128   
00129   // Calculate the trial state given the change in strain
00130   // determineTrialState (dStrain);
00131   TunloadSlope = CunloadSlope;
00132   
00133   double tempStress = Cstress + TunloadSlope*Tstrain - TunloadSlope*Cstrain;
00134   
00135   // Material goes further into compression
00136   if (strain < Cstrain) {
00137     TminStrain = CminStrain;
00138     TendStrain = CendStrain;
00139     
00140     reload ();
00141     
00142     if (tempStress > Tstress) {
00143       Tstress = tempStress;
00144       Ttangent = TunloadSlope;
00145     }
00146   }
00147   
00148   // Material goes TOWARD tension
00149   else if (tempStress <= 0.0) {
00150     Tstress = tempStress;
00151     Ttangent = TunloadSlope;
00152   }
00153   
00154   // Made it into tension
00155   else {
00156     Tstress = 0.0;
00157     Ttangent = 0.0;
00158   }
00159   
00160   return 0;
00161 }
00162 
00163 
00164 
00165 int 
00166 Concrete01::setTrial (double strain, double &stress, double &tangent, double strainRate)
00167 {
00168          // Reset trial history variables to last committed state
00169    TminStrain = CminStrain;
00170    TendStrain = CendStrain;
00171    TunloadSlope = CunloadSlope;
00172    Tstress = Cstress;
00173    Ttangent = Ctangent;
00174    Tstrain = Cstrain;
00175 
00176   // Determine change in strain from last converged state
00177   double dStrain = strain - Cstrain;
00178 
00179   if (fabs(dStrain) < DBL_EPSILON) {
00180     stress = Tstress;
00181     tangent = Ttangent;
00182     return 0;
00183   }
00184 
00185   // Set trial strain
00186   Tstrain = strain;
00187   
00188   // check for a quick return
00189   if (Tstrain > 0.0) {
00190     Tstress = 0;
00191     Ttangent = 0;
00192     stress = 0;
00193     tangent = 0;
00194     return 0;
00195   }
00196   
00197   
00198   // Calculate the trial state given the change in strain
00199   // determineTrialState (dStrain);
00200   TunloadSlope = CunloadSlope;
00201   
00202   double tempStress = Cstress + TunloadSlope*Tstrain - TunloadSlope*Cstrain;
00203   
00204   // Material goes further into compression
00205   if (strain <= Cstrain) {
00206     TminStrain = CminStrain;
00207     TendStrain = CendStrain;
00208     
00209     reload ();
00210     
00211     if (tempStress > Tstress) {
00212       Tstress = tempStress;
00213       Ttangent = TunloadSlope;
00214     }
00215   }
00216   
00217   // Material goes TOWARD tension
00218   else if (tempStress <= 0.0) {
00219     Tstress = tempStress;
00220     Ttangent = TunloadSlope;
00221   }
00222   
00223   // Made it into tension
00224   else {
00225     Tstress = 0.0;
00226     Ttangent = 0.0;
00227   }
00228   
00229   //opserr << "Concrete01::setTrial() " << strain << " " << tangent << " " << strain << endln;
00230   
00231   stress = Tstress;
00232   tangent =  Ttangent;
00233   
00234   return 0;
00235 }
00236 
00237 void Concrete01::determineTrialState (double dStrain)
00238 {  
00239   TminStrain = CminStrain;
00240   TendStrain = CendStrain;
00241   TunloadSlope = CunloadSlope;
00242   
00243   double tempStress = Cstress + TunloadSlope*dStrain;
00244   
00245   // Material goes further into compression
00246   if (Tstrain <= Cstrain) {
00247     
00248     reload ();
00249     
00250     if (tempStress > Tstress) {
00251       Tstress = tempStress;
00252       Ttangent = TunloadSlope;
00253     }
00254   }
00255   
00256   // Material goes TOWARD tension
00257   else if (tempStress <= 0.0) {
00258     Tstress = tempStress;
00259     Ttangent = TunloadSlope;
00260   }
00261   
00262   // Made it into tension
00263   else {
00264     Tstress = 0.0;
00265     Ttangent = 0.0;
00266   }
00267   
00268 }
00269 
00270 void Concrete01::reload ()
00271 {
00272   if (Tstrain <= TminStrain) {
00273     
00274     TminStrain = Tstrain;
00275     
00276     // Determine point on envelope
00277     envelope ();
00278     
00279     unload ();
00280   }
00281   else if (Tstrain <= TendStrain) {
00282     Ttangent = TunloadSlope;
00283     Tstress = Ttangent*(Tstrain-TendStrain);
00284   }
00285   else {
00286     Tstress = 0.0;
00287     Ttangent = 0.0;
00288   }
00289 }
00290 
00291 void Concrete01::envelope ()
00292 {
00293   if (Tstrain > epsc0) {
00294     double eta = Tstrain/epsc0;
00295     Tstress = fpc*(2*eta-eta*eta);
00296     double Ec0 = 2.0*fpc/epsc0;
00297     Ttangent = Ec0*(1.0-eta);
00298   }
00299   else if (Tstrain > epscu) {
00300     Ttangent = (fpc-fpcu)/(epsc0-epscu);
00301     Tstress = fpc + Ttangent*(Tstrain-epsc0);
00302   }
00303   else {
00304     Tstress = fpcu;
00305     Ttangent = 0.0;
00306   }
00307 }
00308 
00309 void Concrete01::unload ()
00310 {
00311   double tempStrain = TminStrain;
00312   
00313   if (tempStrain < epscu)
00314     tempStrain = epscu;
00315   
00316   double eta = tempStrain/epsc0;
00317   
00318   double ratio = 0.707*(eta-2.0) + 0.834;
00319   
00320   if (eta < 2.0)
00321     ratio = 0.145*eta*eta + 0.13*eta;
00322   
00323   TendStrain = ratio*epsc0;
00324   
00325   double temp1 = TminStrain - TendStrain;
00326   
00327   double Ec0 = 2.0*fpc/epsc0;
00328   
00329   double temp2 = Tstress/Ec0;
00330   
00331   if (temp1 > -DBL_EPSILON) {   // temp1 should always be negative
00332     TunloadSlope = Ec0;
00333   }
00334   else if (temp1 <= temp2) {
00335     TendStrain = TminStrain - temp1;
00336     TunloadSlope = Tstress/temp1;
00337   }
00338   else {
00339     TendStrain = TminStrain - temp2;
00340     TunloadSlope = Ec0;
00341   }
00342 }
00343 
00344 double Concrete01::getStress ()
00345 {
00346    return Tstress;
00347 }
00348 
00349 double Concrete01::getStrain ()
00350 {
00351    return Tstrain;
00352 }
00353 
00354 double Concrete01::getTangent ()
00355 {
00356    return Ttangent;
00357 }
00358 
00359 int Concrete01::commitState ()
00360 {
00361    // History variables
00362    CminStrain = TminStrain;
00363    CunloadSlope = TunloadSlope;
00364    CendStrain = TendStrain;
00365 
00366    // State variables
00367    Cstrain = Tstrain;
00368    Cstress = Tstress;
00369    Ctangent = Ttangent;
00370 
00371    return 0;
00372 }
00373 
00374 int Concrete01::revertToLastCommit ()
00375 {
00376    // Reset trial history variables to last committed state
00377    TminStrain = CminStrain;
00378    TendStrain = CendStrain;
00379    TunloadSlope = CunloadSlope;
00380 
00381    // Recompute trial stress and tangent
00382    Tstrain = Cstrain;
00383    Tstress = Cstress;
00384    Ttangent = Ctangent;
00385 
00386    return 0;
00387 }
00388 
00389 int Concrete01::revertToStart ()
00390 {
00391         double Ec0 = 2.0*fpc/epsc0;
00392 
00393    // History variables
00394    CminStrain = 0.0;
00395    CunloadSlope = Ec0;
00396    CendStrain = 0.0;
00397 
00398    // State variables
00399    Cstrain = 0.0;
00400    Cstress = 0.0;
00401    Ctangent = Ec0;
00402 
00403    // Reset trial variables and state
00404    this->revertToLastCommit();
00405 
00406    return 0;
00407 }
00408 
00409 UniaxialMaterial* Concrete01::getCopy ()
00410 {
00411    Concrete01* theCopy = new Concrete01(this->getTag(),
00412                                     fpc, epsc0, fpcu, epscu);
00413 
00414    // Converged history variables
00415    theCopy->CminStrain = CminStrain;
00416    theCopy->CunloadSlope = CunloadSlope;
00417    theCopy->CendStrain = CendStrain;
00418 
00419    // Converged state variables
00420    theCopy->Cstrain = Cstrain;
00421    theCopy->Cstress = Cstress;
00422    theCopy->Ctangent = Ctangent;
00423 
00424    return theCopy;
00425 }
00426 
00427 int Concrete01::sendSelf (int commitTag, Channel& theChannel)
00428 {
00429    int res = 0;
00430    static Vector data(11);
00431    data(0) = this->getTag();
00432 
00433    // Material properties
00434    data(1) = fpc;
00435    data(2) = epsc0;
00436    data(3) = fpcu;
00437    data(4) = epscu;
00438 
00439    // History variables from last converged state
00440    data(5) = CminStrain;
00441    data(6) = CunloadSlope;
00442    data(7) = CendStrain;
00443 
00444    // State variables from last converged state
00445    data(8) = Cstrain;
00446    data(9) = Cstress;
00447    data(10) = Ctangent;
00448 
00449    // Data is only sent after convergence, so no trial variables
00450    // need to be sent through data vector
00451 
00452    res = theChannel.sendVector(this->getDbTag(), commitTag, data);
00453    if (res < 0) 
00454       opserr << "Concrete01::sendSelf() - failed to send data\n";
00455 
00456    return res;
00457 }
00458 
00459 int Concrete01::recvSelf (int commitTag, Channel& theChannel,
00460                                  FEM_ObjectBroker& theBroker)
00461 {
00462    int res = 0;
00463    static Vector data(11);
00464    res = theChannel.recvVector(this->getDbTag(), commitTag, data);
00465 
00466    if (res < 0) {
00467       opserr << "Concrete01::recvSelf() - failed to receive data\n";
00468       this->setTag(0);      
00469    }
00470    else {
00471       this->setTag(int(data(0)));
00472 
00473       // Material properties 
00474       fpc = data(1);
00475       epsc0 = data(2);
00476       fpcu = data(3);
00477       epscu = data(4);
00478 
00479       // History variables from last converged state
00480       CminStrain = data(5);
00481       CunloadSlope = data(6);
00482       CendStrain = data(7);
00483 
00484       // State variables from last converged state
00485       Cstrain = data(8);
00486       Cstress = data(9);
00487       Ctangent = data(10);
00488 
00489       // Set trial state variables
00490       Tstrain = Cstrain;
00491       Tstress = Cstress;
00492       Ttangent = Ctangent;
00493    }
00494 
00495    return res;
00496 }
00497 
00498 void Concrete01::Print (OPS_Stream& s, int flag)
00499 {
00500    s << "Concrete01, tag: " << this->getTag() << endln;
00501    s << "  fpc: " << fpc << endln;
00502    s << "  epsc0: " << epsc0 << endln;
00503    s << "  fpcu: " << fpcu << endln;
00504    s << "  epscu: " << epscu << endln;
00505 }
00506 
00507 
00508 
00509 
00510 // AddingSensitivity:BEGIN ///////////////////////////////////
00511 int
00512 Concrete01::setParameter(const char **argv, int argc, Parameter &param)
00513 {
00514   if (argc < 1)
00515     return 0;
00516 
00517   if (strcmp(argv[0],"fc") == 0) {// Compressive strength
00518     return param.addObject(1, this);
00519   }
00520   if (strcmp(argv[0],"epsco") == 0) {// Strain at compressive strength
00521     return param.addObject(2, this);
00522   }
00523   if (strcmp(argv[0],"fcu") == 0) {// Crushing strength
00524     return param.addObject(3, this);
00525   }
00526   if (strcmp(argv[0],"epscu") == 0) {// Strain at crushing strength
00527     return param.addObject(4, this);
00528   }
00529   else {
00530     opserr << "WARNING: Could not set parameter in Concrete01! " << endln;
00531     return 0;
00532   }
00533 }
00534     
00535                             
00536 
00537 int
00538 Concrete01::updateParameter(int parameterID, Information &info)
00539 {
00540         switch (parameterID) {
00541         case 1:
00542                 this->fpc = info.theDouble;
00543                 break;
00544         case 2:
00545                 this->epsc0 = info.theDouble;
00546                 break;
00547         case 3:
00548                 this->fpcu = info.theDouble;
00549                 break;
00550         case 4:
00551                 this->epscu = info.theDouble;
00552                 break;
00553         default:
00554                 break;
00555         }
00556         
00557         // Make all concrete parameters negative
00558         if (fpc > 0.0)
00559                 fpc = -fpc;
00560 
00561         if (epsc0 > 0.0)
00562                 epsc0 = -epsc0;
00563 
00564         if (fpcu > 0.0)
00565                 fpcu = -fpcu;
00566 
00567         if (epscu > 0.0)
00568                 epscu = -epscu;
00569 
00570         // Initial tangent
00571         double Ec0 = 2*fpc/epsc0;
00572         Ctangent = Ec0;
00573         CunloadSlope = Ec0;
00574         Ttangent = Ec0;
00575 
00576         return 0;
00577 }
00578 
00579 
00580 
00581 
00582 int
00583 Concrete01::activateParameter(int passedParameterID)
00584 {
00585         parameterID = passedParameterID;
00586 
00587         return 0;
00588 }
00589 
00590 double
00591 Concrete01::getStressSensitivity(int gradNumber, bool conditional)
00592 {
00593         // Initialize return value
00594         double TstressSensitivity = 0.0;
00595         double dktdh = 0.0;
00596         double TstrainSensitivity = 0.0;
00597 
00598 
00599         // Pick up sensitivity history variables
00600         double CminStrainSensitivity = 0.0;
00601         double CunloadSlopeSensitivity = 0.0;
00602         double CendStrainSensitivity = 0.0;
00603         double CstressSensitivity = 0.0;
00604         double CstrainSensitivity = 0.0;
00605         if (SHVs != 0) {
00606                 CminStrainSensitivity   = (*SHVs)(0,(gradNumber-1));
00607                 CunloadSlopeSensitivity = (*SHVs)(1,(gradNumber-1));
00608                 CendStrainSensitivity   = (*SHVs)(2,(gradNumber-1));
00609                 CstressSensitivity      = (*SHVs)(3,(gradNumber-1));
00610                 CstrainSensitivity      = (*SHVs)(4,(gradNumber-1));
00611         }
00612 
00613 
00614         // Assign values to parameter derivatives (depending on what's random)
00615         double fpcSensitivity = 0.0;
00616         double epsc0Sensitivity = 0.0;
00617         double fpcuSensitivity = 0.0;
00618         double epscuSensitivity = 0.0;
00619 
00620         if (parameterID == 1) {
00621                 fpcSensitivity = 1.0;
00622         }
00623         else if (parameterID == 2) {
00624                 epsc0Sensitivity = 1.0;
00625         }
00626         else if (parameterID == 3) {
00627                 fpcuSensitivity = 1.0;
00628         }
00629         else if (parameterID == 4) {
00630                 epscuSensitivity = 1.0;
00631         }
00632 
00633 
00634         // Strain increment 
00635         double dStrain = Tstrain - Cstrain;
00636 
00637         // Evaluate stress sensitivity 
00638         if (dStrain < 0.0) {                                    // applying more compression to the material
00639 
00640                 if (Tstrain < CminStrain) {                     // loading along the backbone curve
00641 
00642                         if (Tstrain > epsc0) {                  //on the parabola
00643                                 
00644                                 TstressSensitivity = fpcSensitivity*(2.0*Tstrain/epsc0-(Tstrain/epsc0)*(Tstrain/epsc0))
00645                                               + fpc*( (2.0*TstrainSensitivity*epsc0-2.0*Tstrain*epsc0Sensitivity)/(epsc0*epsc0) 
00646                                                   - 2.0*(Tstrain/epsc0)*(TstrainSensitivity*epsc0-Tstrain*epsc0Sensitivity)/(epsc0*epsc0));
00647                                 
00648                                 dktdh = 2.0*((fpcSensitivity*epsc0-fpc*epsc0Sensitivity)/(epsc0*epsc0))
00649                                           * (1.0-Tstrain/epsc0)
00650                                           - 2.0*(fpc/epsc0)*(TstrainSensitivity*epsc0-Tstrain*epsc0Sensitivity)
00651                                           / (epsc0*epsc0);
00652                         }
00653                         else if (Tstrain > epscu) {             // on the straight inclined line
00654 //cerr << "ON THE STRAIGHT INCLINED LINE" << endl;
00655 
00656                                 dktdh = ( (fpcSensitivity-fpcuSensitivity)
00657                                           * (epsc0-epscu) 
00658                                           - (fpc-fpcu)
00659                                           * (epsc0Sensitivity-epscuSensitivity) )
00660                                           / ((epsc0-epscu)*(epsc0-epscu));
00661 
00662                                 double kt = (fpc-fpcu)/(epsc0-epscu);
00663 
00664                                 TstressSensitivity = fpcSensitivity 
00665                                               + dktdh*(Tstrain-epsc0)
00666                                                   + kt*(TstrainSensitivity-epsc0Sensitivity);
00667                         }
00668                         else {                                                  // on the horizontal line
00669 //cerr << "ON THE HORIZONTAL LINES" << endl;
00670                                 TstressSensitivity = fpcuSensitivity;
00671                                 dktdh = 0.0;
00672                         
00673                         }
00674                 }
00675                 else if (Tstrain < CendStrain) {        // reloading after an unloading that didn't go all the way to zero stress
00676 //cerr << "RELOADING AFTER AN UNLOADING THAT DIDN'T GO ALL THE WAY DOWN" << endl;
00677                         TstressSensitivity = CunloadSlopeSensitivity * (Tstrain-CendStrain)
00678                                       + CunloadSlope * (TstrainSensitivity-CendStrainSensitivity);
00679 
00680                         dktdh = CunloadSlopeSensitivity;
00681                 }
00682                 else {
00683 
00684                         TstressSensitivity = 0.0;
00685                         dktdh = 0.0;
00686 
00687                 }
00688         }
00689         else if (Cstress+CunloadSlope*dStrain<0.0) {// unloading, but not all the way down to zero stress
00690 //cerr << "UNLOADING, BUT NOT ALL THE WAY DOWN" << endl;
00691                 TstressSensitivity = CstressSensitivity 
00692                                        + CunloadSlopeSensitivity*dStrain
00693                                            + CunloadSlope*(TstrainSensitivity-CstrainSensitivity);
00694 
00695                 dktdh = CunloadSlopeSensitivity;
00696         }
00697         else {                                                                  // unloading all the way down to zero stress
00698 //cerr << "UNLOADING ALL THE WAY DOWN" << endl;
00699 
00700                 TstressSensitivity = 0.0;
00701                 dktdh = 0.0;
00702 
00703         }
00704 
00705         return TstressSensitivity;
00706 }
00707 
00708 
00709 
00710 int
00711 Concrete01::commitSensitivity(double TstrainSensitivity, int gradNumber, int numGrads)
00712 {
00713 
00714         // Initialize unconditaional stress sensitivity
00715         double TstressSensitivity = 0.0;
00716         double dktdh = 0.0;
00717 
00718 
00719         // Assign values to parameter derivatives (depending on what's random)
00720         double fpcSensitivity = 0.0;
00721         double epsc0Sensitivity = 0.0;
00722         double fpcuSensitivity = 0.0;
00723         double epscuSensitivity = 0.0;
00724 
00725         if (parameterID == 1) {
00726                 fpcSensitivity = 1.0;
00727         }
00728         else if (parameterID == 2) {
00729                 epsc0Sensitivity = 1.0;
00730         }
00731         else if (parameterID == 3) {
00732                 fpcuSensitivity = 1.0;
00733         }
00734         else if (parameterID == 4) {
00735                 epscuSensitivity = 1.0;
00736         }
00737 
00738 
00739         // Pick up sensitivity history variables
00740         double CminStrainSensitivity = 0.0;
00741         double CunloadSlopeSensitivity = 0.0;
00742         double CendStrainSensitivity = 0.0;
00743         double CstressSensitivity = 0.0;
00744         double CstrainSensitivity = 0.0;
00745         
00746         if (SHVs == 0) {
00747                 SHVs = new Matrix(5,numGrads);
00748                 CunloadSlopeSensitivity = (2.0*fpcSensitivity*epsc0-2.0*fpc*epsc0Sensitivity) / (epsc0*epsc0);
00749         }
00750         else {
00751                 CminStrainSensitivity   = (*SHVs)(0,(gradNumber-1));
00752                 CunloadSlopeSensitivity = (*SHVs)(1,(gradNumber-1));
00753                 CendStrainSensitivity   = (*SHVs)(2,(gradNumber-1));
00754                 CstressSensitivity      = (*SHVs)(3,(gradNumber-1));
00755                 CstrainSensitivity      = (*SHVs)(4,(gradNumber-1));
00756         }
00757 
00758 
00759         // Strain increment 
00760         double dStrain = Tstrain - Cstrain;
00761 
00762         // Evaluate stress sensitivity 
00763         if (dStrain < 0.0) {                                    // applying more compression to the material
00764 
00765                 if (Tstrain < CminStrain) {                     // loading along the backbone curve
00766 
00767                         if (Tstrain > epsc0) {                  //on the parabola
00768                                 
00769                                 TstressSensitivity = fpcSensitivity*(2.0*Tstrain/epsc0-(Tstrain/epsc0)*(Tstrain/epsc0))
00770                                               + fpc*( (2.0*TstrainSensitivity*epsc0-2.0*Tstrain*epsc0Sensitivity)/(epsc0*epsc0) 
00771                                                   - 2.0*(Tstrain/epsc0)*(TstrainSensitivity*epsc0-Tstrain*epsc0Sensitivity)/(epsc0*epsc0));
00772                                 
00773                                 dktdh = 2.0*((fpcSensitivity*epsc0-fpc*epsc0Sensitivity)/(epsc0*epsc0))
00774                                           * (1.0-Tstrain/epsc0)
00775                                           - 2.0*(fpc/epsc0)*(TstrainSensitivity*epsc0-Tstrain*epsc0Sensitivity)
00776                                           / (epsc0*epsc0);
00777                         }
00778                         else if (Tstrain > epscu) {             // on the straight inclined line
00779 
00780                                 dktdh = ( (fpcSensitivity-fpcuSensitivity)
00781                                           * (epsc0-epscu) 
00782                                           - (fpc-fpcu)
00783                                           * (epsc0Sensitivity-epscuSensitivity) )
00784                                           / ((epsc0-epscu)*(epsc0-epscu));
00785 
00786                                 double kt = (fpc-fpcu)/(epsc0-epscu);
00787 
00788                                 TstressSensitivity = fpcSensitivity 
00789                                               + dktdh*(Tstrain-epsc0)
00790                                                   + kt*(TstrainSensitivity-epsc0Sensitivity);
00791                         }
00792                         else {                                                  // on the horizontal line
00793 
00794                                 TstressSensitivity = fpcuSensitivity;
00795                                 dktdh = 0.0;
00796                         
00797                         }
00798                 }
00799                 else if (Tstrain < CendStrain) {        // reloading after an unloading that didn't go all the way to zero stress
00800 
00801                         TstressSensitivity = CunloadSlopeSensitivity * (Tstrain-CendStrain)
00802                                       + CunloadSlope * (TstrainSensitivity-CendStrainSensitivity);
00803 
00804                         dktdh = CunloadSlopeSensitivity;
00805                 }
00806                 else {
00807 
00808                         TstressSensitivity = 0.0;
00809                         dktdh = 0.0;
00810 
00811                 }
00812         }
00813         else if (Cstress+CunloadSlope*dStrain<0.0) {// unloading, but not all the way down to zero stress
00814         
00815                 TstressSensitivity = CstressSensitivity 
00816                                        + CunloadSlopeSensitivity*dStrain
00817                                            + CunloadSlope*(TstrainSensitivity-CstrainSensitivity);
00818 
00819                 dktdh = CunloadSlopeSensitivity;
00820         }
00821         else {                                                                  // unloading all the way down to zero stress
00822 
00823                 TstressSensitivity = 0.0;
00824                 dktdh = 0.0;
00825 
00826         }
00827 
00828         // Commit some history variables
00829         (*SHVs)(3,(gradNumber-1)) = TstressSensitivity;
00830         (*SHVs)(4,(gradNumber-1)) = TstrainSensitivity;
00831 
00832 
00833 
00834 
00835 
00836         // Possibly update history variables for the three ordinary history variable derivatives
00837         double epsTemp, epsTempSensitivity;
00838         double eta, etaSensitivity;
00839         double ratio, ratioSensitivity;
00840         double temp1, temp1Sensitivity;
00841         double temp2, temp2Sensitivity;
00842         double TminStrainSensitivity;
00843         double TunloadSlopeSensitivity;
00844         double TendStrainSensitivity;
00845 
00846         if (dStrain<0.0 && Tstrain<CminStrain) {
00847 
00848                 TminStrainSensitivity = TstrainSensitivity;
00849 
00850                 if (Tstrain < epscu) {
00851 
00852                         epsTemp = epscu; 
00853 
00854                         epsTempSensitivity = epscuSensitivity;
00855 
00856                 }
00857                 else {
00858 
00859                         epsTemp = Tstrain;
00860 
00861                         epsTempSensitivity = TstrainSensitivity;
00862                 }
00863 
00864                 eta = epsTemp/epsc0;
00865 
00866                 etaSensitivity = (epsTempSensitivity*epsc0-epsTemp*epsc0Sensitivity) / (epsc0*epsc0);
00867 
00868                 if (eta < 2.0) {
00869 
00870                         ratio = 0.145 * eta*eta + 0.13*eta;
00871 
00872                         ratioSensitivity = 0.29 * eta * etaSensitivity + 0.13 * etaSensitivity;
00873 
00874                 }
00875                 else {
00876 
00877                         ratio = 0.707*(eta-2.0) + 0.834;
00878 
00879                         ratioSensitivity = 0.707 * etaSensitivity;
00880                 }
00881 
00882                 temp1 = Tstrain - ratio * epsc0;
00883 
00884                 temp1Sensitivity = TstrainSensitivity - ratioSensitivity * epsc0
00885                                                           - ratio * epsc0Sensitivity;
00886 
00887                 temp2 = Tstress * epsc0 / (2.0*fpc); 
00888                 
00889                 temp2Sensitivity = (2.0*fpc*(TstressSensitivity*epsc0+Tstress*epsc0Sensitivity)
00890                         -2.0*Tstress*epsc0*fpcSensitivity) / (4.0*fpc*fpc);
00891 
00892                 if (temp1 == 0.0) {
00893 
00894                         TunloadSlopeSensitivity = (2.0*fpcSensitivity*epsc0-2.0*fpc*epsc0Sensitivity) / (epsc0*epsc0);
00895                 }
00896                 else if (temp1 < temp2) {
00897 
00898                         TendStrainSensitivity = TstrainSensitivity - temp1Sensitivity;
00899 
00900                         TunloadSlopeSensitivity = (TstressSensitivity*temp1-Tstress*temp1Sensitivity) / (temp1*temp1);
00901 
00902                 }
00903                 else {
00904 
00905                         TendStrainSensitivity = TstrainSensitivity - temp2Sensitivity;
00906 
00907                         TunloadSlopeSensitivity = (2.0*fpcSensitivity*epsc0-2.0*fpc*epsc0Sensitivity) / (epsc0*epsc0);
00908                 }
00909         }
00910         else {
00911                 TminStrainSensitivity = CminStrainSensitivity;
00912                 TunloadSlopeSensitivity = CunloadSlopeSensitivity;
00913                 TendStrainSensitivity = CendStrainSensitivity;
00914         }
00915 
00916 
00917 
00918         (*SHVs)(0,(gradNumber-1)) = TminStrainSensitivity;
00919         (*SHVs)(1,(gradNumber-1)) = TunloadSlopeSensitivity;
00920         (*SHVs)(2,(gradNumber-1)) = TendStrainSensitivity;
00921 
00922         return 0;
00923 }
00924 
00925 
00926 
00927 
00928 
00929 
00930 
00931 
00932 
00933 
00934 
00935 
00936 
00937 
00938 
00939 
00940 
00941 
00942 
00943 
00944 
00945 
00946 
00947 
00948 
00949 /* THE OLD METHODS:
00950 double
00951 Concrete01::getStressSensitivity(int gradNumber, bool conditional)
00952 {
00953         // (This method only works for path-independent problems for now.)
00954 
00955         double gradient = 0.0;
00956 
00957         if ( parameterID == 0 ) {
00958                 // Leave the gradient as zero if nothing is random here;
00959         }
00960         else if (Tstrain > 0.0 ) {
00961                 gradient = 0.0;
00962         }
00963         else if (Tstrain > epsc0) {                                     // IN PARABOLIC AREA
00964 
00965                 if ( parameterID == 1 ) {               // d{sigma}d{fpc}
00966                         gradient = 2.0*Tstrain/epsc0-Tstrain*Tstrain/(epsc0*epsc0);
00967                 }
00968                 else if ( parameterID == 2  ) { // d{sigma}d{epsc0}
00969                         gradient = 2.0*fpc/(epsc0*epsc0)*(Tstrain*Tstrain/epsc0-Tstrain);
00970                 }
00971                 else if ( parameterID == 3  ) { // d{sigma}d{fpcu}
00972                         gradient = 0.0;
00973                 }
00974                 else if ( parameterID == 4  ) { // d{sigma}d{epscu}
00975                         gradient = 0.0;
00976                 }
00977                 else {
00978                         gradient = 0.0;
00979                 }
00980         }
00981         else if (Tstrain > epscu) {                                     // IN LINEAR AREA
00982 
00983                 if ( parameterID == 1 ) {               // d{sigma}d{fpc}
00984                         gradient = (epscu-Tstrain)/(epscu-epsc0);
00985                 }
00986                 else if ( parameterID == 2  ) { // d{sigma}d{epsc0}
00987                         gradient = (fpc-fpcu)*(epscu-Tstrain)/((epscu-epsc0)*(epscu-epsc0));
00988                 }
00989                 else if ( parameterID == 3  ) { // d{sigma}d{fpcu}
00990                         gradient = (Tstrain-epsc0)/(epscu-epsc0);
00991                 }
00992                 else if ( parameterID == 4  ) { // d{sigma}d{epscu}
00993                         gradient = (Tstrain-epsc0)*(fpc-fpcu)/((epsc0-epscu)*(epsc0-epscu));
00994                 }
00995                 else {
00996                         gradient = 0.0;
00997                 }
00998         }
00999         else {                                                                          // IN ZERO STIFFNESS AREA
01000 
01001                 if ( parameterID == 1 ) {               // d{sigma}d{fpc}
01002                         gradient = 0.0;
01003                 }
01004                 else if ( parameterID == 2  ) { // d{sigma}d{epsc0}
01005                         gradient = 0.0;
01006                 }
01007                 else if ( parameterID == 3  ) { // d{sigma}d{fpcu}
01008                         gradient = 1.0;
01009                 }
01010                 else if ( parameterID == 4  ) { // d{sigma}d{epscu}
01011                         gradient = 0.0;
01012                 }
01013                 else {
01014                         gradient = 0.0;
01015                 }
01016         }
01017 
01018         return gradient;
01019 }
01020 
01021 
01022 
01023 int
01024 Concrete01::commitSensitivity(double TstrainSensitivity, int gradNumber, int numGrads)
01025 {
01026         // Not treated yet. 
01027 
01028         return 0;
01029 }
01030 */
01031 // AddingSensitivity:END /////////////////////////////////////////////

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