Documentation

Table of Contents

Introduction: Example # 1

To use Tensors, the following files can be included:

#include <tensors/tensor1.h>
#include <tensors/tensor2.h>
#include <tensors/tensor3.h>
#include <tensors/tensor4.h>
#include <tensors/operators.h>

Tensors are template classes requiring the type of components and the space dimension. For instance, Tensor1<double,3> T1; declares a first order tensor in 3D with double precision float point components. In the code below, some tensors are created and printed.

Tensor1<double,3> T1;
Tensor2<double,3> T2;
Tensor3<double,3> T3;
Tensor4<double,3> T4;
for (int i=0; i < 3; ++i) {
    T1[i] = i;
    for (int j=0; j < 3; ++j) {
        T2[i][j] = i*10 + j;
        for (int k=0; k < 3; ++k) {
            T3[i][j][k] = i*100 + j*10 + k;
            for (int l=0; l < 3; ++l) {
                T4[i][j][k][l] = i*1000 + j*100 + k*10 + l;
            }
        }
    }
}

The output of the code above is:

T1 = 
   1    2    3 

T2 = 
  11   12   13 
  21   22   23 
  31   32   33 

T3 = 
 111  112  113  211  212  213  311  312  313 
 121  122  123  221  222  223  321  322  323 
 131  132  133  231  232  233  331  332  333 

T4 = 
1111 1112 1113 | 1211 1212 1213 | 1311 1312 1313 
1121 1122 1123 | 1221 1222 1223 | 1321 1322 1323 
1131 1132 1133 | 1231 1232 1233 | 1331 1332 1333 
------------------------------------------------
2111 2112 2113 | 2211 2212 2213 | 2311 2312 2313 
2121 2122 2123 | 2221 2222 2223 | 2321 2322 2323 
2131 2132 2133 | 2231 2232 2233 | 2331 2332 2333 
------------------------------------------------
3111 3112 3113 | 3211 3212 3213 | 3311 3312 3313 
3121 3122 3123 | 3221 3222 3223 | 3321 3322 3323 
3131 3132 3133 | 3231 3232 3233 | 3331 3332 3333 

The code can be downloaded from here: .

Symbolic manipulation using GiNaC and Maxima: Example # 2

Suppose we want to code the previous fourth order tensor T4 in Fortran. First, we'll use GiNaC to handle symbolic data within tensors. Second, we'll convert the tensor orthonormal components to Mandel's basis (rendering a square matrix) and then pass the output to Maxima for further processing. This is accomplished with , as illustrated below.

Tensor4<GiNaC::ex,3> T4;
for (int i=0; i < 3; ++i) {
    for (int j=0; j < 3; ++j) {
        for (int k=0; k < 3; ++k) {
            for (int l=0; l < 3; ++l) {
                std::ostringstream oss;
                oss << "D" << (i+1)*1000 + (j+1)*100 + (k+1)*10 + l+1;
                T4[i][j][k][l] = GiNaC::symbol(oss.str().c_str());
            }
        }
    }
}
Tensor2<GiNaC::ex,9> T4m;
T4m.SetMaxima();
T4.GetMandel(T4m);
cout << "T4m : " << T4m << "\n";
cout << "load(f90);\nwith_stdout(\"doc02.f90\",f90('T4=T4m));\n";

Now, the code is run with:

./doc02 | maxima

which generates the "doc02.f90" file. In the end, the following Fortran90 code is obtained:

