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
00035
00036 #include <CloughDamage.h>
00037 #include <DamageModel.h>
00038 #include <stdlib.h>
00039 #include <Channel.h>
00040 #include <math.h>
00041
00042 #include <string.h>
00043
00044 #define DEBG 0
00045
00047
00049
00050 CloughDamage::CloughDamage(int tag, Vector inputParam, DamageModel *strength, DamageModel *stiffness,DamageModel *accelerated,DamageModel *capping )
00051 :UniaxialMaterial(tag,MAT_TAG_SnapCloughDamage)
00052 {
00053 if( (inputParam.Size()) < 8)
00054 opserr << "Error: CloughDamage(): inputParam, size <16\n" << "\a";
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 elstk = inputParam[0];
00073 fyieldPos = inputParam[1];
00074 fyieldNeg = inputParam[2];
00075 alpha = inputParam[3];
00076 Resfac = inputParam[4];
00077 capSlope = inputParam[5];
00078 capDispPos = inputParam[6];
00079 capDispNeg = inputParam[7];
00080
00081
00082
00083
00084 if ( capSlope > 0.0 )
00085 opserr << "Error: CloughDamage::CloughDamage : CapSlope must be < 0\n" << "\a";
00086
00087 if ( Resfac < 0.0 || Resfac > 1.0)
00088 opserr << "Error: CloughDamage::CloughDamage : Residual must be > 0 and <= 1\n" << "\a";
00089
00090 if ( alpha > 0.8 || alpha < -0.8 )
00091 opserr << "Error: CloughDamage::CloughDamage : alpha must be < 0.8 and > -0.8\n" << "\a";
00092
00093 if ( alpha == capSlope )
00094 opserr << "Error: CloughDamage::CloughDamage : Error: alpha Hard. can not be equal to alphaCap\n" << "\a";
00095
00096 StrDamage = StfDamage = AccDamage = CapDamage = NULL;
00097
00098 if ( strength != NULL )
00099 {
00100 StrDamage = strength->getCopy();
00101 if ( StrDamage == NULL ) {
00102 opserr << "Error: CloughDamage::CloughDamage : Can not make a copy of strength damage model\n" << "\a";
00103 exit(-1);
00104 }
00105 }
00106
00107 if ( stiffness != NULL )
00108 {
00109 StfDamage = stiffness->getCopy();
00110 if ( StfDamage == NULL ) {
00111 opserr << "Error: CloughDamage::CloughDamage : Can not make a copy of stiffness damage model\n" << "\a";
00112 exit(-1);
00113 }
00114 }
00115
00116 if ( accelerated != NULL )
00117 {
00118 AccDamage = accelerated->getCopy();
00119 if ( AccDamage == NULL ) {
00120 opserr << "Error: CloughDamage::CloughDamage : Can not make a copy of accelerated stiffness damage model\n" << "\a";
00121 exit(-1);
00122 }
00123 }
00124
00125 if ( capping != NULL )
00126 {
00127 CapDamage = capping->getCopy();
00128 if ( CapDamage == NULL ) {
00129 opserr << "Error: CloughDamage::CloughDamage : Can not make a copy of capping damage model\n" << "\a";
00130 exit(-1);
00131 }
00132 }
00133
00134
00135 this->revertToStart();
00136
00137 }
00138
00139
00140 CloughDamage::CloughDamage()
00141 :UniaxialMaterial(0,MAT_TAG_SnapCloughDamage)
00142 {
00143
00144 }
00145
00146
00147
00148 CloughDamage::~CloughDamage()
00149 {
00150
00151 if ( StrDamage != 0 ) delete StrDamage;
00152 if ( StfDamage != 0 ) delete StfDamage;
00153 if ( AccDamage != 0 ) delete AccDamage;
00154 if ( CapDamage != 0 ) delete CapDamage;
00155 }
00156
00157
00158
00159 int CloughDamage::revertToStart()
00160 {
00161
00162 dyieldPos = fyieldPos/elstk;
00163 dyieldNeg = fyieldNeg/elstk;
00164
00165 double ekhard = elstk*alpha;
00166 double fPeakPos = fyieldPos+ekhard*(capDispPos-dyieldPos);
00167 double fPeakNeg = fyieldNeg+ekhard*(capDispNeg-dyieldNeg);
00168
00169 hsTrial[0] = 0.0;
00170 hsTrial[1] = 0.0;
00171 hsTrial[2] = elstk;
00172 hsTrial[3] = elstk;
00173 hsTrial[4] = elstk;
00174 hsTrial[5] = 0.0;
00175 hsTrial[6] = 0.0;
00176 hsTrial[7] = 0.0;
00177 hsTrial[8] = 0.0;
00178 hsTrial[9] = 0.0;
00179 hsTrial[10] = dyieldPos;
00180 hsTrial[11] = dyieldNeg;
00181 hsTrial[12] = fyieldPos;
00182 hsTrial[13] = fyieldNeg;
00183 hsTrial[14] = capDispPos;
00184 hsTrial[15] = capDispNeg;
00185 hsTrial[16] = 0.0;
00186 hsTrial[17] = 0.0;
00187 hsTrial[18] = 0.0;
00188 hsTrial[19] = 0.0;
00189 hsTrial[20] = alpha;
00190 hsTrial[21] = alpha;
00191 hsTrial[22] = -capSlope*elstk*capDispPos+fPeakPos;
00192 hsTrial[23] = -capSlope*elstk*capDispNeg+fPeakNeg;
00193
00194 for( int i=0 ; i<24; i++) {
00195 hsCommit[i] = hsTrial[i];
00196 hsLastCommit[i] = hsTrial[i];
00197 }
00198 if ( StrDamage != NULL ) StrDamage->revertToStart();
00199 if ( StfDamage != NULL ) StfDamage->revertToStart();
00200 if ( AccDamage != NULL ) AccDamage->revertToStart();
00201 if ( CapDamage != NULL ) CapDamage->revertToStart();
00202
00203 return 0;
00204 }
00205
00206 void CloughDamage::Print(OPS_Stream &s, int flag)
00207 {
00208
00209 s << "BondSlipMaterial Tag: " << this->getTag() << endln;
00210 s << "D : " << hsTrial[0] << endln;
00211 s << "F : " << hsTrial[1] << endln;
00212 s << "EK: " << hsTrial[2] << endln;
00213
00214 s << endln;
00215 }
00216
00217
00218 int CloughDamage::revertToLastCommit()
00219 {
00220
00221 for(int i=0; i<24; i++) {
00222 hsTrial[i] = hsCommit[i];
00223 hsCommit[i] = hsLastCommit[i];
00224 }
00225 if ( StrDamage != NULL ) StrDamage->revertToLastCommit();
00226 if ( StfDamage != NULL ) StfDamage->revertToLastCommit();
00227 if ( AccDamage != NULL ) AccDamage->revertToLastCommit();
00228 if ( CapDamage != NULL ) CapDamage->revertToLastCommit();
00229
00230 return 0;
00231 }
00232
00233
00234 double CloughDamage::getTangent()
00235 {
00236
00237 return hsTrial[2];
00238 }
00239
00240 double CloughDamage::getInitialTangent (void)
00241 {
00242
00243 return elstk;
00244 }
00245
00246 double CloughDamage::getStress()
00247 {
00248
00249 return hsTrial[1];
00250 }
00251
00252
00253 double CloughDamage::getStrain (void)
00254 {
00255
00256 return hsTrial[0];
00257 }
00258
00259
00260 int CloughDamage::recvSelf(int cTag, Channel &theChannel,
00261 FEM_ObjectBroker &theBroker)
00262 {
00263
00264 return 0;
00265 }
00266
00267
00268 int CloughDamage::sendSelf(int cTag, Channel &theChannel)
00269 {
00270
00271 return 0;
00272 }
00273
00274
00275 UniaxialMaterial *CloughDamage::getCopy(void)
00276 {
00277
00278 Vector inp(8);
00279
00280 inp[0] = elstk;
00281 inp[1] = fyieldPos;
00282 inp[2] = fyieldNeg;
00283 inp[3] = alpha;
00284 inp[4] = Resfac;
00285 inp[5] = capSlope;
00286 inp[6] = capDispPos;
00287 inp[7] = capDispNeg;
00288
00289 CloughDamage *theCopy = new CloughDamage(this->getTag(), inp ,StrDamage, StfDamage, AccDamage, CapDamage);
00290
00291 for (int i=0; i<24; i++) {
00292 theCopy->hsTrial[i] = hsTrial[i];
00293 theCopy->hsCommit[i] = hsCommit[i];
00294 theCopy->hsLastCommit[i] = hsLastCommit[i];
00295 }
00296
00297 return theCopy;
00298 }
00299
00300
00301 int CloughDamage::setTrialStrain( double d, double strainRate)
00302 {
00303
00304
00305 int kon,idiv,Unl,flagDeg,flgstop;
00306
00307 double ekP,ek,ekunload,sp,sn,dP,fP,f;
00308 double deltaD,err,f1,f2,dmax,dmin,fmax,fmin,ekt;
00309 double betas,betak,betaa;
00310 double Enrgtot,Enrgc,dyPos,dyNeg;
00311 double fyPos,fyNeg;
00312 double betad,cpPos,cpNeg;
00313 double dlstPos,flstPos,dlstNeg,flstNeg,ekc,tst,ekexcurs;
00314 double dCap1Pos,dCap2Pos,dCap1Neg,dCap2Neg;
00315 double ekhardNeg,ekhardPos,alphaPos,alphaNeg;
00316 double fCapRefPos,fCapRefNeg;
00317
00318
00319 idiv = 1;
00320 flagDeg = 0;
00321 flgstop = 0;
00322 Unl = 1;
00323 err = 0.0;
00324
00325 dP = hsCommit[0];
00326 fP = hsCommit[1];
00327 ekP = hsCommit[2];
00328 ekunload = hsCommit[3];
00329 ekexcurs = hsCommit[4];
00330 Enrgtot = hsCommit[5];
00331 Enrgc = hsCommit[6];
00332 sp = hsCommit[7];
00333 sn = hsCommit[8];
00334 kon = (int) hsCommit[9];
00335 dmax = hsCommit[10];
00336 dmin = hsCommit[11];
00337 fyPos = hsCommit[12];
00338 fyNeg = hsCommit[13];
00339 cpPos = hsCommit[14];
00340 cpNeg = hsCommit[15];
00341 dlstPos = hsCommit[16];
00342 flstPos = hsCommit[17];
00343 dlstNeg = hsCommit[18];
00344 flstNeg = hsCommit[19];
00345 alphaPos = hsCommit[20];
00346 alphaNeg = hsCommit[21];
00347 fCapRefPos = hsCommit[22];
00348 fCapRefNeg = hsCommit[23];
00349
00350 ekhardPos = alphaPos * elstk;
00351 ekhardNeg = alphaNeg * elstk;
00352 deltaD = d-dP;
00353
00354 betas = betak = betaa = betad = 0.0;
00355
00356
00357 if ( kon == 0 ) {
00358 if( deltaD >= 0.0) {
00359 kon = 1;
00360 }
00361 else {
00362 kon = 2;
00363 }
00364 }
00365
00366
00367
00368
00369 if ( deltaD >= 0.0 ) {
00370
00371 if ( kon==2 ) {
00372 kon = 1;
00373 Unl = 0;
00374
00375 if( StfDamage != NULL ) {
00376
00377 betak = StfDamage->getDamage();
00378 if( betak >= 1.0 ) {
00379 opserr << "Total loss for stiffness degradation\n";
00380 betak = 1.0;
00381 }
00382 ekunload = ekexcurs * ( 1 - betak );
00383 if( ekunload <= ekhardNeg ) flgstop=1;
00384 }
00385
00386
00387 if( ekunload <= 1.e-7 ) flgstop=1;
00388
00389 if( fP < 0.0) {
00390 tst = dP - fP / ekunload;
00391 if( fabs(dmax-dyieldPos) >= 1.e-10 && fabs(tst) <= 1.e-10) {
00392 sn = 1.e-9;
00393 }
00394 else {
00395 sn = dP - fP / ekunload;
00396 }
00397 }
00398 if( fabs(dmin-dP) <= 1.e-10 ) sp = sn + 1.0e-10;
00399 }
00400
00401
00402
00403
00404 if ( d >= dmax ) {
00405 this->envelPosCap (fyPos,alphaPos,capSlope,cpPos,d,&f,&ek);
00406 dmax = d;
00407 fmax = f;
00408 dlstPos = dmax+ 1.0e-10;
00409 flstPos = f;
00410 }
00411 else if ( fabs(sn) > 1.0e-10) {
00412 this->envelPosCap (fyPos,alphaPos,capSlope,cpPos,dmax,&fmax,&ekt);
00413 if ( d<=sn) {
00414 ek = ekunload;
00415 f = fP+ek*deltaD;
00416 if ( Unl == 0 && fabs(ek-ekP) > 1.0e-10 && dP != dmin) {
00417 dlstNeg = dP;
00418 flstNeg = fP;
00419 }
00420 }
00421 else {
00422 ek = fmax/(dmax-sn);
00423
00424 if (ek>=ekunload) {
00425 flgstop = 1;
00426 opserr << "Unloading stiffness < reloading stiff";
00427 }
00428
00429 f2 = ek *( d - sn );
00430 if( dlstPos > sn && dlstPos < dmax ) {
00431 ekc = flstPos / ( dlstPos - sn );
00432 if( ekc > ek && flstPos < fmax ) {
00433
00434 if( d < dlstPos ) {
00435 ek = flstPos/(dlstPos-sn);
00436 f2 = ek*(d-sn);
00437 }
00438 else {
00439 ek = (fmax-flstPos)/(dmax-dlstPos);
00440 f2 = flstPos+ek*(d-dlstPos);
00441 }
00442 }
00443 }
00444
00445 f1 = fP + ekunload * deltaD;
00446 f = (f1 < f2) ? f1 : f2;
00447
00448 if ( fabs(f-f1) < 1.0e-10 ) ek=ekunload;
00449 }
00450 }
00451 else {
00452 if ( d > 0.0 ) {
00453 this->envelPosCap (fyPos,alphaPos,capSlope,cpPos,d,&f,&ek);
00454 }
00455 else {
00456 this->envelNegCap (fyNeg,alphaNeg,capSlope,cpNeg,d,&f,&ek);
00457 }
00458 }
00459 }
00460 else {
00461 if (kon==1) {
00462 kon = 2;
00463 Unl = 0;
00464
00465 if( StfDamage != NULL ) {
00466
00467 betak = StfDamage->getDamage();
00468 if( betak >= 1.0 ) {
00469 opserr << "Total loss for stiffness degradation\n";
00470 betak = 1.0;
00471 }
00472 ekunload = ekexcurs*(1-betak);
00473 if(ekunload<=ekhardPos) flgstop=1;
00474 }
00475
00476
00477
00478 if( fP > 0.0 ) {
00479 tst = dP-fP/ekunload;
00480 if( fabs(dmin-dyieldNeg) >= 1.e-10 && fabs(tst) <= 1.e-10 ) {
00481 sp = 1.e-9;
00482 }
00483 else {
00484 sp = dP-fP/ekunload;
00485 }
00486 }
00487
00488 if( fabs(dmax-dP) <= 1.e-10 ) sn=sp-1.0e-10;
00489 }
00490
00491
00492
00493
00494 if (d <= dmin) {
00495 this->envelNegCap (fyNeg,alphaNeg,capSlope,cpNeg,d,&f,&ek);
00496 dmin = d;
00497 fmin = f;
00498 dlstNeg = dmin - 1.0e-10;
00499 flstNeg = f;
00500
00501 }
00502 else if ( fabs(sp) > 1.0e-10) {
00503 this->envelNegCap (fyNeg,alphaNeg,capSlope,cpNeg,dmin,&fmin,&ekt);
00504 if ( d>=sp) {
00505 ek = ekunload;
00506 f = fP+ek*deltaD;
00507 if( Unl==0 && fabs(ek-ekP) > 1.0e-10 && dP != dmax ) {
00508 dlstPos = dP;
00509 flstPos = fP;
00510 }
00511 }
00512 else {
00513 ek = fmin/(dmin-sp);
00514
00515 if ( ek >= ekunload ) {
00516 flgstop = 1;
00517 opserr << "Unloading stiffness < reloading stiff\n";
00518 }
00519
00520 f2 = ek * ( d - sp );
00521 if( dlstNeg < sp && dlstNeg > dmin ) {
00522 ekc = flstNeg / ( dlstNeg - sp );
00523
00524 if( ekc > ek && flstNeg > fmin ) {
00525 if( d > dlstNeg ) {
00526 ek = flstNeg / ( dlstNeg - sp );
00527 f2 = ek * ( d - sp );
00528 }
00529 else {
00530 ek = ( fmin - flstNeg ) / ( dmin - dlstNeg );
00531 f2 = flstNeg + ek * ( d - dlstNeg );
00532 }
00533 }
00534 }
00535
00536 f1 = fP + ekunload * deltaD;
00537 f = (f1 > f2) ? f1 : f2;
00538 if ( fabs(f-f1) < 1.e-10 ) ek=ekunload;
00539 }
00540 }
00541 else {
00542 if ( d > 0.0 ) {
00543 this->envelPosCap (fyPos,alphaPos,capSlope,cpPos,d,&f,&ek);
00544 }
00545 else {
00546 this->envelNegCap (fyNeg,alphaNeg,capSlope,cpNeg,d,&f,&ek);
00547 }
00548 }
00549 }
00550
00551
00552
00553
00554
00555 if ( StfDamage != NULL ) {
00556 betak = StrDamage->getDamage();
00557 if( fabs(betak) >= 1.0) betak = 1.0;
00558 }
00559
00560 if ( StrDamage != NULL ) {
00561 betas = StrDamage->getDamage();
00562 if( fabs(betas) >= 1.0) betas = 1.0;
00563 }
00564
00565 if ( AccDamage != NULL ) {
00566 betaa = AccDamage->getDamage();
00567 if( fabs(betaa) >= 1.0) betaa = 1.0;
00568 }
00569
00570 if ( CapDamage != NULL ) {
00571 betad = CapDamage->getDamage();
00572 if( fabs(betad) >= 1.0) betad = 1.0;
00573 }
00574
00575
00576
00577 if( f * fP < 0.0) {
00578 if( fP >0.0 && dmax >dyieldPos) flagDeg = 1;
00579 if( fP < 0.0 && dmin < dyieldNeg) flagDeg = 2;
00580 }
00581
00582
00583
00584
00585 if( flagDeg == 1 || flagDeg == 2 ) {
00586
00587
00588
00589 if( StrDamage != NULL ) betas = StrDamage->getDamage();
00590 if( betas>=1.0 ) {
00591 opserr << "Total loss for strength degradation\n";
00592 betas = 1.0;
00593 }
00594 if( AccDamage != NULL ) betaa = AccDamage->getDamage();
00595 if( betaa>=1.0 ) {
00596 opserr << "Total loss for accelerated stiffness degradation\n";
00597 betaa = 1.0;
00598 }
00599 if( CapDamage != NULL ) betad = CapDamage->getDamage();
00600 if( betad>=1.0 ) {
00601 opserr << "Total loss for capping degradation\n";
00602 betad = 1.0;
00603 }
00604
00605 ekexcurs = ekunload;
00606 Enrgc = 0.0;
00607
00608
00609
00610 if( deltaD < 0.0 ) {
00611
00612 fyNeg = fyNeg * ( 1 - betas );
00613 alphaNeg = alphaNeg * ( 1 - betas );
00614 fCapRefNeg = fCapRefNeg * ( 1 - betad );
00615 dmin = dmin * ( 1 + betaa );
00616
00617 dyNeg = fyNeg / elstk;
00618 ekhardNeg = alphaNeg * elstk;
00619
00620 dCap1Neg = fCapRefNeg/(elstk-capSlope*elstk);
00621 dCap2Neg = (fCapRefNeg+ekhardNeg*dyNeg-fyNeg)/(ekhardNeg-capSlope*elstk);
00622 cpNeg = ( dCap1Neg < dCap2Neg ) ? dCap1Neg : dCap2Neg;
00623 }
00624 else {
00625 fyPos = fyPos * ( 1 - betas );
00626 alphaPos = alphaPos * ( 1 - betas );
00627 fCapRefPos = fCapRefPos * ( 1 - betad );
00628 dmax = dmax * ( 1 + betaa );
00629
00630 dyPos = fyPos / elstk;
00631 ekhardPos = alphaPos * elstk;
00632
00633 dCap1Pos = fCapRefPos / ( elstk - capSlope * elstk );
00634 dCap2Pos = (fCapRefPos+ekhardPos*dyPos-fyPos)/(ekhardPos-capSlope*elstk);
00635 cpPos= (dCap1Pos > dCap2Pos ) ? dCap1Pos : dCap2Pos;
00636 }
00637 flagDeg = 0;
00638 }
00639
00640
00641
00642 hsTrial[0] = d;
00643 hsTrial[1] = f;
00644 hsTrial[2] = ek;
00645 hsTrial[3] = ekunload;
00646 hsTrial[4] = ekexcurs;
00647 hsTrial[5] = Enrgtot;
00648 hsTrial[6] = Enrgc;
00649 hsTrial[7] = sp;
00650 hsTrial[8] = sn;
00651 hsTrial[9] = (double) kon;
00652 hsTrial[10] = dmax;
00653 hsTrial[11] = dmin;
00654 hsTrial[12] = fyPos;
00655 hsTrial[13] = fyNeg;
00656 hsTrial[14] = cpPos;
00657 hsTrial[15] = cpNeg;
00658 hsTrial[16] = dlstPos;
00659 hsTrial[17] = flstPos;
00660 hsTrial[18] = dlstNeg;
00661 hsTrial[19] = flstNeg;
00662 hsTrial[20] = alphaPos;
00663 hsTrial[21] = alphaNeg;
00664 hsTrial[22] = fCapRefPos;
00665 hsTrial[23] = fCapRefNeg;
00666
00667 return 0;
00668 }
00669
00670
00671 int CloughDamage::commitState()
00672 {
00673
00674 int i;
00675 for( i=0; i<24; i++ ) {
00676 hsLastCommit[i] = hsCommit[i];
00677 hsCommit[i] = hsTrial[i];
00678 }
00679
00680
00681 Vector InforForDamage(3);
00682 InforForDamage(0) = hsCommit[0];
00683 InforForDamage(1) = hsCommit[1];
00684 InforForDamage(2) = hsCommit[3];
00685
00686 if ( StfDamage != NULL ) {
00687 StfDamage->setTrial(InforForDamage);
00688 StfDamage->commitState();
00689 }
00690
00691 InforForDamage(2) = 0.0;
00692
00693 if ( StrDamage != NULL ) {
00694 StrDamage->setTrial(InforForDamage);
00695 StrDamage->commitState();
00696 }
00697
00698 if ( AccDamage != NULL ) {
00699 AccDamage->setTrial(InforForDamage);
00700 AccDamage->commitState();
00701 }
00702 if ( CapDamage != NULL ) {
00703 CapDamage->setTrial(InforForDamage);
00704 CapDamage->commitState();
00705 }
00706
00707 this->recordInfo();
00708
00709 return 0;
00710 }
00711
00712
00713 void CloughDamage::recordInfo(int cond )
00714 {
00715
00716 }
00717
00718
00719 void CloughDamage::envelPosCap( double fy, double alphaPos, double alphaCap,
00720 double cpDsp, double d, double *f, double *ek )
00721 {
00722
00723 double dy,Res,rcap,dres;
00724
00725 dy = fy / elstk;
00726
00727 if (dy < cpDsp)
00728 {
00729 Res = Resfac * fyieldPos;
00730 rcap = fy+alphaPos * elstk * ( cpDsp - dy );
00731 dres = cpDsp + ( Res - rcap ) / ( alphaCap * elstk );
00732
00733 if ( d < 0.0 )
00734 {
00735 *f = 0.0;
00736 *ek = 0.0;
00737 }
00738 else
00739 {
00740 if ( d <= dy )
00741 {
00742 *ek = elstk;
00743 *f = (*ek) * d;
00744 }
00745 else
00746 {
00747 if( d <= cpDsp )
00748 {
00749 *ek = elstk * alphaPos;
00750 *f = fy + (*ek) * ( d - dy );
00751 }
00752 else
00753 {
00754 if( d <= dres )
00755 {
00756 *ek = alphaCap * elstk;
00757 *f = rcap + (*ek) * ( d - cpDsp );
00758 }
00759 else
00760 {
00761 *ek = 0;
00762
00763 *f = Res + d * (*ek);
00764 }
00765 }
00766 }
00767 }
00768 }
00769 else
00770 {
00771 rcap = elstk * cpDsp;
00772 Res = Resfac * rcap;
00773 dres = cpDsp + ( Res - rcap ) / ( alphaCap * elstk );
00774
00775 if ( d < 0.0 )
00776 {
00777 *f = 0.0;
00778 *ek = 0.0;
00779 }
00780 else
00781 {
00782 if( d <= cpDsp )
00783 {
00784 *ek = elstk;
00785 *f = (*ek) * d;
00786 }
00787 else
00788 {
00789 if( d <= dres )
00790 {
00791 *ek = alphaCap * elstk;
00792 *f = rcap + (*ek) * ( d - cpDsp );
00793 }
00794 else
00795 {
00796 *ek = 0;
00797
00798 *f = Res + d * (*ek);
00799 }
00800 }
00801 }
00802 }
00803
00804 return;
00805 }
00806
00807
00808 void CloughDamage::envelNegCap( double fy, double alphaNeg, double alphaCap,
00809 double cpDsp, double d, double *f, double *ek)
00810 {
00811
00812 double dy,Res,rcap,dres;
00813
00814 dy = fy / elstk;
00815
00816 if( dy > cpDsp )
00817 {
00818
00819 Res = Resfac * fyieldNeg;
00820 rcap = fy + alphaNeg * elstk * ( cpDsp - dy );
00821 dres = cpDsp + ( Res - rcap ) / ( alphaCap * elstk );
00822
00823 if (d > 0.0)
00824 {
00825 *f = 0.0;
00826 *ek = 0.0;
00827 }
00828 else
00829 {
00830 if ( d >= dy )
00831 {
00832 *ek = elstk;
00833 *f = (*ek) * d;
00834 }
00835 else
00836 {
00837 if ( d >= cpDsp )
00838 {
00839 *ek = elstk * alphaNeg;
00840 *f = fy + (*ek) * ( d - dy );
00841 }
00842 else
00843 {
00844 if ( d >= dres )
00845 {
00846 *ek = elstk * alphaCap;
00847 *f = rcap + (*ek) * ( d - cpDsp );
00848 }
00849 else
00850 {
00851 *ek = 0;
00852
00853 *f = Res + (*ek) * d;
00854 }
00855 }
00856 }
00857 }
00858 }
00859 else
00860 {
00861 rcap = elstk * cpDsp;
00862 Res = Resfac * rcap;
00863 dres = cpDsp + ( Res - rcap ) / ( alphaCap * elstk );
00864
00865 if (d > 0.0)
00866 {
00867 *f = 0.0;
00868 *ek = 0.0;
00869 }
00870 else
00871 {
00872 if ( d >= cpDsp )
00873 {
00874 *ek = elstk;
00875 *f = (*ek) * d;
00876 }
00877 else
00878 {
00879 if ( d >= dres )
00880 {
00881 *ek = elstk * alphaCap;
00882 *f = rcap + (*ek) * ( d - cpDsp );
00883 }
00884 else
00885 {
00886 *ek = 0;
00887
00888 *f = Res + (*ek) * d;
00889 }
00890 }
00891 }
00892 }
00893 return;
00894 }