Visualización de Geodésicas usando EinsteinPy¶

$\hspace{1.5cm}$ image.png$\hspace{2cm}$ image-3.png $\hspace{2cm}$image-2.png

In [1]:
1+1
Out[1]:
2

Geodésicas en torno a un agujero negro de Schwarzschild¶

  • Obs: desde la forma de la métrica de Schwarzschild se sabe que el movimiento está restringido a un plano, luego, se trabajará con gráficas en 2 dimensiones para este tipo de escenarios

Parámetros por defecto: Geodesic()¶

steps (int) – Number of integration steps Defaults to 50

delta (float) – Initial integration step-size Defaults to 0.5

rtol (float) – Relative Tolerance Defaults to 1e-2

atol (float) – Absolute Tolerance Defaults to 1e-2

order (int) – Integration Order Defaults to 2

omega (float) – Coupling between Hamiltonian Flows Smaller values imply smaller integration error, but too small values can make the equation of motion non-integrable. For non-capture trajectories, omega = 1.0 is recommended. For trajectories, that either lead to a capture or a grazing geodesic, a decreased value of 0.01 or less is recommended. Defaults to 1.0

These parameters are for controlling numerical integration when solving geodesic equations, typically in General Relativity simulations (e.g., with einsteinpy). They influence precision, stability, and performance of how the path of a particle or photon is computed through curved spacetime

In [3]:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from einsteinpy.geodesic import Timelike, Nulllike
#from einsteinpy.plotting.geodesic import StaticGeodesicPlotter
#from einsteinpy.symbolic import Schwarzschild
In [22]:
'''   Functions [Move to a separate file]   '''
# Definir función para graficar coordenadas
def plotgeod_q(q, leap, max_ind, name, save=False, mark=0):

    # Definir coordenadas
    t, x, y = q[0][:max_ind:leap], q[1][:max_ind:leap], q[2][:max_ind:leap]

    plt.figure(figsize=(14,5))
    plt.scatter(x, y, c=range(len(t)), cmap='coolwarm', s=6, alpha=.9)   
    plt.plot(0, 0, "ko", label="BH")

    # Event horizon
    rBH = 2.
    xBH = np.linspace(-rBH,rBH,40)
    yBH = np.sqrt(rBH**2-xBH**2)
    plt.plot(xBH,yBH,'k--',xBH,-yBH, 'k--')

    if mark:
        plt.plot(x[-mark:], y[-mark:], 'k*', markersize=13)
    plt.colorbar(label="~Time")    
    plt.xlabel("x", fontsize=12.5)
    plt.ylabel("y", fontsize=12.5)
    plt.title(name, fontsize=12.5)
    plt.legend(fontsize=12.5)
    if save:
        plt.savefig(name+'.png', dpi=400)
    plt.show()

# Plot momentum
def plotgeod_p(q, p, leap, max_ind, name, save=False, mark=0):               # fix to have max_ind=-1 by default

    # Definir coordenadas [esféricas]
    t, E = q[0][:max_ind:leap], p[0][:max_ind:leap]
    p_r, p_theta, p_phi = p[1][:max_ind:leap], p[2][:max_ind:leap], p[3][:max_ind:leap]

    fig, axs = plt.subplots(figsize=(14,5),nrows=1, ncols=2)
    fs=15

    # Energy 
    axs[0].plot(t, E, label=f'E(0)={round(E[0],2)}')
    axs[0].set_title('E(t)', fontsize=fs)
    axs[0].set_xlabel('~Time')
    axs[0].set_ylabel('Energy')
    axs[0].legend(fontsize=fs, loc='upper left')

    # 3-momentum:
    axs[1].plot(t,p_r, label=fr'$P_r(0)=${round(p_r[0], 2)}')
    axs[1].plot(t,p_theta, label=fr'$P_\theta(0)=${round(p_theta[0],2)}')
    axs[1].plot(t,p_phi, label=fr'$P_\phi(0)=${round(p_phi[0],2)}')
    axs[1].set_title('3-momentum', fontsize=fs)
    axs[1].set_xlabel('~Time')
    axs[1].set_ylabel('3-momentum')
    axs[1].legend(fontsize=fs, loc='lower left')

    if mark:        
        axs[0].plot(t[-mark:], E[-mark:], 'k*', markersize=13)          #Not quite happy with this
    if save:
        plt.savefig(name+'.png', dpi=400)
    
    plt.tight_layout() 
    plt.show()

###   Plot n particles    ###
# Same idea as plotgeod_q, but for more particles
# Note that the steps and delta ought to be the same for all particles
# Preferably, same parameters (atol, rtol, omega, order)
# Warning: for now it only supports up to 3 particles and a black hole Mass = 1

def plotgeod_q2(q_list, name, max_ind, a, leap=[1,1,1], save=False, ani=False, lims=[0]):         #, mark=0):

    # Definir coordenadas
    t_list = [q_list[i][0][:max_ind[i]:leap[i]] for i in range(len(q_list))]
    x_list = [q_list[i][1][:max_ind[i]:leap[i]] for i in range(len(q_list))]
    y_list = [q_list[i][2][:max_ind[i]:leap[i]] for i in range(len(q_list))]
    #cmap_list = ['coolwarm', 'viridis', 'jet']
    color_list = ['red', 'green', 'blue']
    marker_list = ['1', 'd', '^']

    plt.figure(figsize=(14,5))
    plt.plot(0, 0, "ko", label="BH")                                # point BH
    for i in range(len(q_list)):
        # Geodesics
        plt.scatter(x_list[i], y_list[i], c=color_list[i], marker=marker_list[i],s=12, alpha=.7, label=f'Particle {1+i}')     
        #plt.colorbar(label=f"~Time | {i}")     #too messy with 3 colorbars; for absorbed geodesics we can do withouth 

    # Event horizon [Update this to support ergosphere and other Kerr BH features]
    ## Schild BH (1 event horizon)
    if name[0]=='S':
        rS = 2.
        xS = np.linspace(-rS,rS,40)
        yS = np.sqrt(rS**2-xS**2)
        plt.plot(xS,yS,'k--',xS,-yS, 'k--')

    ## Kerr BH (2 event horizons + 1 ergosphere)   [Obs: not spherical (Euclidean sense), but S^2 topology] 
    elif name[0]=='K':
        r_plus = 1 + np.sqrt(1-a**2)
        r_minus= 1 - np.sqrt(1-a**2)
        xK_p = np.linspace(-r_plus, r_plus, 30)
        yK_p = np.sqrt(r_plus**2 - xK_p**2)
        xK_m = np.linspace(-r_minus, r_minus, 30)
        yK_m = np.sqrt(r_minus**2 - xK_m**2)
        plt.plot(xK_p,yK_p,'k--', label='OH')                 # outer horizon
        plt.plot(xK_p,-yK_p, 'k--')
        plt.plot(xK_m,yK_m,'k--', alpha=.7, label='IH')     # inner horizon
        plt.plot(xK_m,-yK_m, 'k--', alpha=.7,)
        print(r_plus, r_minus)

        # ergosphere [at the Equator, equal to Schild radius; independent of a]
        rERG = 2.
        xERG = np.linspace(-rERG,rERG,30)
        yERG = np.sqrt(rERG**2-xERG**2)
        plt.plot(xERG,yERG,'g--', label='ERG')      #ergosphere
        plt.plot(xERG,-yERG, 'g--',)

    #if mark:
    #    plt.plot(x[-mark:], y[-mark:], 'k*', markersize=13)
    #plt.colorbar(label="~Time")    

    if lims[0]!=0:
        plt.xlim(lims[0], lims[1])
        plt.ylim(lims[2], lims[3]) 

    plt.xlabel("x [GM/c^2]", fontsize=12.5)
    plt.ylabel("y [GM/c^2]", fontsize=12.5)
    plt.title(name, fontsize=12.5)
    plt.legend(fontsize=12.5)
    if save==True:
        plt.savefig(name+'.png', dpi=400)
    if ani==False:        
        plt.show()
    
