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 #include <Bond_SP01.h>
00032 #include <Vector.h>
00033 #include <Matrix.h>
00034 #include <Channel.h>
00035 #include <Information.h>
00036 #include <math.h>
00037 #include <float.h>
00038
00039 Bond_SP01::Bond_SP01
00040 (int tag, double FY, double SY, double FU, double SU, double KZ, double r, double CD, double DB, double FC, double LA):
00041 UniaxialMaterial(tag,MAT_TAG_Bond_SP01),
00042 fy(FY), sy(SY), fu(FU), su(SU), Kz(KZ), R(r), Cd(CD), db(DB), fc(FC), lba(LA)
00043 {
00044
00045 if ( fy >= 1000 || sy >= 1)
00046 opserr << "WARNING: For the Strain-Penetration Model: input values in ksi and in." << endln;
00047
00048
00049
00050 Cr = 1.01;
00051 Ks = pow(R,Kz/2.5);
00052
00053
00054 E0 = fy/sy;
00055
00056
00057 la = fy*db*1000.0/40.0/pow(fc*1000,0.5);
00058
00059
00060 this->revertToStart ();
00061
00062 }
00063
00064 Bond_SP01::Bond_SP01
00065 (int tag, double FY, double SY, double FU, double SU, double KZ, double r):
00066 UniaxialMaterial(tag,MAT_TAG_Bond_SP01),
00067 fy(FY), sy(SY), fu(FU), su(SU), Kz(KZ), R(r), Cd(0.0), db(1.0), fc(4.35), lba(0.0)
00068 {
00069
00070 if (fy >= 1000 || sy >= 1)
00071 opserr << "WARNING: WARNING: For the Strain-Penetration Model: input values in ksi and in." << endln;
00072
00073
00074
00075 Cr = 1.01;
00076 Ks = pow(R,Kz/2.5);
00077
00078
00079 E0 = fy/sy;
00080
00081
00082 la = fy*db*1000.0/40.0/pow(fc*1000,0.5);
00083
00084
00085 this->revertToStart ();
00086 }
00087
00088 Bond_SP01::Bond_SP01 ():
00089 UniaxialMaterial(0,MAT_TAG_Bond_SP01),
00090 fy(64.0), sy(0.021), fu(102.2), su(1.0), Kz(0.3), R(.8), Cd(0.0), db(1.0), fc(4.35), lba(0.0)
00091 {
00092
00093
00094 }
00095
00096 Bond_SP01::~Bond_SP01 ()
00097 {
00098 }
00099
00100 int Bond_SP01::setTrialStrain (double strain, double strainRate)
00101 {
00102
00103 TRSlip = CRSlip;
00104 TRLoad = CRLoad;
00105 TRSlope = CRSlope;
00106 TmaxHSlip = CmaxHSlip;
00107 TminHSlip = CminHSlip;
00108 Tloading = Cloading;
00109 TYieldFlag = CYieldFlag;
00110
00111
00112 Tslip = strain;
00113
00114
00115 double dslip = Tslip - Cslip;
00116
00117
00118 determineTrialState (Tslip, dslip);
00119
00120 return 0;
00121 }
00122
00123 int Bond_SP01::setTrial (double strain, double &stress, double &tangent, double strainRate)
00124 {
00125
00126 TRSlip = CRSlip;
00127 TRLoad = CRLoad;
00128 TRSlope = CRSlope;
00129 TmaxHSlip = CmaxHSlip;
00130 TminHSlip = CminHSlip;
00131 Tloading = Cloading;
00132 TYieldFlag = CYieldFlag;
00133
00134
00135 Tslip = strain;
00136
00137
00138 double dslip;
00139 dslip = Tslip - Cslip;
00140
00141
00142 determineTrialState (Tslip, dslip);
00143
00144 stress = Tload;
00145 tangent = Ttangent;
00146
00147 return 0;
00148 }
00149
00150 void Bond_SP01::determineTrialState (double ts, double dslip)
00151 {
00152
00153 double maxrs;
00154 double maxrl;
00155 double maxvgs;
00156 double minrs;
00157 double minrl;
00158 double minvgs;
00159 double rslip;
00160 double rload;
00161 double rsvg;
00162 double trs;
00163 double trl;
00164 double trsvg;
00165 double Eun;
00166 double Ere;
00167 double Er;
00168 double kkk = 0.38;
00169 double templ, temps;
00170
00171 double ss;
00172 double Sy;
00173 double ssy;
00174 double suy;
00175 double ft;
00176 double st;
00177
00178 if (fabs(dslip) <= DBL_EPSILON)
00179 {
00180 Tload = Cload;
00181 return;
00182 }
00183
00184 if (Tloading == 0)
00185 {
00186 Tload = getEnvelopeStress(ts);
00187 if (dslip > 0.0)
00188 {
00189 Tloading = 1;
00190 CminHSlip = -ts;
00191 }
00192 else
00193 {
00194 Tloading = -1;
00195 CmaxHSlip = -ts;
00196 }
00197 return;
00198 }
00199
00200 if (TYieldFlag == 0)
00201 {
00202 if (fabs(ts) <= sy)
00203 {
00204 Tload = ts*E0;
00205 Ttangent = E0;
00206 }
00207 else
00208 {
00209 TYieldFlag = 1;
00210 Tload = getEnvelopeStress(ts);
00211 }
00212
00213 if (Tloading > 0 && dslip < 0.0 && Cslip > TmaxHSlip)
00214 TmaxHSlip = Cslip;
00215 if (Tloading < 0 && dslip > 0.0 && Cslip < TminHSlip)
00216 TminHSlip = Cslip;
00217
00218 return;
00219 }
00220
00221
00222 maxrs = TmaxHSlip;
00223 maxrl = getEnvelopeStress(maxrs);
00224 if (maxrs > sy)
00225 {
00226 Eun = E0/pow(maxrs/sy,kkk);
00227 }
00228 else
00229 {
00230 Eun = E0;
00231 }
00232 maxvgs = maxrs-maxrl/Eun;
00233
00234 minrs = TminHSlip;
00235 minrl = getEnvelopeStress(minrs);
00236 if (minrs < -sy)
00237 {
00238 Ere = E0/pow(-minrs/sy,kkk);
00239 }
00240 else
00241 {
00242 Ere = E0;
00243 }
00244 minvgs = minrs-minrl/Ere;
00245
00246 rslip = TRSlip;
00247 rload = TRLoad;
00248 Er = TRSlope;
00249 rsvg = rslip-rload/Er;
00250
00251
00252 if (Tloading > 0.0)
00253 {
00254 if (dslip > 0.0)
00255 {
00256 if (ts >= maxrs)
00257 {
00258 Tload = getEnvelopeStress(ts);
00259 }
00260 else
00261 {
00262 if (ts >= rsvg)
00263 {
00264 Sy = maxrl/Ere;
00265 suy = (maxrs-rsvg)/Sy;
00266 if (ts-rsvg <= Ks*(maxrs-rsvg))
00267 {
00268 ssy = (ts-rsvg)/Sy;
00269 ss = ssy/(suy-ssy);
00270 ft = ss/pow((pow(1/suy,R)+pow(ss,R)),(1/R));
00271 Tload = ft*maxrl;
00272 st = pow(suy,(1-R))/pow(suy-ssy,2)/pow((pow(1/suy,R)+pow(ss,R)),(1/R+1));
00273 Ttangent = st*Ere;
00274 }
00275 else
00276 {
00277 ssy = Ks*(maxrs-rsvg)/Sy;
00278 ss = ssy/(suy-ssy);
00279 ft = ss/pow((pow(1/suy,R)+pow(ss,R)),(1/R));
00280 templ = ft*maxrl;
00281 temps = Ks*(maxrs-rsvg)+rsvg;
00282 Tload = templ+(maxrl-templ)/(maxrs-temps)*(ts-temps);
00283 Ttangent = (maxrl-templ)/(maxrs-temps);
00284 }
00285 }
00286 else
00287 {
00288 if (ts >= rslip)
00289 {
00290 Tload = rload*(ts-rsvg)/(rslip-rsvg);
00291 Ttangent = Er;
00292 }
00293 else
00294 {
00295 Tload = rload;
00296 }
00297 }
00298 }
00299 }
00300 else
00301 {
00302 Tloading = -1;
00303 TRSlip = Cslip;
00304 TRLoad = Cload;
00305 if (Cslip > TmaxHSlip)
00306 {
00307 TmaxHSlip = Cslip;
00308 if (TmaxHSlip > sy)
00309 {
00310 TRSlope = E0/pow(TmaxHSlip/sy, kkk);
00311 }
00312 else
00313 {
00314 TRSlope = E0;
00315 }
00316 }
00317 Er = TRSlope;
00318
00319 trs = TRSlip;
00320 trl = TRLoad;
00321 trsvg = trs-trl/Er;
00322
00323 if (trsvg > 0.0 && CminHSlip == 0.0)
00324 CminHSlip = -sy*trsvg/su;
00325
00326 if (ts > trs)
00327 {
00328 Tload = trl;
00329 }
00330 else
00331 {
00332 if (ts > trsvg)
00333 {
00334 Tload = trl*(ts-trsvg)/(trs-trsvg);
00335 Ttangent = Er;
00336 }
00337 else
00338 {
00339 if (ts > minrs)
00340 {
00341 Sy = minrl/Eun;
00342 suy = (minrs-trsvg)/Sy;
00343 if (ts-trsvg >= Ks*(minrs-trsvg))
00344 {
00345 ssy = (ts-trsvg)/Sy;
00346 ss = ssy/(suy-ssy);
00347 ft = ss/pow((pow(1/suy,R)+pow(ss,R)),(1/R));
00348 Tload = ft*minrl;
00349 st = pow(suy,(1-R))/pow(suy-ssy,2)/pow((pow(1/suy,R)+pow(ss,R)),(1/R+1));
00350 Ttangent = st*Eun;
00351 }
00352 else
00353 {
00354 ssy = Ks*(minrs-trsvg)/Sy;
00355 ss = ssy/(suy-ssy);
00356 ft = ss/pow((pow(1/suy,R)+pow(ss,R)),(1/R));
00357 templ = ft*minrl;
00358 temps = Ks*(minrs-trsvg)+trsvg;
00359 Tload = templ+(minrl-templ)/(minrs-temps)*(ts-temps);
00360 Ttangent = (minrl-templ)/(minrs-temps);
00361 }
00362 }
00363 else
00364 {
00365 Tload = getEnvelopeStress(ts);
00366 }
00367 }
00368 }
00369
00370 }
00371 }
00372 else
00373 {
00374 if (dslip < 0.0)
00375 {
00376 if (ts <= minrs)
00377 {
00378 Tload = getEnvelopeStress(ts);
00379 }
00380 else
00381 {
00382 if (ts <= rsvg)
00383 {
00384 Sy = minrl/Eun;
00385 suy = (minrs-rsvg)/Sy;
00386 if (ts-rsvg >= Ks*(minrs-rsvg))
00387 {
00388 ssy = (ts-rsvg)/Sy;
00389 ss = ssy/(suy-ssy);
00390 ft = ss/pow((pow(1/suy,R)+pow(ss,R)),(1/R));
00391 Tload = ft*minrl;
00392 st = pow(suy,(1-R))/pow(suy-ssy,2)/pow((pow(1/suy,R)+pow(ss,R)),(1/R+1));
00393 Ttangent = st*Eun;
00394 }
00395 else
00396 {
00397 ssy = Ks*(minrs-rsvg)/Sy;
00398 ss = ssy/(suy-ssy);
00399 ft = ss/pow((pow(1/suy,R)+pow(ss,R)),(1/R));
00400 templ = ft*minrl;
00401 temps = Ks*(minrs-rsvg)+rsvg;
00402 Tload = templ+(minrl-templ)/(minrs-temps)*(ts-temps);
00403 Ttangent = (minrl-templ)/(minrs-temps);
00404 }
00405 }
00406 else
00407 {
00408 if (ts <= rslip)
00409 {
00410 Tload = rload*(ts-rsvg)/(rslip-rsvg);
00411 Ttangent = E0;
00412 }
00413 else
00414 {
00415 Tload = rload;
00416 }
00417 }
00418 }
00419 }
00420 else
00421 {
00422 Tloading = 1;
00423 TRSlip = Cslip;
00424 TRLoad = Cload;
00425 if (Cslip < TminHSlip)
00426 {
00427 TminHSlip = Cslip;
00428 if (TminHSlip < -sy)
00429 {
00430 TRSlope = E0/pow(-TminHSlip/sy, kkk);
00431 }
00432 else
00433 {
00434 TRSlope = E0;
00435 }
00436 }
00437 Er = TRSlope;
00438
00439 trs = TRSlip;
00440 trl = TRLoad;
00441 trsvg = trs-trl/Er;
00442
00443 if (trsvg < 0.0 && CmaxHSlip == 0.0)
00444 CmaxHSlip = sy*trsvg/(-su);
00445
00446 if (ts < trs)
00447 {
00448 Tload = trl;
00449 }
00450 else
00451 {
00452 if (ts < trsvg)
00453 {
00454 Tload = trl*(ts-trsvg)/(trs-trsvg);
00455 Ttangent = Er;
00456 }
00457 else
00458 {
00459 if (ts < maxrs)
00460 {
00461 Sy = maxrl/Ere;
00462 suy = (maxrs-rsvg)/Sy;
00463 if (ts-trsvg <= Ks*(maxrs-trsvg))
00464 {
00465 ssy = (ts-trsvg)/Sy;
00466 ss = ssy/(suy-ssy);
00467 ft = ss/pow((pow(1/suy,R)+pow(ss,R)),(1/R));
00468 Tload = ft*maxrl;
00469 st = pow(suy,(1-R))/pow(suy-ssy,2)/pow((pow(1/suy,R)+pow(ss,R)),(1/R+1));
00470 Ttangent = st*Ere;
00471 }
00472 else
00473 {
00474 ssy = Ks*(maxrs-trsvg)/Sy;
00475 ss = ssy/(suy-ssy);
00476 ft = ss/pow((pow(1/suy,R)+pow(ss,R)),(1/R));
00477 templ = ft*maxrl;
00478 temps = Ks*(maxrs-trsvg)+trsvg;
00479 Tload = templ+(maxrl-templ)/(maxrs-temps)*(ts-temps);
00480 Ttangent = (maxrl-templ)/(maxrs-temps);
00481 }
00482 }
00483 else
00484 {
00485 Tload = getEnvelopeStress(ts);
00486 }
00487 }
00488 }
00489 if (Cslip < TminHSlip)
00490 {
00491 TminHSlip = Cslip;
00492 }
00493 }
00494 }
00495
00496
00497
00498 }
00499
00500 double Bond_SP01::getEnvelopeStress (double s)
00501 {
00502 double ss;
00503 double ft;
00504 double st;
00505 double ssy;
00506 double suy;
00507 double load;
00508
00509 if (fabs(s) < DBL_EPSILON)
00510 {
00511 load = 0.0;
00512 Ttangent = E0;
00513 return load;
00514 }
00515
00516 if (s > 0.0)
00517 {
00518 if (s <= sy)
00519 {
00520 load = s*E0;
00521 Ttangent = E0;
00522 }
00523 else
00524 {
00525 if (s < su)
00526 {
00527 ssy = (s-sy)/sy;
00528 suy = (su-sy)/sy;
00529 ss = ssy/(suy-ssy);
00530 ft = ss/pow((pow(1/suy/Kz,Cr)+pow(ss,Cr)),1/Cr);
00531 load = fy+ft*(fu-fy);
00532 st = (pow(suy,(1-Cr))/pow(Kz,Cr)/pow((suy-ssy),2))/pow((pow(1/suy/Kz,Cr)+pow(ss,Cr)),(1/Cr+1));
00533 Ttangent = st*E0;
00534 }
00535 else
00536 {
00537 load = fu;
00538 Ttangent = 0.0;
00539 }
00540 }
00541 }
00542 else
00543 {
00544 if (s >= -sy)
00545 {
00546 load = s*E0;
00547 Ttangent = E0;
00548 }
00549 else
00550 {
00551 if (s > -su)
00552 {
00553 ssy = (s-(-sy))/(-sy);
00554 suy = (su-sy)/sy;
00555 ss = ssy/(suy-ssy);
00556 ft = ss/pow((pow(1/suy/Kz,Cr)+pow(ss,Cr)),1/Cr);
00557 load = -fy+ft*(-fu+fy);
00558 st = (pow(suy,(1-Cr))/pow(Kz,Cr)/pow((suy-ssy),2))/pow((pow(1/suy/Kz,Cr)+pow(ss,Cr)),(1/Cr+1));
00559 Ttangent = st*E0;
00560 }
00561 else
00562 {
00563 load = -fu;
00564 Ttangent = 0.0;
00565 }
00566 }
00567 }
00568
00569 return load;
00570 }
00571
00572 double Bond_SP01::getStrain ()
00573 {
00574 return Tslip;
00575 }
00576
00577 double Bond_SP01::getStress ()
00578 {
00579 return Tload;
00580 }
00581
00582 double Bond_SP01::getTangent ()
00583 {
00584 return Ttangent;
00585 }
00586
00587 double Bond_SP01::getInitialTangent()
00588 {
00589 return fy/sy;
00590 }
00591
00592 int Bond_SP01::commitState ()
00593 {
00594
00595 CRSlip = TRSlip;
00596 CRLoad = TRLoad;
00597 CRSlope = TRSlope;
00598 CmaxHSlip = TmaxHSlip;
00599 CminHSlip = TminHSlip;
00600 Cloading = Tloading;
00601 CYieldFlag = TYieldFlag;
00602
00603
00604 Cslip = Tslip;
00605 Cload = Tload;
00606 Ctangent = Ttangent;
00607
00608 return 0;
00609 }
00610
00611 int Bond_SP01::revertToLastCommit ()
00612 {
00613
00614 TRSlip = CRSlip;
00615 TRLoad = CRLoad;
00616 TRSlope = CRSlope;
00617 TmaxHSlip = CmaxHSlip;
00618 TminHSlip = CminHSlip;
00619 Tloading = Cloading;
00620 TYieldFlag = CYieldFlag;
00621
00622
00623 Tslip = Cslip;
00624 Tload = Cload;
00625 Ttangent = Ctangent;
00626
00627 return 0;
00628 }
00629
00630 int Bond_SP01::revertToStart ()
00631 {
00632
00633 CRSlip = 0.0;
00634 CRLoad = 0.0;
00635 CRSlope = E0;
00636 CmaxHSlip = 0.0;
00637 CminHSlip = 0.0;
00638 Cloading = 0;
00639 CYieldFlag = 0;
00640
00641 TRSlip = 0.0;
00642 TRLoad = 0.0;
00643 TRSlope = E0;
00644 TmaxHSlip = 0.0;
00645 TminHSlip = 0.0;
00646 Tloading = 0;
00647 TYieldFlag = 0;
00648
00649
00650 Cslip = 0.0;
00651 Cload = 0.0;
00652 Ctangent = E0;
00653
00654 Tslip = 0.0;
00655 Tload = 0.0;
00656 Ttangent = E0;
00657
00658 return 0;
00659 }
00660
00661 UniaxialMaterial* Bond_SP01::getCopy ()
00662 {
00663 Bond_SP01* theCopy = new Bond_SP01(this->getTag(), fy, sy, fu, su, Kz, R, Cd, db, fc, lba);
00664
00665
00666 theCopy->CRSlip = CRSlip;
00667 theCopy->CRLoad = CRLoad;
00668 theCopy->CRSlope = CRSlope;
00669 theCopy->CmaxHSlip = CmaxHSlip;
00670 theCopy->CminHSlip = CminHSlip;
00671 theCopy->Cloading = Cloading;
00672 theCopy->CYieldFlag = CYieldFlag;
00673
00674
00675 theCopy->TRSlip = TRSlip;
00676 theCopy->TRLoad = TRLoad;
00677 theCopy->TRSlope = TRSlope;
00678 theCopy->TmaxHSlip = TmaxHSlip;
00679 theCopy->TminHSlip = TminHSlip;
00680 theCopy->Tloading = Tloading;
00681 theCopy->TYieldFlag = TYieldFlag;
00682
00683
00684 theCopy->Cslip = Cslip;
00685 theCopy->Cload = Cload;
00686 theCopy->Ctangent = Ctangent;
00687
00688
00689 theCopy->Tslip = Tslip;
00690 theCopy->Tload = Tload;
00691 theCopy->Ttangent = Ttangent;
00692
00693
00694 theCopy->Cr = Cr;
00695 theCopy->Ks = Ks;
00696 theCopy->E0 = E0;
00697 theCopy->la = la;
00698
00699 return theCopy;
00700 }
00701
00702 int Bond_SP01::sendSelf (int commitTag, Channel& theChannel)
00703 {
00704 return -1;
00705 }
00706
00707 int Bond_SP01::recvSelf (int commitTag, Channel& theChannel,
00708 FEM_ObjectBroker& theBroker)
00709 {
00710 return -1;
00711 }
00712
00713 void Bond_SP01::Print (OPS_Stream& s, int flag)
00714 {
00715 s << "Bond_SP01 tag: " << this->getTag() << endln;
00716 s << " sy: " << sy << " ";
00717 s << " fy: " << fy << " ";
00718 s << " su: " << su << " ";
00719 s << " fu: " << fu << " ";
00720 s << " Kz: " << Kz << " ";
00721 s << " R: " << R << " ";
00722 s << " Cd: " << Cd << " ";
00723 s << " db: " << db << " ";
00724 s << " fc: " << fc << " ";
00725 s << " lba:" << lba << " ";
00726 }
00727
00728