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
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 #include <math.h>
00077 #include <MultiaxialCyclicPlasticity.h>
00078 #include <MultiaxialCyclicPlasticity3D.h>
00079 #include <MultiaxialCyclicPlasticityAxiSymm.h>
00080 #include <MultiaxialCyclicPlasticityPlaneStrain.h>
00081 #include <Information.h>
00082
00083 #include <Channel.h>
00084 #include <FEM_ObjectBroker.h>
00085
00086
00087 Tensor MultiaxialCyclicPlasticity :: rank2(2, def_dim_2, 0.0 ) ;
00088 Tensor MultiaxialCyclicPlasticity :: rank4(2, def_dim_2, 0.0 ) ;
00089
00090
00091 const double MultiaxialCyclicPlasticity :: one3 = 1.0 / 3.0 ;
00092 const double MultiaxialCyclicPlasticity :: two3 = 2.0 / 3.0 ;
00093 const double MultiaxialCyclicPlasticity :: four3 = 4.0 / 3.0 ;
00094 const double MultiaxialCyclicPlasticity :: root23 = sqrt( 2.0 / 3.0 ) ;
00095 const double MultiaxialCyclicPlasticity :: infinity = 1.0e12;
00096
00097 double MultiaxialCyclicPlasticity::initialTangent[3][3][3][3] ;
00098 double MultiaxialCyclicPlasticity::IIdev[3][3][3][3] ;
00099 double MultiaxialCyclicPlasticity::IbunI[3][3][3][3] ;
00100
00101 int MultiaxialCyclicPlasticity::MaterialStageID = 2;
00102
00103 int MultiaxialCyclicPlasticity::IncrFormulationFlag=1;
00104
00105
00106
00107 void MultiaxialCyclicPlasticity :: initialize ( )
00108 {
00109 stress.Zero();
00110 strain.Zero();
00111 stress_n.Zero();
00112 strain_n.Zero();
00113 backs.Zero();
00114 backs_n.Zero();
00115 so.Zero();
00116 so_n.Zero();
00117
00118
00119
00120
00121 flagjustunload=0;
00122 flagfirstload=0;
00123 icounter=0;
00124 iternum=0;
00125 plasticflag=0;
00126 plasticflag_n=0;
00127
00128
00129 kappa = infinity;
00130 Psi = 2 * shear;
00131 load = 0.0;
00132
00133 X[1] = 2 * shear;
00134 X[2] = kappa;
00135 alp=0;
00136 }
00137
00138
00139
00140 MultiaxialCyclicPlasticity :: MultiaxialCyclicPlasticity( ) :
00141 NDMaterial( ), stress(3,3), strain(3,3),
00142 stress_n(3,3), strain_n(3,3), backs(3,3), backs_n(3,3), so(3,3), so_n(3,3)
00143 {
00144 bulk = 0.0 ;
00145 shear = 0.0 ;
00146 bulk_K0 = 0.0 ;
00147 shear_K0 = 0.0 ;
00148 eta = 0.0 ;
00149
00150 density = 0.0 ;
00151
00152 this->initialize( ) ;
00153
00154 int i, j, k, l ;
00155
00156
00157 for ( i = 0; i < 3; i++ ) {
00158 for ( j = 0; j < 3; j++ ) {
00159 for ( k = 0; k < 3; k++ ) {
00160 for ( l = 0; l < 3; l++) {
00161
00162 IbunI[i][j][k][l] = 0.0 ;
00163
00164 IIdev[i][j][k][l] = 0.0 ;
00165
00166 }
00167 }
00168 }
00169 }
00170
00171
00172
00173
00174 IbunI [0][0] [0][0] = 1.0 ;
00175 IbunI [0][0] [1][1] = 1.0 ;
00176 IbunI [0][0] [2][2] = 1.0 ;
00177 IbunI [1][1] [0][0] = 1.0 ;
00178 IbunI [1][1] [1][1] = 1.0 ;
00179 IbunI [1][1] [2][2] = 1.0 ;
00180 IbunI [2][2] [0][0] = 1.0 ;
00181 IbunI [2][2] [1][1] = 1.0 ;
00182 IbunI [2][2] [2][2] = 1.0 ;
00183
00184
00185
00186 IIdev [0][0] [0][0] = two3 ;
00187 IIdev [0][0] [1][1] = -one3 ;
00188 IIdev [0][0] [2][2] = -one3 ;
00189 IIdev [0][1] [0][1] = 0.5 ;
00190 IIdev [0][1] [1][0] = 0.5 ;
00191 IIdev [0][2] [0][2] = 0.5 ;
00192 IIdev [0][2] [2][0] = 0.5 ;
00193 IIdev [1][0] [0][1] = 0.5 ;
00194 IIdev [1][0] [1][0] = 0.5 ;
00195 IIdev [1][1] [0][0] = -one3 ;
00196 IIdev [1][1] [1][1] = two3 ;
00197 IIdev [1][1] [2][2] = -one3 ;
00198 IIdev [1][2] [1][2] = 0.5 ;
00199 IIdev [1][2] [2][1] = 0.5 ;
00200 IIdev [2][0] [0][2] = 0.5 ;
00201 IIdev [2][0] [2][0] = 0.5 ;
00202 IIdev [2][1] [1][2] = 0.5 ;
00203 IIdev [2][1] [2][1] = 0.5 ;
00204 IIdev [2][2] [0][0] = -one3 ;
00205 IIdev [2][2] [1][1] = -one3 ;
00206 IIdev [2][2] [2][2] = two3 ;
00207 }
00208
00209
00210
00211 MultiaxialCyclicPlasticity::MultiaxialCyclicPlasticity(int tag,
00212 int classTag,
00213 double rho,
00214 double K,
00215 double G,
00216 double Su,
00217 double Ho_kin,
00218 double Parameter_h,
00219 double Parameter_m,
00220 double Parameter_beta,
00221 double Kcoeff,
00222 double viscosity)
00223 : NDMaterial(tag, ND_TAG_MultiaxialCyclicPlasticity),
00224 stress(3,3), strain(3,3), stress_n(3,3), strain_n(3,3),
00225 backs(3,3), backs_n(3,3), so(3,3), so_n(3,3)
00226 {
00227 density = rho;
00228 bulk = K ;
00229 shear = G ;
00230 R = sqrt(8.0/3.0)*Su;
00231
00232 Ho = Ho_kin;
00233 h = Parameter_h;
00234 m = Parameter_m ;
00235 beta = Parameter_beta ;
00236 eta = viscosity ;
00237
00239 K0 = Kcoeff;
00240
00241 double v = K0 /(1+K0);
00242 double E = 9 * bulk * shear / (3*bulk+shear);
00243
00244 shear_K0 = E /(2*(1+v));
00245 bulk_K0 = E/(3*(1-2*v));
00247
00248 if (tag==200) {
00249 v = 0.499;
00250 shear_K0 = 1;
00251 bulk_K0 *= 1000;
00252 }
00253
00254 this->initialize( ) ;
00255
00256 int i, j, k, l ;
00257
00258
00259 for ( i = 0; i < 3; i++ ) {
00260 for ( j = 0; j < 3; j++ ) {
00261 for ( k = 0; k < 3; k++ ) {
00262 for ( l = 0; l < 3; l++) {
00263
00264 IbunI[i][j][k][l] = 0.0 ;
00265
00266 IIdev[i][j][k][l] = 0.0 ;
00267
00268 }
00269 }
00270 }
00271 }
00272
00273
00274
00275
00276 IbunI [0][0] [0][0] = 1.0 ;
00277 IbunI [0][0] [1][1] = 1.0 ;
00278 IbunI [0][0] [2][2] = 1.0 ;
00279 IbunI [1][1] [0][0] = 1.0 ;
00280 IbunI [1][1] [1][1] = 1.0 ;
00281 IbunI [1][1] [2][2] = 1.0 ;
00282 IbunI [2][2] [0][0] = 1.0 ;
00283 IbunI [2][2] [1][1] = 1.0 ;
00284 IbunI [2][2] [2][2] = 1.0 ;
00285
00286
00287
00288 IIdev [0][0] [0][0] = two3 ;
00289 IIdev [0][0] [1][1] = -one3 ;
00290 IIdev [0][0] [2][2] = -one3 ;
00291 IIdev [0][1] [0][1] = 0.5 ;
00292 IIdev [0][1] [1][0] = 0.5 ;
00293 IIdev [0][2] [0][2] = 0.5 ;
00294 IIdev [0][2] [2][0] = 0.5 ;
00295 IIdev [1][0] [0][1] = 0.5 ;
00296 IIdev [1][0] [1][0] = 0.5 ;
00297 IIdev [1][1] [0][0] = -one3 ;
00298 IIdev [1][1] [1][1] = two3 ;
00299 IIdev [1][1] [2][2] = -one3 ;
00300 IIdev [1][2] [1][2] = 0.5 ;
00301 IIdev [1][2] [2][1] = 0.5 ;
00302 IIdev [2][0] [0][2] = 0.5 ;
00303 IIdev [2][0] [2][0] = 0.5 ;
00304 IIdev [2][1] [1][2] = 0.5 ;
00305 IIdev [2][1] [2][1] = 0.5 ;
00306 IIdev [2][2] [0][0] = -one3 ;
00307 IIdev [2][2] [1][1] = -one3 ;
00308 IIdev [2][2] [2][2] = two3 ;
00309 }
00310
00311
00312
00313 MultiaxialCyclicPlasticity ::
00314 MultiaxialCyclicPlasticity( int tag, int classTag,
00315 double rho, double K, double G )
00316 :NDMaterial(tag, classTag),
00317 stress(3,3), strain(3,3), stress_n(3,3), strain_n(3,3),
00318 backs(3,3), backs_n(3,3), so(3,3), so_n(3,3)
00319 {
00320 density = rho;
00321 bulk = K ;
00322 shear = G ;
00323 bulk_K0 = K ;
00324 shear_K0 = G ;
00325 eta = 0.0 ;
00326
00327 this->initialize( ) ;
00328
00329 int i, j, k, l ;
00330
00331
00332 for ( i = 0; i < 3; i++ ) {
00333 for ( j = 0; j < 3; j++ ) {
00334 for ( k = 0; k < 3; k++ ) {
00335 for ( l = 0; l < 3; l++) {
00336
00337 IbunI[i][j][k][l] = 0.0 ;
00338
00339 IIdev[i][j][k][l] = 0.0 ;
00340
00341 }
00342 }
00343 }
00344 }
00345
00346
00347
00348
00349 IbunI [0][0] [0][0] = 1.0 ;
00350 IbunI [0][0] [1][1] = 1.0 ;
00351 IbunI [0][0] [2][2] = 1.0 ;
00352 IbunI [1][1] [0][0] = 1.0 ;
00353 IbunI [1][1] [1][1] = 1.0 ;
00354 IbunI [1][1] [2][2] = 1.0 ;
00355 IbunI [2][2] [0][0] = 1.0 ;
00356 IbunI [2][2] [1][1] = 1.0 ;
00357 IbunI [2][2] [2][2] = 1.0 ;
00358
00359
00360
00361 IIdev [0][0] [0][0] = two3 ;
00362 IIdev [0][0] [1][1] = -one3 ;
00363 IIdev [0][0] [2][2] = -one3 ;
00364 IIdev [0][1] [0][1] = 0.5 ;
00365 IIdev [0][1] [1][0] = 0.5 ;
00366 IIdev [0][2] [0][2] = 0.5 ;
00367 IIdev [0][2] [2][0] = 0.5 ;
00368 IIdev [1][0] [0][1] = 0.5 ;
00369 IIdev [1][0] [1][0] = 0.5 ;
00370 IIdev [1][1] [0][0] = -one3 ;
00371 IIdev [1][1] [1][1] = two3 ;
00372 IIdev [1][1] [2][2] = -one3 ;
00373 IIdev [1][2] [1][2] = 0.5 ;
00374 IIdev [1][2] [2][1] = 0.5 ;
00375 IIdev [2][0] [0][2] = 0.5 ;
00376 IIdev [2][0] [2][0] = 0.5 ;
00377 IIdev [2][1] [1][2] = 0.5 ;
00378 IIdev [2][1] [2][1] = 0.5 ;
00379 IIdev [2][2] [0][0] = -one3 ;
00380 IIdev [2][2] [1][1] = -one3 ;
00381 IIdev [2][2] [2][2] = two3 ;
00382 }
00383
00384
00385
00386 MultiaxialCyclicPlasticity :: ~MultiaxialCyclicPlasticity( )
00387 { }
00388
00389
00390 NDMaterial*
00391 MultiaxialCyclicPlasticity :: getCopy (const char *type)
00392 {
00393 if (strcmp(type,"PlaneStress2D") == 0 || strcmp(type,"PlaneStress") == 0)
00394 {
00395 opserr << "MultiaxialCyclicPlasticity type plane stress material is NOT available now....";
00396 return 0;
00397 }
00398 else if (strcmp(type,"PlaneStrain2D") == 0 || strcmp(type,"PlaneStrain") == 0)
00399 {
00400 MultiaxialCyclicPlasticityPlaneStrain *clone ;
00401 clone = new MultiaxialCyclicPlasticityPlaneStrain(this->getTag(), density, bulk, shear, sqrt(3.0/8.0)*R,
00402 Ho, h, m, beta, K0, eta) ;
00403 return clone ;
00404 }
00405 else if (strcmp(type,"AxiSymmetric2D") == 0 || strcmp(type,"AxiSymmetric") == 0)
00406 {
00407 MultiaxialCyclicPlasticityAxiSymm *clone ;
00408 clone = new MultiaxialCyclicPlasticityAxiSymm(this->getTag(), density, bulk, shear, sqrt(3.0/8.0)*R,
00409 Ho, h, m, beta, K0, eta) ;
00410 return clone ;
00411 }
00412 else if ((strcmp(type,"ThreeDimensional") == 0) || (strcmp(type,"3D") == 0))
00413 {
00414 MultiaxialCyclicPlasticity3D *clone ;
00415 clone = new MultiaxialCyclicPlasticity3D(this->getTag(), density, bulk, shear, sqrt(3.0/8.0)*R,
00416 Ho, h, m, beta, K0, eta) ;
00417 return clone ;
00418 }
00419 else if ( (strcmp(type,"PlateFiber") == 0) )
00420 {
00421 opserr << "MultiaxialCyclicPlasticity type plate fiber material is NOT available now....";
00422 return 0;
00423 }
00424
00425 else
00426 {
00427 opserr << "MultiaxialCyclicPlasticity::getModel failed to get model: " << type << endln;
00428 return 0;
00429 }
00430 }
00431
00432
00433 void MultiaxialCyclicPlasticity :: Print( OPS_Stream &s, int flag )
00434 {
00435 s << endln ;
00436 s << "MultiaxialCyclicPlasticity : " ;
00437 s << this->getType( ) << endln ;
00438 s << "K = " << bulk << endln ;
00439 s << "Gmax = " << shear << endln ;
00440 s << "Rho = " << density << endln ;
00441 s << "R = " << R << endln ;
00442 s << "Ho = " << Ho << endln ;
00443 s << "h = " << h << endln ;
00444 s << "m = " << m << endln ;
00445 s << "beta = " << beta << endln ;
00446 s << "eta = " << eta << endln ;
00447 s << endln ;
00448 }
00449
00450
00451 void MultiaxialCyclicPlasticity :: elastic_integrator( )
00452 {
00453 static Matrix dev_strain(3,3) ;
00454
00455 static Matrix dev_stress(3,3) ;
00456
00457
00458 double pressure;
00459
00460 double trace = 0.0 ;
00461
00462 int i,j,k,l;
00463 int ii, jj ;
00464
00465
00466 if (IncrFormulationFlag==0){
00467
00468 trace = strain(0,0) + strain(1,1) + strain(2,2) ;
00469
00470
00471 dev_strain = strain ;
00472
00473 for ( i = 0; i < 3; i++ )
00474 dev_strain(i,i) -= ( one3*trace ) ;
00475
00476
00477 dev_stress = dev_strain;
00478 dev_stress *= 2.0 * shear_K0;
00479
00480
00481 pressure = trace ;
00482 pressure *= bulk_K0 ;
00483 }
00484
00485 static Matrix IncrStrain(3,3);
00486
00487 static Matrix DevStress_n(3,3);
00488
00489 static double pressure_n;
00490
00491 if (IncrFormulationFlag==1){
00492
00493
00494
00495
00496
00497 IncrStrain = strain;
00498 IncrStrain -= strain_n ;
00499
00500 trace = IncrStrain(0,0) + IncrStrain(1,1) + IncrStrain(2,2) ;
00501
00502 dev_strain = IncrStrain ;
00503 for ( i = 0; i < 3; i++ ) dev_strain(i,i) -= ( one3*trace ) ;
00504
00505 pressure_n = one3 * (stress_n(0,0)+stress_n(1,1)+stress_n(2,2));
00506
00507 DevStress_n = stress_n ;
00508
00509 for ( i = 0; i < 3; i++ ) DevStress_n(i,i) -= pressure_n ;
00510
00511
00512
00513
00514
00515
00516 dev_stress = dev_strain;
00517 dev_stress *= 2.0 * shear_K0;
00518 dev_stress += DevStress_n;
00519
00520 pressure = trace;
00521 pressure *= bulk_K0;
00522 pressure += pressure_n;
00523
00524 }
00525
00526
00527
00528 stress = dev_stress ;
00529 for ( i = 0; i < 3; i++ )
00530 stress(i,i) += pressure ;
00531
00532
00533
00534
00535 for ( ii = 0; ii < 6; ii++ ) {
00536 for ( jj = 0; jj < 6; jj++ ) {
00537
00538 index_map( ii, i, j ) ;
00539 index_map( jj, k, l ) ;
00540
00541
00542 tangent[i][j][k][l] = bulk_K0 * IbunI[i][j][k][l] ;
00543
00544 tangent[i][j][k][l] += (2.0*shear_K0) * IIdev[i][j][k][l] ;
00545
00546
00547 tangent [j][i][k][l] = tangent[i][j][k][l] ;
00548 tangent [i][j][l][k] = tangent[i][j][k][l] ;
00549 tangent [j][i][l][k] = tangent[i][j][k][l] ;
00550
00551 }
00552 }
00553
00554 flagfirstload=0;
00555
00556 return ;
00557 }
00558
00559
00560
00561
00562
00563 void MultiaxialCyclicPlasticity :: doInitialTangent( )
00564 {
00565 int ii,jj,i,j,k,l;
00566
00567
00568 for ( ii = 0; ii < 6; ii++ ) {
00569 for ( jj = 0; jj < 6; jj++ ) {
00570
00571 index_map( ii, i, j ) ;
00572 index_map( jj, k, l ) ;
00573
00574
00575 initialTangent[i][j][k][l] = bulk * IbunI[i][j][k][l] ;
00576 initialTangent[i][j][k][l] += (2.0*shear) * IIdev[i][j][k][l] ;
00577
00578
00579 initialTangent [j][i][k][l] = initialTangent[i][j][k][l] ;
00580 initialTangent [i][j][l][k] = initialTangent[i][j][k][l] ;
00581 initialTangent [j][i][l][k] = initialTangent[i][j][k][l] ;
00582
00583 }
00584 }
00585
00586 return ;
00587 }
00588
00589
00590
00591
00592 void MultiaxialCyclicPlasticity :: index_map( int matrix_index, int &i, int &j )
00593 {
00594 switch ( matrix_index+1 ) {
00595
00596 case 1 :
00597 i = 1 ;
00598 j = 1 ;
00599 break ;
00600
00601 case 2 :
00602 i = 2 ;
00603 j = 2 ;
00604 break ;
00605
00606 case 3 :
00607 i = 3 ;
00608 j = 3 ;
00609 break ;
00610
00611 case 4 :
00612 i = 1 ;
00613 j = 2 ;
00614 break ;
00615
00616 case 5 :
00617 i = 2 ;
00618 j = 3 ;
00619 break ;
00620
00621 case 6 :
00622 i = 3 ;
00623 j = 1 ;
00624 break ;
00625
00626
00627 default :
00628 i = 1 ;
00629 j = 1 ;
00630 break ;
00631
00632 }
00633
00634 i-- ;
00635 j-- ;
00636
00637 return ;
00638 }
00639
00640
00641 NDMaterial*
00642 MultiaxialCyclicPlasticity::getCopy (void)
00643 {
00644 opserr << "MultiaxialCyclicPlasticity::getCopy -- subclass responsibility\n";
00645 exit(-1);
00646 return 0;
00647 }
00648
00649 const char*
00650 MultiaxialCyclicPlasticity::getType (void) const
00651 {
00652 opserr << "MultiaxialCyclicPlasticity::getType -- subclass responsibility\n";
00653 exit(-1);
00654 return 0;
00655 }
00656
00657 int
00658 MultiaxialCyclicPlasticity::getOrder (void) const
00659 {
00660 opserr << "MultiaxialCyclicPlasticity::getOrder -- subclass responsibility\n";
00661 exit(-1);
00662 return 0;
00663 }
00664
00665
00666 int
00667 MultiaxialCyclicPlasticity::commitState( )
00668 {
00669
00670 stress_n = stress;
00671 strain_n = strain;
00672
00673 backs_n = backs;
00674 so_n = so;
00675
00676 Psi = X[1];
00677 kappa = X[2];
00678
00679 plasticflag_n=plasticflag;
00680 if (plasticflag==2 ){
00681 plasticflag_n=1;
00682 }
00683
00684 iternum=0;
00685 return 0;
00686
00687 }
00688
00689
00690 int
00691 MultiaxialCyclicPlasticity::revertToLastCommit( )
00692 {
00693 return 0;
00694 }
00695
00696
00697 int
00698 MultiaxialCyclicPlasticity::revertToStart( ) {
00699
00700 this->initialize( ) ;
00701
00702 return 0;
00703 }
00704
00705 int
00706 MultiaxialCyclicPlasticity::sendSelf(int commitTag, Channel &theChannel)
00707 {
00708
00709
00710 static Vector data(10);
00711 int cnt = 0;
00712 data(cnt++) = this->getTag();
00713 data(cnt++) = density;
00714 data(cnt++) = bulk;
00715 data(cnt++) = shear;
00716 data(cnt++) = R;
00717 data(cnt++) = Ho;
00718 data(cnt++) = h;
00719 data(cnt++) = m;
00720 data(cnt++) = beta;
00721 data(cnt++) = eta;
00722
00723
00724 if (theChannel.sendVector(this->getDbTag(), commitTag, data) < 0) {
00725 opserr << "MultiaxialCyclicPlasticity::sendSelf - failed to send vector to channel\n";
00726 return -1;
00727 }
00728
00729 return 0;
00730 }
00731
00732 int
00733 MultiaxialCyclicPlasticity::recvSelf (int commitTag, Channel &theChannel,
00734 FEM_ObjectBroker &theBroker)
00735 {
00736
00737
00738 static Vector data(10);
00739 if (theChannel.recvVector(this->getDbTag(), commitTag, data) < 0) {
00740 opserr << "MultiaxialCyclicPlasticity::recvSelf - failed to recv vector from channel\n";
00741 return -1;
00742 }
00743
00744
00745 int cnt = 0;
00746 this->setTag(data(cnt++));
00747 density = data(cnt++);
00748 bulk = data(cnt++);
00749 shear = data(cnt++);
00750 R = data(cnt++);
00751 Ho = data(cnt++);
00752 h = data(cnt++);
00753 m = data(cnt++);
00754 beta = data(cnt++);
00755 eta = data(cnt++);
00756
00757
00758 return 0;
00759 }
00760
00761
00762
00763
00764
00765 double
00766 MultiaxialCyclicPlasticity::getRho()
00767 {
00768 return density;
00769 }
00770
00771
00772
00773 int MultiaxialCyclicPlasticity::updateParameter(int responseID, Information &info)
00774 {
00775
00776
00777 this-> MaterialStageID = responseID;
00778 return 0;
00779 }
00780
00781
00782
00783 void MultiaxialCyclicPlasticity::plastic_integrator()
00784 {
00785
00786 int unloadflag;
00787
00788
00789
00790 static double ZERO = 1.0e-16;
00791
00792 static double zerotol = 1.0e-10;
00793 static double tolforload= 1.0e-10;
00794 static double tolforX = 1.0e-6;;
00795
00796 double twomu;
00797 int ii,jj;
00798 int i,j,k,l;
00799
00800 static Matrix de(3,3) ;
00801 static Matrix s(3,3) ;
00802
00803 static double p;
00804 static double e;
00805
00806 static Matrix IncrStrain(3,3);
00807 static Matrix s_n(3,3);
00808 static double p_n;
00809
00810 double normchi=0;
00811 static Matrix strial(3,3);
00812 static Matrix chitri(3,3);
00813 static Matrix alpha_n(3,3);
00814 static double Psi_split;
00815 static Matrix temp6(3,3);
00816 static double dottemp6;
00817 double norm = 0;
00818
00819 double Hn =0;
00820 double Hn1=0;
00821 double ftrial;
00822 double temp;
00823 double normde;
00824 double fn;
00825 int zeroloadflag;
00826 int showdebugInfo;
00827
00828 showdebugInfo=0;
00829
00830 Vector debugInfo(10);
00831
00832 debugInfo.Zero();
00833 for ( i = 0; i < 10; i++ ) debugInfo(i) = -1.0 ;
00834
00835 unloadflag=0;
00836 zeroloadflag=0;
00837 load = 0;
00838 icounter=0;
00839 flagjustunload = 0;
00840 X[1]=0; X[2]=0;
00841
00842 iternum++;
00843
00844
00845
00846
00847
00848 IncrStrain = strain;
00849 IncrStrain -= strain_n ;
00850 e = IncrStrain(0,0) + IncrStrain(1,1) + IncrStrain(2,2) ;
00851 de = IncrStrain ;
00852 for ( i = 0; i < 3; i++ ) de(i,i) -= ( one3*e ) ;
00853
00854
00855 p_n = one3 * (stress_n(0,0)+stress_n(1,1)+stress_n(2,2));
00856 s_n = stress_n ;
00857
00858 for ( i = 0; i < 3; i++ ) s_n(i,i) -= p_n ;
00859
00860 flagfirstload++;
00861
00862
00863 if (flagfirstload==1){
00864
00865 so_n=s_n;
00866 so=so_n;
00867 backs_n=s_n;
00868 kappa=infinity;
00869 Psi=2*shear;
00870 plasticflag=0;
00871 X[1]=2*shear;
00872 X[2]=infinity;
00873 debugInfo(1)=1;
00874 goto LABEL10;
00875 }
00876
00877 so=so_n;
00878
00879
00880
00881 normde=0;
00882 for ( i = 0; i < 3; i++ ){
00883 for ( j = 0; j < 3; j++ ) {
00884 normde += de(i,j)*de(i,j) ;
00885 }
00886 }
00887
00888 if (normde >= 0.0) {
00889 normde=sqrt(normde);
00890 } else {
00891 opserr<<"MCP:1061:problem!!"<<endln;
00892 }
00893
00894 if (normde<=zerotol)
00895 {
00896 X[1] = 2*shear;
00897 X[2] = infinity;
00898 plasticflag=0;
00899 load = 1000;
00900 zeroloadflag=1;
00901 debugInfo(1)=2;
00902
00903 goto LABEL10;
00904 }
00905 MCPparameter(9) = normde ;
00906
00907
00908
00909
00910
00911
00912 double kappasave;
00913 int plasticflagsave;
00914
00915 kappasave=kappa;
00916 plasticflagsave=plasticflag_n;
00917
00918 fn=0;
00919
00920 chitri=s_n-backs_n;
00921 normchi=0;
00922 for ( i = 0; i < 3; i++ ){
00923 for ( j = 0; j < 3; j++ ) {
00924 normchi += chitri(i,j)*chitri(i,j) ;
00925 }
00926 }
00927
00928 if (normchi >= 0) {
00929 normchi =sqrt(normchi);
00930 } else {
00931 normchi = 0;
00932 opserr<<"Problem!!"<<endln;
00933 }
00934
00935 fn = normchi - R;
00936
00937 if ((fn >=0)&&(plasticflag_n!=1))
00938 {
00939 opserr<<"MCP::995:strange, fn="<<fn<<" plasticflag_n="<<plasticflag_n<<endln;
00940 showdebugInfo=1;
00941 }
00942
00943 if (fn >=0 ){
00944 kappa=0;
00945 plasticflag_n=1;
00946
00947 }
00948 else {
00949
00950 plasticflag_n=0;
00951
00952 double n1 =0;
00953 double n2 =0;
00954 double t1dott2=0;
00955
00956 n1=0.0;
00957
00958 for ( i = 0; i < 3; i++ ){
00959 for ( j = 0; j < 3; j++ ) {
00960 temp=s_n(i,j)-backs_n(i,j);
00961 n1 += temp*temp;
00962 }
00963 }
00964
00965 if (n1 >= 0.0) {
00966 n1=sqrt(n1);
00967 }
00968
00969 n2=0.0;
00970 for ( i = 0; i < 3; i++ ){
00971 for ( j = 0; j < 3; j++ ) {
00972 temp=s_n(i,j)-so_n(i,j);
00973 n2 += temp*temp ;
00974 }
00975 }
00976
00977 if (n2 >= 0.0) {
00978 n2=sqrt(n2);
00979 }
00980
00981 if (n2==0){
00982 kappa=infinity;
00983 } else{
00984 t1dott2=0;
00985 for ( i = 0; i < 3; i++ ){
00986 for ( j = 0; j < 3; j++ ) {
00987 t1dott2 += (s_n(i,j)-backs_n(i,j))*(s_n(i,j)-so_n(i,j)) ;
00988 }
00989 }
00990 t1dott2=t1dott2/(n1*n2);
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001 temp=t1dott2*n1*n2,
01002 kappa =sqrt(temp*temp+n2*n2*(R*R-normchi*normchi))-t1dott2*n1*n2;
01003 kappa *=1.0/(n2*n2);
01004
01005 if ((fabs(kappa-kappasave)>1e-6)&&((fabs(kappasave)<infinity))){
01006
01007
01008
01009 }
01010
01011 }
01012
01013 }
01014
01015
01016
01017
01018
01021
01022 kappa=kappasave;
01023
01024
01025
01026
01027
01028 for ( i = 0; i < 3; i++ ){
01029 for ( j = 0; j < 3; j++ ) {
01030 alpha_n(i,j)= so_n(i,j)+ (backs_n(i,j)-so_n(i,j)) /(1+kappa);
01031 }
01032 }
01033
01034
01035
01036
01037
01038
01039
01040 Hn=h*pow(kappa,m)+Ho;
01041
01042 Psi=2.0*shear*(1.0-shear/(shear+Hn/3.0));
01043
01044
01045
01046
01047
01048 Psi_split=2.0*shear*(1.0-shear/(shear+((1-beta)*Hn+beta*Ho)/3.0));
01049
01050
01051
01052
01053
01054
01055 load=0; temp6.Zero(); temp=0;
01056 for ( i = 0; i < 3; i++ ){
01057 for ( j = 0; j < 3; j++ ) {
01058 temp6(i,j) = s_n(i,j)-alpha_n(i,j);
01059 load += temp6(i,j)*de(i,j) ;
01060 temp += temp6(i,j)*temp6(i,j);
01061 }
01062 }
01063
01064 load *= 1.0/(sqrt(temp));
01065
01066
01067 if (load < tolforload*normde)
01068 {
01069 if (plasticflag_n==1){
01070 debugInfo(2)=1;
01071
01072
01073
01074 } else {
01075 debugInfo(2)=2;
01076
01077
01078
01079 }
01080
01081 kappa = infinity ;
01082 Psi = 2*shear;
01083 so = s_n;
01084 flagjustunload = 1;
01085 unloadflag = 1;
01086 X[1] = 2*shear;
01087 X[2] = infinity;
01088
01089 plasticflag=0;
01090 goto LABEL10;
01091
01092 }
01093
01094
01095
01096
01097
01098
01099 if (plasticflag_n==1){
01100 strial = s_n + 2.0 * shear * de;
01101 chitri = strial ;
01102 chitri-= backs_n;
01103
01104
01105 normchi = 0 ;
01106 for ( i = 0; i < 3; i++ ){
01107 for ( j = 0; j < 3; j++ ) {
01108 normchi += chitri(i,j)*chitri(i,j) ;
01109 }
01110 }
01111
01112
01113 if (normchi >= 0){
01114 normchi = sqrt(normchi);
01115 } else {
01116 opserr<<"MCP 1060::Problem, normchi<0"<<endln;
01117 }
01118
01119 ftrial=normchi-R;
01120 if (ftrial > 0){
01121 plasticflag=1;
01122 debugInfo(3)=1;
01123 } else {
01124 debugInfo(3)=2;
01125 opserr<<"MCP1419::unload from plastic" <<endln;
01126
01127 plasticflag = 0;
01128 kappa = infinity ;
01129 Psi = 2*shear;
01130 so = s_n;
01131 X[1] = 2*shear;
01132 X[2] = infinity;
01133 flagjustunload = 1;
01134 unloadflag = 1;
01135 goto LABEL10;
01136
01137 }
01138 } else {
01139 debugInfo(3)=3;
01140 chitri = Psi*de;
01141 chitri += s_n;
01142 chitri -= backs_n;
01143
01144 normchi=0;
01145 for ( i = 0; i < 3; i++ ){
01146 for ( j = 0; j < 3; j++ ) {
01147 normchi += chitri(i,j)*chitri(i,j) ;
01148 }
01149 }
01150
01151
01152 if (normchi >= 0){
01153 normchi =sqrt(normchi);
01154 } else {
01155 opserr<<"MCP 1089::Problem, normchi<0 normchi="<< normchi<<endln;
01156 }
01157
01158 plasticflag=0;
01159
01160 ftrial=normchi-R;
01161 if (ftrial >= 0) {
01162
01163 chitri = Psi_split*de;
01164 chitri += s_n;
01165 chitri -= backs_n;
01166
01167 normchi=0;
01168 for ( i = 0; i < 3; i++ ){
01169 for ( j = 0; j < 3; j++ ) {
01170 normchi += chitri(i,j)*chitri(i,j) ;
01171 }
01172 }
01173
01174
01175 if (normchi >= 0){
01176 normchi =sqrt(normchi);
01177 } else {
01178 opserr<<"MCP 1111::Problem, normchi<0"<<endln;
01179 }
01180
01181 ftrial=normchi-R;
01182 if (ftrial>=0){
01183 debugInfo(3)=4;
01184 plasticflag=2;
01185 } else {
01186 debugInfo(3)=5;
01187 plasticflag=0;
01188 }
01189 }
01190 }
01191
01192
01193
01194
01195
01196
01197
01198
01199 LABEL6:
01200 if (plasticflag==0){
01201
01202
01203
01204 X[1] = Psi ;
01205 X[2] = kappa;
01206
01207
01208
01209
01210
01211 double g1, g2;
01212 double aa, bb, cc, dd;
01213
01214 Hn = h* pow(kappa, m) + Ho;
01215 Hn1 = h* pow(X[2],m) + Ho;
01216
01217
01218 g1=X[1]-2.0*shear*(1.0-shear/(shear+((1-beta)*Hn+beta*Hn1)/3.0));
01219
01220 temp6.Zero();
01221
01222
01223 for ( i = 0; i < 3; i++ ){
01224 for ( j = 0; j < 3; j++ ) {
01225 temp6(i,j) = s_n(i,j)-backs_n(i,j) + X[1]*de(i,j) + X[2]*(s_n(i,j)+X[1]*de(i,j)-so(i,j));
01226 }
01227 }
01228
01229
01230 dottemp6=0;
01231 for ( i = 0; i < 3; i++ ){
01232 for ( j = 0; j < 3; j++ ) {
01233 dottemp6 += temp6(i,j)*temp6(i,j);
01234 }
01235 }
01236
01237 if (dottemp6 >=0){
01238 g2=R-sqrt(dottemp6);
01239 } else {
01240 opserr<<"MCP1244::problem, dottemp6<0 "<<dottemp6<<endln;
01241 g2=R;
01242 }
01243
01244 norm = g1*g1+g2*g2;
01245 if (norm >= 0){
01246 norm = sqrt(norm);
01247 } else {
01248 opserr<<"MCP::problem, norm<0 "<<norm<<endln;
01249 norm = 0.0;
01250 }
01251
01252
01253 icounter = 0;
01254
01255 while ((norm>tolforX)&&(icounter<60)&&(X[2]>0))
01256
01257 {
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269 Hn1 = h* pow(X[2],m) + Ho;
01270
01271
01272
01273
01274
01275
01276 aa = 1.0;
01277 temp=shear + ((1.0-beta)*Hn+beta*Hn1)/3.0;
01278
01279 bb= -2.0/3.0*beta*shear*shear/(temp*temp)*h*m*pow(X[2],m-1.0);
01280
01281
01282
01283 if (sqrt(dottemp6) > ZERO) {
01284 cc = 0 ;
01285 for ( i = 0; i < 3; i++ ){
01286 for ( j = 0; j < 3; j++ ) {
01287 cc += temp6(i,j)*de(i,j);
01288 }
01289 }
01290 cc *= -(1+X[2])/sqrt(dottemp6);
01291
01292 dd = 0 ;
01293 for ( i = 0; i < 3; i++ ){
01294 for ( j = 0; j < 3; j++ ) {
01295 dd += temp6(i,j)*(s_n(i,j)+X[1]*de(i,j)-so(i,j));
01296 }
01297 }
01298 dd *= -1.0/sqrt(dottemp6);
01299 } else {
01300 opserr<<"MCP:: singularity in Jacobian, dottemp6="<<dottemp6<<endln;
01301
01302 opserr<<"MCP:: X[1]="<<X[1]<<" X[2]="<<X[2]<<endln;
01303 opserr<<"MCP:: plasticflag_n="<<plasticflag_n<<" kappa="<<kappa<<" Psi="<<Psi <<endln;
01304 cc = 0;
01305 dd = 0;
01306 }
01307
01308 if (fabs(aa*dd-cc*bb)>=ZERO){
01309 X[1] += -1.0 /(aa*dd - cc*bb)*( dd*g1 - bb*g2);
01310 X[2] += -1.0 /(aa*dd - cc*bb)*(-cc*g1 + aa*g2);
01311 } else {
01312 opserr<<"MCP:: Fatal error: infinite Jacobian" <<endln;
01313
01314
01315 opserr<<"MCP::pow()="<<pow(X[2],m)<<endln;
01316 opserr<<"MCP::X[2]="<<X[2]<<endln;
01317
01318
01319 }
01320
01321 if (X[2]<=0) {
01322 icounter = 100;
01323
01324 }
01325
01326
01327
01328 Hn1 = h* pow(X[2],m) + Ho;
01329
01330
01331
01332
01333
01334 g1=X[1]-2.0*shear*(1.0-shear/(shear+((1.0-beta)*Hn+beta*Hn1)/3.0));
01335
01336
01337 temp6.Zero();
01338
01339 for ( i = 0; i < 3; i++ ){
01340 for ( j = 0; j < 3; j++ ) {
01341 temp6(i,j) = s_n(i,j)-backs_n(i,j) + X[1]*de(i,j) + X[2]*(s_n(i,j)+X[1]*de(i,j)-so(i,j));
01342 }
01343 }
01344
01345
01346 dottemp6 = 0;
01347 for ( i = 0; i < 3; i++ ){
01348 for ( j = 0; j < 3; j++ ) {
01349 dottemp6 += temp6(i,j)*temp6(i,j);
01350 }
01351 }
01352
01353 if (dottemp6 >=0){
01354 g2=R-sqrt(dottemp6);
01355 } else {
01356
01357 opserr<<"MCP1353::aa="<<aa<<" bb="<<bb<<" cc="<<cc<<" dd="<<dd<<endln;
01358 opserr<<"MCP1353::X[2]="<<X[2]<<endln;
01359 opserr<<"MCP1353::pow(X[2],m-1)"<<pow(X[2],m-1)<<endln;
01360 icounter=1353;
01361 }
01362 norm = g1*g1+g2*g2;
01363 if (norm > 0){
01364 norm = sqrt(norm);
01365 } else {
01366 norm = 0.0;
01367 }
01368
01369 icounter +=1;
01370
01371 }
01372
01373
01374 debugInfo(4)=1;
01375
01376 if ((norm > tolforX)&&(X[2]!=0)){
01377 opserr<<endln<<endln<<"MCP::X[1] X[2] is not converged!! norm = "<<norm <<" icounter="<<icounter<<endln;
01378 opserr<<"MCP::plasticflag_n= "<<plasticflag_n <<" plasticflag="<< plasticflag<<endln;
01379 opserr<<"MCP::X[2] ="<< X[2]<<endln<<endln;
01380 opserr<<"MCP::debugInfo= "<<debugInfo<<endln;
01381 showdebugInfo=1;
01382 }
01383
01384 if (X[2]<=0.0)
01385 { debugInfo(4)=2;
01386
01387
01388
01389
01390
01391
01392
01393
01394 X[2]=0.0;
01395
01396 if (unloadflag == 1){
01397 debugInfo(4)=3;
01398 plasticflag=0;
01399 X[1] = 2*shear;
01400 } else {
01401 chitri = Psi_split*de;
01402 chitri += s_n;
01403 chitri -= backs_n;
01404 normchi=0;
01405 for ( i = 0; i < 3; i++ ){
01406 for ( j = 0; j < 3; j++ ) {
01407 normchi += chitri(i,j)*chitri(i,j) ;
01408 }
01409 }
01410
01411
01412 if (normchi >= 0){
01413 normchi =sqrt(normchi);
01414 } else {
01415 opserr<<"MCP 1111::Problem, normchi<0"<<endln;
01416 }
01417
01418 ftrial=normchi-R;
01419 if (ftrial>=0){
01420 debugInfo(4)=4;
01421 plasticflag=2;
01422 X[1]=Psi_split;
01423 } else {
01424 debugInfo(4)=X[2];
01425 plasticflag=0;
01426
01427 X[1]=2.0*shear*(1.0-shear/(shear+((1.0-beta)*Hn+beta*Ho)/3.0));
01428
01429 }
01430 }
01431
01432 }
01433
01434
01435 }
01436
01437
01438
01439
01440
01441 if (plasticflag==2){
01442
01443
01444
01445 debugInfo(4)=6;
01446
01447 double chichi;
01448 double chide ;
01449 chichi=0; chide=0;
01450 for ( i = 0; i < 3; i++ ){
01451 for ( j = 0; j < 3; j++ ) {
01452 chichi += (s_n(i,j)-backs_n(i,j))*(s_n(i,j)-backs_n(i,j));
01453 chide += (s_n(i,j)-backs_n(i,j))*de(i,j);
01454 }
01455 }
01456
01457
01458 alp = (-chide+sqrt(chide*chide+normde*normde*(R*R-chichi)));
01459 alp = alp /(Psi_split *normde*normde);
01460
01461
01462 double insidesqrt;
01463 insidesqrt=chide*chide+normde*normde*(R*R-chichi);
01464
01465 if ((alp > 1.0)||(insidesqrt<0)||(alp < 0.0) ){
01466 debugInfo(4)=7;
01467 opserr<<"MCP:1394::WRONG!!! alpha="<<alp<<" chichi-R*R="<<chichi-R*R<<endln;
01468 opserr<<"MCP::debugInfo= "<<debugInfo<<endln;
01469
01470 alp=0;
01471 plasticflag=1;
01472 showdebugInfo=1;
01473 }
01474
01475 }
01476
01477
01478
01479
01481
01482 LABEL10:
01483
01484 debugInfo(0)=plasticflag_n;
01485 debugInfo(6)=normde;
01486 debugInfo(7)=plasticflag;
01487 debugInfo(8)=X[1];
01488 debugInfo(9)=X[2];
01489
01490 if (plasticflag==0)
01491 {
01492
01493 debugInfo(5)=1;
01494
01495 twomu=X[1];
01496
01497 s = s_n ;
01498 s += twomu * de;
01499 p = p_n + bulk * e ;
01500
01501 stress = s;
01502 for ( i = 0; i < 3; i++ ) stress(i,i)= s(i,i) + p ;
01503
01504 backs=backs_n;
01505
01506
01507 temp6=s-backs;
01508 temp=0;
01509 for ( i = 0; i < 3; i++ ){
01510 for ( j = 0; j < 3; j++ ) {
01511 temp += temp6(i,j)*temp6(i,j);
01512 }
01513 }
01514
01515
01516 if (sqrt(temp)-R>=0){
01517 if (unloadflag!=1){
01518 plasticflag=1;
01519 }
01520
01521
01522
01523
01524
01525
01526
01527 }
01528
01529
01530
01531
01532
01533 for ( ii = 0; ii < 6; ii++ ) {
01534 for ( jj = 0; jj < 6; jj++ ) {
01535 index_map( ii, i, j ) ;
01536 index_map( jj, k, l ) ;
01537 tangent[i][j][k][l] = bulk * IbunI[i][j][k][l] ;
01538 tangent[i][j][k][l] += twomu * IIdev[i][j][k][l] ;
01539
01540 tangent [j][i][k][l] = tangent[i][j][k][l] ;
01541 tangent [i][j][l][k] = tangent[i][j][k][l] ;
01542 tangent [j][i][l][k] = tangent[i][j][k][l] ;
01543 }
01544 }
01545 }
01546
01547 if (plasticflag > 0)
01548 {
01549
01550 if ((X[1]==2.0*shear)&&(unloadflag!=1)&&(zeroloadflag!=1)){
01551 opserr<<"MCP::warning...WHY X[1]=2G at plasticflag>0 and not unload?"<<endln;
01552 opserr<<"MCP::debugInfo= "<<debugInfo<<endln;
01553 showdebugInfo=1;
01554 }
01555
01556
01557 twomu = 2.0 * shear;
01558 if (plasticflag==1)
01559 { debugInfo(5)=2;
01560 alp = 0.0;
01561 strial = s_n ;
01562 strial += twomu*de;
01563 chitri = strial;
01564 chitri -= backs_n;
01565 Psi_split = 0;
01566 }
01567
01568 if (plasticflag==2)
01569 {
01570 debugInfo(5)=3;
01571 strial = s_n ;
01572 strial += alp * Psi_split * de;
01573 strial += (1-alp)*twomu*de;
01574 chitri = strial;
01575 chitri -= backs_n;
01576 }
01577
01578 normchi = 0.0;
01579
01580 for ( i = 0; i < 3; i++ ){
01581 for ( j = 0; j < 3; j++ ) {
01582 normchi += chitri(i,j)*chitri(i,j);
01583 }
01584 }
01585 if (normchi >= 0) {
01586 normchi = sqrt (normchi);
01587 }
01588 else {
01589 opserr<<"MCP1873:: normchi = " << normchi <<endln;
01590 opserr<<"MCP:: plastic loading with zero stresses, problem" <<endln;
01591 }
01592
01593 ftrial = normchi - R;
01594
01595 if (ftrial < ZERO)
01596 {
01597 opserr<<"MCP1472:: ftrial = " <<ftrial<<endln;
01598 opserr<<"MCP1472:: strange! set ftrial=0, plasticflag="<<plasticflag <<endln;
01599 opserr<<"MCP1372:: plasticflag_n="<<plasticflag_n<<" fn="<<fn<<" normde="<<normde<<" Psi_split="<<Psi_split<<endln;
01600 opserr<<"MCP1372:: load="<<load<<endln;
01601 showdebugInfo=1;
01602 }
01603
01604
01605 double gamma;
01606 gamma = ftrial /(twomu + 2.0*Ho/3.0);
01607
01608 gamma *= (1.0 - 1e-08) ;
01609
01610
01611
01612 backs = backs_n;
01613 backs += two3 * Ho * gamma * chitri/ normchi ;
01614
01615 s = s_n + alp * Psi_split * de;
01616 s += twomu * ((1-alp) * de - gamma * chitri/normchi );
01617
01618
01619
01620 temp6=s-backs;
01621 temp=0;
01622 for ( i = 0; i < 3; i++ ){
01623 for ( j = 0; j < 3; j++ ) {
01624 temp += temp6(i,j)*temp6(i,j);
01625 }
01626 }
01627
01628
01629 if ((sqrt(temp)-R>(1.0e-3)*R)||(sqrt(temp)-R<0)){
01630 opserr<<"MCP1690::plastic: alp = " << alp <<endln;
01631 opserr<<"MCP1690::plastic: |S|-R = " << sqrt(temp)-R<<endln;
01632 opserr<<"MCP::debugInfo= "<<debugInfo<<endln;
01633 showdebugInfo=1;
01634
01635 }
01636
01637
01638
01639 p = p_n + bulk * e;
01640
01641 stress = s ;
01642 for ( i = 0; i < 3; i++ )
01643 stress(i,i) += p ;
01644
01645
01646
01647
01648 if (Ho==0){
01649 X[1] = 0;
01650 } else
01651 {
01652 X[1] = 2.0 * shear /(1.0 + 3.0*shear/Ho);
01653 }
01654 X[2] = 0 ;
01655
01656
01657
01658 double theta1 = 1.0 - 2.0 *shear *gamma/normchi;
01659 double theta2 = 1.0/(1.0+Ho/3.0/shear) - (1.0-theta1);
01660
01661 double NbunN;
01662
01663 for ( ii = 0; ii < 6; ii++ ) {
01664 for ( jj = 0; jj < 6; jj++ ) {
01665
01666 index_map( ii, i, j ) ;
01667 index_map( jj, k, l ) ;
01668
01669 NbunN = chitri(i,j)*chitri(k,l)/(normchi*normchi) ;
01670
01671
01672
01673
01674
01675
01676
01678 tangent[i][j][k][l] = (1-alp)* bulk * IbunI[i][j][k][l] ;
01679 tangent[i][j][k][l] += (1-alp)* 2.0*shear*theta1 * IIdev[i][j][k][l] ;
01680 tangent[i][j][k][l] -= (1-alp)* 2.0*shear*theta2 * NbunN ;
01681
01682
01683
01684
01685
01686
01687
01688 tangent[i][j][k][l] += alp * bulk * IbunI[i][j][k][l] ;
01689 tangent[i][j][k][l] += alp * Psi_split * IIdev[i][j][k][l] ;
01690
01691
01692
01693
01694 tangent[j][i][k][l] = tangent[i][j][k][l] ;
01695 tangent[i][j][l][k] = tangent[i][j][k][l] ;
01696 tangent[j][i][l][k] = tangent[i][j][k][l] ;
01697
01698 }
01699 }
01700 }
01701
01702
01703
01704 if (showdebugInfo==1){
01705 opserr<<"END OF INTEGRATOR::debugInfo= "<<debugInfo<<endln;
01706 }
01707
01708
01709
01710
01711 }
01712
01713
01714 Vector MultiaxialCyclicPlasticity::MCPparameter(10) ;
01715
01716
01717
01718
01719 Vector&
01720 MultiaxialCyclicPlasticity::getMCPparameter()
01721 {
01722
01723 MCPparameter(0) = plasticflag;
01724 MCPparameter(1) = X[1];
01725 MCPparameter(2) = X[2];
01726 MCPparameter(3) = alp ;
01727 MCPparameter(4) = stress(0,1) ;
01728 MCPparameter(5) = backs(0,1) ;
01729
01730
01731 double norm = 0 ;
01732 double p = one3 * (stress(0,0)+stress(1,1)+stress(2,2));
01733 Matrix s = stress ;
01734 int i;
01735 for (i = 0; i < 3; i++ ) s(i,i) -= p ;
01736
01737 for (i = 0; i < 3; i++ ){
01738 for (int j = 0; j < 3; j++ ) {
01739 norm += (s(i,j)-backs(i,j)) * (s(i,j)-backs(i,j)) ;
01740 }
01741 }
01742
01743 MCPparameter(6) = sqrt(norm) ;
01744 MCPparameter(7) = load ;
01745
01746 norm=0;
01747 for (i = 0; i < 3; i++ ){
01748 for (int j = 0; j < 3; j++ ) {
01749 norm += (strain(i,j)) * (strain(i,j)) ;
01750 }
01751 }
01752
01753 MCPparameter(8) = norm ;
01754
01755 return MCPparameter;
01756
01757 }