00001 #include <math.h>
00002 #include "chen.h"
00003 #include "global.h"
00004 #include "genfile.h"
00005 #include "intpoints.h"
00006 #include "vecttens.h"
00007 #include "alias.h"
00008 #include "stochdriver.h"
00009 #include "matrix.h"
00010 #include "hardsoft.h"
00011
00012 chen::chen (void)
00013 {
00014
00015 fyc=0.0;
00016
00017 fyt=0.0;
00018
00019 fybc=0.0;
00020
00021 fc=0.0;
00022
00023 ft=0.0;
00024
00025 fbc=0.0;
00026
00027
00028 ay=0.0; au=0.0;
00029 ky=0.0; ku=0.0;
00030
00031
00032
00033 state=1;
00034
00035
00036
00037
00038 }
00039
00040 chen::~chen (void)
00041 {
00042
00043 }
00044
00045
00046
00047
00048
00049
00050 void chen::read (XFILE *in)
00051 {
00052
00053
00054
00055
00056
00057
00058 xfscanf (in,"%lf %lf %lf %lf %lf %lf",&fyc,&fyt,&fybc,&fc,&ft,&fbc);
00059
00060 sra.read (in);
00061
00062 hs.read (in);
00063
00064 }
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 void chen::matstiff (matrix &d,long ipp,long ido)
00077 {
00078 if (Mp->nlman->stmat==initial_stiff){
00079
00080 Mm->elmatstiff (d,ipp);
00081 }
00082 if (Mp->nlman->stmat==tangent_stiff){
00083
00084 matrix ad(d.m,d.n);
00085 Mm->elmatstiff (ad,ipp);
00086 tangentstiff (ad,d,ipp,ido);
00087 }
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 void chen::tangentstiff (matrix &d,matrix &td,long ipp,long ido)
00100 {
00101 long ncomp=Mm->ip[ipp].ncompstr;
00102 double denom1,denom2,denom,gamma;
00103 vector str,av(d.m),q(1),dfdq(1);
00104 matrix sig(3,3),am(d.m,d.n),dfds(3,3);
00105
00106 gamma=Mm->ip[ipp].eqother[ido+ncomp];
00107 if (gamma<1.0e-10){
00108 copym (d,td);
00109 }
00110 else{
00111 allocv (ncomp,str);
00112
00113
00114 Mm->givestress (0,ipp,str);
00115 vector_tensor (str,sig,Mm->ip[ipp].ssst,stress);
00116
00117 q[0]=Mm->ip[ipp].eqother[ido+ncomp+1];
00118
00119 deryieldfdsigma (sig,q,dfds);
00120 tensor_vector (str,dfds,Mm->ip[ipp].ssst,stress);
00121
00122 if (Mm->ip[ipp].ssst==planestress){
00123 vector auxstr(3);
00124 auxstr[0]=str[0];auxstr[1]=str[1];auxstr[2]=str[2];
00125 destrv (str);
00126 allocv (d.m,str);
00127 str[0]=auxstr[0];str[1]=auxstr[1];str[2]=auxstr[2];
00128 }
00129
00130 mxv (d,str,av);
00131 scprd (av,str,denom1);
00132
00133 scprd (str,str,denom2);
00134
00135 deryieldfdq (sig,q,dfdq);
00136
00137 denom2 = sqrt(denom2)*dfdq[0];
00138
00139 denom=denom1-denom2;
00140
00141
00142 if (fabs(denom)<1.0e-1 || denom>1.0e5){
00143 copym (d,td);
00144 }
00145 else{
00146 vxv (str,str,am);
00147 mxm (d,am,td);
00148 mxm (td,d,am);
00149
00150 cmulm (1.0/denom,am);
00151
00152 subm (d,am,td);
00153 }
00154
00155 destrv (str);
00156 }
00157
00158 }
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 double chen::yieldfunction (matrix &sig,vector &q)
00170 {
00171 double f,invar,j2,zone;
00172 matrix dev(3,3);
00173
00174
00175 deviator (sig,dev);
00176
00177 invar=first_invar (sig);
00178
00179 j2=second_invar(dev);
00180
00181 zone=sqrt(j2)+invar/sqrt(3.0);
00182
00183 if (state==1){
00184
00185 if(invar<0.0 && zone<0.0){
00186 ay = (fybc*fybc-fyc*fyc)/(2.0*fybc-fyc);
00187 au = (fbc*fbc-fc*fc)/(2.0*fbc-fc);
00188 ky = fyc*fybc*(2*fyc-fybc)/3.0/(2*fybc-fyc);
00189 ku = fc*fbc*(2*fc-fbc)/3.0/(2*fbc-fc);
00190
00191 if (q[0]>1.0) q[0]=1.0;
00192
00193 f = j2 + ay/3.0*invar - ky + q[0]*((au-ay)*invar/3.0 - (ku-ky));
00194 }
00195
00196 else{
00197 ay = (fyc-fyt)/2.0;
00198 au = (fc-ft)/2.0;
00199 ky = fyc*fyt/6.0;
00200 ku = fc*ft/6.0;
00201
00202 if (q[0]>1.0) q[0]=1.0;
00203
00204 f = j2 - (invar*invar)/6.0 + ay/3.0*invar - ky +q[0]*((au-ay)*invar/3.0 - (ku-ky));
00205 }
00206 }
00207 if (state==2){
00208
00209 ay = (fybc*fybc-fyc*fyc)/(2.0*fybc-fyc);
00210 au = (fbc*fbc-fc*fc)/(2.0*fbc-fc);
00211 ky = fyc*fybc*(2*fyc-fybc)/3.0/(2*fybc-fyc);
00212 ku = fc*fbc*(2*fc-fbc)/3.0/(2*fbc-fc);
00213
00214 if (q[0]>1.0) q[0]=1.0;
00215
00216 f = j2 + ay/3.0*invar - ky + q[0]*((au-ay)*invar/3.0 - (ku-ky));
00217 }
00218 if (state==3){
00219
00220 ay = (fyc-fyt)/2.0;
00221 au = (fc-ft)/2.0;
00222 ky = fyc*fyt/6.0;
00223 ku = fc*ft/6.0;
00224
00225 if (q[0]>1.0) q[0]=1.0;
00226
00227 f = j2 - (invar*invar)/6.0 + ay/3.0*invar - ky +q[0]*((au-ay)*invar/3.0 - (ku-ky));
00228 }
00229
00230 return f;
00231 }
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244 void chen::deryieldfdsigma (matrix &sig,vector &q,matrix &dfds)
00245 {
00246 double invar,j2,zone;
00247 matrix dev(3,3);
00248
00249
00250 deviator (sig,dev);
00251
00252 invar=first_invar (sig);
00253
00254 j2=second_invar(dev);
00255
00256 fillm (0.0,dfds);
00257
00258 zone=sqrt(j2)+invar/sqrt(3.0);
00259
00260 if (state==1){
00261
00262 if(invar<0.0 && zone<0.0){
00263 ay = (fybc*fybc-fyc*fyc)/(2.0*fybc-fyc);
00264 au = (fbc*fbc-fc*fc)/(2.0*fbc-fc);
00265 ky = fyc*fybc*(2*fyc-fybc)/3.0/(2*fybc-fyc);
00266 ku = fc*fbc*(2*fc-fbc)/3.0/(2*fbc-fc);
00267
00268 if (q[0]>1.0) q[0]=1.0;
00269
00270 dfds[0][0]=1.0/3.0*(2.0*sig[0][0]-sig[1][1]-sig[2][2]) + ay/3.0 + q[0]/3.0*(au-ay);
00271 dfds[1][1]=1.0/3.0*(2.0*sig[1][1]-sig[0][0]-sig[2][2]) + ay/3.0 + q[0]/3.0*(au-ay);
00272 dfds[2][2]=1.0/3.0*(2.0*sig[2][2]-sig[0][0]-sig[1][1]) + ay/3.0 + q[0]/3.0*(au-ay);
00273
00274 dfds[0][1]=2*sig[0][1];
00275 dfds[1][0]=2*sig[0][1];
00276 dfds[0][2]=2*sig[0][2];
00277 dfds[2][0]=2*sig[0][2];
00278 dfds[1][2]=2*sig[1][2];
00279 dfds[2][1]=2*sig[1][2];
00280 }
00281
00282 else{
00283 ay = (fyc-fyt)/2.0;
00284 au = (fc-ft)/2.0;
00285 ky = fyc*fyt/6.0;
00286 ku = fc*ft/6.0;
00287
00288 if (q[0]>1.0) q[0]=1.0;
00289
00290 dfds[0][0]=1.0/3.0*(2.0*sig[0][0]-sig[1][1]-sig[2][2]) + ay/3.0 - 1.0/3.0*invar + q[0]/3.0*(au-ay);
00291 dfds[1][1]=1.0/3.0*(2.0*sig[1][1]-sig[0][0]-sig[2][2]) + ay/3.0 - 1.0/3.0*invar + q[0]/3.0*(au-ay);
00292 dfds[2][2]=1.0/3.0*(2.0*sig[2][2]-sig[0][0]-sig[1][1]) + ay/3.0 - 1.0/3.0*invar + q[0]/3.0*(au-ay);
00293
00294 dfds[0][1]=2*sig[0][1];
00295 dfds[1][0]=2*sig[0][1];
00296 dfds[0][2]=2*sig[0][2];
00297 dfds[2][0]=2*sig[0][2];
00298 dfds[1][2]=2*sig[1][2];
00299 dfds[2][1]=2*sig[1][2];
00300 }
00301 }
00302 if (state==2){
00303 ay = (fybc*fybc-fyc*fyc)/(2.0*fybc-fyc);
00304 au = (fbc*fbc-fc*fc)/(2.0*fbc-fc);
00305 ky = fyc*fybc*(2*fyc-fybc)/3.0/(2*fybc-fyc);
00306 ku = fc*fbc*(2*fc-fbc)/3.0/(2*fbc-fc);
00307
00308 if (q[0]>1.0) q[0]=1.0;
00309
00310 dfds[0][0]=1.0/3.0*(2.0*sig[0][0]-sig[1][1]-sig[2][2]) + ay/3.0 + q[0]/3.0*(au-ay);
00311 dfds[1][1]=1.0/3.0*(2.0*sig[1][1]-sig[0][0]-sig[2][2]) + ay/3.0 + q[0]/3.0*(au-ay);
00312 dfds[2][2]=1.0/3.0*(2.0*sig[2][2]-sig[0][0]-sig[1][1]) + ay/3.0 + q[0]/3.0*(au-ay);
00313
00314 dfds[0][1]=2*sig[0][1];
00315 dfds[1][0]=2*sig[0][1];
00316 dfds[0][2]=2*sig[0][2];
00317 dfds[2][0]=2*sig[0][2];
00318 dfds[1][2]=2*sig[1][2];
00319 dfds[2][1]=2*sig[1][2];
00320 }
00321 if (state==3){
00322 ay = (fyc-fyt)/2.0;
00323 au = (fc-ft)/2.0;
00324 ky = fyc*fyt/6.0;
00325 ku = fc*ft/6.0;
00326
00327 if (q[0]>1.0) q[0]=1.0;
00328
00329 dfds[0][0]=1.0/3.0*(2.0*sig[0][0]-sig[1][1]-sig[2][2]) + ay/3.0 - 1.0/3.0*invar + q[0]/3.0*(au-ay);
00330 dfds[1][1]=1.0/3.0*(2.0*sig[1][1]-sig[0][0]-sig[2][2]) + ay/3.0 - 1.0/3.0*invar + q[0]/3.0*(au-ay);
00331 dfds[2][2]=1.0/3.0*(2.0*sig[2][2]-sig[0][0]-sig[1][1]) + ay/3.0 - 1.0/3.0*invar + q[0]/3.0*(au-ay);
00332
00333 dfds[0][1]=2*sig[0][1];
00334 dfds[1][0]=2*sig[0][1];
00335 dfds[0][2]=2*sig[0][2];
00336 dfds[2][0]=2*sig[0][2];
00337 dfds[1][2]=2*sig[1][2];
00338 dfds[2][1]=2*sig[1][2];
00339 }
00340 }
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351 void chen::deryieldfdsigmadsigma (matrix &sig,matrix &dfdsds)
00352 {
00353 double invar,j2,zone;
00354 matrix dev(3,3);
00355
00356
00357 deviator (sig,dev);
00358
00359 invar=first_invar (sig);
00360
00361 j2=second_invar(dev);
00362
00363 fillm (0.0,dfdsds);
00364
00365 zone = sqrt(j2)+invar/sqrt(3.0);
00366
00367 if (state==1){
00368
00369 if(invar<0.0 && zone<0.0){
00370 dfdsds[0][0] = 2.0/3.0;
00371 dfdsds[0][1] = -1.0/3.0;
00372 dfdsds[0][2] = -1.0/3.0;
00373
00374 dfdsds[1][0] = -1.0/3.0;
00375 dfdsds[1][1] = 2.0/3.0;
00376 dfdsds[1][2] = -1.0/3.0;
00377
00378 dfdsds[2][0] = -1.0/3.0;
00379 dfdsds[2][1] = -1.0/3.0;
00380 dfdsds[2][2] = 2.0/3.0;
00381
00382 dfdsds[3][3] = 2.0;
00383 dfdsds[4][4] = 2.0;
00384 dfdsds[5][5] = 2.0;
00385 }
00386
00387 else{
00388 dfdsds[0][0] = 1.0/3.0;
00389 dfdsds[0][1] = -2.0/3.0;
00390 dfdsds[0][2] = -2.0/3.0;
00391
00392 dfdsds[1][0] = -2.0/3.0;
00393 dfdsds[1][1] = 1.0/3.0;
00394 dfdsds[1][2] = -2.0/3.0;
00395
00396 dfdsds[2][0] = -2.0/3.0;
00397 dfdsds[2][1] = -2.0/3.0;
00398 dfdsds[2][2] = 1.0/3.0;
00399
00400 dfdsds[3][3] = 2.0;
00401 dfdsds[4][4] = 2.0;
00402 dfdsds[5][5] = 2.0;
00403 }
00404 }
00405 if (state==2){
00406 dfdsds[0][0] = 2.0/3.0;
00407 dfdsds[0][1] = -1.0/3.0;
00408 dfdsds[0][2] = -1.0/3.0;
00409
00410 dfdsds[1][0] = -1.0/3.0;
00411 dfdsds[1][1] = 2.0/3.0;
00412 dfdsds[1][2] = -1.0/3.0;
00413
00414 dfdsds[2][0] = -1.0/3.0;
00415 dfdsds[2][1] = -1.0/3.0;
00416 dfdsds[2][2] = 2.0/3.0;
00417
00418 dfdsds[3][3] = 2.0;
00419 dfdsds[4][4] = 2.0;
00420 dfdsds[5][5] = 2.0;
00421
00422 }
00423 if (state==3){
00424 dfdsds[0][0] = 1.0/3.0;
00425 dfdsds[0][1] = -2.0/3.0;
00426 dfdsds[0][2] = -2.0/3.0;
00427
00428 dfdsds[1][0] = -2.0/3.0;
00429 dfdsds[1][1] = 1.0/3.0;
00430 dfdsds[1][2] = -2.0/3.0;
00431
00432 dfdsds[2][0] = -2.0/3.0;
00433 dfdsds[2][1] = -2.0/3.0;
00434 dfdsds[2][2] = 1.0/3.0;
00435
00436 dfdsds[3][3] = 2.0;
00437 dfdsds[4][4] = 2.0;
00438 dfdsds[5][5] = 2.0;
00439 }
00440 }
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452 void chen::deryieldfdq (matrix &sig,vector &q,vector &dfdq)
00453 {
00454 double invar,j2,zone;
00455 matrix dev(3,3);
00456
00457
00458 deviator (sig,dev);
00459
00460 invar=first_invar (sig);
00461
00462 j2=second_invar(dev);
00463
00464 fillv (0.0,dfdq);
00465
00466 zone=sqrt(j2)+invar/sqrt(3.0);
00467
00468 if (state==1){
00469
00470 if(invar<0.0 && zone<0.0){
00471 ay = (fybc*fybc-fyc*fyc)/(2.0*fybc-fyc);
00472 au = (fbc*fbc-fc*fc)/(2.0*fbc-fc);
00473 ky = fyc*fybc*(2*fyc-fybc)/3.0/(2*fybc-fyc);
00474 ku = fc*fbc*(2*fc-fbc)/3.0/(2*fbc-fc);
00475
00476 if (q[0]<1.0)
00477 dfdq[0] = (au-ay)*invar/3.0 - (ku-ky);
00478 else
00479 dfdq[0]=0.0;
00480 }
00481
00482 else{
00483 ay = (fyc-fyt)/2.0;
00484 au = (fc-ft)/2.0;
00485 ky = fyc*fyt/6.0;
00486 ku = fc*ft/6.0;
00487
00488 if (q[0]<1.0)
00489 dfdq[0] = (au-ay)*invar/3.0 - (ku-ky);
00490 else
00491 dfdq[0]=0.0;
00492 }
00493 }
00494 if (state==2){
00495 ay = (fybc*fybc-fyc*fyc)/(2.0*fybc-fyc);
00496 au = (fbc*fbc-fc*fc)/(2.0*fbc-fc);
00497 ky = fyc*fybc*(2*fyc-fybc)/3.0/(2*fybc-fyc);
00498 ku = fc*fbc*(2*fc-fbc)/3.0/(2*fbc-fc);
00499
00500 if (q[0]<1.0)
00501 dfdq[0] = (au-ay)*invar/3.0 - (ku-ky);
00502 else
00503 dfdq[0]=0.0;
00504 }
00505 if (state==3){
00506 ay = (fyc-fyt)/2.0;
00507 au = (fc-ft)/2.0;
00508 ky = fyc*fyt/6.0;
00509 ku = fc*ft/6.0;
00510
00511 if (q[0]<1.0)
00512 dfdq[0] = (au-ay)*invar/3.0 - (ku-ky);
00513 else
00514 dfdq[0]=0.0;
00515 }
00516 }
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528 void chen::deryieldfdsigmadq (matrix &sig,vector &q,matrix &dfdsdq)
00529 {
00530 double invar,j2,zone;
00531 matrix dev(3,3);
00532
00533
00534 deviator (sig,dev);
00535
00536 invar=first_invar (sig);
00537
00538 j2=second_invar(dev);
00539
00540 fillm (0.0,dfdsdq);
00541
00542 zone=sqrt(j2)+invar/sqrt(3.0);
00543
00544 if (state==1){
00545
00546 if(invar<0.0 && zone<0.0){
00547 ay = (fybc*fybc-fyc*fyc)/(2.0*fybc-fyc);
00548 au = (fbc*fbc-fc*fc)/(2.0*fbc-fc);
00549 ky = fyc*fybc*(2*fyc-fybc)/3.0/(2*fybc-fyc);
00550 ku = fc*fbc*(2*fc-fbc)/3.0/(2*fbc-fc);
00551
00552 if (q[0]<1.0){
00553 dfdsdq[0][0]=(au-ay)/3.0;
00554 dfdsdq[1][0]=(au-ay)/3.0;
00555 dfdsdq[2][0]=(au-ay)/3.0;
00556 }
00557
00558 dfdsdq[3][0]=0.0;
00559 dfdsdq[4][0]=0.0;
00560 dfdsdq[5][0]=0.0;
00561 }
00562
00563 else{
00564 ay = (fyc-fyt)/2.0;
00565 au = (fc-ft)/2.0;
00566 ky = fyc*fyt/6.0;
00567 ku = fc*ft/6.0;
00568
00569 if (q[0]<1.0){
00570 dfdsdq[0][0]=(au-ay)/3.0;
00571 dfdsdq[1][0]=(au-ay)/3.0;
00572 dfdsdq[2][0]=(au-ay)/3.0;
00573 }
00574
00575 dfdsdq[3][0]=0.0;
00576 dfdsdq[4][0]=0.0;
00577 dfdsdq[5][0]=0.0;
00578 }
00579 }
00580 if (state==2){
00581 ay = (fybc*fybc-fyc*fyc)/(2.0*fybc-fyc);
00582 au = (fbc*fbc-fc*fc)/(2.0*fbc-fc);
00583 ky = fyc*fybc*(2*fyc-fybc)/3.0/(2*fybc-fyc);
00584 ku = fc*fbc*(2*fc-fbc)/3.0/(2*fbc-fc);
00585
00586 if (q[0]<1.0){
00587 dfdsdq[0][0]=(au-ay)/3.0;
00588 dfdsdq[1][0]=(au-ay)/3.0;
00589 dfdsdq[2][0]=(au-ay)/3.0;
00590 }
00591
00592 dfdsdq[3][0]=0.0;
00593 dfdsdq[4][0]=0.0;
00594 dfdsdq[5][0]=0.0;
00595 }
00596 if (state==3){
00597 ay = (fyc-fyt)/2.0;
00598 au = (fc-ft)/2.0;
00599 ky = fyc*fyt/6.0;
00600 ku = fc*ft/6.0;
00601
00602 if (q[0]<1.0){
00603 dfdsdq[0][0]=(au-ay)/3.0;
00604 dfdsdq[1][0]=(au-ay)/3.0;
00605 dfdsdq[2][0]=(au-ay)/3.0;
00606 }
00607
00608 dfdsdq[3][0]=0.0;
00609 dfdsdq[4][0]=0.0;
00610 dfdsdq[5][0]=0.0;
00611 }
00612
00613 }
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626 void chen::dhdsigma (matrix &sigt,vector &q,matrix &dhds)
00627 {
00628 matrix dfds(3,3),dfdsds(6,6);
00629
00630
00631 deryieldfdsigma (sigt,q,dfds);
00632
00633 deryieldfdsigmadsigma (sigt,dfdsds);
00634
00635 hs.dhdsigma (sigt,dfds,dfdsds,dhds);
00636
00637 if (q[0]>=1.0)
00638 fillm (0.0,dhds);
00639 }
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650 void chen::dhdqpar (matrix &sigt,vector &q,matrix &dhdq)
00651 {
00652 matrix dfds(3,3),dfdsdq(6,1);
00653
00654
00655 deryieldfdsigma (sigt,q,dfds);
00656
00657 deryieldfdsigmadq (sigt,q,dfdsdq);
00658
00659 hs.dhdqpar (sigt,dfds,dfdsdq,dhdq);
00660
00661 if (q[0]>=1.0)
00662 fillm (0.0,dhdq);
00663 }
00664
00665
00666
00667
00668
00669
00670
00671
00672 void chen::dhdgamma (vector &dhdg)
00673 {
00674
00675 hs.dhdgamma (dhdg);
00676 }
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687 void chen::hvalues (matrix &sigt,vector &q,vector &h)
00688 {
00689 matrix dfds(3,3),dfdsds(6,6);
00690
00691
00692 deryieldfdsigma (sigt,q,dfds);
00693
00694 hs.hvalues (sigt,dfds,h);
00695 }
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708 void chen::nlstresses (long ipp, long im, long ido)
00709 {
00710 long i,ni,n;
00711 double gamma,err;
00712
00713
00714 n = Mm->ip[ipp].ncompstr;
00715
00716 vector epsn(n),epsp(n),q(1);
00717
00718
00719 for (i=0;i<n;i++){
00720
00721 epsn[i]=Mm->ip[ipp].strain[i];
00722
00723 epsp[i]=Mm->ip[ipp].eqother[ido+i];
00724 }
00725
00726 gamma = Mm->ip[ipp].eqother[ido+n];
00727
00728
00729
00730
00731
00732
00733 q[0]=Mm->ip[ipp].eqother[ido+n+1];
00734
00735
00736 if (sra.give_tsra () == cp){
00737 ni=sra.give_ni ();
00738 err=sra.give_err ();
00739
00740
00741
00742
00743 Mm->newton_stress_return_2 (ipp,im,ido,gamma,epsn,epsp,q,ni,err);
00744
00745
00746 }
00747 else{
00748 fprintf (stderr,"\n\n wrong type of stress return algorithm is required in nlstresses (file %s, line %d).\n",__FILE__,__LINE__);
00749 abort ();
00750 }
00751
00752
00753
00754
00755 for (i=0;i<n;i++){
00756 Mm->ip[ipp].other[ido+i]=epsp[i];
00757 }
00758 Mm->ip[ipp].other[ido+n]=gamma;
00759 Mm->ip[ipp].other[ido+n+1]=q[0];
00760
00761 }
00762
00763 void chen::nonloc_nlstresses (long ipp, long im, long ido)
00764 {
00765 long i,ni, n = Mm->ip[ipp].ncompstr;
00766 double gamma,err;
00767 vector epsn(n),epsp(n),q(1);
00768
00769
00770 for (i=0;i<n;i++){
00771 epsn[i]=Mm->ip[ipp].strain[i];
00772 epsp[i]=Mm->ip[ipp].nonloc[i];
00773 }
00774 gamma = Mm->ip[ipp].eqother[ido+n];
00775 q[0] = Mm->ip[ipp].eqother[ido+n+1];
00776
00777
00778 if (sra.give_tsra () == cp){
00779 ni=sra.give_ni ();
00780 err=sra.give_err ();
00781
00782 Mm->cutting_plane (ipp,im,ido,gamma,epsn,epsp,q,ni,err);
00783 }
00784 else{
00785 fprintf (stderr,"\n\n wrong type of stress return algorithm is required in nlstresses (file %s, line %d).\n",__FILE__,__LINE__);
00786 abort ();
00787 }
00788
00789
00790 for (i=0;i<n;i++){
00791 Mm->ip[ipp].other[ido+i]=epsp[i];
00792 }
00793 Mm->ip[ipp].other[ido+n]=gamma;
00794 Mm->ip[ipp].other[ido+n+1]=q[0];
00795 }
00796
00797
00798
00799
00800
00801
00802 void chen::updateval (long ipp, long im, long ido)
00803 {
00804 long i,n = Mm->givencompeqother(ipp, im);
00805
00806 for (i=0;i<n;i++){
00807 Mm->ip[ipp].eqother[ido+i]=Mm->ip[ipp].other[ido+i];
00808 }
00809 }
00810
00811
00812
00813
00814
00815
00816 void chen::changeparam (atsel &atm,vector &val)
00817 {
00818 long i;
00819
00820 for (i=0;i<atm.nba;i++){
00821 switch (atm.atrib[i]){
00822 case 0:{
00823 fyc=val[i];
00824 break;
00825 }
00826 case 1:{
00827 fyt=val[i];
00828 break;
00829 }
00830 case 2:{
00831 fybc=val[i];
00832 break;
00833 }
00834 case 3:{
00835 fc=val[i];
00836 break;
00837 }
00838 case 4:{
00839 ft=val[i];
00840 break;
00841 }
00842 case 5:{
00843 fbc=val[i];
00844 break;
00845 }
00846 default:{
00847 fprintf (stderr,"\n\n wrong number of atribute in function changeparam (file %s, line %d).\n",__FILE__,__LINE__);
00848 }
00849 }
00850 }
00851
00852
00853 hs.changeparam (atm,val);
00854
00855 }
00856
00857 double chen::give_consparam (long ipp,long ido)
00858 {
00859 long ncompstr;
00860 double gamma;
00861
00862 ncompstr=Mm->ip[ipp].ncompstr;
00863 gamma = Mm->ip[ipp].eqother[ido+ncompstr];
00864
00865 return gamma;
00866 }
00867
00868 long chen::give_num_interparam ()
00869 {
00870 return 1;
00871 }
00872
00873 void chen::give_interparam (long ipp,long ido,vector &q)
00874 {
00875 long ncompstr=Mm->ip[ipp].ncompstr;
00876
00877 q[0]=Mm->ip[ipp].eqother[ido+ncompstr+1];
00878 }
00879