00001 #include "varelastisomat.h"
00002 #include "matrix.h"
00003 #include "vector.h"
00004 #include "stochdriver.h"
00005 #include "global.h"
00006 #include "intpoints.h"
00007
00008
00009
00010
00011
00012
00013
00014
00015 varelastisomat::varelastisomat (void)
00016 {
00017
00018 e = 0.0;
00019
00020 nu = 0.0;
00021 }
00022
00023
00024
00025
00026
00027
00028
00029
00030 varelastisomat::~varelastisomat (void)
00031 {
00032
00033 }
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 void varelastisomat::read (XFILE *in)
00047 {
00048
00049
00050 xfscanf (in,"%lf %lf",&e,&nu);
00051 }
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 void varelastisomat::matstiff (matrix &d, long ipp)
00066 {
00067 elmatstiff(d, ipp);
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 void varelastisomat::elmatstiff (matrix &d, long ipp)
00083 {
00084 strastrestate ssst = Mm->ip[ipp].ssst;
00085 double e_c = Mm->give_actual_ym(ipp);
00086 double nu_c = Mm->give_actual_nu(ipp);
00087
00088 switch (ssst){
00089 case bar:{
00090 matstiff_bar (d, e_c);
00091 break;
00092 }
00093 case plbeam:{
00094 matstiff_plbeam (d, e_c, nu_c);
00095 break;
00096 }
00097 case spacebeam:{
00098 matstiff_spacebeam (d, e_c, nu_c);
00099 break;
00100 }
00101 case planestress:{
00102 matstiff_plstress (d, e_c, nu_c);
00103 break;
00104 }
00105 case planestrain:{
00106 matstiff_plstrain (d, e_c, nu_c);
00107 break;
00108 }
00109 case platek:{
00110 matstiff_platek (d, e_c, nu_c);
00111 break;
00112 }
00113 case plates:{
00114 matstiff_plates (d, e_c, nu_c);
00115 break;
00116 }
00117 case axisymm:{
00118 matstiff_axi (d, e_c, nu_c);
00119 break;
00120 }
00121 case spacestress:{
00122 matstiff_spacestr (d, e_c, nu_c);
00123 break;
00124 }
00125 default:{
00126 print_err("unknown number of components of stress tensor is required", __FILE__, __LINE__, __func__);
00127 }
00128 }
00129 }
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 void varelastisomat::matstiff_bar (matrix &d, double e_c)
00145 {
00146 d[0][0] = e_c;
00147 }
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 void varelastisomat::matstiff_plbeam (matrix &d, double e_c, double nu_c)
00164 {
00165 d[0][0] = e_c;
00166 d[1][1] = e_c/2.0/(1.0+nu_c);
00167 d[2][2] = e_c;
00168 }
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184 void varelastisomat::matstiff_spacebeam (matrix &d, double e_c, double nu_c)
00185 {
00186 d[0][0] = e_c;
00187 d[1][1] = e_c/2.0/(1.0+nu_c);
00188 d[2][2] = e_c/2.0/(1.0+nu_c);
00189 d[3][3] = e_c/2.0/(1.0+nu_c);
00190 d[4][4] = e_c;
00191 d[5][5] = e_c;
00192 }
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 void varelastisomat::matstiff_plstress (matrix &d, double e_c, double nu_c)
00209 {
00210 double c;
00211
00212 fillm(0.0,d);
00213
00214 c = e_c/(1.0-nu_c*nu_c);
00215
00216 d[0][0] = c; d[0][1] = c*nu_c; d[0][2] = 0.0;
00217 d[1][0] = c*nu_c; d[1][1] = c; d[1][2] = 0.0;
00218 d[2][0] = 0.0; d[2][1] = 0.0; d[2][2] = e_c/2.0/(1.0+nu_c);
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 void varelastisomat::matstiff_plstrain (matrix &d, double e_c, double nu_c)
00236 {
00237 double c;
00238
00239 fillm(0.0,d);
00240
00241 c = e_c/(1.0+nu_c)/(1.0-2.0*nu_c);
00242
00243 d[0][0] = c*(1.0-nu_c); d[0][1] = c*nu_c; d[0][2] = 0.0;
00244 d[1][0] = c*nu_c; d[1][1] = c*(1.0-nu_c); d[1][2] = 0.0;
00245 d[2][0] = 0.0; d[2][1] = 0.0; d[2][2] = e_c/2.0/(1.0+nu_c);
00246
00247 if (d.m > 3)
00248 {
00249 d[0][3] = d[0][1]; d[1][3] = d[1][0];
00250 d[3][0] = d[1][0]; d[3][1] = d[1][0]; d[3][3] = d[1][1];
00251 }
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 void varelastisomat::matstiff_axi (matrix &d, double e_c, double nu_c)
00269 {
00270 double g,s;
00271
00272 fillm(0.0,d);
00273
00274 g = e_c/2.0/(1.0+nu_c);
00275 s = e_c/(1.0+nu_c)/(1.0-2.0*nu_c);
00276
00277 d[0][0]=s*(1-nu_c); d[0][1]=s*nu_c; d[0][2]=d[0][1];
00278 d[1][0]=d[0][1]; d[1][1]=d[0][0]; d[1][2]=d[0][1];
00279 d[2][0]=d[0][1]; d[2][1]=d[0][1]; d[2][2]=d[0][0];
00280
00281 d[3][3]=g;
00282
00283 }
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300 void varelastisomat::matstiff_platek (matrix &d, double e_c, double nu_c)
00301 {
00302 double c,g;
00303
00304 fillm(0.0,d);
00305
00306 c = e_c/12.0/(1.0-nu_c*nu_c);
00307 g = e_c/2.0/(1.0+nu_c);
00308
00309 d[0][0]=c; d[0][1]=c*nu_c; d[0][2]=0.0;
00310 d[1][0]=d[0][1]; d[1][1]=c; d[1][2]=0.0;
00311 d[2][0]=0.0; d[2][1]=0.0; d[2][2]=g/12.0;
00312
00313 }
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330 void varelastisomat::matstiff_plates (matrix &d, double e_c, double nu_c)
00331 {
00332 double c,g;
00333
00334 fillm(0.0,d);
00335
00336 c = e_c/12.0/(1.0-nu_c*nu_c);
00337 g = e_c/2.0/(1.0+nu_c);
00338
00339 d[0][0]=c; d[0][1]=c*nu_c; d[0][2]=0.0;
00340 d[1][0]=d[0][1]; d[1][1]=c; d[1][2]=0.0;
00341 d[2][0]=0.0; d[2][1]=0.0; d[2][2]=g/12.0;
00342
00343 d[3][3]=g; d[4][4]=g;
00344 }
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358 void varelastisomat::matstiff_spacestr (matrix &d, double e_c, double nu_c)
00359 {
00360 double g,s;
00361
00362 fillm(0.0,d);
00363
00364 g = e_c/2.0/(1.0+nu_c);
00365 s = e_c/(1.0+nu_c)/(1.0-2.0*nu_c);
00366
00367 d[0][0]=s*(1-nu_c); d[0][1]=s*nu_c; d[0][2]=s*nu_c;
00368 d[1][0]=d[0][1]; d[1][1]=d[0][0]; d[1][2]=d[0][1];
00369 d[2][0]=d[0][1]; d[2][1]=d[0][1]; d[2][2]=d[0][0];
00370
00371 d[3][3]=g; d[4][4]=g; d[5][5]=g;
00372 }
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387 void varelastisomat::matcompl (matrix &c, long ipp)
00388 {
00389 strastrestate ssst = Mm->ip[ipp].ssst;
00390 double e_c = Mm->give_actual_ym(ipp);
00391 double nu_c = Mm->give_actual_nu(ipp);
00392
00393 switch (ssst){
00394 case bar:{
00395 matcompl_bar (c, e_c);
00396 break;
00397 }
00398 case plbeam:{
00399 matcompl_plbeam (c, e_c, nu_c);
00400 break;
00401 }
00402 case planestress:{
00403 matcompl_plstress (c, e_c, nu_c);
00404 break;
00405 }
00406 case planestrain:{
00407 matcompl_plstrain (c, e_c, nu_c);
00408 break;
00409 }
00410 case axisymm:{
00411 matcompl_axi (c, e_c, nu_c);
00412 break;
00413 }
00414 case spacestress:{
00415 matcompl_spacestr (c, e_c, nu_c);
00416 break;
00417 }
00418 default:{
00419 print_err("unknown number of components of stress tensor is required", __FILE__, __LINE__, __func__);
00420 }
00421 }
00422 }
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437 void varelastisomat::matcompl_bar (matrix &c, double e_c)
00438 {
00439 c[0][0] = 1.0/e_c;
00440 }
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456 void varelastisomat::matcompl_plbeam (matrix &c, double e_c, double nu_c)
00457 {
00458 c[0][0] = 1.0/e_c;
00459 c[1][1] = 2.0*(1.0+nu_c)/e_c;
00460 c[2][2] = 1.0/e_c;
00461 }
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477 void varelastisomat::matcompl_plstress (matrix &c, double e_c, double nu_c)
00478 {
00479 fillm(0.0,c);
00480
00481 c[0][0] = 1.0/e_c; c[0][1] = -1.0*nu_c/e_c; c[0][2] = 0.0;
00482 c[1][0] = -1.0*nu_c/e_c; c[1][1] = 1.0/e_c; c[1][2] = 0.0;
00483 c[2][0] = 0.0; c[2][1] = 0.0; c[2][2] = 2.0*(1.0+nu_c)/e_c;
00484 }
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500 void varelastisomat::matcompl_plstrain (matrix &c, double e_c, double nu_c)
00501 {
00502 double g;
00503
00504 fillm(0.0,c);
00505
00506 g = (1.0+nu_c)/e_c;
00507
00508 c[0][0] = g*(1.0-nu_c); c[0][1] = -1.0*g*nu_c; c[0][2] = 0.0;
00509 c[1][0] = -1.0*g*nu_c; c[1][1] = g*(1.0-nu_c); c[1][2] = 0.0;
00510 c[2][0] = 0.0; c[2][1] = 0.0; c[2][2] = 2.0*g;
00511 }
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527 void varelastisomat::matcompl_axi (matrix &c, double e_c, double nu_c)
00528 {
00529 double g;
00530 fillm(0.0,c);
00531
00532 g = 2.0*(1.0+nu_c)/e_c;
00533
00534 c[0][0]=1.0/e_c; c[0][1]=-1.0*nu_c/e_c; c[0][2]=c[0][1]; c[0][3]=0.0;
00535 c[1][0]=c[0][1]; c[1][1]=c[0][0]; c[1][2]=c[0][1]; c[1][3]=0.0;
00536 c[2][0]=c[0][1]; c[2][1]=c[0][1]; c[2][2]=c[0][0]; c[2][3]=0.0;
00537
00538 c[3][0]=c[0][3]; c[3][1]=c[1][3]; c[3][2]=c[2][3]; c[3][3]=g;
00539 }
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555 void varelastisomat::matcompl_spacestr (matrix &c, double e_c, double nu_c)
00556 {
00557 double g;
00558 fillm(0.0,c);
00559
00560 g = 2.0*(1.0+nu_c)/e_c;
00561
00562 c[0][0]=1.0/e_c; c[0][1]=-1.0*nu_c/e_c; c[0][2]=c[0][1];
00563 c[1][0]=c[0][1]; c[1][1]=c[0][0]; c[1][2]=c[0][1];
00564 c[2][0]=c[0][1]; c[2][1]=c[0][1]; c[2][2]=c[0][0];
00565
00566 c[3][3]=g; c[4][4]=g; c[5][5]=g;
00567 }
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580 void varelastisomat::nlstresses (long ipp)
00581 {
00582 long i, n = Mm->ip[ipp].ncompstr;
00583 double nu_c = Mm->give_actual_nu(ipp);
00584 vector eps(n),sig(n);
00585 strastrestate ssst = Mm->ip[ipp].ssst;
00586 matrix d(n,n);
00587
00588
00589 for (i=0;i<n;i++){
00590 eps[i]=Mm->ip[ipp].strain[i];
00591 }
00592
00593 matstiff (d,ssst);
00594 mxv (d,eps,sig);
00595 if (Mm->ip[ipp].ssst == planestress)
00596 Mm->ip[ipp].strain[3] = -nu_c / (1.0 - nu_c) * (eps[0]+eps[1]);
00597
00598 for (i=0;i<n;i++){
00599 Mm->ip[ipp].stress[i]=sig[i];
00600 }
00601
00602 }
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616 void varelastisomat::changeparam (atsel &atm,vector &val)
00617 {
00618 long i;
00619
00620 for (i=0;i<atm.num;i++){
00621 switch (atm.atrib[i]){
00622 case 0:{
00623 e=val[i];
00624 break;
00625 }
00626 case 1:{
00627 nu=val[i];
00628 break;
00629 }
00630 default:{
00631 print_err("wrong number of atribute is required", __FILE__, __LINE__, __func__);
00632 }
00633 }
00634 }
00635 }