00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
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
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
00069 double Ec0 = 2*fpc/epsc0;
00070 Ctangent = Ec0;
00071 CunloadSlope = Ec0;
00072 Ttangent = Ec0;
00073
00074
00075 this->revertToLastCommit();
00076
00077
00078 parameterID = 0;
00079 SHVs = 0;
00080
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
00089 this->revertToLastCommit();
00090
00091
00092 parameterID = 0;
00093 SHVs = 0;
00094
00095 }
00096
00097 Concrete01::~Concrete01 ()
00098 {
00099
00100 }
00101
00102
00103 int Concrete01::setTrialStrain (double strain, double strainRate)
00104 {
00105
00106 TminStrain = CminStrain;
00107 TendStrain = CendStrain;
00108 TunloadSlope = CunloadSlope;
00109 Tstress = Cstress;
00110 Ttangent = Ctangent;
00111 Tstrain = Cstrain;
00112
00113
00114 double dStrain = strain - Cstrain;
00115
00116 if (fabs(dStrain) < DBL_EPSILON)
00117 return 0;
00118
00119
00120 Tstrain = strain;
00121
00122
00123 if (Tstrain > 0.0) {
00124 Tstress = 0;
00125 Ttangent = 0;
00126 return 0;
00127 }
00128
00129
00130
00131 TunloadSlope = CunloadSlope;
00132
00133 double tempStress = Cstress + TunloadSlope*Tstrain - TunloadSlope*Cstrain;
00134
00135
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
00149 else if (tempStress <= 0.0) {
00150 Tstress = tempStress;
00151 Ttangent = TunloadSlope;
00152 }
00153
00154
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
00169 TminStrain = CminStrain;
00170 TendStrain = CendStrain;
00171 TunloadSlope = CunloadSlope;
00172 Tstress = Cstress;
00173 Ttangent = Ctangent;
00174 Tstrain = Cstrain;
00175
00176
00177 double dStrain = strain - Cstrain;
00178
00179 if (fabs(dStrain) < DBL_EPSILON) {
00180 stress = Tstress;
00181 tangent = Ttangent;
00182 return 0;
00183 }
00184
00185
00186 Tstrain = strain;
00187
00188
00189 if (Tstrain > 0.0) {
00190 Tstress = 0;
00191 Ttangent = 0;
00192 stress = 0;
00193 tangent = 0;
00194 return 0;
00195 }
00196
00197
00198
00199
00200 TunloadSlope = CunloadSlope;
00201
00202 double tempStress = Cstress + TunloadSlope*Tstrain - TunloadSlope*Cstrain;
00203
00204
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
00218 else if (tempStress <= 0.0) {
00219 Tstress = tempStress;
00220 Ttangent = TunloadSlope;
00221 }
00222
00223
00224 else {
00225 Tstress = 0.0;
00226 Ttangent = 0.0;
00227 }
00228
00229
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
00246 if (Tstrain <= Cstrain) {
00247
00248 reload ();
00249
00250 if (tempStress > Tstress) {
00251 Tstress = tempStress;
00252 Ttangent = TunloadSlope;
00253 }
00254 }
00255
00256
00257 else if (tempStress <= 0.0) {
00258 Tstress = tempStress;
00259 Ttangent = TunloadSlope;
00260 }
00261
00262
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
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) {
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
00362 CminStrain = TminStrain;
00363 CunloadSlope = TunloadSlope;
00364 CendStrain = TendStrain;
00365
00366
00367 Cstrain = Tstrain;
00368 Cstress = Tstress;
00369 Ctangent = Ttangent;
00370
00371 return 0;
00372 }
00373
00374 int Concrete01::revertToLastCommit ()
00375 {
00376
00377 TminStrain = CminStrain;
00378 TendStrain = CendStrain;
00379 TunloadSlope = CunloadSlope;
00380
00381
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
00394 CminStrain = 0.0;
00395 CunloadSlope = Ec0;
00396 CendStrain = 0.0;
00397
00398
00399 Cstrain = 0.0;
00400 Cstress = 0.0;
00401 Ctangent = Ec0;
00402
00403
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
00415 theCopy->CminStrain = CminStrain;
00416 theCopy->CunloadSlope = CunloadSlope;
00417 theCopy->CendStrain = CendStrain;
00418
00419
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
00434 data(1) = fpc;
00435 data(2) = epsc0;
00436 data(3) = fpcu;
00437 data(4) = epscu;
00438
00439
00440 data(5) = CminStrain;
00441 data(6) = CunloadSlope;
00442 data(7) = CendStrain;
00443
00444
00445 data(8) = Cstrain;
00446 data(9) = Cstress;
00447 data(10) = Ctangent;
00448
00449
00450
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
00474 fpc = data(1);
00475 epsc0 = data(2);
00476 fpcu = data(3);
00477 epscu = data(4);
00478
00479
00480 CminStrain = data(5);
00481 CunloadSlope = data(6);
00482 CendStrain = data(7);
00483
00484
00485 Cstrain = data(8);
00486 Cstress = data(9);
00487 Ctangent = data(10);
00488
00489
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
00511 int
00512 Concrete01::setParameter(const char **argv, int argc, Parameter ¶m)
00513 {
00514 if (argc < 1)
00515 return 0;
00516
00517 if (strcmp(argv[0],"fc") == 0) {
00518 return param.addObject(1, this);
00519 }
00520 if (strcmp(argv[0],"epsco") == 0) {
00521 return param.addObject(2, this);
00522 }
00523 if (strcmp(argv[0],"fcu") == 0) {
00524 return param.addObject(3, this);
00525 }
00526 if (strcmp(argv[0],"epscu") == 0) {
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
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
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
00594 double TstressSensitivity = 0.0;
00595 double dktdh = 0.0;
00596 double TstrainSensitivity = 0.0;
00597
00598
00599
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
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
00635 double dStrain = Tstrain - Cstrain;
00636
00637
00638 if (dStrain < 0.0) {
00639
00640 if (Tstrain < CminStrain) {
00641
00642 if (Tstrain > epsc0) {
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) {
00654
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 {
00669
00670 TstressSensitivity = fpcuSensitivity;
00671 dktdh = 0.0;
00672
00673 }
00674 }
00675 else if (Tstrain < CendStrain) {
00676
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) {
00690
00691 TstressSensitivity = CstressSensitivity
00692 + CunloadSlopeSensitivity*dStrain
00693 + CunloadSlope*(TstrainSensitivity-CstrainSensitivity);
00694
00695 dktdh = CunloadSlopeSensitivity;
00696 }
00697 else {
00698
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
00715 double TstressSensitivity = 0.0;
00716 double dktdh = 0.0;
00717
00718
00719
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
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
00760 double dStrain = Tstrain - Cstrain;
00761
00762
00763 if (dStrain < 0.0) {
00764
00765 if (Tstrain < CminStrain) {
00766
00767 if (Tstrain > epsc0) {
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) {
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 {
00793
00794 TstressSensitivity = fpcuSensitivity;
00795 dktdh = 0.0;
00796
00797 }
00798 }
00799 else if (Tstrain < CendStrain) {
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) {
00814
00815 TstressSensitivity = CstressSensitivity
00816 + CunloadSlopeSensitivity*dStrain
00817 + CunloadSlope*(TstrainSensitivity-CstrainSensitivity);
00818
00819 dktdh = CunloadSlopeSensitivity;
00820 }
00821 else {
00822
00823 TstressSensitivity = 0.0;
00824 dktdh = 0.0;
00825
00826 }
00827
00828
00829 (*SHVs)(3,(gradNumber-1)) = TstressSensitivity;
00830 (*SHVs)(4,(gradNumber-1)) = TstrainSensitivity;
00831
00832
00833
00834
00835
00836
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
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031