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