-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgeodesics_ham.c
71 lines (51 loc) · 1.56 KB
/
geodesics_ham.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "decs.h"
void push_photon_ham(double X[NDIM], double Kcon[][NDIM], double dl[])
{
double dgcon[NDIM][NDIM][NDIM];
double dKcov[NDIM], Kcov[NDIM];
double Xh[NDIM], Kconh[NDIM], Kcovh[NDIM];
double gcon[NDIM][NDIM], gcov[NDIM][NDIM] ;
int i, j, k;
/* advance X */
/* 2nd order: scheme
take half-step and then evaluate derivatives
at half-step. */
//fprintf(stderr,"---> %g %g %g %g %g %g %g %g\n", X[0], X[1], X[2], X[3], Kcon[0], Kcon[1], Kcon[2], Kcon[3]) ;
/** half-step **/
dgcon_calc(X, dgcon) ;
/* advance K */
gcov_func(X, gcov) ;
lower(Kcon[0], gcov, Kcov) ;
for (k = 0; k < 4; k++)
dKcov[k] = 0.;
for (i = 1; i < 3; i++)
for (j = 0; j < 4; j++)
for (k = 0; k < 4; k++)
dKcov[i] -= 0.5 * dl[0] * 0.5 * dgcon[i][j][k] * Kcov[j] * Kcov[k];
for (k = 0; k < 4; k++)
Kcovh[k] = Kcov[k] + dKcov[k];
/* advance X */
for (i = 0; i < 4; i++)
Xh[i] = X[i] + 0.5 * dl[0] * Kcon[0][i] ;
/** full step **/
dgcon_calc(Xh, dgcon) ;
/* advance K */
for (k = 0; k < 4; k++)
dKcov[k] = 0.;
for (i = 1; i < 3; i++)
for (j = 0; j < 4; j++)
for (k = 0; k < 4; k++)
dKcov[i] -= dl[0] * 0.5 * dgcon[i][j][k] * Kcovh[j] * Kcovh[k];
for (k = 0; k < 4; k++)
Kcov[k] += dKcov[k];
gcon_func(Xh, gcon) ;
/* lower does the same thing as raise... */
lower(Kcovh, gcon, Kconh) ;
/* advance X */
for (k = 0; k < 4; k++)
X[k] += dl[0] * Kconh[k];
gcon_func(X, gcon) ;
lower(Kcov, gcon, Kcon[0]) ;
//fprintf(stderr,"---> %g %g %g %g %g %g %g %g\n", X[0], X[1], X[2], X[3], Kcon[0], Kcon[1], Kcon[2], Kcon[3]) ;
/* done! */
}