00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "time.h"
00022 #include "limits.h"
00023 #include "math.h"
00024 #include "float.h"
00025
00026 #include "BJtensor.h"
00027 #include "stresst.h"
00028 #include "straint.h"
00029 #include "BJvector.h"
00030 #include "BJmatrix.h"
00031 #include "iostream.h"
00032
00033 int main(int argc, char *argv[])
00034 {
00035 if (argc != 2)
00036 {
00037 puts("\a\n usage: elast_tst test01.std\n");
00038 exit( 1 );
00039 }
00040 ::printf("\n\n------------- MACHINE (CPU) DEPENDENT THINGS --------------\n\n");
00041
00042
00043 float float_eps = f_macheps();
00044 double double_eps = d_macheps();
00045
00046
00047 ::printf("\n float macheps = %.20e \n",float_eps);
00048 ::printf(" double macheps = %.20e \n",double_eps);
00049
00050
00051
00052
00053 float sqrt_f_eps = sqrt(f_macheps());
00054 double sqrt_d_eps = sqrt(d_macheps());
00055
00056
00057 ::printf("\n sqrt float macheps = %.20e \n",sqrt_f_eps);
00058 ::printf(" sqrt double macheps = %.20e \n",sqrt_d_eps);
00059
00060
00061
00062 double one = 1.0;
00063 double onepmc = 1.0+double_eps;
00064 ::printf("\n one = %.32e \n",one);
00065 ::printf("onepmc = %.32e \n",onepmc);
00066 if (one == onepmc)
00067 {
00068 printf("1.0 == 1.0+double_eps -->> OK \n");
00069 }
00070 else
00071 {
00072 printf("1.0 == 1.0+double_eps -->> NOT OK \n");
00073 }
00074
00075
00076
00077 double one2 = 10e20;
00078 double onepmc2 = 10e20*(1.0+double_eps);
00079 ::printf("\n one2 = %.32e \n",one2);
00080 ::printf("onepmc2 = %.32e \n",onepmc2);
00081 if (one2 == onepmc2)
00082 {
00083 printf("10e20 == 10e20*(1.0+double_eps) -->> OK \n");
00084 }
00085 else
00086 {
00087 printf("10e20 == 10e20*(1.0+double_eps) -->> NOT OK \n");
00088 }
00089
00090
00091
00092 double one3 = 1.0;
00093 double onepmc3 = 1.0+double_eps*10000.0;
00094 ::printf("\n one3 = %.32e \n",one3);
00095 ::printf("onepmc3 = %.32e\n",onepmc3);
00096 if (one3 == onepmc3)
00097 {
00098 printf("1.0 == 1.0+double_eps*10.0 -->> OK \n");
00099 }
00100 else
00101 {
00102 printf("1.0 == 1.0+double_eps*10.0 -->> NOT OK \n");
00103 }
00104
00105
00106 ::printf("\n\n---------------- MATRIX -----------------\n\n");
00107
00108
00109
00110
00111 BJmatrix matrix1;
00112 matrix1.print("m1","matrix1");
00113
00114 static double initvalue[] = {1.0, 2.0,
00115 3.0, 4.0};
00116
00117 BJmatrix matrix2(2,2,initvalue);
00118 matrix2.print("m2","matrix2");
00119
00120
00121 BJmatrix matrix3("I",3);
00122 matrix3.print("m3","matrix3");
00123
00124
00125 BJmatrix m(argv[1]);
00126 m.print("m","m is");
00127
00128
00129 BJmatrix first_matrix = m;
00130 first_matrix.print("fm","first_matrix is");
00131
00132
00133
00134 ::printf("\n\n--------EIGENVECTORS and EIGENVALUES-----------\n");
00135 static double symm_initvalue[] = {1.0, 0.0,
00136 0.0, 0.0};
00137
00138 BJmatrix sym_matrix(2,2,symm_initvalue);
00139 sym_matrix.print("m","Sym_matrix");
00140
00141
00142 BJvector eval = sym_matrix.eigenvalues();
00143 eval.print("ev","Eigenvalues of sym_matrix");
00144
00145 BJmatrix evect = sym_matrix.eigenvectors();
00146 evect.print("ev","Eigenvectors of sym_matrix");
00147
00148
00149 m.write_standard("test.dat", "this is a test");
00150
00151
00152 if ( first_matrix == m ) ::printf("\n first_matrix == m TRUE \n");
00153 else ::printf("\a\n first_matrix == m NOTTRUE \n");
00154
00155
00156 BJmatrix m2 =m+m;
00157 m2.print("m2","\nm+m = \n");
00158
00159
00160 if ( m2 == m ) ::printf("\a\n m2 == m TRUE \n");
00161 else ::printf("\n m2 == m NOTTRUE \n");
00162
00163 BJmatrix m3 =m-m;
00164 m3.print("m3","\nm-m = \n");
00165
00166
00167 BJmatrix m4 = m*m;
00168 m4.print("m4","\n m*m = \n");
00169
00170
00171 BJmatrix mtran = m.transpose();
00172 mtran.print("mt","transpose of m is");
00173
00174
00175
00176 printf("determinant = %6.6f \n",m.determinant());
00177
00178
00179
00180 BJmatrix minv = m.inverse();
00181 minv.print("mi","inverse of m is");
00182
00183 ( m * minv ).print("1"," m * m.inverse() ");
00184
00185
00186 printf("min = %6.6f \n", m.mmin() );
00187 printf("max = %6.6f \n", m.mmax() );
00188 printf("mean = %6.6f \n", m.mean() );
00189 printf("variance = %6.6f \n", m.variance() );
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365 static double vect1[] = {2.0, 3.0, -2.0, 5.0, -2.0};
00366 static double vect2[] = {1.0, 1.0, 1.0, 1.0, 1.0};
00367
00368
00369 BJvector first_vector( 5, vect1);
00370 first_vector.print("f","\n\nfirst_vector vector\n");
00371
00372
00373 BJvector second_vector ( 5, vect2);
00374 second_vector.print("s","\n\nsecond_vector vector\n");
00375
00376
00377 BJvector third_vector;
00378
00379 third_vector = first_vector + second_vector;
00380 third_vector.print("t","\nfirst_vector + second_vector = \n");
00381
00382 BJvector dot_product = first_vector.transpose() * second_vector;
00383
00384
00385
00386
00387
00388 printf("\n\n------------VECTOR AND MATRIX -----------------\n\n");
00389 static double vect3[] = {1.0, 2.0, 3.0, 4.0, 5.0};
00390
00391
00392 BJmatrix res1;
00393 BJmatrix res2;
00394
00395
00396 BJmatrix vect_as_matrix(5, 1, vect3);
00397 BJvector vect(5, vect3);
00398
00399 first_matrix.print("f","\n first matrix");
00400
00401
00402 vect_as_matrix.print("vm","\n vector as matrix");
00403 vect.print("v","\n vector");
00404
00405
00406 res1 = vect_as_matrix.transpose() * first_matrix;
00407 res2 = vect.transpose() * first_matrix;
00408
00409 res1.print("r1","\n result");
00410 res2.print("r2","\n result");
00411
00412
00413
00414 ::printf("\n\n----------------- TENSOR --------------------\n\n");
00415
00416
00417
00418
00419
00420 tensor t1;
00421 t1.print("t1","\n tensor t1");
00422
00423 static double t2values[] = { 1,2,3,
00424 4,5,6,
00425 7,8,9 };
00426
00427 tensor t2( 2, def_dim_2, t2values);
00428 t2.print("t2","\ntensor t2 (2nd-order with values assignement)");
00429
00430 cerr << "rank of t2: " << t2.rank() << endl;
00431 for (int ii=1; ii<=t2.rank(); ii++) {
00432 cerr << "dimension of t2 in " << ii << " is " << t2.dim(ii) << endl;
00433 }
00434
00435
00436 tensor tst( 2, def_dim_2, t2values);
00437
00438
00439 t2.print("t2","\noriginal tensor t2 ");
00440 tst.print("tst","\ntst ");
00441
00442 tensor t2xt2 = t2("ij")*t2("jk");
00443 t2xt2.print("t2xt2","\ntensor t2 x t2");
00444
00445 tensor t2xtst = t2("ij")*tst("jk");
00446 t2xtst.print("t2xtst","\ntensor t2 x tst");
00447
00448 t2.print("t2","\noriginal tensor t2 ");
00449
00450
00451 tensor ZERO(4,def_dim_4,0.0);
00452 ZERO.print("z","\ntensor ZERO (4-th order with value assignment)");
00453
00454 static double t4val[] =
00455 { 11.100, 12.300, 13.100, 15.230, 16.450, 14.450, 17.450, 18.657, 19.340,
00456 110.020, 111.000, 112.030, 114.034, 115.043, 113.450, 116.670, 117.009, 118.060,
00457 128.400, 129.500, 130.060, 132.560, 133.000, 131.680, 134.100, 135.030, 136.700,
00458 119.003, 120.400, 121.004, 123.045, 124.023, 122.546, 125.023, 126.043, 127.000,
00459 137.500, 138.600, 139.000, 141.067, 142.230, 140.120, 143.250, 144.030, 145.900,
00460 146.060, 147.700, 148.990, 150.870, 151.000, 149.780, 152.310, 153.200, 154.700,
00461 164.050, 165.900, 166.003, 168.450, 169.023, 167.067, 170.500, 171.567, 172.500,
00462 155.070, 156.800, 157.067, 159.000, 160.230, 158.234, 161.470, 162.234, 163.800,
00463 173.090, 174.030, 175.340, 177.060, 178.500, 176.000, 179.070, 180.088, 181.200};
00464
00465
00466 tensor t4(4, def_dim_4, t4val);
00467 t4.print("t4","\ntensor t4 (4th-order with values assignment)");
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485 tensor tst1;
00486 tensor temp = t2("ij") * t4("ijkl");
00487 tst1 = temp("kl") * t4("klpq") * t2("pq");
00488 tst1.print("tst1","\ntensor tst1 = t2(\"ij\")*t4(\"ijkl\")*t4(\"klpq\")*t2(\"pq\");");
00489
00490
00491
00492
00493
00494 tensor t4inv_2 = t4.inverse_2();
00495 t4inv_2.print("t4i","\ntensor t4 inverted_2");
00496 tensor unity_2 = t4("ijkl")*t4inv_2("klpq");
00497 unity_2.print("uno2","\ntensor unity_2");
00498
00499
00500
00501
00502 tensor e("e",3,def_dim_3);
00503 e.print("e","\nLevi-Civita permutation tensor e");
00504
00505
00506
00507 tensor I2("I", 2, def_dim_2);
00508 I2.print("I2","\ntensor I2 (2nd order unit tensor: Kronecker Delta -> d_ij)");
00509
00510
00511
00512 tensor Ipmnq = I2("pm") * I2("nq");
00513 tensor Imnpq = I2("mn") * I2("pq");
00514
00515
00516
00518
00519
00520
00521
00522
00523 tensor I2I2 = I2("ij")*I2("ij");
00524 I2I2.print("I2I2","\ntensor I2 * I2");
00525
00526
00527 tensor I2PI = I2*PI;
00528 I2PI.print("I2PI","\ntensor I2 * PI");
00529
00531
00532
00533
00535
00536
00537
00538
00539 double deltatrace = I2.trace();
00540 ::printf("\ntrace of Kronecker delta is %f \n",deltatrace);
00541
00542
00543 double deltadet = I2.determinant();
00544 ::printf("\ndeterminant of Kronecker delta is %f \n",deltadet);
00545
00546
00547 tensor I2again = I2;
00548 if ( I2again == I2 ) ::printf("\n I2again == I2 TRUE (OK)\n");
00549 else ::printf("\a\n\n\n I2again == I2 NOTTRUE \n\n\n");
00550
00551
00552
00553
00554
00555 tensor I_ijkl( 4, def_dim_4, 0.0 );
00556 I_ijkl = I2("ij")*I2("kl");
00557
00558 tensor I_ikjl( 4, def_dim_4, 0.0 );
00559
00560 I_ikjl = I_ijkl.transpose0110();
00561
00562 tensor I_ikjl_inv_2 = I_ikjl.inverse_2();
00563
00564 if ( I_ikjl == I_ikjl_inv_2 ) ::printf("\n\n I_ikjl == I_ikjl_inv_2 !\n");
00565 else ::printf("\a\n\n I_ikjl != I_ikjl_inv_2 !\n");
00566
00567 tensor I_iljk( 4, def_dim_4, 0.0 );
00568
00569
00570 I_iljk = I_ijkl.transpose0111();
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580 ::printf("\n\n intermultiplications \n");
00581
00582 tensor I_ijkl_I_ikjl = I_ijkl("ijkl")*I_ikjl("ijkl");
00583 I_ijkl_I_ikjl.print("i","\n\n I_ijkl*I_ikjl \n");
00584
00585
00586 tensor I_ijkl_I_iljk = I_ijkl("ijkl")*I_iljk("ijkl");
00587 I_ijkl_I_iljk.print("i","\n\n I_ijkl*I_iljk \n");
00588
00589
00590 tensor I_ikjl_I_iljk = I_ikjl("ijkl")*I_iljk("ijkl");
00591 I_ikjl_I_iljk.print("i","\n\n I_ikjl*I_iljk \n");
00592
00593
00594
00595 ::printf("\n\n intermultiplications same with same \n");
00596 tensor I_ijkl_I_ijkl = I_ijkl("ijkl")*I_ijkl("ijkl");
00597 I_ijkl_I_ijkl.print("i","\n\n I_ijkl*I_ijkl \n");
00598
00599 tensor I_ikjl_I_ikjl = I_ikjl("ikjl")*I_ikjl("ikjl");
00600 I_ikjl_I_ikjl.print("i","\n\n I_ikjl*I_ikjl \n");
00601
00602 tensor I_iljk_I_iljk = I_iljk("iljk")*I_iljk("iljk");
00603 I_iljk_I_iljk.print("i","\n\n I_iljk*I_iljk \n");
00604
00605
00606
00607
00608 tensor I4s = (I_ikjl+I_iljk)*0.5;
00609
00610 I4s.print("I4s","\n symmetric tensor I4s = (I_ikjl+I_iljk)*0.5 ");
00611
00612 tensor I4sk = (I_ikjl-I_iljk)*0.5;
00613 I4sk.print("I4sk","\n skew-symmetric tensor I4sk = (I_ikjl-I_iljk)*0.5 ");
00614
00615
00616 if ( I4s == I4sk ) ::printf("\n\n I4s == I4sk !\n");
00617 else ::printf("\a\n\n I4s != I4sk !\n");
00618
00619
00620
00621
00622
00623 tensor ee = e("ijm")*e("klm");
00624 ee.print("ee","\ntensor e_ijm*e_klm");
00625 tensor id = ee - (I_ikjl - I_iljk);
00626 if ( id == ZERO ) ::printf("\n\n e-delta identity HOLDS !! \n\n");
00627 tensor ee1 = e("ilm")*e("jlm");
00628 ee1.print("ee1","\n\n e(\"ilm\")*e(\"jlm\") \n");
00629 tensor ee2 = e("ijk")*e("ijk");
00630 ee2.print("ee2","\n\n e(\"ijk\")*e(\"ijk\") \n");
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643 double Ey = 20000;
00644 double nu = 0.2;
00645
00646 tensor E1 = (I_ijkl*((Ey*nu*2.0)/(2.0*(1.0+nu)*(1-2.0*nu)))) +
00647 ( (I_ikjl+I_iljk)*(Ey/(2.0*(1.0+nu))));
00648
00649 tensor D1= (I_ijkl * (-nu/Ey)) + ( (I_ikjl+I_iljk) * ((1.0+nu)/(2.0*Ey)));
00650
00651
00652 tensor test = E1("ijkl")*D1("klpq");
00653 test.print("t","\n\n\n test = E1(\"ijkl\")*D1(\"klpq\") \n");
00654
00655 if ( test == I4s ) ::printf("\n test == I4s TRUE ( up to sqrt(macheps())) \n");
00656 else ::printf("\a\n\n\n test == I4s NOTTRUE ( up to sqrt(macheps())) \n\n\n");
00657
00658
00659
00660 double lambda = nu * Ey / (1. + nu) / (1. - 2. * nu);
00661 double mu = Ey / (2. * (1. + nu));
00662 ::printf("\n lambda = %.12e\n",lambda);
00663 ::printf(" mu = %.12e\n",mu);
00664
00665 ::printf("\nYoung Modulus = %.4e",Ey);
00666 ::printf("\nPoisson ratio = %.4e\n",nu);
00667 ::printf( " lambda + 2 mu = %.4e\n", (lambda + 2 * mu));
00668
00669
00670 tensor E2 = (I_ijkl * lambda) + (I4s * (2. * mu));
00671 E2.print("E2","tensor E2: elastic moduli Tensor = lambda*I2*I2+2*mu*I4s");
00672
00673 tensor E2inv = E2.inverse();
00674
00675
00676 tensor D2= (I_ijkl * (-nu/Ey)) + (I4s * (1./(2.*mu)));
00677 D2.print("D2","tensor D2: compliance Tensor (I_ijkl * (-nu/Ey)) + (I4s * (1./2./mu))");
00678
00679 if ( E2inv == D2 ) ::printf("\n E2inv == D2 TRUE \n");
00680 else ::printf("\a\n\n\n E2inv == D2 NOTTRUE \n\n\n");
00681
00682 if ( E1 == E2 ) ::printf("\n E1 == E2 TRUE \n");
00683 else ::printf("\a\n\n\n E1 == E2 NOTTRUE \n\n\n");
00684
00685 if ( D1 == D2 ) ::printf("\n D1 == D2 TRUE \n");
00686 else ::printf("\a\n\n\n D1 == D2 NOTTRUE \n\n\n");
00687
00688
00689
00690
00691 double PIo3 = PI/3.0;
00692
00693
00694 double p_start = 5000.000;
00695 double q_start = 2000.0;
00696 double theta_start = PIo3;
00697
00698
00699 stresstensor stress = stress.pqtheta2stress(p_start, q_start, theta_start);
00700 stress.report("stress\n");
00701
00702
00703 straintensor strain = D2("ijkl") * stress("kl");
00704 strain.report("strain = D2(\"ijkl\") * stress(\"kl\") \n");
00705
00706
00707
00708
00709
00710
00711 ::printf("\n\n\n\n\n");
00712 ::printf("\n\n----------------- STRESS TENSOR --------(Kaspar Willam tests)--------\n\n");
00713
00714 static double stressvalues[] = { 1.0, 2.0, 3.0,
00715 2.0, 2.0, 5.0,
00716 3.0, 5.0, 9.0 };
00717
00718 stresstensor sigma(stressvalues);
00719 sigma.report("\n\n stress tensor sigma (2nd-order with values assignment)");
00720
00721
00722 stresstensor s = sigma.deviator();
00723 s.report("\n\n stress deviator s \n\n");
00724
00725 stresstensor test01 = s("ij") * s("ij");
00726 test01.reportshort("\n\n\n test01 \n\n\n ");
00727
00728 stresstensor KWtest01 = s("ij") * s("jk");
00729 stresstensor KWtest02 = KWtest01("ik") * I2("ik");
00730 KWtest02.reportshort("\n\n\n KWtest02 \n\n\n ");
00731
00732
00733
00734 static double stressvector[] = {-3.0, -2.0, 5.0, 2.0*sqrt(2.0), 3.0*sqrt(2.0), 5.0*sqrt(2.0)};
00735
00736
00737 BJvector stressvector01( 6, stressvector);
00738 stressvector01.print("sigma","\n\n stressvector01\n");
00739
00740 BJvector product = stressvector01.transpose() * stressvector01;
00741 product.print("product","\n\n product = stressvector01*stressvector01 \n");
00742
00743
00744 ::printf("\n\n\n");
00745
00746
00747
00748
00749 ::printf("\n\n\n --------------------------TENSOR SCALAR MULTIPLICATION ----\n\n");
00750 tensor EEEE1 = E2;
00751 tensor EEEE2 = EEEE1*2.0;
00752 EEEE1.print("E1","tensor EEEE1");
00753 EEEE2.print("E2","tensor EEEE2");
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782 exit(1);
00783
00784 }