In [13]:
# set plot theme 
sns.set_theme(context='notebook', style='darkgrid', palette='colorblind')

Prototipo de simulación¶

  1. Definir condiciones iniciales y parámetros de Geodesic()
  2. Calcular geodésica (Timelike or Nulllike)
    • Tomar nota de Warnings
  3. Obtener trayectoria: 4-posición y 4-momentum
  4. Graficar evolución temporal de la posición (plano ecuatorial)
    • Investigar errores
    • Graficar 4-momentum
  5. Concluciones
  6. Exportar resultados o volver a al paso 1.

Ecuación Geodésica

$$ \frac{d^2x^{\mu}}{d\lambda^2}+\Gamma_{\nu\sigma}^{\mu}\frac{dx^\nu}{d\lambda}\frac{dx^\sigma}{d\lambda}$$

Los pasos de la integración se realizan sobre el parámetro afín $\lambda$

La primera componente de la 4-posición $x^0(λ) = t(λ)$ es parte de la solución de esta ecuación. Luego, qué tan rápido cambia $t$ respecto a $\lambda$ dependerá del momentum inicial y la geometría del espacio en ese punto.

In [ ]:
# Condiciones iniciales
position = [56., np.pi / 2, 0.]            # r, theta, phi (x=56, y=z=0)
momentum = [0., 0., 3.83405]               # momento inicial solo en phi
a = 0.                                     # Spin = 0 for a Schwarzschild black hole
steps = 5500                               # Number of steps to be taken by the solver
delta = 1                                  # default is set to 0.5
In [8]:
geod = Timelike(                    # m>0
    metric="Schwarzschild",
    metric_params=(a,),
    position=position,
    momentum=momentum,
    steps=steps,
    delta=delta,
    suppress_warnings=True,
    return_cartesian=True        # Obs: Momenta are dimensionless quantities, and are returned in Spherical Polar Coordinates.
)
#print(geod)
In [ ]:
# 4-posición y 4-momentum
q = geod.trajectory[1].T[:4]         #[GM/c^2]
p = geod.trajectory[1].T[-4:]   
In [46]:
q[1]
Out[46]:
array([5.59998939e+01, 5.59993694e+01, 5.59985728e+01, ...,
       2.14083123e+05, 1.94292710e+05, 1.85140955e+05], shape=(5500,))
In [47]:
q[2]
Out[47]:
array([ 6.84651348e-02,  1.36929665e-01,  2.05393464e-01, ...,
       -4.75899271e+04, -1.01777092e+05, -1.17696597e+05], shape=(5500,))
In [52]:
p[2]
Out[52]:
array([2.87025740e-19, 5.74054660e-19, 8.61087728e-19, ...,
       1.07740099e-15, 1.32112061e-15, 1.42160205e-15], shape=(5500,))
In [ ]:
# Definir cuadriposición y cuadrimomentum

q = geod.trajectory[1].T[:4]                  # 4-position (cartesian) [Units of GM/c^2]
p = geod.trajectory[1].T[-4:]                 # 4 momentum (spherical) [dimensionless] 

leap = 1
max_ind = 584

# name output
metric = 'Schild'       # Kerr
kind = 'Timelike'       # Nulllike
name = metric +'_'+ kind +'_'+ str(steps) +'_'+ str(delta) +'_'+ str(position) +'_'+ str(momentum)      

plotgeod_q(q, leap, max_ind, name, save=False)    
No description has been provided for this image

Hasta aquí todo parece correcto: el momento inicial de la partícula no es el suficiente para orbitar de manera estable al agujero negro y en poco tiempo terminará cayendo...

In [ ]:
plotgeod_q(q, leap, max_ind=2000 ,name=name)   
No description has been provided for this image

Algo falló, ahora acerquémonos...

In [ ]:
plotgeod_q(q, leap, max_ind=589 ,name=name) 
No description has been provided for this image
In [ ]:
plotgeod_q(q, leap, max_ind=588 ,name=name, mark=3)   
No description has been provided for this image

Obs: notar que la separación entre los puntos fue incrementando a medida que la partícula se acercaba al BH, esto sugiere que la simulación requería de un step más pequeño para que la simulación mantuviera la estabilidad

Veamos ahora el comportamiento del cuadrimomento

In [ ]:
# How to get initial conditions
geod.position
geod.momentum
Out[ ]:
array([ 0.        , 56.        ,  1.57079633,  0.        ])
In [ ]:
plotgeod_p(q, p, leap, max_ind=800, name=name)    
No description has been provided for this image
In [123]:
plotgeod_p(q, p, leap, max_ind=588, name=name, mark=3)    
No description has been provided for this image
In [ ]:
# Usando una las funciones integradas en einsteinpy
from einsteinpy.plotting import GeodesicPlotter

gpl = GeodesicPlotter()

gpl.clear()
gpl.parametric_plot(geod, colors=("red", "green", "blue"))
gpl.show()

No la mejor opción en este caso...

Ajustar omega y delta¶

