(* 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]