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