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
00036
00037
00038
00039 #include <BarSlipMaterial.h>
00040 #include <math.h>
00041 #include <float.h>
00042 #include <OPS_Globals.h>
00043
00044 BarSlipMaterial::BarSlipMaterial(int tag,
00045 double f, double fs, double es, double fsu,
00046 double eh, double dbar, double ljoint, int n, double w, double d,
00047 int bsf, int typ):
00048 UniaxialMaterial(tag, MAT_TAG_BarSlip),
00049 tagMat(tag), bsflag(bsf), unit(0), type(typ), damage(1), width(w), depth(d),
00050 envlpPosStress(6), envlpPosStrain(6), envlpNegStress(6), envlpNegStrain(6),
00051 fc(f), fy(fs), Es(es), fu(fsu), Eh(eh), db(dbar), nbars(n), ld(ljoint),
00052 eP(4,2), eN(4,2), envlpPosDamgdStress(6), envlpNegDamgdStress(6), state3Stress(4),
00053 state3Strain(4), state4Stress(4), state4Strain(4)
00054 {
00055 rDispP = 0.25; rForceP = 0.25; uForceP = 0.0;
00056 rDispN = 0.25; rForceN = 0.25; uForceN = 0.0;
00057 gammaK1 = 0.3; gammaK2 = 0.0; gammaK3 = 0.1; gammaK4 = 0.0; gammaKLimit = 0.4;
00058 gammaD1 = 0.6; gammaD2 = 0.0; gammaD3 = 0.2; gammaD4 = 0.0; gammaDLimit = 0.25;
00059 gammaF1 = 0.7; gammaF2 = 0.3; gammaF3 = 0.5; gammaF4 = 0.1; gammaFLimit = 0.0;
00060 gammaE = 10.0;
00061
00062 getBondStrength();
00063 getBarSlipEnvelope();
00064 createMaterial();
00065 }
00066
00067 BarSlipMaterial::BarSlipMaterial(int tag,
00068 double f, double fs, double es, double fsu,
00069 double eh, double dbar, double ljoint, int n, double w, double d,
00070 int bsf, int typ, int dam, int unt):
00071 UniaxialMaterial(tag, MAT_TAG_BarSlip),
00072 tagMat(tag), bsflag(bsf), unit(unt), type(typ), damage(dam), width(w), depth(d),
00073 envlpPosStress(6), envlpPosStrain(6), envlpNegStress(6), envlpNegStrain(6),
00074 fc(f), fy(fs), Es(es), fu(fsu), Eh(eh), db(dbar), nbars(n), ld(ljoint),
00075 eP(4,2), eN(4,2), envlpPosDamgdStress(6), envlpNegDamgdStress(6), state3Stress(4),
00076 state3Strain(4), state4Stress(4), state4Strain(4)
00077 {
00078 rDispP = 0.25; rForceP = 0.25; uForceP = 0.0;
00079 rDispN = 0.25; rForceN = 0.25; uForceN = 0.0;
00080 gammaK1 = 0.3; gammaK2 = 0.0; gammaK3 = 0.1; gammaK4 = 0.0; gammaKLimit = 0.4;
00081 gammaD1 = 0.6; gammaD2 = 0.0; gammaD3 = 0.2; gammaD4 = 0.0; gammaDLimit = 0.25;
00082 gammaF1 = 0.7; gammaF2 = 0.3; gammaF3 = 0.5; gammaF4 = 0.1; gammaFLimit = 0.0;
00083 gammaE = 10.0;
00084
00085
00086 if (damage == 0)
00087 {
00088 gammaK1 = 0.0; gammaK2 = 0.0; gammaK3 = 0.0; gammaK4 = 0.0; gammaKLimit = 0.0;
00089 gammaD1 = 0.0; gammaD2 = 0.0; gammaD3 = 0.0; gammaD4 = 0.0; gammaDLimit = 0.0;
00090 gammaF1 = 0.0; gammaF2 = 0.0; gammaF3 = 0.0; gammaF4 = 0.0; gammaFLimit = 0.0;
00091 }
00092 if (damage == 1)
00093 {
00094
00095 gammaF1 = 0.0; gammaF2 = 0.0; gammaF3 = 0.0; gammaF4 = 0.0; gammaFLimit = 0.0;
00096 }
00097 if (damage == 2)
00098 {
00099
00100 gammaF1 = 11.8986; gammaF2 = 0.0; gammaF3 = 3.9694; gammaF4 = 0.0; gammaFLimit = 0.85;
00101 }
00102
00103 getBondStrength();
00104 getBarSlipEnvelope();
00105 createMaterial();
00106 }
00107
00108
00109 BarSlipMaterial::BarSlipMaterial():
00110 UniaxialMaterial(0, MAT_TAG_BarSlip),
00111 tagMat(0), bsflag(0), unit(0), type(0), damage(0), width(0.0), depth(0.0),
00112 envlpPosStress(6), envlpPosStrain(6), envlpNegStress(6), envlpNegStrain(6),
00113 fc(0.0), fy(0.0), Es(0.0), fu(0.0), Eh(0.0), db(0.0), nbars(0), ld(0.0),
00114 eP(4,2), eN(4,2), envlpPosDamgdStress(6), envlpNegDamgdStress(6), state3Stress(4),
00115 state3Strain(4), state4Stress(4), state4Strain(4)
00116 {
00117
00118 }
00119
00120 BarSlipMaterial::~BarSlipMaterial()
00121 {
00122
00123
00124
00125
00126 }
00127
00128 void BarSlipMaterial::getBondStrength(void)
00129 {
00130 if (fc <= 0.0)
00131 opserr << "WARNING : BAR-SLIP -- fc should be positive entry" << endln;
00132
00133 if (unit == 0)
00134 {
00135 if (fc >= 1000.0)
00136 {
00137 unit = 2;
00138 }
00139 else
00140 {
00141 unit = 1;
00142 }
00143 }
00144
00145 if (unit == 1)
00146 {
00147 if (bsflag == 1)
00148 {
00149 tauYT = 0.05*pow(fc,0.5);
00150 tauET = 1.8*pow(fc,0.5);
00151 tauEC = 2.2*pow(fc,0.5);
00152 tauYC = 3.7*pow(fc,0.5);
00153 tauR = 0.15*pow(fc,0.5);
00154 }
00155 else if (bsflag == 0)
00156 {
00157 tauYT = 0.4*pow(fc,0.5);
00158 tauET = 1.8*pow(fc,0.5);
00159 tauEC = 2.2*pow(fc,0.5);
00160 tauYC = 3.7*pow(fc,0.5);
00161 tauR = 0.15*pow(fc,0.5);
00162 }
00163 }
00164 else if (unit == 2)
00165 {
00166 if (bsflag == 1)
00167 {
00168 tauYT = 0.6*pow(fc,0.5);
00169 tauET = 21*pow(fc,0.5);
00170 tauEC = 26*pow(fc,0.5);
00171 tauYC = 43*pow(fc,0.5);
00172 tauR = 1.8*pow(fc,0.5);
00173 }
00174 else if (bsflag == 0)
00175 {
00176 tauYT = 4.8*pow(fc,0.5);
00177 tauET = 21*pow(fc,0.5);
00178 tauEC = 26*pow(fc,0.5);
00179 tauYC = 43*pow(fc,0.5);
00180 tauR = 1.8*pow(fc,0.5);
00181 }
00182 }
00183 else if (unit == 3)
00184 {
00185 if (bsflag == 1)
00186 {
00187 tauYT = 1.58*pow(fc,0.5);
00188 tauET = 56.92*pow(fc,0.5);
00189 tauEC = 69.57*pow(fc,0.5);
00190 tauYC = 117*pow(fc,0.5);
00191 tauR = 4.74*pow(fc,0.5);
00192 }
00193 else if (bsflag == 0)
00194 {
00195 tauYT = 12.65*pow(fc,0.5);
00196 tauET = 56.92*pow(fc,0.5);
00197 tauEC = 69.57*pow(fc,0.5);
00198 tauYC = 117*pow(fc,0.5);
00199 tauR = 4.74*pow(fc,0.5);
00200 }
00201 }
00202 else if (unit == 4)
00203 {
00204 if (bsflag == 1)
00205 {
00206 tauYT = 7.2*pow(fc,0.5);
00207 tauET = 252*pow(fc,0.5);
00208 tauEC = 312*pow(fc,0.5);
00209 tauYC = 516*pow(fc,0.5);
00210 tauR = 21.6*pow(fc,0.5);
00211 }
00212 else if (bsflag == 0)
00213 {
00214 tauYT = 57.6*pow(fc,0.5);
00215 tauET = 252*pow(fc,0.5);
00216 tauEC = 312*pow(fc,0.5);
00217 tauYC = 516*pow(fc,0.5);
00218 tauR = 21.6*pow(fc,0.5);
00219 }
00220 }
00221 else if (unit == 5)
00222 {
00223 if (bsflag == 1)
00224 {
00225 tauYT = 0.02*pow(fc,0.5);
00226 tauET = 0.66*pow(fc,0.5);
00227 tauEC = 0.82*pow(fc,0.5);
00228 tauYC = 1.36*pow(fc,0.5);
00229 tauR = 0.06*pow(fc,0.5);
00230 }
00231 else if (bsflag == 0)
00232 {
00233 tauYT = 0.15*pow(fc,0.5);
00234 tauET = 0.66*pow(fc,0.5);
00235 tauEC = 0.82*pow(fc,0.5);
00236 tauYC = 1.36*pow(fc,0.5);
00237 tauR = 0.06*pow(fc,0.5);
00238 }
00239 }
00240 else if (unit == 6)
00241 {
00242 if (bsflag == 1)
00243 {
00244 tauYT = 0.24*pow(fc,0.5);
00245 tauET = 7.92*pow(fc,0.5);
00246 tauEC = 9.84*pow(fc,0.5);
00247 tauYC = 16.32*pow(fc,0.5);
00248 tauR = 0.72*pow(fc,0.5);
00249 }
00250 else if (bsflag == 0)
00251 {
00252 tauYT = 1.8*pow(fc,0.5);
00253 tauET = 7.92*pow(fc,0.5);
00254 tauEC = 9.84*pow(fc,0.5);
00255 tauYC = 16.32*pow(fc,0.5);
00256 tauR = 0.72*pow(fc,0.5);
00257 }
00258 }
00259 }
00260
00261 void BarSlipMaterial::getBarSlipEnvelope(void)
00262 {
00263
00264
00265
00266
00267
00268 double delta = 0.0;
00269 double del_ult = 0.0;
00270 if (unit == 1)
00271 {
00272 delta = 3.0;
00273 del_ult = 10.0;
00274 }
00275 else if (unit == 2 || unit == 5)
00276 {
00277 delta = 3.0/25.43;
00278 del_ult = 10.0/25.43;
00279 }
00280 else if (unit == 3)
00281 {
00282 delta = 0.003;
00283 del_ult = 0.01;
00284 }
00285 else if (unit == 4 || unit == 6)
00286 {
00287 delta = 3.0/(25.43*12.0);
00288 del_ult = 10.0/(25.43*12.0);
00289 }
00290
00291 double Ab = PI*pow(db,2)/4;
00292 double As = Ab*nbars;
00293
00294 double frP = 0.0;
00295 double frN = 0.0;
00296 double geo = 0.0;
00297 double let = 0.0;
00298 double lec = 0.0;
00299 double lyc = 0.0;
00300 double lyt = 0.0;
00301 double k1 = 0.0;
00302 double k2 = 0.0;
00303 double k3 = 0.0;
00304 double le1 = 0.0;
00305 double le2 = 0.0;
00306 double unloadNForce = 0.0;
00307 double unloadPForce = 0.0;
00308 eP.Zero();
00309 eN.Zero();
00310
00311 frP = tauR*ld*PI*db*As/Ab;
00312 frN = -tauR*ld*PI*db*As/Ab;
00313
00314 geo = PI*db/Ab;
00315 let = fy/(tauET*geo);
00316 lyt = (fu-fy)/(tauYT*geo);
00317 lec = fy/(tauEC*geo);
00318 lyc = (fu-fy)/(tauYC*geo);
00319
00320 k1 = 2*Es*(tauET/fy)*geo*As;
00321
00322 eP(0,0) = 0.5*fy*As/k1;
00323 eP(0,1) = 0.5*fy*As;
00324 eP(1,0) = fy*As/k1;
00325 eP(1,1) = fy*As;
00326
00327 if (let+lyt<ld && bsflag ==0 )
00328 {
00329 k2 = (fu-fy)*As/(fy*lyt/Es + 0.5*geo*tauYT*pow(lyt,2)/Eh);
00330 }
00331 else
00332 {
00333 le1 = fy/(tauET*geo);
00334 le2 = fy/(tauYT*geo);
00335 k2 = (fu-fy)*As/(geo*0.5*tauYT*(pow(le2,2)/Es - pow(le1,2)/Es + pow(lyt,2)/Eh) + fy*lyt/Es);
00336 }
00337
00338
00339 eP(2,0) = (delta<(fy*As/k1 + (fu-fy)*As/k2))? delta:(fy*As/k1 + (fu-fy)*As/k2);
00340
00341 if (eP(2,0) == delta)
00342 {
00343 eP(2,1) = fy*As + (delta - fy*As/k1)*k2;
00344 }
00345 else
00346 {
00347 eP(2,1) = fu*As;
00348 }
00349
00350 eP(3,0) = del_ult;
00351 eP(3,1) = eP(2,1) + (eP(2,1) - eP(1,1))*(eP(3,0) - eP(2,0))/(eP(2,0) - eP(1,0));
00352
00353 gammaFLimit = 1.0 - frP/eP(2,1);
00354
00355 double dth = depth;
00356 double dd = 0.1*depth;
00357 double j = 0.0;
00358 double beta = 0.85;
00359 double fcc = 0.0;
00360
00361 if (unit == 2)
00362 {
00363 fcc = fc;
00364 }
00365 else if (unit == 1)
00366 {
00367 fcc = 145*fc;
00368 }
00369 else if (unit == 3)
00370 {
00371 fcc = 0.000145*fc;
00372 }
00373 else if (unit == 4)
00374 {
00375 fcc = 0.00694*fc;
00376 }
00377 else if (unit == 5)
00378 {
00379 fcc = 1000*fc;
00380 }
00381 else if (unit == 6)
00382 {
00383 fcc = 6.94*fc;
00384 }
00385
00386 double b1 = (fcc - 4000)*0.05/1000;
00387 if (b1 <= 0.0)
00388 {
00389 b1 = 0.0;
00390 }
00391 if (b1 >= 0.2)
00392 {
00393 b1 = 0.2;
00394 }
00395
00396 double beta1 = 0.85 - b1;
00397
00398 double cForce = 0.0;
00399
00400 if ((type == 0) || (type == 1))
00401 {
00402 j = 0.85;
00403 }
00404 else if (type ==2)
00405 {
00406 j = 0.75;
00407 }
00408
00409 cForce = 1 + (beta*fc*dth*width*2*(1-j)/(Es*As*0.003*beta1*(1-dd*beta1/(2*dth*(1-j)))));
00410 As = As*cForce;
00411 k1 = 2*Es*(tauEC/fy)*geo*As;
00412
00413
00414 eN(0,0) = -.5*fy*As/k1;
00415 eN(0,1) = -.5*fy*As;
00416 eN(1,0) = -fy*As/k1;
00417 eN(1,1) = -fy*As;
00418
00419 if (lec+lyc < ld && bsflag ==0 )
00420 {
00421 k2 = (fu-fy)*As/(fy*lyc/Es + 0.5*geo*tauYC*pow(lyc,2)/Eh);
00422 }
00423 else
00424 {
00425 le1 = fy/(tauEC*geo);
00426 le2 = fy/(tauYC*geo);
00427 k2 = (fu-fy)*As/(geo*0.5*tauYC*(pow(le2,2)/Es - pow(le1,2)/Es + pow(lyc,2)/Eh) + fy*lyc/Es);
00428 }
00429
00430 eN(2,0) = (delta<(fy*As/k1 + (fu-fy)*As/k2))? -delta:-(fy*As/k1 + (fu-fy)*As/k2);
00431
00432 if (eN(2,0) == -delta)
00433 {
00434 eN(2,1) = -fy*As + (-delta + fy*As/k1)*k2;
00435 }
00436 else
00437 {
00438 eN(2,1) = -fu*As;
00439 }
00440
00441 k3 = 1e-3*k1;
00442 eN(3,0) = -del_ult;
00443 eN(3,1) = eN(2,1) + k3*(eN(3,0)-eN(2,0));
00444
00445 As = As/cForce;
00446
00447 double tP = (ld<(lec+lyc)) ? ld:(lec+lyc);
00448 double tN = (ld<(let+lyt)) ? ld:(let+lyt);
00449
00450 unloadPForce = tauR*PI*db*As*tP/Ab;
00451 unloadNForce = -tauR*PI*db*As*tN/Ab;
00452
00453 uForceP = unloadPForce/eP(2,1);
00454 uForceN = unloadNForce/eN(2,1);
00455
00456 double ratio = 2.0;
00457 rForceP = (uForceP>uForceN) ? ratio*uForceP:ratio*uForceN;
00458 rForceN = (uForceP>uForceN) ? ratio*uForceP:ratio*uForceN;
00459
00460
00461 }
00462
00463 void BarSlipMaterial::createMaterial(void)
00464 {
00465
00466
00467
00468
00469
00470 bool error = false;
00471
00472
00473 if (eP(0,0) <= 0.0 || eP(1,0) <= 0.0 || eP(2,0) <= 0.0 || eP(3,0) <= 0.0)
00474 error = true;
00475
00476 if (eN(0,0) >= 0.0 || eN(1,0) >= 0.0 || eN(2,0) >= 0.0 || eN(3,0) >= 0.0)
00477 error = true;
00478
00479 if (error) {
00480 opserr << "Error: -- input backbone not unique, BarSlipMaterial::BarSlipMaterial" << "\a";
00481 }
00482
00483 envlpPosStress.Zero(); envlpPosStrain.Zero(); envlpNegStress.Zero(); envlpNegStrain.Zero();
00484 energyCapacity = 0.0; kunload = 0.0; elasticStrainEnergy = 0.0;
00485
00486
00487 SetEnvelope();
00488
00489 envlpPosDamgdStress = envlpPosStress; envlpNegDamgdStress = envlpNegStress;
00490 state3Stress.Zero(); state3Strain.Zero(); state4Stress.Zero(); state4Strain.Zero();
00491
00492 revertToStart();
00493 revertToLastCommit();
00494
00495
00496 }
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540 UniaxialMaterial* BarSlipMaterial::getCopy(void)
00541 {
00542 BarSlipMaterial *theCopy = new BarSlipMaterial (this->getTag(), fc, fy, Es,
00543 fu, Eh, db, ld, nbars, width, depth, bsflag, type, damage, unit);
00544
00545 theCopy->rDispN = rDispN;
00546 theCopy->rDispP = rDispP;
00547 theCopy->rForceN = rForceN;
00548 theCopy->rForceP = rForceP;
00549 theCopy->uForceN = uForceN;
00550 theCopy->uForceP = uForceP;
00551
00552
00553 theCopy->Tstress = Tstress;
00554 theCopy->Tstrain = Tstrain;
00555 theCopy->Ttangent = Ttangent;
00556
00557
00558 theCopy->Cstate = Cstate;
00559 theCopy->Cstrain = Cstrain;
00560 theCopy->Cstress = Cstress;
00561 theCopy->CstrainRate = CstrainRate;
00562
00563 theCopy->lowCstateStrain = lowCstateStrain;
00564 theCopy->lowCstateStress = lowCstateStress;
00565 theCopy->hghCstateStrain = hghCstateStrain;
00566 theCopy->hghCstateStress = hghCstateStress;
00567 theCopy->CminStrainDmnd = CminStrainDmnd;
00568 theCopy->CmaxStrainDmnd = CmaxStrainDmnd;
00569 theCopy->Cenergy = Cenergy;
00570 theCopy->CgammaK = CgammaK;
00571 theCopy->CgammaD = CgammaD;
00572 theCopy->CgammaF = CgammaF;
00573 theCopy->gammaKUsed = gammaKUsed;
00574 theCopy->gammaFUsed = gammaFUsed;
00575
00576
00577 theCopy->Tstate = Tstate;
00578 theCopy->dstrain = dstrain;
00579 theCopy->lowTstateStrain = lowTstateStrain;
00580 theCopy->lowTstateStress = lowTstateStress;
00581 theCopy->hghTstateStrain = hghTstateStrain;
00582 theCopy->hghTstateStress = hghTstateStress;
00583 theCopy->TminStrainDmnd = TminStrainDmnd;
00584 theCopy->TmaxStrainDmnd = TmaxStrainDmnd;
00585 theCopy->Tenergy = Tenergy;
00586 theCopy->TgammaK = TgammaK;
00587 theCopy->TgammaD = TgammaD;
00588 theCopy->TgammaF = TgammaF;
00589
00590
00591 theCopy->kElasticPos = kElasticPos;
00592 theCopy->kElasticNeg = kElasticNeg;
00593 theCopy->kElasticPosDamgd = kElasticPosDamgd;
00594 theCopy->kElasticNegDamgd = kElasticNegDamgd;
00595 theCopy->uMaxDamgd = uMaxDamgd;
00596 theCopy->uMinDamgd = uMinDamgd;
00597
00598 for (int i = 0; i<6; i++)
00599 {
00600 theCopy->envlpPosStrain(i) = envlpPosStrain(i);
00601 theCopy->envlpPosStress(i) = envlpPosStress(i);
00602 theCopy->envlpNegStrain(i) = envlpNegStrain(i);
00603 theCopy->envlpNegStress(i) = envlpNegStress(i);
00604 theCopy->envlpNegDamgdStress(i) = envlpNegDamgdStress(i);
00605 theCopy->envlpPosDamgdStress(i) = envlpPosDamgdStress(i);
00606 }
00607
00608 for (int j = 0; j<4; j++)
00609 {
00610 theCopy->state3Strain(j) = state3Strain(j);
00611 theCopy->state3Stress(j) = state3Stress(j);
00612 theCopy->state4Strain(j) = state4Strain(j);
00613 theCopy->state4Stress(j) = state4Stress(j);
00614 }
00615
00616 theCopy->energyCapacity = energyCapacity;
00617 theCopy->kunload = kunload;
00618 theCopy->elasticStrainEnergy = elasticStrainEnergy;
00619
00620 return theCopy;
00621 }
00622
00623 int BarSlipMaterial::sendSelf(int commitTag, Channel &theChannel)
00624 {
00625 return -1;
00626 }
00627
00628 int BarSlipMaterial::recvSelf(int commitTag, Channel &theChannel,
00629 FEM_ObjectBroker & theBroker)
00630 {
00631 return -1;
00632 }
00633
00634 void BarSlipMaterial::Print(OPS_Stream &s, int flag)
00635 {
00636 s << "BarSlipMaterial, tag: " << this-> getTag() << endln;
00637 s << "Positive Envelope : " << eP << endln;
00638 s << "Negative Envelope : " << eN << endln;
00639 }
00640
00641
00642 void BarSlipMaterial::SetEnvelope(void)
00643 {
00644 double kPos = eP(0,1)/eP(0,0);
00645 double kNeg = eN(0,1)/eN(0,0);
00646
00647 double k = (kPos>kNeg) ? kPos:kNeg;
00648 double u = (eP(0,0)>-eN(0,0)) ? 1e-4*eP(0,0):-1e-4*eN(0,0);
00649
00650 envlpPosStrain(0) = u; envlpPosStress(0) = u*k;
00651 envlpNegStrain(0) = -u; envlpNegStress(0) = -u*k;
00652
00653 for (int i1 = 1; i1 < 5; i1++) {
00654 envlpPosStrain(i1) = eP(i1-1,0);
00655 envlpPosStress(i1) = eP(i1-1,1);
00656 envlpNegStrain(i1) = eN(i1-1,0);
00657 envlpNegStress(i1) = eN(i1-1,1);
00658 }
00659
00660 double k1 = (eP(3,1) - eP(2,1))/(eP(3,0) - eP(2,0));
00661 double k2 = (eN(3,1) - eN(2,1))/(eN(3,0) - eN(2,0));
00662
00663 envlpPosStrain(5) = 1e+6*eP(3,0); envlpNegStrain(5) = 1e+6*eN(3,0);
00664 envlpPosStress(5) = (k1>0) ? eP(3,1) + k1*(envlpPosStrain(5)-envlpPosStrain(4)):envlpPosStress(4)*1.1;
00665 envlpNegStress(5) = (k2>0) ? eN(3,1) + k2*(envlpNegStrain(5)-envlpNegStrain(4)):envlpNegStress(4)*1.1;
00666
00667 kElasticPos = envlpPosStress(1)/envlpPosStrain(1);
00668 kElasticNeg = envlpNegStress(1)/envlpNegStrain(1);
00669
00670 double energyPos = 0.5*envlpPosStrain(0)*envlpPosStress(0);
00671 double energyNeg = 0.5*envlpNegStrain(0)*envlpNegStress(0);
00672
00673 for (int i2 = 0; i2<4; i2++) {
00674 energyPos += 0.5*(envlpPosStress(i2)+envlpPosStress(i2+1))*(envlpPosStrain(i2+1) - envlpPosStrain(i2));
00675 }
00676
00677 for (int i3 = 0; i3<4; i3++) {
00678 energyNeg += 0.5*(envlpNegStress(i3)+envlpNegStress(i3+1))*(envlpNegStrain(i3+1) - envlpNegStrain(i3));
00679 }
00680
00681 double max_energy = (energyPos>energyNeg) ? energyPos:energyNeg;
00682 energyCapacity = gammaE*max_energy;
00683 }
00684
00685 int BarSlipMaterial::setTrialStrain(double strain, double CstrainRate)
00686 {
00687 Tstate = Cstate;
00688 Tenergy = Cenergy;
00689 Tstrain = strain;
00690 lowTstateStrain = lowCstateStrain;
00691 hghTstateStrain = hghCstateStrain;
00692 lowTstateStress = lowCstateStress;
00693 hghTstateStress = hghCstateStress;
00694 TminStrainDmnd = CminStrainDmnd;
00695 TmaxStrainDmnd = CmaxStrainDmnd;
00696 TgammaF = CgammaF;
00697 TgammaK = CgammaK;
00698 TgammaD = CgammaD;
00699
00700 dstrain = Tstrain - Cstrain;
00701 if (dstrain<1e-12 && dstrain>-1e-12){
00702 dstrain = 0.0;
00703 }
00704
00705
00706
00707 getstate(Tstrain,dstrain);
00708
00709 switch (Tstate)
00710 {
00711
00712 case 0:
00713 Ttangent = envlpPosStress(0)/envlpPosStrain(0);
00714 Tstress = Ttangent*Tstrain;
00715 break;
00716 case 1:
00717 Tstress = posEnvlpStress(strain);
00718 Ttangent = posEnvlpTangent(strain);
00719 break;
00720 case 2:
00721 Ttangent = negEnvlpTangent(strain);
00722 Tstress = negEnvlpStress(strain);
00723 break;
00724 case 3:
00725 kunload = (hghTstateStrain<0.0) ? kElasticNegDamgd:kElasticPosDamgd;
00726 state3Strain(0) = lowTstateStrain;
00727 state3Strain(3) = hghTstateStrain;
00728 state3Stress(0) = lowTstateStress;
00729 state3Stress(3) = hghTstateStress;
00730
00731 getState3(state3Strain,state3Stress,kunload);
00732 Ttangent = Envlp3Tangent(state3Strain,state3Stress,strain);
00733 Tstress = Envlp3Stress(state3Strain,state3Stress,strain);
00734
00735
00736 break;
00737 case 4:
00738 kunload = (lowTstateStrain<0.0) ? kElasticNegDamgd:kElasticPosDamgd;
00739 state4Strain(0) = lowTstateStrain;
00740 state4Strain(3) = hghTstateStrain;
00741 state4Stress(0) = lowTstateStress;
00742 state4Stress(3) = hghTstateStress;
00743
00744 getState4(state4Strain,state4Stress,kunload);
00745 Ttangent = Envlp4Tangent(state4Strain,state4Stress,strain);
00746 Tstress = Envlp4Stress(state4Strain,state4Stress,strain);
00747 break;
00748 }
00749
00750 double denergy = 0.5*(Tstress+Cstress)*dstrain;
00751 elasticStrainEnergy = (Tstrain>0.0) ? 0.5*Tstress/kElasticPosDamgd*Tstress:0.5*Tstress/kElasticNegDamgd*Tstress;
00752
00753 Tenergy = Cenergy + denergy;
00754
00755 updateDmg(Tstrain);
00756 return 0;
00757 }
00758
00759 double BarSlipMaterial::getStrain(void)
00760 {
00761 return Tstrain;
00762 }
00763
00764 double BarSlipMaterial::getStress(void)
00765 {
00766 return Tstress;
00767 }
00768
00769 double BarSlipMaterial::getTangent(void)
00770 {
00771 return Ttangent;
00772 }
00773
00774 double BarSlipMaterial::getInitialTangent(void)
00775 {
00776 return envlpPosStress(0)/envlpPosStrain(0);
00777 }
00778
00779 int BarSlipMaterial::commitState(void)
00780 {
00781 Cstate = Tstate;
00782
00783 if (dstrain>1e-12||dstrain<-(1e-12)) {
00784 CstrainRate = dstrain;}
00785 else {
00786 CstrainRate = TstrainRate;}
00787
00788 lowCstateStrain = lowTstateStrain;
00789 lowCstateStress = lowTstateStress;
00790 hghCstateStrain = hghTstateStrain;
00791 hghCstateStress = hghTstateStress;
00792 CminStrainDmnd = TminStrainDmnd;
00793 CmaxStrainDmnd = TmaxStrainDmnd;
00794 Cenergy = Tenergy;
00795
00796 Cstress = Tstress;
00797 Cstrain = Tstrain;
00798
00799 CgammaK = TgammaK;
00800 CgammaD = TgammaD;
00801 CgammaF = TgammaF;
00802
00803
00804 kElasticPosDamgd = kElasticPos*(1 - gammaKUsed);
00805 kElasticNegDamgd = kElasticNeg*(1 - gammaKUsed);
00806
00807 uMaxDamgd = TmaxStrainDmnd*(1 + CgammaD);
00808 uMinDamgd = TminStrainDmnd*(1 + CgammaD);
00809
00810 envlpPosDamgdStress = envlpPosStress*(1-gammaFUsed);
00811 envlpNegDamgdStress = envlpNegStress*(1-gammaFUsed);
00812
00813
00814
00815
00816 return 0;
00817 }
00818
00819 int BarSlipMaterial::revertToLastCommit(void)
00820 {
00821 Tstate = Cstate;
00822
00823 TstrainRate = CstrainRate;
00824
00825 lowTstateStrain = lowCstateStrain;
00826 lowTstateStress = lowCstateStress;
00827 hghTstateStrain = hghCstateStrain;
00828 hghTstateStress = hghCstateStress;
00829 TminStrainDmnd = CminStrainDmnd;
00830 TmaxStrainDmnd = CmaxStrainDmnd;
00831 Tenergy = Cenergy;
00832
00833 Tstrain = Cstrain; Tstress = Cstress;
00834
00835 TgammaD = CgammaD;
00836 TgammaK = CgammaK;
00837 TgammaF = CgammaF;
00838
00839 return 0;
00840 }
00841
00842 int BarSlipMaterial::revertToStart(void)
00843 {
00844 Cstate = 0;
00845 Cstrain = 0.0;
00846 Cstress = 0.0;
00847 CstrainRate = 0.0;
00848 lowCstateStrain = envlpNegStrain(0);
00849 lowCstateStress = envlpNegStress(0);
00850 hghCstateStrain = envlpPosStrain(0);
00851 hghCstateStress = envlpPosStress(0);
00852 CminStrainDmnd = envlpNegStrain(1);
00853 CmaxStrainDmnd = envlpPosStrain(1);
00854 Cenergy = 0.0;
00855 CgammaK = 0.0;
00856 CgammaD = 0.0;
00857 CgammaF = 0.0;
00858
00859 Ttangent = envlpPosStress(0)/envlpPosStrain(0);
00860 dstrain = 0.0;
00861 gammaKUsed = 0.0;
00862 gammaFUsed = 0.0;
00863
00864 kElasticPosDamgd = kElasticPos;
00865 kElasticNegDamgd = kElasticNeg;
00866 uMaxDamgd = CmaxStrainDmnd;
00867 uMinDamgd = CminStrainDmnd;
00868
00869 return 0;
00870 }
00871
00872 void BarSlipMaterial::getstate(double u,double du)
00873 {
00874 int cid = 0;
00875 int cis = 0;
00876 int newState = 0;
00877 if (du*CstrainRate<=0.0){
00878 cid = 1;
00879 }
00880 if (u<lowTstateStrain || u>hghTstateStrain || cid) {
00881 if (Tstate == 0) {
00882 if (u>hghTstateStrain) {
00883 cis = 1;
00884 newState = 1;
00885 lowTstateStrain = envlpPosStrain(0);
00886 lowTstateStress = envlpPosStress(0);
00887 hghTstateStrain = envlpPosStrain(5);
00888 hghTstateStress = envlpPosStress(5);
00889 }
00890 else if (u<lowTstateStrain){
00891 cis = 1;
00892 newState = 2;
00893 lowTstateStrain = envlpNegStrain(5);
00894 lowTstateStress = envlpNegStress(5);
00895 hghTstateStrain = envlpNegStrain(0);
00896 hghTstateStress = envlpNegStress(0);
00897 }
00898 }
00899 else if (Tstate==1 && du<0.0) {
00900 cis = 1;
00901 if (Cstrain>TmaxStrainDmnd) {
00902 TmaxStrainDmnd = u - du;
00903 }
00904 if (TmaxStrainDmnd<uMaxDamgd) {
00905 TmaxStrainDmnd = uMaxDamgd;
00906 }
00907 if (u<uMinDamgd) {
00908 newState = 2;
00909 gammaFUsed = CgammaF;
00910 for (int i=0; i<=5; i++) {
00911 envlpNegDamgdStress(i) = envlpNegStress(i)*(1.0-gammaFUsed);
00912 }
00913 lowTstateStrain = envlpNegStrain(5);
00914 lowTstateStress = envlpNegStress(5);
00915 hghTstateStrain = envlpNegStrain(0);
00916 hghTstateStress = envlpNegStress(0);
00917 }
00918 else {
00919 newState = 3;
00920 lowTstateStrain = uMinDamgd;
00921 gammaFUsed = CgammaF;
00922 for (int i=0; i<=5; i++) {
00923 envlpNegDamgdStress(i) = envlpNegStress(i)*(1.0-gammaFUsed);
00924 }
00925 lowTstateStress = negEnvlpStress(uMinDamgd);
00926 hghTstateStrain = Cstrain;
00927 hghTstateStress = Cstress;
00928 }
00929 gammaKUsed = CgammaK;
00930 kElasticPosDamgd = kElasticPos*(1.0-gammaKUsed);
00931 }
00932 else if (Tstate ==2 && du>0.0){
00933 cis = 1;
00934 if (Cstrain<TminStrainDmnd) {
00935 TminStrainDmnd = Cstrain;
00936 }
00937 if (TminStrainDmnd>uMinDamgd) {
00938 TminStrainDmnd = uMinDamgd;
00939 }
00940 if (u>uMaxDamgd) {
00941 newState = 1;
00942 gammaFUsed = CgammaF;
00943 for (int i=0; i<=5; i++) {
00944 envlpPosDamgdStress(i) = envlpPosStress(i)*(1.0-gammaFUsed);
00945 }
00946 lowTstateStrain = envlpPosStrain(0);
00947 lowTstateStress = envlpPosStress(0);
00948 hghTstateStrain = envlpPosStrain(5);
00949 hghTstateStress = envlpPosStress(5);
00950 }
00951 else {
00952 newState = 4;
00953 lowTstateStrain = Cstrain;
00954 lowTstateStress = Cstress;
00955 hghTstateStrain = uMaxDamgd;
00956 gammaFUsed = CgammaF;
00957 for (int i=0; i<=5; i++) {
00958 envlpPosDamgdStress(i) = envlpPosStress(i)*(1.0-gammaFUsed);
00959 }
00960 hghTstateStress = posEnvlpStress(uMaxDamgd);
00961 }
00962 gammaKUsed = CgammaK;
00963 kElasticNegDamgd = kElasticNeg*(1.0-gammaKUsed);
00964 }
00965 else if (Tstate ==3) {
00966 if (u<lowTstateStrain){
00967 cis = 1;
00968 newState = 2;
00969 lowTstateStrain = envlpNegStrain(5);
00970 hghTstateStrain = envlpNegStrain(0);
00971 lowTstateStress = envlpNegDamgdStress(5);
00972 hghTstateStress = envlpNegDamgdStress(0);
00973 }
00974 else if (u>uMaxDamgd && du>0.0) {
00975 cis = 1;
00976 newState = 1;
00977 lowTstateStrain = envlpPosStrain(0);
00978 lowTstateStress = envlpPosStress(0);
00979 hghTstateStrain = envlpPosStrain(5);
00980 hghTstateStress = envlpPosStress(5);
00981 }
00982 else if (du>0.0) {
00983 cis = 1;
00984 newState = 4;
00985 lowTstateStrain = Cstrain;
00986 lowTstateStress = Cstress;
00987 hghTstateStrain = uMaxDamgd;
00988 gammaFUsed = CgammaF;
00989 for (int i=0; i<=5; i++) {
00990 envlpPosDamgdStress(i) = envlpPosStress(i)*(1.0-gammaFUsed);
00991 }
00992 hghTstateStress = posEnvlpStress(uMaxDamgd);
00993 gammaKUsed = CgammaK;
00994 kElasticNegDamgd = kElasticNeg*(1.0-gammaKUsed);
00995 }
00996 }
00997 else if (Tstate == 4){
00998 if (u>hghTstateStrain){
00999 cis = 1;
01000 newState = 1;
01001 lowTstateStrain = envlpPosStrain(0);
01002 lowTstateStress = envlpPosDamgdStress(0);
01003 hghTstateStrain = envlpPosStrain(5);
01004 hghTstateStress = envlpPosDamgdStress(5);
01005 }
01006 else if (u<uMinDamgd && du <0.0) {
01007 cis = 1;
01008 newState = 2;
01009 lowTstateStrain = envlpNegStrain(5);
01010 lowTstateStress = envlpNegDamgdStress(5);
01011 hghTstateStrain = envlpNegStrain(0);
01012 hghTstateStress = envlpNegDamgdStress(0);
01013 }
01014 else if (du<0.0) {
01015 cis = 1;
01016 newState = 3;
01017 lowTstateStrain = uMinDamgd;
01018 gammaFUsed = CgammaF;
01019 for (int i=0; i<=5; i++) {
01020 envlpNegDamgdStress(i) = envlpNegStress(i)*(1.0-gammaFUsed);
01021 }
01022 lowTstateStress = negEnvlpStress(uMinDamgd);
01023 hghTstateStrain = Cstrain;
01024 hghTstateStress = Cstress;
01025 gammaKUsed = CgammaK;
01026 kElasticPosDamgd = kElasticPos*(1.0-gammaKUsed);
01027 }
01028 }
01029 }
01030 if (cis) {
01031 Tstate = newState;
01032
01033 }
01034 }
01035
01036 double BarSlipMaterial::posEnvlpStress(double u)
01037 {
01038 double k = 0.0;
01039 int i = 0;
01040 double f = 0.0;
01041 while (k==0.0 && i<=4){
01042
01043 if (u<=envlpPosStrain(i+1)){
01044 k = (envlpPosDamgdStress(i+1)-envlpPosDamgdStress(i))/(envlpPosStrain(i+1)-envlpPosStrain(i));
01045 f = envlpPosDamgdStress(i) + (u-envlpPosStrain(i))*k;
01046 }
01047 i++;
01048 }
01049
01050
01051 if (k==0.0){
01052 k = (envlpPosDamgdStress(5) - envlpPosDamgdStress(4))/(envlpPosStrain(5) - envlpPosStrain(4));
01053 f = envlpPosDamgdStress(5) + k*(u-envlpPosStrain(5));
01054 }
01055
01056 return f;
01057
01058 }
01059
01060 double BarSlipMaterial::posEnvlpTangent(double u)
01061 {
01062 double k = 0.0;
01063 int i = 0;
01064 while (k==0.0 && i<=4){
01065
01066 if (u<=envlpPosStrain(i+1)){
01067 k = (envlpPosDamgdStress(i+1)-envlpPosDamgdStress(i))/(envlpPosStrain(i+1)-envlpPosStrain(i));
01068 }
01069 i++;
01070 }
01071
01072 if (k==0.0){
01073 k = (envlpPosDamgdStress(5) - envlpPosDamgdStress(4))/(envlpPosStrain(5) - envlpPosStrain(4));
01074 }
01075
01076 return k;
01077
01078 }
01079
01080 double BarSlipMaterial::negEnvlpStress(double u)
01081 {
01082 double k = 0.0;
01083 int i = 0;
01084 double f = 0.0;
01085 while (k==0.0 && i<=4){
01086 if (u>=envlpNegStrain(i+1)){
01087 k = (envlpNegDamgdStress(i)-envlpNegDamgdStress(i+1))/(envlpNegStrain(i)-envlpNegStrain(i+1));
01088 f = envlpNegDamgdStress(i+1)+(u-envlpNegStrain(i+1))*k;
01089 }
01090 i++;
01091 }
01092
01093 if (k==0.0){
01094 k = (envlpNegDamgdStress(4) - envlpNegDamgdStress(5))/(envlpNegStrain(4)-envlpNegStrain(5));
01095 f = envlpNegDamgdStress(5) + k*(u-envlpNegStrain(5));
01096 }
01097 return f;
01098 }
01099
01100 double BarSlipMaterial::negEnvlpTangent(double u)
01101 {
01102 double k = 0.0;
01103 int i = 0;
01104 while (k==0.0 && i<=4){
01105
01106 if (u>=envlpNegStrain(i+1)){
01107 k = (envlpNegDamgdStress(i)-envlpNegDamgdStress(i+1))/(envlpNegStrain(i)-envlpNegStrain(i+1));
01108 }
01109 i++;
01110 }
01111
01112 if (k==0.0){
01113 k = (envlpNegDamgdStress(4) - envlpNegDamgdStress(5))/(envlpNegStrain(4)-envlpNegStrain(5));
01114 }
01115 return k;
01116
01117 }
01118
01119 void BarSlipMaterial::getState3(Vector& state3Strain, Vector& state3Stress, double kunload)
01120 {
01121
01122 double kmax = (kunload>kElasticNegDamgd) ? kunload:kElasticNegDamgd;
01123
01124 if (state3Strain(0)*state3Strain(3) <0.0){
01125
01126 state3Strain(1) = lowTstateStrain*rDispN;
01127 if (rForceN-uForceN > 1e-8) {
01128 state3Stress(1) = lowTstateStress*rForceN;
01129 }
01130 else {
01131 if (TminStrainDmnd < envlpNegStrain(3)) {
01132 double st1 = lowTstateStress*uForceN*(1.0+1e-6);
01133 double st2 = envlpNegDamgdStress(4)*(1.0+1e-6);
01134 state3Stress(1) = (st1<st2) ? st1:st2;
01135 }
01136 else {
01137 double st1 = envlpNegDamgdStress(3)*uForceN*(1.0+1e-6);
01138 double st2 = envlpNegDamgdStress(4)*(1.0+1e-6);
01139 state3Stress(1) = (st1<st2) ? st1:st2;
01140 }
01141 }
01142
01143 if ((state3Stress(1)-state3Stress(0))/(state3Strain(1)-state3Strain(0)) > kElasticNegDamgd) {
01144 state3Strain(1) = lowTstateStrain + (state3Stress(1)-state3Stress(0))/kElasticNegDamgd;
01145 }
01146
01147 if (state3Strain(1)>state3Strain(3)) {
01148
01149 double du = state3Strain(3) - state3Strain(0);
01150 double df = state3Stress(3) - state3Stress(0);
01151 state3Strain(1) = state3Strain(0) + 0.33*du;
01152 state3Strain(2) = state3Strain(0) + 0.67*du;
01153 state3Stress(1) = state3Stress(0) + 0.33*df;
01154 state3Stress(2) = state3Stress(0) + 0.67*df;
01155 }
01156 else {
01157 if (TminStrainDmnd < envlpNegStrain(3)) {
01158 state3Stress(2) = uForceN*envlpNegDamgdStress(4);
01159 }
01160 else {
01161 state3Stress(2) = uForceN*envlpNegDamgdStress(3);
01162 }
01163 state3Strain(2) = hghTstateStrain - (hghTstateStress-state3Stress(2))/kunload;
01164
01165 if (state3Strain(2) > state3Strain(3)) {
01166
01167 double du = state3Strain(3) - state3Strain(1);
01168 double df = state3Stress(3) - state3Stress(1);
01169 state3Strain(2) = state3Strain(1) + 0.5*du;
01170 state3Stress(2) = state3Stress(1) + 0.5*df;
01171 }
01172 else if ((state3Stress(2) - state3Stress(1))/(state3Strain(2) - state3Strain(1)) > kmax) {
01173
01174 double du = state3Strain(3) - state3Strain(0);
01175 double df = state3Stress(3) - state3Stress(0);
01176 state3Strain(1) = state3Strain(0) + 0.33*du;
01177 state3Strain(2) = state3Strain(0) + 0.67*du;
01178 state3Stress(1) = state3Stress(0) + 0.33*df;
01179 state3Stress(2) = state3Stress(0) + 0.67*df;
01180 }
01181 else if ((state3Strain(2) < state3Strain(1))||((state3Stress(2)-state3Stress(1))/(state3Strain(2)-state3Strain(1))<0)) {
01182 if (state3Strain(2)<0.0) {
01183
01184 double du = state3Strain(3)-state3Strain(1);
01185 double df = state3Stress(3)-state3Stress(1);
01186 state3Strain(2) = state3Strain(1) + 0.5*du;
01187 state3Stress(2) = state3Stress(1) + 0.5*df;
01188 }
01189 else if (state3Strain(1) > 0.0) {
01190
01191 double du = state3Strain(2)-state3Strain(0);
01192 double df = state3Stress(2)-state3Stress(0);
01193 state3Strain(1) = state3Strain(0) + 0.5*du;
01194 state3Stress(1) = state3Stress(0) + 0.5*df;
01195 }
01196 else {
01197 double avgforce = 0.5*(state3Stress(2) + state3Stress(1));
01198 double dfr = 0.0;
01199 if (avgforce < 0.0){
01200 dfr = -avgforce/100;
01201 }
01202 else {
01203 dfr = avgforce/100;
01204 }
01205 double slope12 = (state3Stress(1) - state3Stress(0))/(state3Strain(1) - state3Strain(0));
01206 double slope34 = (state3Stress(3) - state3Stress(2))/(state3Strain(3) - state3Strain(2));
01207 state3Stress(1) = avgforce - dfr;
01208 state3Stress(2) = avgforce + dfr;
01209 state3Strain(1) = state3Strain(0) + (state3Stress(1) - state3Stress(0))/slope12;
01210 state3Strain(2) = state3Strain(3) - (state3Stress(3) - state3Stress(2))/slope34;
01211 }
01212 }
01213 }
01214 }
01215 else {
01216
01217 double du = state3Strain(3)-state3Strain(0);
01218 double df = state3Stress(3)-state3Stress(0);
01219 state3Strain(1) = state3Strain(0) + 0.33*du;
01220 state3Strain(2) = state3Strain(0) + 0.67*du;
01221 state3Stress(1) = state3Stress(0) + 0.33*df;
01222 state3Stress(2) = state3Stress(0) + 0.67*df;
01223 }
01224
01225
01226 double checkSlope = state3Stress(0)/state3Strain(0);
01227 double slope = 0.0;
01228
01229
01230 int i = 0;
01231 while (i<3) {
01232 double du = state3Strain(i+1)-state3Strain(i);
01233 double df = state3Stress(i+1)-state3Stress(i);
01234 if (du<0.0 || df<0.0) {
01235 double du = state3Strain(3)-state3Strain(0);
01236 double df = state3Stress(3)-state3Stress(0);
01237 state3Strain(1) = state3Strain(0) + 0.33*du;
01238 state3Strain(2) = state3Strain(0) + 0.67*du;
01239 state3Stress(1) = state3Stress(0) + 0.33*df;
01240 state3Stress(2) = state3Stress(0) + 0.67*df;
01241 slope = df/du;
01242 i = 3;
01243 }
01244 if (slope > 1e-8 && slope < checkSlope) {
01245 state3Strain(1) = 0.0; state3Stress(1) = 0.0;
01246 state3Strain(2) = state3Strain(3)/2; state3Stress(2) = state3Stress(3)/2;
01247 }
01248 i++;
01249 }
01250
01251 if (state3Stress(2) <= state3Stress(1)) {
01252 state3Stress(1) = state3Stress(2)*1.02;
01253 }
01254 }
01255
01256 void BarSlipMaterial::getState4(Vector& state4Strain,Vector& state4Stress, double kunload)
01257 {
01258
01259 double kmax = (kunload>kElasticPosDamgd) ? kunload:kElasticPosDamgd;
01260
01261 if (state4Strain(0)*state4Strain(3) <0.0){
01262
01263 state4Strain(2) = hghTstateStrain*rDispP;
01264 if (uForceP==0.0){
01265 state4Stress(2) = hghTstateStress*rForceP;
01266 }
01267 else if (rForceP-uForceP > 1e-8) {
01268 state4Stress(2) = hghTstateStress*rForceP;
01269 }
01270 else {
01271 if (TmaxStrainDmnd > envlpPosStrain(3)) {
01272 double st1 = hghTstateStress*uForceP*(1.0+1e-6);
01273 double st2 = envlpPosDamgdStress(4)*(1.0+1e-6);
01274 state4Stress(2) = (st1>st2) ? st1:st2;
01275 }
01276 else {
01277 double st1 = envlpPosDamgdStress(3)*uForceP*(1.0+1e-6);
01278 double st2 = envlpPosDamgdStress(4)*(1.0+1e-6);
01279 state4Stress(2) = (st1>st2) ? st1:st2;
01280 }
01281 }
01282
01283 if ((state4Stress(3)-state4Stress(2))/(state4Strain(3)-state4Strain(2)) > kElasticPosDamgd) {
01284 state4Strain(2) = hghTstateStrain - (state4Stress(3)-state4Stress(2))/kElasticPosDamgd;
01285 }
01286
01287 if (state4Strain(2)<state4Strain(0)) {
01288
01289 double du = state4Strain(3) - state4Strain(0);
01290 double df = state4Stress(3) - state4Stress(0);
01291 state4Strain(1) = state4Strain(0) + 0.33*du;
01292 state4Strain(2) = state4Strain(0) + 0.67*du;
01293 state4Stress(1) = state4Stress(0) + 0.33*df;
01294 state4Stress(2) = state4Stress(0) + 0.67*df;
01295 }
01296 else {
01297 if (TmaxStrainDmnd > envlpPosStrain(3)) {
01298 state4Stress(1) = uForceP*envlpPosDamgdStress(4);
01299 }
01300 else {
01301 state4Stress(1) = uForceP*envlpPosDamgdStress(3);
01302 }
01303 state4Strain(1) = lowTstateStrain + (-lowTstateStress+state4Stress(1))/kunload;
01304
01305 if (state4Strain(1) < state4Strain(0)) {
01306
01307 double du = state4Strain(2) - state4Strain(0);
01308 double df = state4Stress(2) - state4Stress(0);
01309 state4Strain(1) = state4Strain(0) + 0.5*du;
01310 state4Stress(1) = state4Stress(0) + 0.5*df;
01311 }
01312 else if ((state4Stress(2) - state4Stress(1))/(state4Strain(2) - state4Strain(1)) > kmax) {
01313
01314 double du = state4Strain(3) - state4Strain(0);
01315 double df = state4Stress(3) - state4Stress(0);
01316 state4Strain(1) = state4Strain(0) + 0.33*du;
01317 state4Strain(2) = state4Strain(0) + 0.67*du;
01318 state4Stress(1) = state4Stress(0) + 0.33*df;
01319 state4Stress(2) = state4Stress(0) + 0.67*df;
01320 }
01321 else if ((state4Strain(2) < state4Strain(1))||((state4Stress(2)-state4Stress(1))/(state4Strain(2)-state4Strain(1))<0)) {
01322 if (state4Strain(1)>0.0) {
01323
01324 double du = state4Strain(2)-state4Strain(0);
01325 double df = state4Stress(2)-state4Stress(0);
01326 state4Strain(1) = state4Strain(0) + 0.5*du;
01327 state4Stress(1) = state4Stress(0) + 0.5*df;
01328 }
01329 else if (state4Strain(2) < 0.0) {
01330
01331 double du = state4Strain(3)-state4Strain(1);
01332 double df = state4Stress(3)-state4Stress(1);
01333 state4Strain(2) = state4Strain(1) + 0.5*du;
01334 state4Stress(2) = state4Stress(1) + 0.5*df;
01335 }
01336 else {
01337 double avgforce = 0.5*(state4Stress(2) + state4Stress(1));
01338 double dfr = 0.0;
01339 if (avgforce < 0.0){
01340 dfr = -avgforce/100;
01341 }
01342 else {
01343 dfr = avgforce/100;
01344 }
01345 double slope12 = (state4Stress(1) - state4Stress(0))/(state4Strain(1) - state4Strain(0));
01346 double slope34 = (state4Stress(3) - state4Stress(2))/(state4Strain(3) - state4Strain(2));
01347 state4Stress(1) = avgforce - dfr;
01348 state4Stress(2) = avgforce + dfr;
01349 state4Strain(1) = state4Strain(0) + (state4Stress(1) - state4Stress(0))/slope12;
01350 state4Strain(2) = state4Strain(3) - (state4Stress(3) - state4Stress(2))/slope34;
01351 }
01352 }
01353 }
01354 }
01355 else {
01356
01357 double du = state4Strain(3)-state4Strain(0);
01358 double df = state4Stress(3)-state4Stress(0);
01359 state4Strain(1) = state4Strain(0) + 0.33*du;
01360 state4Strain(2) = state4Strain(0) + 0.67*du;
01361 state4Stress(1) = state4Stress(0) + 0.33*df;
01362 state4Stress(2) = state4Stress(0) + 0.67*df;
01363 }
01364
01365
01366
01367 double checkSlope = state4Stress(0)/state4Strain(0);
01368 double slope = 0.0;
01369
01370
01371 int i = 0;
01372 while (i<3) {
01373 double du = state4Strain(i+1)-state4Strain(i);
01374 double df = state4Stress(i+1)-state4Stress(i);
01375 if (du<0.0 || df<0.0) {
01376 double du = state4Strain(3)-state4Strain(0);
01377 double df = state4Stress(3)-state4Stress(0);
01378 state4Strain(1) = state4Strain(0) + 0.33*du;
01379 state4Strain(2) = state4Strain(0) + 0.67*du;
01380 state4Stress(1) = state4Stress(0) + 0.33*df;
01381 state4Stress(2) = state4Stress(0) + 0.67*df;
01382 slope = df/du;
01383 i = 3;
01384 }
01385 if (slope > 1e-8 && slope < checkSlope) {
01386 state4Strain(1) = 0.0; state4Stress(1) = 0.0;
01387 state4Strain(2) = state4Strain(3)/2; state4Stress(2) = state4Stress(3)/2;
01388 }
01389
01390 i++;
01391 }
01392
01393 if (state4Stress(2) <= state4Stress(1)) {
01394 state4Stress(2) = state4Stress(1)*1.02;
01395 }
01396 }
01397
01398 double BarSlipMaterial::Envlp3Tangent(Vector s3Strain, Vector s3Stress, double u)
01399 {
01400 double k = 0.0;
01401 int i = 0;
01402 while ((k==0.0||i<=2) && (i<=2))
01403 {
01404 if (u>= s3Strain(i)) {
01405 k = (s3Stress(i+1)-s3Stress(i))/(s3Strain(i+1)-s3Strain(i));
01406 }
01407 i++;
01408 }
01409 if (k==0.0) {
01410 if (u<s3Strain(0)) {
01411 i = 0;
01412 }
01413 else {
01414 i = 2;
01415 }
01416 k = (s3Stress(i+1)-s3Stress(i))/(s3Strain(i+1)-s3Strain(i));
01417
01418 }
01419 return k;
01420 }
01421
01422 double BarSlipMaterial::Envlp4Tangent(Vector s4Strain, Vector s4Stress, double u)
01423 {
01424 double k = 0.0;
01425 int i = 0;
01426 while ((k==0.0||i<=2) && (i<=2))
01427 {
01428 if (u>= s4Strain(i)) {
01429 k = (s4Stress(i+1)-s4Stress(i))/(s4Strain(i+1)-s4Strain(i));
01430 }
01431 i++;
01432 }
01433 if (k==0.0) {
01434 if (u<s4Strain(0)) {
01435 i = 0;
01436 }
01437 else {
01438 i = 2;
01439 }
01440 k = (s4Stress(i+1)-s4Stress(i))/(s4Strain(i+1)-s4Strain(i));
01441
01442 }
01443 return k;
01444 }
01445
01446 double BarSlipMaterial::Envlp3Stress(Vector s3Strain, Vector s3Stress, double u)
01447 {
01448 double k = 0.0;
01449 int i = 0;
01450 double f = 0.0;
01451 while ((k==0.0||i<=2) && (i<=2))
01452 {
01453 if (u>= s3Strain(i)) {
01454 k = (s3Stress(i+1)-s3Stress(i))/(s3Strain(i+1)-s3Strain(i));
01455 f = s3Stress(i)+(u-s3Strain(i))*k;
01456 }
01457 i++;
01458 }
01459 if (k==0.0) {
01460 if (u<s3Strain(0)) {
01461 i = 0;
01462 }
01463 else {
01464 i = 2;
01465 }
01466 k = (s3Stress(i+1)-s3Stress(i))/(s3Strain(i+1)-s3Strain(i));
01467 f = s3Stress(i)+(u-s3Strain(i))*k;
01468 }
01469 return f;
01470 }
01471
01472 double BarSlipMaterial::Envlp4Stress(Vector s4Strain, Vector s4Stress, double u)
01473 {
01474 double k = 0.0;
01475 int i = 0;
01476 double f = 0.0;
01477 while ((k==0.0||i<=2) && (i<=2))
01478 {
01479 if (u>= s4Strain(i)) {
01480 k = (s4Stress(i+1)-s4Stress(i))/(s4Strain(i+1)-s4Strain(i));
01481 f = s4Stress(i)+(u-s4Strain(i))*k;
01482 }
01483 i++;
01484 }
01485 if (k==0.0) {
01486 if (u<s4Strain(0)) {
01487 i = 0;
01488 }
01489 else {
01490 i = 2;
01491 }
01492 k = (s4Stress(i+1)-s4Stress(i))/(s4Strain(i+1)-s4Strain(i));
01493 f = s4Stress(i)+(u-s4Strain(i))*k;
01494 }
01495 return f;
01496 }
01497
01498 void BarSlipMaterial::updateDmg(double strain)
01499 {
01500 double umaxAbs = (TmaxStrainDmnd>-TminStrainDmnd) ? TmaxStrainDmnd:-TminStrainDmnd;
01501 double uultAbs = (envlpPosStrain(4)>-envlpNegStrain(4)) ? envlpPosStrain(4):-envlpNegStrain(4);
01502 if ((strain<uultAbs && strain>-uultAbs)&& Tenergy< energyCapacity)
01503 {
01504 TgammaK = gammaK1*pow((umaxAbs/uultAbs),gammaK3);
01505 TgammaD = gammaD1*pow((umaxAbs/uultAbs),gammaD3);
01506 if (damage == 2 || damage == 0) {
01507 TgammaF = gammaF1*pow((umaxAbs/uultAbs),gammaF3);
01508 }
01509
01510 if (damage == 1) {
01511 if (umaxAbs >= envlpPosStrain(3)) {
01512 double a = gammaFLimit/0.7;
01513 double b = -gammaFLimit*3.0/7.0;
01514 double x = (umaxAbs/uultAbs);
01515 TgammaF = a*x + b;
01516 }
01517 }
01518
01519 if (Tenergy>elasticStrainEnergy) {
01520 TgammaK = TgammaK + gammaK2*pow(((Tenergy-elasticStrainEnergy)/energyCapacity),gammaK4);
01521 TgammaD = TgammaD + gammaD2*pow(((Tenergy-elasticStrainEnergy)/energyCapacity),gammaD4);
01522 TgammaF = TgammaF + gammaF2*pow(((Tenergy-elasticStrainEnergy)/energyCapacity),gammaF4);
01523 }
01524 double kminP = (posEnvlpStress(TmaxStrainDmnd)/TmaxStrainDmnd);
01525 double kminN = (negEnvlpStress(TminStrainDmnd)/TminStrainDmnd);
01526 double kmin = (kminP/kElasticPos>kminN/kElasticNeg) ? kminP/kElasticPos:kminN/kElasticNeg;
01527 double gammaKLimEnv = (0.0>(1-kmin)) ? 0.0:(1-kmin);
01528 double k1 = (TgammaK<gammaKLimit) ? TgammaK:gammaKLimit;
01529 TgammaK = (k1<gammaKLimEnv) ? k1:gammaKLimEnv;
01530 TgammaD = (TgammaD<gammaDLimit) ? TgammaD:gammaDLimit;
01531 TgammaF = (TgammaF<gammaFLimit) ? TgammaF:gammaFLimit;
01532 }
01533 else if (strain<uultAbs && strain>-uultAbs) {
01534 double kminP = (posEnvlpStress(TmaxStrainDmnd)/TmaxStrainDmnd);
01535 double kminN = (negEnvlpStress(TminStrainDmnd)/TminStrainDmnd);
01536 double kmin = (kminP/kElasticPos>kminN/kElasticNeg) ? kminP/kElasticPos:kminN/kElasticNeg;
01537 double gammaKLimEnv = (0.0>(1-kmin)) ? 0.0:(1-kmin);
01538
01539 TgammaK = (gammaKLimit<gammaKLimEnv) ? gammaKLimit:gammaKLimEnv;
01540 TgammaD = gammaDLimit;
01541 TgammaF = gammaFLimit;
01542 }
01543 }