Eddington-Finkelstein Coordinates

Defined in terms of the Schwarzschild coordinates (t,r,θ,ϕ):
t      =    v-r-2 M ln|(r/(2M))-1| = (OverTilde[t])-2M ln |(r/(2M))-1|
dt   =dv-(((1-((2M)/r)))^(-1))dr
(ds^2)=-(1-((2M)/r))(dv^2)+ 2 dv dr +(r^2)((dΩ)^2)

Radial Null Lines

3 solutions:
dv=0 => v = const.                                                                      (( dv)/dr)=0
(v/(4M))=  (r/(2M))+ln(|(r/(2M))-1|)+((Subscript[v, 0])/(4M))                                                 (dv/dr)= 2 (((1-((2M)/r)))^(-1))
(OverTilde[t])=r+4M ln |(r/(2M))-1|+(Subscript[(OverTilde[t]), 0])                                             ((OverTilde[dt])/dr)=((r+2M)/(r-2M)) 
r = 2 M
(OverTilde[t])=v-r = t + 2 M ln|(r/(2M))-1|

ve[r_,v0_] := 4((r/2)+Log[(r/2)-1])+v0;
vi[r_,v0_] := 4((r/2)+Log[1-(r/2)])+v0;
v  [r_,v0_]  :=If[r>2,4((r/2)+Log[(r/2)-1])+v0,(r/2)+Log[1-(r/2)]];
te[r_,t0_] := r+ 4 Log[(r/2)-1]+t0;
ti[r_,t0_] := r+ 4 Log[1-(r/2)]+t0;
dv[r_]:= (2/(1-(2/r)));
dt[r_]:= ((r+2)/(r-2))

slope1: defines forward light cone, extending from slope1 to slope2. 
We make sure that slope1 -> 0<= θ1 <= π
                                        slope2 -> 0<= θ2-θ1 
So you have to make sure the slopes are entered in the correct order in order to mark the timelike separated events

lightCone[x0_,y0_,len_,slope1_,slope2_,color_]:= Module[
{x1,y1,x2,y2,x3,y3,x4,y4,θ1,θ2,θ, cone,l},
l=Abs[len];
If[slope1>0,
θ1=ArcTan[slope1],
θ1=ArcTan[slope1]+π
];(* ArcTan gives  ((-π)/2) <= θ <= (π/2)*)
If[slope2>0,
θ2=ArcTan[slope2],
θ2=ArcTan[slope2]+π
];
If[θ2<θ1,θ=θ2;θ2=θ1;θ1=θ];
x1=x0+l Cos[θ1];y1= y0+ l Sin[θ1];
x2=x0+l Cos[θ2];y2= y0+ l Sin[θ2];
x3=x0-l Cos[θ2];y3=y0 - l Sin[θ2];
x4=x0-l Cos[θ1];y4=y0 - l Sin[θ1];
cone=Polygon[{{x1,y1},{x2,y2},{x0,y0},{x4,y4},{x3,y3},{x0,y0}}];
(*Print["P1= (",x1,",",y1,")  P2= (",x2,",",y2,")"];*)
Graphics[{color,cone}]
];
(*Show[{lightCone[0.,0.,1.,-1.,-4.5,Red],lightCone[2.,3.,1.,1.,3.6,Blue]}]*)

(t,v) coordinates

