12#include "gadgetconfig.h"
14#ifdef DEBUG_SYMTENSORS
22#include "../data/allvars.h"
23#include "../data/dtypes.h"
24#include "../data/intposconvert.h"
25#include "../data/symtensors.h"
26#include "../sort/cxxsort.h"
27#include "../system/system.h"
29static bool compare_list(
const int &a,
const int &b) {
return a < b; }
31static void symtensor_test_tensor4_contraction_with_tensor1(
void)
38 int I1[3] = {0, 1, 2};
42 for(
int i = 0; i < 3; i++)
43 for(
int j = 0; j < 3; j++)
44 for(
int k = 0; k < 3; k++)
45 for(
int l = 0; l < 3; l++)
47 if(i <= j && j <= k && k <= l)
49 I4[i][j][k][l] = count++;
53 int li[] = {i, j, k, l};
57 I4[i][j][k][l] = I4[li[0]][li[1]][li[2]][li[3]];
65 for(
int i = 0; i < 3; i++)
66 for(
int j = 0; j < 3; j++)
67 for(
int k = 0; k < 3; k++)
71 I3[i][j][k] = count++;
79 I3[i][j][k] = I3[li[0]][li[1]][li[2]];
85 for(
int i = 0; i < 15; i++)
88 for(
int i = 0; i < 3; i++)
92 double M4[3][3][3][3];
93 for(
int i = 0; i < 3; i++)
94 for(
int j = 0; j < 3; j++)
95 for(
int k = 0; k < 3; k++)
96 for(
int l = 0; l < 3; l++)
97 M4[i][j][k][l] = T4[I4[i][j][k][l]];
101 for(
int i = 0; i < 3; i++)
106 for(
int i = 0; i < 3; i++)
107 for(
int j = 0; j < 3; j++)
108 for(
int k = 0; k < 3; k++)
112 for(
int l = 0; l < 3; l++)
113 R3[i][j][k] += M4[i][j][k][l] * M1[l];
120 printf(
"Result comparison:\n");
122 for(
int i = 0; i < 3; i++)
123 for(
int j = 0; j < 3; j++)
124 for(
int k = 0; k < 3; k++)
128 printf(
"%c%c%c: %g %g\n",
'X' + i,
'X' + j,
'X' + k, S3[I3[i][j][k]], R3[i][j][k]);
135static void symtensor_test_tensor4_contraction_with_tensor2(
void)
145 for(
int i = 0; i < 3; i++)
146 for(
int j = 0; j < 3; j++)
147 for(
int k = 0; k < 3; k++)
148 for(
int l = 0; l < 3; l++)
150 if(i <= j && j <= k && k <= l)
152 I4[i][j][k][l] = count++;
156 int li[] = {i, j, k, l};
160 I4[i][j][k][l] = I4[li[0]][li[1]][li[2]][li[3]];
170 for(
int i = 0; i < 3; i++)
171 for(
int j = 0; j < 3; j++)
183 I2[i][j] = I2[li[0]][li[1]];
191 for(
int i = 0; i < 15; i++)
194 for(
int i = 0; i < 6; i++)
198 double M4[3][3][3][3];
199 for(
int i = 0; i < 3; i++)
200 for(
int j = 0; j < 3; j++)
201 for(
int k = 0; k < 3; k++)
202 for(
int l = 0; l < 3; l++)
203 M4[i][j][k][l] = T4[I4[i][j][k][l]];
207 for(
int i = 0; i < 3; i++)
208 for(
int j = 0; j < 3; j++)
209 M2[i][j] = T2[I2[i][j]];
213 for(
int i = 0; i < 3; i++)
214 for(
int j = 0; j < 3; j++)
218 for(
int k = 0; k < 3; k++)
219 for(
int l = 0; l < 3; l++)
220 R2[i][j] += M4[i][j][k][l] * M2[k][l];
227 printf(
"Result comparison:\n");
229 for(
int i = 0; i < 3; i++)
230 for(
int j = 0; j < 3; j++)
234 printf(
"%c%c: %g %g\n",
'X' + i,
'X' + j, S2[I2[i][j]], R2[i][j]);
241static void symtensor_test_tensor4_contraction_with_tensor3(
void)
251 for(
int i = 0; i < 3; i++)
252 for(
int j = 0; j < 3; j++)
253 for(
int k = 0; k < 3; k++)
254 for(
int l = 0; l < 3; l++)
256 if(i <= j && j <= k && k <= l)
258 I4[i][j][k][l] = count++;
262 int li[] = {i, j, k, l};
266 I4[i][j][k][l] = I4[li[0]][li[1]][li[2]][li[3]];
276 for(
int i = 0; i < 3; i++)
277 for(
int j = 0; j < 3; j++)
278 for(
int k = 0; k < 3; k++)
282 I3[i][j][k] = count++;
286 int li[] = {i, j, k};
290 I3[i][j][k] = I3[li[0]][li[1]][li[2]];
298 for(
int i = 0; i < 15; i++)
301 for(
int i = 0; i < 10; i++)
305 double M4[3][3][3][3];
306 for(
int i = 0; i < 3; i++)
307 for(
int j = 0; j < 3; j++)
308 for(
int k = 0; k < 3; k++)
309 for(
int l = 0; l < 3; l++)
310 M4[i][j][k][l] = T4[I4[i][j][k][l]];
314 for(
int i = 0; i < 3; i++)
315 for(
int j = 0; j < 3; j++)
316 for(
int k = 0; k < 3; k++)
317 M3[i][j][k] = T3[I3[i][j][k]];
321 for(
int i = 0; i < 3; i++)
325 for(
int j = 0; j < 3; j++)
326 for(
int k = 0; k < 3; k++)
327 for(
int l = 0; l < 3; l++)
328 R1[i] += M4[i][j][k][l] * M3[j][k][l];
335 printf(
"Result comparison:\n");
337 for(
int i = 0; i < 3; i++)
338 printf(
"%c: %g %g\n",
'X' + i, S1[i], R1[i]);
345 symtensor_test_tensor4_contraction_with_tensor1();
346 symtensor_test_tensor4_contraction_with_tensor2();
347 symtensor_test_tensor4_contraction_with_tensor3();
double mycxxsort(T *begin, T *end, Tcomp comp)
void symtensor_test(void)
double get_random_number(void)