1st Try¶

Siguiendo las recomendaciones de la documentación, para trayectorias donde la partícula es absorbida,

es recomendable utilizar un valor de omega$\leq0.01$. Adicionalmente, se utiliza delta=0.5

In [2]:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from einsteinpy.geodesic import Timelike
from einsteinpy.plotting.geodesic import StaticGeodesicPlotter
from einsteinpy.symbolic import Schwarzschild
In [138]:
# Condiciones iniciales
position = [56., np.pi / 2, 0.]            # r, theta, phi (x=56, y=z=0)
momentum = [0., 0., 3.83405]               # momento inicial solo en phi
a = 0.                                     # Spin = 0 for a Schwarzschild black hole
steps = 1200                               # Number of steps to be taken by the solver
delta = 0.5   
omega = 0.002
In [139]:
geod = Timelike(                    # m>0
    metric="Schwarzschild",
    metric_params=(a,),
    position=position,
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    suppress_warnings=False,          #True,
    return_cartesian=True        # Obs: Momenta are dimensionless quantities, and are returned in Spherical Polar Coordinates.
)
#print(geod)
In [140]:
geod.trajectory[1].T[0]-geod.trajectory[0]              # Is this numeric error or time dilation...
Out[140]:
array([ 5.10367056e-01,  2.07341326e-02, -4.68898751e-01, ...,
        8.30438125e+08,  8.57063129e+08,  8.84541768e+08], shape=(1200,))
In [141]:
geod.trajectory[0]              # = range(steps)
Out[141]:
array([   0,    1,    2, ..., 1197, 1198, 1199], shape=(1200,))
In [142]:
geod.trajectory[1].T[0]                                 # Not even ordered?
Out[142]:
array([5.10367056e-01, 1.02073413e+00, 1.53110125e+00, ...,
       8.30439322e+08, 8.57064327e+08, 8.84542967e+08], shape=(1200,))
In [ ]:
# Definir 4-posición y 4-momentum

q = geod.trajectory[1].T[:4]                  # 4-position (cartesian) [Units of GM/c^2]
p = geod.trajectory[1].T[-4:]                 # 4 momentum (spherical) [dimensionless] 

leap = 1
max_ind = 1190

# name output
metric = 'Schild'       # Kerr
kind = 'Timelike'       # Nulllike
name = metric +'_'+ kind +'_'+ str(steps) +'_'+ str(delta) +'_'+ str(position) +'_'+ str(momentum)      

plotgeod_q(q, leap, max_ind, name, save=False)    
No description has been provided for this image
In [148]:
plotgeod_q(q, leap, max_ind=720, name=name)  
No description has been provided for this image

Esta vez los errores numéricos comenzaron incluso antes de acercarse al agujero negro

In [152]:
plotgeod_q(q, leap, max_ind=735, name=name, mark=5)  
No description has been provided for this image
In [ ]:
plotgeod_p(q, p, leap, max_ind=1190, name=name)    
No description has been provided for this image

Ahora nos acercámos a los puntos más cercanos al BH

In [157]:
plotgeod_p(q, p, leap, max_ind=735, name=name, mark=5)  
No description has been provided for this image

Obs: Notar que los errores numéricos se intensificaron mucho antes del encuentro con el BH

2nd Try¶

  • Probar con omega=0.009 y reducimos a delta=0.2
In [1]:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from einsteinpy.geodesic import Timelike
#from einsteinpy.plotting.geodesic import StaticGeodesicPlotter
#from einsteinpy.symbolic import Schwarzschild
In [ ]:
# Condiciones iniciales
position = [56., np.pi / 2, 0.]            # r, theta, phi (x=56, y=z=0)
momentum = [0., 0., 3.83405]               # momento inicial solo en phi
a = 0.                                     # Spin = 0 for a Schwarzschild black hole
steps = 1200                               # Number of steps to be taken by the solver
delta = 0.2   
omega = 0.009

# Calcular geodésica
geod2 = Timelike(                    # m>0
    metric="Schwarzschild",
    metric_params=(a,),
    position=position,
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    suppress_warnings=False,          #True,
    return_cartesian=True        # Obs: Momenta are dimensionless quantities, and are returned in Spherical Polar Coordinates.
)

#print(geod)

# First warning
#Numerical error has exceeded specified tolerance at step = 655.
In [ ]:
# Definir 4-posición y 4-momentum

q = geod2.trajectory[1].T[:4]                  # 4-position (cartesian) [Units of GM/c^2]
p = geod2.trajectory[1].T[-4:]                 # 4 momentum (spherical) [dimensionless] 

leap = 1
max_ind = 1190

# name output
metric = 'Schild'       # Kerr
kind = 'Timelike'       # Nulllike
name = metric +'_'+ kind +'_'+ str(steps) +'_'+ str(delta) +'_'+ str(position) +'_'+ str(momentum)           

plotgeod_q(q, leap, max_ind, name, save=False)    
No description has been provided for this image

Now zoom in...

In [43]:
plotgeod_q(q, leap, max_ind=940, name=name, save=False)   
No description has been provided for this image

Resultados similares a los obtenidos en la sección anterior, los errores comienzan a ser significativos mucho antes de acercarse al BH

In [ ]:
plotgeod_p(q, p, leap, max_ind=700, name=name)    
No description has been provided for this image

Al parecer las variaciones en el momento y en la energía no son significativas, pero se empieza a notar que el momento radial comienza a disminuir

In [20]:
plotgeod_p(q, p, leap, max_ind=1000, name=name)    
No description has been provided for this image

3rd Try¶

  • Aumentar el orden del RK (2 $\to$ 4) y utilizar delta=1.0 y omega=1.0 (para resolver de buena forma la primera parte de la trayectoria)
In [ ]:
# Condiciones iniciales
position = [56., np.pi / 2, 0.]            # r, theta, phi (x=56, y=z=0)
momentum = [0., 0., 3.83405]               # momento inicial solo en phi
a = 0.                                     # Spin = 0 for a Schwarzschild black hole
steps = 1200                               # Number of steps to be taken by the solver
delta = 1.0   
omega = 1.0
order = 4

# Calcular geodésica
geod3 = Timelike(                    # m>0
    metric="Schwarzschild",
    metric_params=(a,),
    position=position,
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    suppress_warnings=False,          #True,
    return_cartesian=True        # Obs: Momenta are dimensionless quantities, and are returned in Spherical Polar Coordinates.
)

# First warning
# Numerical error has exceeded specified tolerance at step = 582.
In [ ]:
# Definir 4-posición y 4-momentum

