Contact Us!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.

| Download
Views: 289
Image: ubuntu2004
1
#include "mpi.h"
2
#include "kadath_spheric.hpp"
3
4
using namespace Kadath ;
5
6
int main(int argc, char** argv) {
7
8
int rc = MPI_Init (&argc, &argv) ;
9
int rank = 0 ;
10
MPI_Comm_rank (MPI_COMM_WORLD, &rank) ;
11
12
double aa, ome, nhor, vhor ;
13
FILE* ff = fopen(argv[1], "r") ;
14
Space_spheric espace (ff) ;
15
fread_be (&ome, sizeof(double), 1, ff) ;
16
fread_be (&nhor, sizeof(double), 1, ff) ;
17
fread_be (&vhor, sizeof(double), 1, ff) ;
18
Scalar lapse(espace, ff) ;
19
Vector shift(espace, ff) ;
20
Metric_tensor gmet(espace, ff) ;
21
fclose(ff) ;
22
23
int ndom = espace.get_nbr_domains() ;
24
25
// Number of point
26
Base_tensor basis (shift.get_basis()) ;
27
Metric_tensor gfixed (espace, COV, basis) ;
28
for (int i=1 ; i<=3 ; i++)
29
for (int j=1 ; j<=3 ; j++)
30
if (i==j)
31
gfixed.set(i,j) = 1. ;
32
else
33
gfixed.set(i,j).annule_hard() ;
34
gfixed.std_base() ;
35
36
37
Vector scov (espace, COV, basis) ;
38
scov = 0 ;
39
scov.set(1) = 1. ;
40
scov.std_base() ;
41
42
Vector st (espace, COV, basis) ;
43
st = 0 ;
44
st.set(2) = 1. ;
45
st.std_base() ;
46
47
48
Vector er (espace, CON, basis) ;
49
er = 0 ;
50
er.set(1).set_domain(1) = 1. ;
51
er.std_base() ;
52
53
Vector mm (espace, CON, basis) ;
54
for (int i=1 ; i<=3 ; i++)
55
mm.set(i) = 0. ;
56
Val_domain xx (espace.get_domain(1)->get_cart(1)) ;
57
Val_domain yy (espace.get_domain(1)->get_cart(2)) ;
58
mm.set(3).set_domain(1) = sqrt(xx*xx + yy*yy) ;
59
mm.std_base() ;
60
61
Scalar one (espace) ;
62
one = 1 ;
63
one.std_base() ;
64
65
List_comp used (6,2) ;
66
used.set(0)->set(0) = 1 ; used.set(0)->set(1) = 1 ;
67
used.set(1)->set(0) = 1 ; used.set(1)->set(1) = 2 ;
68
used.set(2)->set(0) = 1 ; used.set(2)->set(1) = 3 ;
69
used.set(3)->set(0) = 2 ; used.set(3)->set(1) = 2 ;
70
used.set(4)->set(0) = 2 ; used.set(4)->set(1) = 3 ;
71
used.set(5)->set(0) = 3 ; used.set(5)->set(1) = 3 ;
72
73
List_comp dege(3,2) ;
74
dege.set(0)->set(0) = 2 ; dege.set(0)->set(1) = 2 ;
75
dege.set(1)->set(0) = 2 ; dege.set(1)->set(1) = 3 ;
76
dege.set(2)->set(0) = 3 ; dege.set(2)->set(1) = 3 ;
77
78
List_comp nondege(2,2) ;
79
nondege.set(0)->set(0) = 1 ; nondege.set(0)->set(1) = 2 ;
80
nondege.set(1)->set(0) = 1 ; nondege.set(1)->set(1) = 3 ;
81
82
List_comp rrcomp (1,2) ;
83
rrcomp.set(0)->set(0) = 1 ; rrcomp.set(0)->set(1) = 1 ;
84
85
List_comp ozers(3,2) ;
86
ozers.set(0)->set(0) = 1 ; ozers.set(0)->set(1) = 1 ;
87
ozers.set(1)->set(0) = 1 ; ozers.set(1)->set(1) = 2 ;
88
ozers.set(2)->set(0) = 1 ; ozers.set(2)->set(1) = 3 ;
89
90
double eightpi = 8.*M_PI ;
91
Metric_general met (gmet) ;
92
93
// Solve the equation in space outside the nucleus
94
System_of_eqs syst (espace, 1, ndom-1) ;
95
96
// Unknowns
97
syst.add_var ("N", lapse) ;
98
syst.add_var ("B", shift) ;
99
met.set_system (syst, "g") ;
100
syst.add_var ("ome", ome) ;
101
102
// User defined constants
103
syst.add_cst ("s", scov) ;
104
syst.add_cst ("gf", gfixed) ;
105
syst.add_cst ("nhor", nhor) ;
106
syst.add_cst ("vhor", vhor) ;
107
108
syst.add_cst ("mm", mm) ;
109
syst.add_cst ("er", er) ;
110
syst.add_cst ("eightpi", eightpi) ;
111
syst.add_cst ("spin", spintarget) ;
112
113
// For speed
114
syst.add_def ("DBS_i^j = D_i B^j") ;
115
syst.add_def ("K_ij = (DBS_ij + DBS_ji) /2./N") ;
116
117
syst.add_def (1, "sn^i = s^i / sqrt(s_i * s^i)") ;
118
syst.add_def (1, "sigma = sn^i * sn^j * K_ij + D_i sn^i") ;
119
120
// Quantities to compute the spin
121
syst.add_def (1, "detq = (sn^k * s_k)^2 * determinant(g_ij)") ;
122
syst.add_def (1, "intS = -sqrt(detq)*K_ij * mm^j *sn^i / eightpi") ;
123
espace.add_eq_int_hor (syst, "integ(intS) = spin") ;
124
125
syst.add_def ("V^i = g^kl * Gam_kl^i") ;
126
syst.add_def ("Gauge_ij = 0.5*(D_i V_j + D_j V_i)") ;
127
syst.add_def ("Ope_ij = R_ij - Gauge_ij") ;
128
syst.add_def ("Hamilton = g^kl * Ope_kl - K_ij * K^ij") ;
129
syst.add_def ("Momentum^i = D_j K^ij") ;
130
syst.add_def ("Evol_ij = N * (Ope_ij-2*K_ik*K_j^k) - D_i D_j N + B^k * D_k K_ij + K_ik * DBS_j^k + K_jk * DBS_i^k ") ;
131
132
// Inner BCs :
133
syst.add_eq_bc (1, INNER_BC, "N = nhor") ;
134
syst.add_eq_bc (1, INNER_BC, "B^i = N * sn^i + ome * mm^i") ;
135
syst.add_eq_bc_exception (1, INNER_BC, "sigma=0", "g_ij * er^i * er^j = vhor") ;
136
syst.add_eq_bc (1, INNER_BC, "g_ij = gf_ij", nondege) ;
137
138
// Bulk
139
for (int d=1 ; d<ndom ; d++) {
140
syst.add_eq_inside (d, "Hamilton=0") ;
141
syst.add_eq_inside (d, "Momentum^i=0") ;
142
143
if (d==1) {
144
syst.add_eq_inside (d, "Evol_ij=0", ozers) ;
145
syst.add_eq_one_side (d, "Evol_ij=0", dege) ;
146
}
147
else
148
syst.add_eq_inside (d, "Evol_ij=0", used) ;
149
150
if (d!=ndom-1) {
151
syst.add_eq_matching (d, OUTER_BC, "N") ;
152
syst.add_eq_matching (d, OUTER_BC, "dn(N)") ;
153
syst.add_eq_matching (d, OUTER_BC, "B^i") ;
154
syst.add_eq_matching (d, OUTER_BC, "dn(B^i)") ;
155
syst.add_eq_matching (d, OUTER_BC, "g_ij", used) ;
156
syst.add_eq_matching (d, OUTER_BC, "dn(g_ij)", used) ;
157
}
158
}
159
160
// OUter BC
161
syst.add_eq_bc (ndom-1, OUTER_BC, "N=1") ;
162
syst.add_eq_bc (ndom-1, OUTER_BC, "B^i=0") ;
163
syst.add_eq_bc (ndom-1, OUTER_BC, "g_ij = gf_ij", used) ;
164
165
// Newton-Raphson
166
double conv ;
167
bool endloop = false ;
168
int ite = 1 ;
169
char name[100] ;
170
171
172
while (!endloop) {
173
endloop = syst.do_newton(1e-8, conv) ;
174
if (rank==0) {
175
cout << "Newton iteration " << ite << " " << conv << endl ;
176
cout << "Omega = " << ome << endl ;
177
}
178
ite++ ;
179
}
180
181
sprintf (name, "kerr_%f_%f_%f_%d.dat", nhor, vhor, ome, espace.get_domain(1)->get_nbr_points()(0)) ;
182
//sprintf (name, "kerr.dat") ;
183
// Save
184
if (rank==0) {
185
FILE* ff = fopen(name, "w") ;
186
espace.save(ff) ;
187
fwrite_be (&ome, sizeof(double), 1, ff) ;
188
fwrite_be (&nhor, sizeof(double), 1, ff) ;
189
fwrite_be (&vhor, sizeof(double), 1, ff) ;
190
lapse.save(ff) ;
191
shift.save(ff) ;
192
gmet.save(ff) ;
193
fclose(ff) ;
194
}
195
196
MPI_Finalize() ;
197
198
return EXIT_SUCCESS ;
199
}
200
201
202
203