190 lines
5.6 KiB
Mathematica
190 lines
5.6 KiB
Mathematica
(*
|
|
This script is used to get a analytical formula of \psi_4,
|
|
and save to a file.
|
|
*)
|
|
|
|
(*
|
|
Usage: Please set the fowllowing variables from outside as
|
|
command line arguments, like this:
|
|
wolframscript -file Teuk_psi4.wl m a L n in|out [filename]
|
|
for example:
|
|
wolframscript -file Teuk_psi4.wl 0 1e-8 1 1 out
|
|
if filename is not given, it's "./psi4_analytical.txt" by default.
|
|
*)
|
|
|
|
(* variable name : description *)
|
|
|
|
(* Begin of variables *)
|
|
(* m : the Teukolsky multiple order *)
|
|
(* a : wave amplitude *)
|
|
(* L : wave width *)
|
|
(* n : the order N in F formula *)
|
|
(* End of variables *)
|
|
|
|
|
|
(* Parsing arguments *)
|
|
|
|
argv = Rest@$ScriptCommandLine;
|
|
Check[
|
|
{m, a, L, n} = Interpreter["Number"]/@argv[[;;4]];
|
|
type = argv[[5]];
|
|
If[Length@argv >= 6,
|
|
filename = argv[[6]],
|
|
filename = "./psi4_analytical.txt"
|
|
],
|
|
Print["Error: Check your command line arguments!"];Abort[]
|
|
];
|
|
|
|
(* Set Assumptions *)
|
|
$Assumptions = aa > 0 && r > 0 && Pi > theta > 0 &&
|
|
2 Pi >= phi >= 0 && t ~Element~ Reals &&
|
|
x ~Element~ Reals && y ~Element~ Reals && z ~Element~ Reals;
|
|
(* Global Simplify time limit *)
|
|
tc = 60
|
|
|
|
(* Help functions *)
|
|
pSimplify[list_] :=
|
|
ArrayReshape[
|
|
ParallelMap[
|
|
Simplify[#, TimeConstraint->tc]&, Flatten@list, Method->"FinestGrained"
|
|
],
|
|
Dimensions@list
|
|
];
|
|
|
|
psi4analytical[g_, coordinates_, vecn_, vecmb_] :=
|
|
Module[
|
|
{dim = Length[coordinates], t1, t2,
|
|
t3, t4, ig, dg, gamma, dgamma, RiemR, psi4},
|
|
dg = D[g, {coordinates}];
|
|
ig = Inverse[g] // pSimplify;
|
|
t1 =
|
|
AbsoluteTiming[
|
|
gamma = pSimplify[
|
|
ParallelTable[
|
|
1/2 Plus @@ ((ig[[i, #]] (dg[[#, j, k]] + dg[[#, k, j]] -
|
|
dg[[k, j, #]])) &) /@ Range[dim],
|
|
{i, 1, dim}, {j,1, dim}, {k, 1, dim}
|
|
]
|
|
];
|
|
][[1]];
|
|
Print["Finish computing gamma, time cost:", t1, "s"];
|
|
t2 =
|
|
AbsoluteTiming[
|
|
dgamma = pSimplify[
|
|
D[gamma, {coordinates}]
|
|
];
|
|
][[1]];
|
|
Print["Finish computing dgamma, time cost:", t2, "s"];
|
|
t3 =
|
|
AbsoluteTiming[
|
|
RiemR = ParallelTable[
|
|
dgamma[[l, i, k, j]] - dgamma[[l, j, k, i]] +
|
|
Plus @@ ((gamma[[#, k, i]] gamma[[l, j, #]] -\
|
|
gamma[[#, k, j]] gamma[[l, i, #]]) &) /@ Range[dim],
|
|
{i, 1, dim}, {j, 1, dim}, {k, 1, dim}, {l, 1, dim}
|
|
];
|
|
][[1]];
|
|
Print["Finish computing RiemR, time cost:" , t3, "s"];
|
|
t4 =
|
|
AbsoluteTiming[
|
|
psi4 = ((((RiemR . g) . vecmb) . vecn) . vecmb) . vecn;
|
|
][[1]];
|
|
Print["Finish computing psi4, time cost:" , t4, "s"];
|
|
psi4
|
|
];
|
|
|
|
(* set metric *)
|
|
Switch[m,
|
|
0,
|
|
frr = 2 - 3 Sin[theta]^2;
|
|
frtheta = -3 Cos[theta] Sin[theta];
|
|
frphi = 0;
|
|
fthetatheta1 = 3 Sin[theta]^2;
|
|
fthetatheta2 = -1; fthetaphi = 0;
|
|
fphiphi1 = -fthetatheta1;
|
|
fphiphi2 = 3 Sin[theta]^2 - 1;,
|
|
1,
|
|
frr = Sin[2 theta] Cos[phi];
|
|
frtheta = Cos[2 theta] Cos[phi];
|
|
frphi = -Cos[theta] Sin[phi];
|
|
fthetatheta1 = -frr;
|
|
fthetatheta2 = 0;
|
|
fthetaphi = -Sin[theta] Sin[phi];
|
|
fphiphi1 = -fthetatheta1;
|
|
fphiphi2 = -frr;,
|
|
-1,
|
|
frr = Sin[2 theta] Sin[phi];
|
|
frtheta = Cos[2 theta] Sin[phi];
|
|
frphi = Cos[theta] Cos[phi];
|
|
fthetatheta1 = -frr;
|
|
fthetatheta2 = 0;
|
|
fthetaphi = Sin[theta] Cos[phi];
|
|
fphiphi1 = -fthetatheta1;
|
|
fphiphi2 = -frr;,
|
|
2,
|
|
frr = Sin[theta]^2 Cos[2 phi];
|
|
frtheta = Sin[theta] Cos[theta] Cos[2 phi];
|
|
frphi = -Sin[theta] Sin[2 phi];
|
|
fthetatheta1 = (1 + Cos[theta]^2) Cos[2 phi];
|
|
fthetatheta2 = -Cos[2 phi];
|
|
fthetaphi = Cos[theta] Sin[2 phi];
|
|
fphiphi1 = -fthetatheta1;
|
|
fphiphi2 = Cos[theta]^2 Cos[2 phi];,
|
|
-2,
|
|
frr = Sin[theta]^2 Sin[2 phi];
|
|
frtheta = Sin[theta] Cos[theta] Sin[2 phi];
|
|
frphi = Sin[theta] Cos[2 phi];
|
|
fthetatheta1 = (1 + Cos[theta]^2) Sin[2 phi];
|
|
fthetatheta2 = -Sin[2 phi];
|
|
fthetaphi = -Cos[theta] Cos[2 phi];
|
|
fphiphi1 = -fthetatheta1; fphiphi2 = Cos[theta]^2 Sin[2 phi];,
|
|
_,
|
|
Print["Error: m must be one of {0,1,2,-1,-2}."];Abort[]
|
|
]
|
|
|
|
h = aa {
|
|
{0, 0, 0, 0},
|
|
{0, AA[t, r] frr, BB[t, r] frtheta r, BB[t, r] frphi r Sin[theta]},
|
|
{0, BB[t, r] frtheta r,
|
|
(CC[t, r] fthetatheta1 + AA[t, r] fthetatheta2) r^2,
|
|
(AA[t, r] - 2 CC[t, r]) fthetaphi r^2 Sin[theta]},
|
|
{0, BB[t, r] frphi r Sin[theta],
|
|
(AA[t, r] - 2 CC[t, r]) fthetaphi r^2 Sin[theta],
|
|
(CC[t, r] fphiphi1 + AA [t, r] fphiphi2) r^2 Sin[theta]^2}
|
|
} // Simplify;
|
|
g = DiagonalMatrix[{-1, 1, r^2, r^2 Sin[theta]^2}] + h // Simplify;
|
|
|
|
rule1 = Switch[type,
|
|
"in",
|
|
{
|
|
AA -> Function[{t, r},3 (F''[t + r]/r^3 - (3 F'[t + r])/r^4 + (3 F[t + r])/r^5)],
|
|
BB -> Function[{t, r}, -(-(F'''[t + r]/r^2) + (3 F''[t + r])/r^3 - (6 F'[t + r])/r^4 + (6 F[t + r])/r^5)],
|
|
CC -> Function[{t, r}, 1/4 (F''''[t + r]/r - (2 F'''[t + r])/r^2 + (9 F''[t + r])/r^3 - (21 F'[t + r])/r^4 + (21 F[t + r])/r^5)]
|
|
},
|
|
"out",
|
|
{
|
|
AA -> Function[{t, r}, 3 (F''[t - r]/r^3 + (3 F'[t - r])/r^4 + (3 F[t - r])/r^5)],
|
|
BB -> Function[{t, r}, -(F'''[t - r]/r^2 + (3 F''[t - r])/r^3 + (6 F'[t - r])/r^4 + (6 F[t - r])/r^5)],
|
|
CC -> Function[{t, r}, 1/4 (F''''[t - r]/r + (2 F'''[t - r])/r^2 + (9 F''[t - r])/r^3 + (21 F'[t - r])/r^4 + (21 F[t - r])/r^5)]
|
|
},
|
|
_,
|
|
Print["Error: check wave type, can only be in or out"];Abort[]
|
|
]
|
|
|
|
rule2 = F -> Function[L^5 (#/L)^n E^(-(#^2/L^2))]
|
|
|
|
(* set tetrad *)
|
|
vecn = 1/2 {1, -1, 0, 0};
|
|
vecmb = 1/(Sqrt[2] r) {0, 0, 1, -(I/Sin[theta])};
|
|
|
|
(* Calculate psi4 *)
|
|
psi4 = psi4analytical[g, {t, r, theta, phi}, vecn, vecmb];
|
|
psi4 = psi4 /. {aa->a};
|
|
psi4 = psi4 /. rule1;
|
|
psi4 = psi4 /. rule2;
|
|
|
|
psi4 = psi4 /. {t->0};
|
|
(* psi4 = Simplify[psi4, TimeConstraint->tc]; *)
|
|
|
|
Put[psi4, filename]
|