q = geod3.trajectory[1].T[:4]                  # 4-position (cartesian) [Units of GM/c^2]
p = geod3.trajectory[1].T[-4:]                 # 4 momentum (spherical) [dimensionless] 

leap = 1
max_ind = 1190

# name output
metric = 'Schild'       # Kerr
kind = 'Timelike'       # Nulllike
name = metric +'_'+ kind +'_'+ str(steps) +'_'+ str(delta) +'_'+ str(position) +'_'+ str(momentum)      

# Plot q
plotgeod_q(q, leap, max_ind, name, save=False)    
No description has been provided for this image

Similar al resultado obtenido en la primera sección. Now zoom in...

In [41]:
plotgeod_q(q, leap, max_ind=585, name=name, save=False)         # Notar que los últimos 3 puntos ya sobrepasaron 
                                                                # la tolerancia seteada            
No description has been provided for this image

Esta vez sí se obtiene una simulación estable antes de llegar al BH

In [38]:
plotgeod_q(q, leap, max_ind=586, name=name, save=False, mark=2)   
No description has been provided for this image

Naturalmente, luego de llegar al horizonte de eventos, la simulación carece de sentido

Clasificar geodésicas y aplicar early-stopping¶

  • Timelike inner bound orbits (type IIa)
  • Timelike outer bound orbits (type IIb)
  • Timelike unbound absorbed orbits (type IIIa)
  • Timelike unbound scattered orbits (type IIIb)
  • Null bound orbits (type II)
  • Null unbound obsorbed orbits
  • Null unbound scattered orbits

  • Para las orbitas absorbidas, es necesario aplicar un early-stopping justo antes de que la partícula entre al agujero negro
  • En general, se necesita detener la simulación si se ha excedido la tolerancia fijada para el error

Null unbound Scatter orbits¶

In [4]:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from einsteinpy.geodesic import Timelike, Nulllike
1st Try¶
  • omega=delta=1 y RK2
  • Momento inicial positivo en $\phi$ y negativo en $r$
In [ ]:
# Condiciones iniciales
position = [56., np.pi / 2, 0.]            # r, theta, phi (x=56, y=z=0)
momentum = [-1., 0., 3.83405]               # momento inicial solo en phi
a = 0.                                     # Spin = 0 for a Schwarzschild black hole
steps = 1500                               # Number of steps to be taken by the solver
delta = 1.  
omega = 1.
order = 2

# Calcular geodésica
geod_n1 = Nulllike(                    # m=0
    metric="Schwarzschild",
    metric_params=(a,),
    position=position,
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    suppress_warnings=False,          #True,
    return_cartesian=True        # Obs: Momenta are dimensionless quantities, and are returned in Spherical Polar Coordinates.
)

#print(geod)

# First warning
# Numerical error has exceeded specified tolerance a step = 58.
In [48]:
# Definir 4-posición y 4-momentum

q = geod_n1.trajectory[1].T[:4]                  # 4-position (cartesian) [Units of GM/c^2]
p = geod_n1.trajectory[1].T[-4:]                 # 4 momentum (spherical) [dimensionless] 

leap = 1
max_ind = steps-10

# name output
metric = 'Schild'       # or Kerr
kind = 'Nulllike'       # or Timelike
name = metric +'_'+ kind +'_'+ str(steps) +'_'+ str(delta) +'_'+ str(position) +'_'+ str(momentum)           

plotgeod_q(q, leap, max_ind, name, save=False)    
No description has been provided for this image
In [49]:
plotgeod_q(q, leap, max_ind=61, name=name, save=False)    
No description has been provided for this image

Se observa que los puntos están muy espaciados, lo cual sugiere que el integrador requiere de un delta más pequeño. Esto tiene sentido ya que esta partícula se está moviendo a la máxima velocidad permitida (i.e., c)

2nd Try¶
  • Disminuir el delta para que la simulación gane estabilidad. delta=.4
  • Dado que la partícula pasa bastante cerca del BH, también se diminuye el omega. omega=0.5
  • Adicionalmente, se disminuye la magnitud del momento en $r$ (para evitar absorción) y se utiliza RK4.
In [ ]:
# Condiciones iniciales
position = [56., np.pi / 2, 0.]            # r, theta, phi (x=56, y=z=0)
momentum = [-.7, 0., 3.83405]               # momento inicial solo en phi
a = 0.                                     # Spin = 0 for a Schwarzschild black hole
steps = 1500                               # Number of steps to be taken by the solver
delta = .4
omega = .5
order = 4

# Calcular geodésica
geod_n2 = Nulllike(                    # m=0
    metric="Schwarzschild",
    metric_params=(a,),
    position=position,
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    suppress_warnings=False,          #True,
    return_cartesian=True        # Obs: Momenta are dimensionless quantities, and are returned in Spherical Polar Coordinates.
)

#print(geod)

# First warning
# Numerical error has exceeded specified tolerance a step = 91.
In [52]:
# Definir 4-posición y 4-momentum

q = geod_n2.trajectory[1].T[:4]                  # 4-position (cartesian) [Units of GM/c^2]
p = geod_n2.trajectory[1].T[-4:]                 # 4 momentum (spherical) [dimensionless] 

leap = 1
max_ind = steps-10

# name output
metric = 'Schild'       # or Kerr
kind = 'Nulllike'       # or Timelike
name = metric +'_'+ kind +'_'+ str(steps) +'_'+ str(delta) +'_'+ str(position) +'_'+ str(momentum)           

plotgeod_q(q, leap, max_ind, name, save=False)    
No description has been provided for this image

Zoom in...

In [66]:
plotgeod_q(q, leap, max_ind=157, name=name, save=False)  
No description has been provided for this image
In [56]:
plotgeod_p(q, p, leap, max_ind=1200, name=name)    
No description has been provided for this image

Zoom in...

In [70]:
plotgeod_p(q, p, leap, max_ind=150, name=name, mark=3)    
No description has been provided for this image

Desde el paso 140 aproximadamente, los errores tanto en la energía como en el momento en r, comienzan a ser significativos

En este caso, ya no corresponde a un defecto de las condiciones iniciales, pues se aprecia que la geodésica pasa lo suficientemente lejos del BH

3rd Try¶
  • omega=1.0 ; delta=.5 ; RK4
  • $P_r(0)=0.4$