T4(1,1) = D1111
T4(1,2) = D1122
T4(1,3) = D1133
T4(1,4) = (sqrt(2)*D1121+sqrt(2)*D1112)/2.0
T4(1,5) = (sqrt(2)*D1132+sqrt(2)*D1123)/2.0
T4(1,6) = (sqrt(2)*D1131+sqrt(2)*D1113)/2.0
T4(1,7) = (sqrt(2)*D1121-sqrt(2)*D1112)/2.0
T4(1,8) = (sqrt(2)*D1132-sqrt(2)*D1123)/2.0
T4(1,9) = (sqrt(2)*D1131-sqrt(2)*D1113)/2.0
T4(2,1) = D2211
T4(2,2) = D2222
T4(2,3) = D2233
T4(2,4) = (sqrt(2)*D2221+sqrt(2)*D2212)/2.0
T4(2,5) = (sqrt(2)*D2232+sqrt(2)*D2223)/2.0
T4(2,6) = (sqrt(2)*D2231+sqrt(2)*D2213)/2.0
T4(2,7) = (sqrt(2)*D2221-sqrt(2)*D2212)/2.0
T4(2,8) = (sqrt(2)*D2232-sqrt(2)*D2223)/2.0
T4(2,9) = (sqrt(2)*D2231-sqrt(2)*D2213)/2.0
T4(3,1) = D3311
T4(3,2) = D3322
T4(3,3) = D3333
T4(3,4) = (sqrt(2)*D3321+sqrt(2)*D3312)/2.0
T4(3,5) = (sqrt(2)*D3332+sqrt(2)*D3323)/2.0
T4(3,6) = (sqrt(2)*D3331+sqrt(2)*D3313)/2.0
T4(3,7) = (sqrt(2)*D3321-sqrt(2)*D3312)/2.0
T4(3,8) = (sqrt(2)*D3332-sqrt(2)*D3323)/2.0
T4(3,9) = (sqrt(2)*D3331-sqrt(2)*D3313)/2.0
T4(4,1) = (sqrt(2)*D2111+sqrt(2)*D1211)/2.0
T4(4,2) = (sqrt(2)*D2122+sqrt(2)*D1222)/2.0
T4(4,3) = (sqrt(2)*D2133+sqrt(2)*D1233)/2.0
T4(4,4) = (D2121+D2112+D1221+D1212)/2.0
T4(4,5) = (D2132+D2123+D1232+D1223)/2.0
T4(4,6) = (D2131+D2113+D1231+D1213)/2.0
T4(4,7) = (D2121-D2112+D1221-D1212)/2.0
T4(4,8) = (D2132-D2123+D1232-D1223)/2.0
T4(4,9) = (D2131-D2113+D1231-D1213)/2.0
T4(5,1) = (sqrt(2)*D3211+sqrt(2)*D2311)/2.0
T4(5,2) = (sqrt(2)*D3222+sqrt(2)*D2322)/2.0
T4(5,3) = (sqrt(2)*D3233+sqrt(2)*D2333)/2.0
T4(5,4) = (D3221+D3212+D2321+D2312)/2.0
T4(5,5) = (D3232+D3223+D2332+D2323)/2.0
T4(5,6) = (D3231+D3213+D2331+D2313)/2.0
T4(5,7) = (D3221-D3212+D2321-D2312)/2.0
T4(5,8) = (D3232-D3223+D2332-D2323)/2.0
T4(5,9) = (D3231-D3213+D2331-D2313)/2.0
T4(6,1) = (sqrt(2)*D3111+sqrt(2)*D1311)/2.0
T4(6,2) = (sqrt(2)*D3122+sqrt(2)*D1322)/2.0
T4(6,3) = (sqrt(2)*D3133+sqrt(2)*D1333)/2.0
T4(6,4) = (D3121+D3112+D1321+D1312)/2.0
T4(6,5) = (D3132+D3123+D1332+D1323)/2.0
T4(6,6) = (D3131+D3113+D1331+D1313)/2.0
T4(6,7) = (D3121-D3112+D1321-D1312)/2.0
T4(6,8) = (D3132-D3123+D1332-D1323)/2.0
T4(6,9) = (D3131-D3113+D1331-D1313)/2.0
T4(7,1) = (sqrt(2)*D2111-sqrt(2)*D1211)/2.0
T4(7,2) = (sqrt(2)*D2122-sqrt(2)*D1222)/2.0
T4(7,3) = (sqrt(2)*D2133-sqrt(2)*D1233)/2.0
T4(7,4) = (D2121+D2112-D1221-D1212)/2.0
T4(7,5) = (D2132+D2123-D1232-D1223)/2.0
T4(7,6) = (D2131+D2113-D1231-D1213)/2.0
T4(7,7) = (D2121-D2112-D1221+D1212)/2.0
T4(7,8) = (D2132-D2123-D1232+D1223)/2.0
T4(7,9) = (D2131-D2113-D1231+D1213)/2.0
T4(8,1) = (sqrt(2)*D3211-sqrt(2)*D2311)/2.0
T4(8,2) = (sqrt(2)*D3222-sqrt(2)*D2322)/2.0
T4(8,3) = (sqrt(2)*D3233-sqrt(2)*D2333)/2.0
T4(8,4) = (D3221+D3212-D2321-D2312)/2.0
T4(8,5) = (D3232+D3223-D2332-D2323)/2.0
T4(8,6) = (D3231+D3213-D2331-D2313)/2.0
T4(8,7) = (D3221-D3212-D2321+D2312)/2.0
T4(8,8) = (D3232-D3223-D2332+D2323)/2.0
T4(8,9) = (D3231-D3213-D2331+D2313)/2.0
T4(9,1) = (sqrt(2)*D3111-sqrt(2)*D1311)/2.0
T4(9,2) = (sqrt(2)*D3122-sqrt(2)*D1322)/2.0
T4(9,3) = (sqrt(2)*D3133-sqrt(2)*D1333)/2.0
T4(9,4) = (D3121+D3112-D1321-D1312)/2.0
T4(9,5) = (D3132+D3123-D1332-D1323)/2.0
T4(9,6) = (D3131+D3113-D1331-D1313)/2.0
T4(9,7) = (D3121-D3112-D1321+D1312)/2.0
T4(9,8) = (D3132-D3123-D1332+D1323)/2.0
T4(9,9) = (D3131-D3113-D1331+D1313)/2.0