rmin=0.0; rmax = 5.0; rS=2.0;
vmin = -4.5;vmax = 4.5;
g0=Graphics[{Opacity[0.15],Red,Rectangle[{0,vmin},{rS,vmax+1}]}];
g1=Plot[
Table[   vi[r,v0],{v0,{0.0,  -2,2,4,-4,6,-6}}],{r,0.05,rS-0.001}
];
g2=Plot[
Table[   ve[r,v0],{v0,{0.0,  -2,2,4,-4,6,-6}}],{r,rS+0.001,rmax}
];
g3=Plot[
Table[   v0,{v0,{-3,-1,1,3}}],{r,0.05,rmax}(*,PlotStyle->{Magenta}*)
];
vp =   1;rp=r/.FindRoot[vi[r,   2.0]==vp,{r,1.0}];
l1 =lightCone[rp,vp,0.50,dv[rp],0.0,Magenta];
vp =   1;rp=r/.FindRoot[ve[r,   0.0]==vp,{r,3.8}];
l2 =lightCone[rp,vp,0.30,dv[rp],0.0,Magenta];
vp =   1;rp=r/.FindRoot[ve[r,-6.0]==vp,{r,3.8}];
l3 =lightCone[rp,vp,0.30,dv[rp],0.0,Magenta];
vp =-1;rp=r/.FindRoot[vi[r,   0.0]==vp,{r,1.0}];
l4 =lightCone[rp,vp,0.45,dv[rp],0.0,Magenta];
vp =-1;rp=r/.FindRoot[ve[r,   0.0]==vp,{r,2.5}];
l5 =lightCone[rp,vp,0.35,dv[rp],0.0,Magenta];
vp =-1;rp=r/.FindRoot[ve[r,-6.0]==vp,{r,3.5}];
l6 =lightCone[rp,vp,0.35,dv[rp],0.0,Magenta];
vp =  3;rp=r/.FindRoot[vi[r,   4.0]==vp,{r,1.0}];
l7 =lightCone[rp,vp,0.45,dv[rp],0.0,Magenta];
vp =  3;rp=r/.FindRoot[ve[r,   0.0]==vp,{r,3.0}];
l8 =lightCone[rp,vp,0.35,dv[rp],0.0,Magenta];
vp =  3;rp=r/.FindRoot[ve[r,-6.0]==vp,{r,4.0}];
l9 =lightCone[rp,vp,0.35,dv[rp],0.0,Magenta];
(*Print["(rp,vp)= (",rp,",",vp,")  dv= ",dv[rp]];*)
Show[g0,g1,g2,g3,l1,l2,l3,l4,l5,l6,l7,l8,l9,
PlotRange-> {{rmin,rmax},{vmin,vmax}},AspectRatio-> 1,Axes-> True,AxesLabel->{"r","v"}]

(r,(OverTilde[t])) coordinates

rmin=0.0; rmax = 5.0; rS=2.0;
tmin = -4.5;tmax = 4.5;
g0=Graphics[{Opacity[0.15],Red,Rectangle[{0,tmin},{rS,tmax+1}]}];
g1=Plot[
Table[   ti[r,t0],{t0,{0.0,  -2,2,4,-4,6,-6}}],{r,0.05,rS-0.001}
];
g2=Plot[
Table[   te[r,t0],{t0,{0.0,  -2,2,4,-4,6,-6}}],{r,rS+0.001,rmax}
];
g3=Plot[
Table[-r +t0,{t0,{-3,-1,1,3,5,7}}],{r,0.05,rmax}(*,PlotStyle->{Magenta}*)
];
tp =   3;rp=r/.FindRoot[ti[r,   4.0]== -r+tp,{r,1.0}];
l1 =lightCone[rp,-rp+tp,0.50,dt[rp],-1.0,Magenta];
tp =   3;rp=r/.FindRoot[te[r,   6.0]== -r+tp,{r,2.5}];
l2 =lightCone[rp,-rp+tp,0.50,dt[rp],-1.0,Magenta];
tp =   3;rp=r/.FindRoot[te[r,-2.0]== -r+tp,{r,2.5}];
l3 =lightCone[rp,-rp+tp,0.50,dt[rp],-1.0,Magenta];
tp =   3;rp=r/.FindRoot[te[r,-6.0]== -r+tp,{r,2.5}];
l4 =lightCone[rp,-rp+tp,0.50,dt[rp],-1.0,Magenta];
tp =-1;rp=r/.FindRoot[ti[r,   0.0]== -r+tp,{r,1.0}];
l5 =lightCone[rp,-rp+tp,0.50,dt[rp],-1.0,Magenta];
tp =-1;rp=r/.FindRoot[te[r,   6.0]== -r+tp,{r,2.5}];
l6 =lightCone[rp,-rp+tp,0.38,dt[rp],-1.0,Magenta];
tp =-1;rp=r/.FindRoot[te[r,-2.0]== -r+tp,{r,2.5}];
l7 =lightCone[rp,-rp+tp,0.38,dt[rp],-1.0,Magenta];
tp =-1;rp=r/.FindRoot[te[r,-6.0]== -r+tp,{r,2.5}];
l8  =lightCone[rp,-rp+tp,0.42,dt[rp],-1.0,Magenta];
Show[g0,g1,g2,g3,l1,l2,l3,l4,l5,l6,l7,l8,
PlotRange-> {{rmin,rmax},{tmin,tmax}},AspectRatio-> 1,Axes-> True,AxesLabel->{"r","(OverTilde[t])"}]

Acknowledgements

This notebook has been programmed by Konstantinos Anagnostopoulos, Physics Department, National Technical University of Athens, Greece, while he was an instructor of the 4th year undergraduate course "General Relativity and Cosmology". It was created for fun, but it may turn out to be useful to everyone studying the General Theory of Relativity for the first time.
Email: konstant@mail.ntua.gr
Web:    http://physics.ntua.gr/konstant 
It is offered under a GPL/CC BY 4.0 license (in that order, depending on whether they apply on the programming part or the text part of the notebook).