In [73]:
# Condiciones iniciales
position = [56., np.pi / 2, 0.]            # r, theta, phi (x=56, y=z=0)
momentum = [-.4, 0., 3.83405]               # momento inicial solo en phi
a = 0.                                     # Spin = 0 for a Schwarzschild black hole
steps = 800                               # Number of steps to be taken by the solver
delta = .5
omega = 1.
order = 4

# Calcular geodésica
geod_n3 = Nulllike(                    # m=0
    metric="Schwarzschild",
    metric_params=(a,),
    position=position,
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    suppress_warnings=False,          #True,
    return_cartesian=True        # Obs: Momenta are dimensionless quantities, and are returned in Spherical Polar Coordinates.
)

#print(geod)

# First warning
# No warnings!
In [74]:
# Definir 4-posición y 4-momentum

q = geod_n3.trajectory[1].T[:4]                  # 4-position (cartesian) [Units of GM/c^2]
p = geod_n3.trajectory[1].T[-4:]                 # 4 momentum (spherical) [dimensionless] 

leap = 1
max_ind = steps-10

# name output
metric = 'Schild'       # or Kerr
kind = 'Nulllike'       # or Timelike
name = metric +'_'+ kind +'_'+ str(steps) +'_'+ str(delta) +'_'+ str(position) +'_'+ str(momentum)           

plotgeod_q(q, leap, max_ind, name, save=False)    
No description has been provided for this image

Relativity does work!

In [75]:
plotgeod_p(q, p, leap, max_ind=600, name=name)   
No description has been provided for this image
In [ ]:
p[1][-1]                # P_r final
Out[ ]:
np.float64(0.39767470785280296)

Se observan pequeñas oscilaciones en la energía y además, luego de ser desviado, el momento $P_r$ del fotón cambió de signo.

Esto se espera, ya que el momento radial inicial comienza siendo negativo, llega al punto de retorno (en este caso al periapsis de su órbita) donde $P_r=0$ y luego escapa al infinito, donde $P_r>0$

In [ ]:
#r = np.sqrt(q[1]**2+q[2]**2)
#plt.plot(q[0], r)
Out[ ]:
[<matplotlib.lines.Line2D at 0x7fa09b8cc050>]
No description has been provided for this image
4th Try¶
  • Kerr BH (a=.85)
  • position = [20., np.pi / 2, 0.]
  • momentum = [-.7, 0., 3.]
In [ ]:
# Condiciones iniciales
position = [20., np.pi / 2, 0.]            # r, theta, phi (x=20, y=z=0)
momentum = [-.7, 0., 3.]                   # momento inicial solo en phi y r
metric='Kerr'
a = 0.85                                   # Spin = 0 for a Schwarzschild black hole
steps = 500                               # Number of steps to be taken by the solver
delta = 0.2  
omega = 0.01
order = 4

# Calcular geodésica
geod_K = Nulllike(                    # m=0
    metric=metric,
    metric_params=(a,),
    position=position,
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    suppress_warnings=False,          #True,
    return_cartesian=True          # Obs: Momenta are dimensionless quantities, and are returned in Spherical Polar Coordinates.
)

#print(geod)

# First warning
# Numerical error has exceeded specified tolerance a step = 496. [just at the end]
In [12]:
# Definir 4-posición y 4-momentum

q = geod_K.trajectory[1].T[:4]                  # 4-position (cartesian) [Units of GM/c^2]
p = geod_K.trajectory[1].T[-4:]                 # 4 momentum (spherical) [dimensionless] 

leap = 1
max_ind = steps-10

# name output
kind = 'Nulllike'       # or Timelike
name = metric +'_'+ kind +'_'+ str(steps) +'_'+ str(delta) +'_'+ str(position) +'_'+ str(momentum)           

plotgeod_q(q, leap, max_ind, name, save=False)  
No description has been provided for this image

La gráfica parece bastante estable, lo cual se condice con los warnings que nos dió la simulación (solo 5 al final de la geodésica)

Notar que el punto retorno parece estar desplazado hacia la izquierda respecto a las simulaciones realizadas con agujeros negros estáticos, lo cual se conoce como frame draggin, un efecto relativista causado precisamente por la rotación de este agujero negro.

Para visualizar más en profundidad este fenómenos, podemos simular 2 fotones, uno cuya trayectoria siga la rotación del BH y otro que vaya en sentido contrario a esta

In [ ]:
# 2 Photons: co-rotating and counter-rotating
# Ya tenemor el primer fotón en geod_K

# Condiciones iniciales
position = [20., np.pi / 2, 0.]             # r, theta, phi (x=20, y=z=0)
momentum = [-.7, 0., -3.]                   # momento inicial hacia abajo izquierda
metric='Kerr'
a = 0.85                                   # Spin = 0 for a Schwarzschild black hole
steps = 500                                # Number of steps to be taken by the solver
delta = 0.2  
omega = 0.01
order = 4

# Calcular geodésica
geod_K2 = Nulllike(                    # m=0
    metric=metric,
    metric_params=(a,),
    position=position,
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    suppress_warnings=False,          #True,
    return_cartesian=True          # Obs: Momenta are dimensionless quantities, and are returned in Spherical Polar Coordinates.
)

#print(geod)

# First warning
# Numerical error has exceeded specified tolerance a step = 152. (dang it!)
In [17]:
# Definir 4-posición y 4-momentum

q = geod_K2.trajectory[1].T[:4]                  # 4-position (cartesian) [Units of GM/c^2]
p = geod_K2.trajectory[1].T[-4:]                 # 4 momentum (spherical) [dimensionless] 

leap = 1
max_ind = steps-10

# name output
kind = 'Nulllike'       # or Timelike
name = metric +'_'+ kind +'_'+ str(steps) +'_'+ str(delta) +'_'+ str(position) +'_'+ str(momentum)           

plotgeod_q(q, leap, max_ind, name, save=False)  
No description has been provided for this image
In [22]:
plotgeod_q(q, leap, max_ind=151, name=name, save=False) 
No description has been provided for this image

En este caso, debido a que el fotón viajaba en contra del sentido de rotación del BH, no pudo escapary terminó siendo capturado por el BH de Kerr

In [16]:
'Kerr_ 2_nulllike'[0]=='K'
Out[16]:
True
In [28]:
## Plot both photons

plotgeod_q2(q_list=[geod_K.trajectory[1].T[:4], geod_K2.trajectory[1].T[:4]],
             name='Kerr_ 2_nulllike_co_counter-rotating', 
             max_ind=[200, 151], 
             a=0.85, 
             leap=[1,1,1], 
             save=True)
