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