I feel I should point out that the Jacobian does not necessarily generate a coordinate system, more like a coordinate frame. To define a coordinate system we must have:
$\frac{\partial A}{\partial r}=\frac{\partial B}{\partial t},\frac{\partial C}{\partial r}=\frac{\partial D}{\partial t}$
Which is satisfied for the particular cases below.
I used the symbols (A,B,C,D) as the Jacobian terms for debugging/analysis. When viewing a Grobner decomposition to investigate, the capitals stand out much better than strings of $\frac{\partial t}{\partial r}$ 's and they are really what I am interested in.
Here is the corrected maxima (http://maxima.sourceforge.net/) code with links:
/* This program is an exercise to compute the Jacobian of a
coordinate transform taking a source metric to a target metric.
For the exercise, I have chosen the Schwarzschild metric as an
example source metric and various target metrics from
"Coordinate families for the Schwarzschild geometry based on radial timelike geodesics"
https://arxiv.org/pdf/1211.4337v2.pdf
The theory behind the conversion of metrics to conditions on the
Jacobian is shown on
https://en.wikipedia.org/wiki/Metric_tensor#Metric_in_coordinates
The last equation is simplified by moving the Jacobian inverses on
the right hand side to a Jacobian on the left hand side,
leading to simpler expressions. for solve().
The procedural template is
1) Form the general list of equations to solve for the Jacobian terms (A,B,C,D)
2) Append any constraints on the solutions.
3) Solve for A,B,C,D and any additional terms that are needed to
make solve() happy.
Note: that input equations, input variables and requested solution variables,
interact. Sometimes the requested solutions need to be modified to accommodate
the inputs.
*/
load(grobner);
/* g2g() accepts an originating metric and a target metric and returns a
list of simultanious equations in (A,B,C,D) to be used in solve().
the (A,B,C,D) are the matrix elements for the Jacobian of the
original coordinates to target coordinates.
i.e. J: (t,r)->(t',r')
*/;
J:matrix([A,B],[C,D]);
g2g(Gin,Gout):=(block[k],
k:transpose(J).Gout.J-Gin,
list_matrix_entries(k)
);
/* The Schwarzchild metric */
m:1-2*M/r;;
G:matrix([-m,0],[0,1/m]);
kill(q);
q: sqrt(2*M/r);
G_pg:matrix([-m,q],[q,1]);
g2g_pg: g2g(G,G_pg)$
T_pg:append(g2g_pg,[A-1,D-1,C])$
J_pg:ratsimp(solve(T_pg,[A,B,C,D]));
kill(p,q);
G_lmp:matrix([-m,q],[q,p]);
q: sqrt(1-p*m);
T_lmp:append(g2g(G,G_lmp),[A-1,D-1])$
J_lmp:ratsimp(solve(T_lmp,[A,B,C,D]));
G_v:matrix([-m,1],[1,0]);
T_v:append(g2g(G,G_v),[A-1,D-1])$
J_v:ratsimp(solve(T_v,[A,B,C,D]));
kill(u);
q:sqrt((2*M/r)+(u-1));
G_gh:matrix([-m/u,q/u],[q/u,1/u]);
T_gh:ratsimp(append(g2g(G,G_gh),[C,D-1]))$
J_gh:ratsimp(solve(T_gh,[A,B,C,D]));
kill(p,q);
q:sqrt(p*(1-p*m));
G_df:matrix([-p*m,q],[q,p]);
T_df:append(g2g(G,G_df),[C,D-1])$
J_df:ratsimp(solve(T_df,[A,B,C,D]));
kill(p,q);
q:sqrt(1-p*m);
G_lmpe:matrix([-m,q],[q,p]);
T_lmpe:append(g2g(G,G_lmpe),[C,D-1])$
J_mpe:ratsimp(solve(T_lmpe,[A,B,C,D]));
kill(p,u);
u:sqrt(p*(1-p*m));
G_gh:matrix([-p*m,u],[u,p]);
T_gh:append(g2g(G,G_gh),[C,D-1])$
J_gh:ratsimp(solve(T_gh,[A,B,C,D]));
--
The purpose of this exercise is to have code to investigate the nature of the various event horizons in the Kerr metric and to clarify some of the statements in
The Geometry of Kerr Black Holes
by: Barrett O'Neil
If anybody is interested in following along, let me know. I am thinking about starting a blog on what promises to be a long journey; the last two projects took two years each and nobody read either blog :)