1.526782687642637 0.473217312357363
No description has been provided for this image

Note: The ergosphere is the region where no observer can remain stationary, due to frame dragging

The ergosphere touches the outer horizon at the poles, but extends out to r=2 at the equator (just like Schild)

Also note that this is just a intuitive representation, these surfaces are not really spherical in the Euclidean sense.

3-test-particle simulations: Part I¶

  • Calcular 2 geodésicas para el mismo atractor y las condiciones iniciales, pero variando delta y omega,.
  • En este caso utilizamos un agujero negro de Kerr y geodésicas nulas (m=0)
In [ ]:
# Condiciones iniciales
position = [20., np.pi / 2, 0.]                 # r, theta, phi (x=56, y=z=0)
momentum = [-1., 0., 2.7]                       # momento inicial en -r y phi
a = .8                                          # Spin = 0 for a Schwarzschild black hole
steps = [400, 500, 600]                         # Number of steps to be taken by the solver
delta = [1, .5, .2]
omega = [1., 0.1, 0.05]
order = [4, 4, 4]

# Calcular geodésicas
geod_list=[]
for i in range(3):
    geod_A = Nulllike(                    # m=0
        metric="Kerr",
        metric_params=(a,),
        position=position,
        momentum=momentum,
        steps=steps[i],
        delta=delta[i],
        omega=omega[i],
        order=order[i],
        suppress_warnings=False,          #True,
        return_cartesian=True        # Obs: Momenta are dimensionless quantities, and are returned in Spherical Polar Coordinates.
    )
    geod_list.append(geod_A)
    print(f"Sim {i} finished!")

# First warnings
# A: Numerical error has exceeded specified tolerance at step = 20.
# B: None
# C: None

Muchas de las simulaciones se caen rápidamente. Realizar las simulaciones de esta manera no es muy conveniente, ya que si se cae una las demás no pueden ejecutarse. Luego, se debe asegurar que la simulación es estable (dadas las condiciones iniciales y los parámetros de la simulación) y luego graficar las 3 juntas.

In [ ]:
plotgeod_q2(q_list = [geod_list[i].trajectory[1].T[:4] for i in range(3)], 
            name='Kerr_3_photons_different_delta&omega', 
            max_ind=[23, 44, 116], 
            a=.8, 
            leap=[1,1,1], 
            save=False)
1.5999999999999999 0.40000000000000013
No description has been provided for this image
In [74]:
plotgeod_q2(q_list = [geod_list[i].trajectory[1].T[:4] for i in range(3)], 
            name='Kerr_3_photons_different_delta&omega', 
            max_ind=[23, 44, 117], 
            a=.8, 
            leap=[1,1,1], 
            save=False)
1.5999999999999999 0.40000000000000013
No description has been provided for this image

Notar que las geodésicas 2 y 3 no dieron wanrings, pero aún así tuvieron grandes problemas en las cercanías del agujero negro.

Se destaca que la partícula 3 pudo pasar de manera estable por la ergoesfera:

In [ ]:
plotgeod_q(geod_list[-1].trajectory[1].T[:4], leap=1, max_ind=116, name='Kerr_Particle3_plotgeod_q', save=False)    
No description has been provided for this image
In [85]:
plotgeod_q2(q_list = [geod_list[-1].trajectory[1].T[:4]], 
            name='Kerr_photon3_plotgeod_q2', 
            max_ind=[116], 
            a=.8, 
            leap=[1], 
            save=False)
1.5999999999999999 0.40000000000000013
No description has been provided for this image

Disminuir tolerancia: 1¶

In [ ]:
## Caso 1: counter-rotating
# Condiciones iniciales
position = [20., np.pi / 2, 0.]             # r, theta, phi (x=20, y=z=0)
momentum = [-.6, 0., -3.]                   # momento inicial hacia abajo izquierda
metric='Kerr'
a = 0.8                                   # Spin = 0 for a Schwarzschild black hole
steps = 500                                # Number of steps to be taken by the solver
delta = 0.2  
omega = 0.01
order = 4
atol = 1e-5
rtol = 1e-4
In [ ]:
# Calcular geodésica

geod_B = Nulllike(                    # m=0
    metric=metric,
    metric_params=(a,),
    position=position,
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    atol=atol,
    rtol=rtol,
    suppress_warnings=False,          
    return_cartesian=True             
)

# Utiliza fantasy por defecto al bajarle las tolerancias
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 183.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 184.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 185.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 186.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 187.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 188.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 189.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 190.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 191.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 192.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 193.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 194.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 195.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 196.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 197.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 198.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 199.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 200.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 201.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 202.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 203.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 204.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 205.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 206.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 207.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 208.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 209.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 210.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 211.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 212.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 213.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 214.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 215.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 216.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 217.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 218.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 219.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 220.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 221.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 222.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 223.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 224.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 225.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 226.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 227.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 228.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 229.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 230.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 231.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 232.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 233.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 234.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 235.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 236.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 237.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 238.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 239.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 240.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 241.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 242.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 243.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 244.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 245.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 246.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 247.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 248.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 249.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 250.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 251.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 252.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 253.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 254.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 255.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 256.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 257.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 258.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 259.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 260.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 261.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 262.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 263.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 264.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 265.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 266.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 267.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 268.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 269.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 270.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 271.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 272.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 273.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 274.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 275.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 276.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 277.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 278.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 279.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 280.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 281.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 282.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 283.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 284.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 285.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 286.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 287.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 288.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 289.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 290.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 291.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 292.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 293.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 294.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 295.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 296.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 297.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 298.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 299.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 300.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 301.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 302.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 303.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 304.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 305.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 306.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 307.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 308.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 309.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 310.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 311.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 312.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 313.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 314.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 315.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 316.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 317.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 318.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 319.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 320.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 321.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 322.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 323.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 324.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 325.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 326.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 327.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 328.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 329.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 330.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 331.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 332.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 333.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 334.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 335.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 336.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 337.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 338.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 339.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 340.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 341.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 342.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 343.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 344.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 345.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 346.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 347.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 348.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 349.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 350.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 351.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 352.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 353.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 354.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 355.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 356.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 357.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 358.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 359.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 360.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 361.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 362.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 363.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 364.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 365.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 366.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 367.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 368.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 369.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 370.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 371.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 372.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 373.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 374.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 375.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 376.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 377.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 378.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 379.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 380.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 381.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 382.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 383.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 384.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 385.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 386.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 387.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 388.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 389.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 390.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 391.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 392.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 393.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 394.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 395.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 396.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 397.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 398.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 399.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 400.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 401.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 402.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 403.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 404.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 405.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 406.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 407.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 408.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 409.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 410.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 411.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 412.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 413.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 414.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 415.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 416.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 417.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 418.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 419.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 420.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 421.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 422.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 423.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 424.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 425.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 426.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 427.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 428.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 429.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 430.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 431.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 432.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 433.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 434.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 435.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 436.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 437.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 438.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 439.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 440.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 441.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 442.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 443.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 444.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 445.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 446.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 447.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 448.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 449.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 450.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 451.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 452.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 453.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 454.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 455.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 456.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 457.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 458.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 459.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 460.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 461.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 462.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 463.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 464.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 465.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 466.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 467.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 468.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 469.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 470.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 471.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 472.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 473.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 474.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 475.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 476.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 477.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 478.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 479.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 480.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 481.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 482.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 483.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 484.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 485.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 486.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 487.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 488.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 489.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 490.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 491.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 492.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 493.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 494.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 495.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 496.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 497.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 498.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 499.
  warnings.warn(
/home/jorge/miniconda3/envs/Einstein/lib/python3.13/site-packages/einsteinpy/integrators/fantasy.py:287: RuntimeWarning: Numerical error has exceeded specified tolerance at step = 500.
  warnings.warn(
In [ ]:
plotgeod_q2([geod_B.trajectory[1].T[:4]], 
            name='Kerr_photon1_LowerRtol&Atol', 
            max_ind=[185], 
            a=.8, 
            leap=[1], 
            save=False)
1.5999999999999999 0.40000000000000013
No description has been provided for this image
In [18]:
## Caso 2: co-rotating
# Condiciones iniciales
position = [20., np.pi / 2, 0.]             # r, theta, phi (x=20, y=z=0)
momentum = [-.6, 0., 3.]                   # momento inicial hacia arriba izquierda
metric='Kerr'
a = 0.8                                   # Spin = 0 for a Schwarzschild black hole
steps = 500                                # Number of steps to be taken by the solver
delta = 0.08  
omega = 0.01
order = 4
atol = 1e-6
rtol = 1e-5
In [ ]:
# Calcular geodésica

geod_B = Nulllike(                    # m=0
    metric=metric,
    metric_params=(a,),
    position=position,
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    atol=atol,
    rtol=rtol,
    suppress_warnings=False,          
    return_cartesian=True             
)

# No warnings!
In [ ]:
plotgeod_q2([geod_B.trajectory[1].T[:4]], 
            name='Kerr_photon2_LowerRtol&Atol', 
            max_ind=[500], 
            a=.8, 
            leap=[1], 
            save=False)
1.5999999999999999 0.40000000000000013
No description has been provided for this image

Dado que disminuimos el delta, la simulación fue bastante estable y el integrador tuvo las condiciones necesarias para resolver de manera correcta la geodésica.

One last example...

In [39]:
# 3 posiciones iniciales bastante cercanas, mismo momento inicial
position = [[20., np.pi / 2, -.8*np.pi/4], [20., np.pi / 2, -1.2*np.pi/4], [20., np.pi / 2, -1.6*np.pi/4]]           
momentum = [-.6, 0., 3.]                   # momento inicial hacia arriba izquierda
metric='Kerr'
a = 0.8                                    # Spin = 0 for a Schwarzschild black hole
steps = 650                                # Number of steps to be taken by the solver
delta = 0.1  
omega = 0.01
order = 4
atol = 1e-4
rtol = 1e-3
In [ ]:
# 1st geodesic
geod_C1 = Nulllike(                    # m=0
    metric=metric,
    metric_params=(a,),
    position=position[0],
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    atol=atol,
    rtol=rtol,
    suppress_warnings=False,          
    return_cartesian=True             
)

# No warnings | 2m 6.6s
In [41]:
# 2nd geodesic
geod_C2 = Nulllike(                    # m=0
    metric=metric,
    metric_params=(a,),
    position=position[1],
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    atol=atol,
    rtol=rtol,
    suppress_warnings=False,          
    return_cartesian=True             
)
In [42]:
# 3rd geodesic
geod_C3 = Nulllike(                    # m=0
    metric=metric,
    metric_params=(a,),
    position=position[2],
    momentum=momentum,
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    atol=atol,
    rtol=rtol,
    suppress_warnings=False,          
    return_cartesian=True             
)
In [ ]:
plotgeod_q2(q_list=[geod_C1.trajectory[1].T[:4], geod_C2.trajectory[1].T[:4], geod_C3.trajectory[1].T[:4]], 
            name='Kerr_photon3_LowerRtol&Atol', 
            max_ind=[600, 600, 600], 
            a=.8, 
            leap=[1,1,1], 
            save=False)
1.5999999999999999 0.40000000000000013
No description has been provided for this image
In [64]:
def plotgeod_q2_ani(q_list, name, max_ind, a, leap=[1,1,1], save=False):         

    # Definir coordenadas
    t_list = [q_list[i][0][:max_ind[i]:leap[i]] for i in range(len(q_list))]
    x_list = [q_list[i][1][:max_ind[i]:leap[i]] for i in range(len(q_list))]
    y_list = [q_list[i][2][:max_ind[i]:leap[i]] for i in range(len(q_list))]
    #cmap_list = ['coolwarm', 'viridis', 'jet']
    color_list = ['red', 'green', 'blue']
    marker_list = ['1', 'd', '^']

    #plt.figure(figsize=(14,5))
    #plt.clf()
    plt.plot(0, 0, "ko", label="BH")                                # point BH
    for i in range(len(q_list)):
        # Geodesics
        plt.scatter(x_list[i], y_list[i], c=color_list[i], marker=marker_list[i],s=12, alpha=.7, label=f'Particle {1+i}')     
        #plt.colorbar(label=f"~Time | {i}")     #too messy with 3 colorbars; for absorbed geodesics we can do withouth 

    # Event horizon [Update this to support ergosphere and other Kerr BH features]
    ## Schild BH (1 event horizon)
    if name[0]=='S':
        rS = 2.
        xS = np.linspace(-rS,rS,40)
        yS = np.sqrt(rS**2-xS**2)
        plt.plot(xS,yS,'k--',xS,-yS, 'k--')

    ## Kerr BH (2 event horizons + 1 ergosphere)   [Obs: not spherical (Euclidean sense), but S^2 topology] 
    elif name[0]=='K':
        r_plus = 1 + np.sqrt(1-a**2)
        r_minus= 1 - np.sqrt(1-a**2)
        xK_p = np.linspace(-r_plus, r_plus, 30)
        yK_p = np.sqrt(r_plus**2 - xK_p**2)
        xK_m = np.linspace(-r_minus, r_minus, 30)
        yK_m = np.sqrt(r_minus**2 - xK_m**2)
        plt.plot(xK_p,yK_p,'k--', label='OH')                 # outer horizon
        plt.plot(xK_p,-yK_p, 'k--')
        plt.plot(xK_m,yK_m,'k--', alpha=.7, label='IH')     # inner horizon
        plt.plot(xK_m,-yK_m, 'k--', alpha=.7,)
        #print(r_plus, r_minus)

        # ergosphere [at the Equator, equal to Schild radius; independent of a]
        rERG = 2.
        xERG = np.linspace(-rERG,rERG,30)
        yERG = np.sqrt(rERG**2-xERG**2)
        plt.plot(xERG,yERG,'g--', label='ERG')      #ergosphere
        plt.plot(xERG,-yERG, 'g--',)

    #if mark:
    #    plt.plot(x[-mark:], y[-mark:], 'k*', markersize=13)
    #plt.colorbar(label="~Time")    
    plt.xlabel("x [GM/c^2]", fontsize=12.5)
    plt.ylabel("y [GM/c^2]", fontsize=12.5)
    plt.title(name, fontsize=12.5)
    plt.legend(fontsize=12.5)
    if save==True:
        plt.savefig(name+'.png', dpi=400)
In [ ]:
#%matplotlib notebook
In [72]:
ani.save("my_kerr_animation1.gif", fps=8, writer="pillow");

Animaciones...... ...

In [ ]:
# Exportar imágenes [make gif somewhere else]

n=50
for i in range(1,n+1):
    x = int(i/n * 640)
    plotgeod_q2(q_list=[geod_C1.trajectory[1].T[:4], geod_C2.trajectory[1].T[:4], geod_C3.trajectory[1].T[:4]], 
                name=f'Kerr_3photons_ani_{i}', 
                max_ind=[x, x, x], 
                a=.8, 
                leap=[1,1,1], 
                save=True)

Disminuir tolerancia: 2¶

In [2]:
# 3 posiciones iniciales bastante cercanas, mismo momento inicial
position = [[20., np.pi / 2, -.8*np.pi/4], [28., np.pi / 2, -1.2*np.pi/4], [33., np.pi / 2, -1.6*np.pi/4]]           
momentum = [[-.9, 0., 3.], [-.6, 0., 3.], [-.3, 0., 3.]]                   # momento inicial hacia arriba izquierda
metric='Kerr'
a = 0.8                                    # Spin = 0 for a Schwarzschild black hole
steps = 650                                # Number of steps to be taken by the solver
delta = 0.1  
omega = 0.01
order = 4
atol = 1e-4
rtol = 1e-3
In [ ]:
# 1st geodesic
geod_C1 = Nulllike(                    # m=0
    metric=metric,
    metric_params=(a,),
    position=position[0],
    momentum=momentum[0],
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    atol=atol,
    rtol=rtol,
    suppress_warnings=False,          
    return_cartesian=True             
)

# No warnings | 1m 54.9s 
In [ ]:
# 2nd geodesic
geod_C2 = Nulllike(                    # m=0
    metric=metric,
    metric_params=(a,),
    position=position[1],
    momentum=momentum[1],
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    atol=atol,
    rtol=rtol,
    suppress_warnings=False,          
    return_cartesian=True             
)

# No Warnings | 1m 9.5s
In [ ]:
# 3rd geodesic
geod_C3 = Nulllike(                    # m=0
    metric=metric,
    metric_params=(a,),
    position=position[2],
    momentum=momentum[2],
    steps=steps,
    delta=delta,
    omega=omega,
    order=order,
    atol=atol,
    rtol=rtol,
    suppress_warnings=False,          
    return_cartesian=True             
)

# No Warnings | 1m 54.8s
In [29]:
plotgeod_q2(q_list=[geod_C1.trajectory[1].T[:4], geod_C2.trajectory[1].T[:4], geod_C3.trajectory[1].T[:4]], 
            name='Kerr_photon3_LowerRtol&Atol_2nd', 
            max_ind=[648, 648, 648], 
            a=.8, 
            leap=[1,2,30], 
            save=True,
            lims=[-15, 29, -16, 5])
1.5999999999999999 0.40000000000000013
No description has been provided for this image
In [ ]:
geod_C1.trajectory[1].T[:4][0][-1]          # ~tiempo final
Out[ ]:
np.float64(74.64622247950199)
In [ ]:
geod_C2.trajectory[1].T[:4][0][-1]          
Out[ ]:
np.float64(47.71590769222416)
In [18]:
geod_C3.trajectory[1].T[:4][0][-1]
Out[18]:
np.float64(21.008649890179324)

Vemos que las partículas viajan durante intervalos de tiempo diferentes. Los parámetros steps y delta, no determinan la cantidad de tiempo que va a transcurrir, solamente fijan el valor máximo del parámetro afín y el espaciado sus valores.

Notar que dado que los momenta iniciales son diferentes, también lo serán las energías.

Even if the step size and number of steps are the same, geodesics advance through proper time (or an affine parameter) at different rates depending on their initial 4-velocity (or 4-momentum) and location in spacetime. That means coordinate time t evolves differently for each geodesic

In [ ]:
# 3rd geodesic [more steps for the 3rd particle][optionally, we could use delta=1, since this photon is pretty far
#                from the BH]
geod_C3 = Nulllike(                    # m=0
    metric=metric,
    metric_params=(a,),
    position=position[2],
    momentum=momentum[2],
    steps=3*steps,
    delta=delta,
    omega=omega,
    order=order,
    atol=atol,
    rtol=rtol,
    suppress_warnings=False,          
    return_cartesian=True             
)
In [32]:
geod_C3.trajectory[1].T[0][-1]
Out[32]:
np.float64(180.06083193999572)
In [35]:
plotgeod_q2(q_list=[geod_C1.trajectory[1].T[:4], geod_C2.trajectory[1].T[:4], geod_C3.trajectory[1].T[:4]], 
            name='Kerr_photon3_LowerRtol&Atol_2nd', 
            max_ind=[648, 648, 1900], 
            a=.8, 
            leap=[1,2,30], 
            save=True,
            lims=[-15, 29, -16, 5])
1.5999999999999999 0.40000000000000013
No description has been provided for this image
In [ ]: