Repository: einsteinpy/einsteinpy

Issue:
Coding the right event horizon for Kerr & Kerr-Newman space-time
🐞 **Problem**
As of now, in calculation of time-like trajectory in Kerr metric stops and raises a warning on reaching schwarzschild radius. But event horizon in kerr spacetime is smaller than schwarzschild radius. But the exact values need to be researched.

🎯 **Goal**
  - Research about the problem and specify the correct radius after which computation should stop in `metric/kerr.py`.

- [x] Kerr

- [ ] Kerr-Newman

📋  **Steps to solve the problem**

 * Comment below about what you've started working on.
 * Add, commit, push your changes
 * Submit a pull request and add this in comments - `Addresses #109`
 * Ask for a review in comments section of pull request
 * Celebrate your contribution to this project 🎉


Discussion:
pep8speaks: Hello @obi-wan-shinobi! Thanks for opening this PR. We checked the lines you've touched for [PEP 8](https://www.python.org/dev/peps/pep-0008) issues, and found:

* In the file [`src/einsteinpy/metric/kerrnewman.py`](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py):

> [Line 89:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L89): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 90:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L90): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 91:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L91): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 95:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L95): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 96:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L96): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 97:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L97): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 98:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L98): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 99:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L99): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 103:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L103): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 104:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L104): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 105:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L105): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 106:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L106): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 107:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L107): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 111:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L111): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 112:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L112): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 113:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L113): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 166:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L166): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator
> [Line 234:13](https://github.com/einsteinpy/einsteinpy/blob/141f8ee6c231918eecb8a6201f2af04a05048fa7/src/einsteinpy/metric/kerrnewman.py#L234): [W503](https://duckduckgo.com/?q=pep8%20W503) line break before binary operator




codecov[bot]: # [Codecov](https://codecov.io/gh/einsteinpy/einsteinpy/pull/472?src=pr&el=h1) Report
> Merging [#472](https://codecov.io/gh/einsteinpy/einsteinpy/pull/472?src=pr&el=desc) into [master](https://codecov.io/gh/einsteinpy/einsteinpy/commit/0e311bec1be2508a28ebd8a3f8b7b944db997269&el=desc) will **decrease** coverage by `0.33%`.
> The diff coverage is `62.50%`.

[![Impacted file tree graph](https://codecov.io/gh/einsteinpy/einsteinpy/pull/472/graphs/tree.svg?width=650&height=150&src=pr&token=H3oDVYA11f)](https://codecov.io/gh/einsteinpy/einsteinpy/pull/472?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master     #472      +/-   ##
==========================================
- Coverage   95.01%   94.67%   -0.34%     
==========================================
  Files          63       63              
  Lines        2106     2124      +18     
==========================================
+ Hits         2001     2011      +10     
- Misses        105      113       +8     
```


| [Impacted Files](https://codecov.io/gh/einsteinpy/einsteinpy/pull/472?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [src/einsteinpy/utils/kerrnewman\_utils.py](https://codecov.io/gh/einsteinpy/einsteinpy/pull/472/diff?src=pr&el=tree#diff-c3JjL2VpbnN0ZWlucHkvdXRpbHMva2Vycm5ld21hbl91dGlscy5weQ==) | `92.72% <55.55%> (-7.28%)` | :arrow_down: |
| [src/einsteinpy/metric/kerrnewman.py](https://codecov.io/gh/einsteinpy/einsteinpy/pull/472/diff?src=pr&el=tree#diff-c3JjL2VpbnN0ZWlucHkvbWV0cmljL2tlcnJuZXdtYW4ucHk=) | `91.76% <83.33%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/einsteinpy/einsteinpy/pull/472?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/einsteinpy/einsteinpy/pull/472?src=pr&el=footer). Last update [0e311be...141f8ee](https://codecov.io/gh/einsteinpy/einsteinpy/pull/472?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

ritzvik: Tests would most likely be ignored for this, I'll decide upon it
obi-wan-shinobi: Could you also review on the code coverage problem? I can't seem to find what's wrong... sorry :(
ritzvik: > Could you also review the code coverage problem? I can't seem to find what's wrong... sorry :(

I’ll get back to it.
shreyasbapat: Pay attention to the commit author, if I am right, there's some discrepancy. Or maybe it's GitHub mobile app
obi-wan-shinobi: > Pay attention to the commit author, if I am right, there's some discrepancy. Or maybe it's GitHub mobile app

I'm not sure I understand 😅
ritzvik: Everything looks good!
@obi-wan-shinobi Thanks !!

Patch:
diff --git a/src/einsteinpy/metric/kerrnewman.py b/src/einsteinpy/metric/kerrnewman.py
index 0c8cde9..166f00c 100644
--- a/src/einsteinpy/metric/kerrnewman.py
+++ b/src/einsteinpy/metric/kerrnewman.py
@@ -85,32 +85,32 @@ class KerrNewman:
         for i in range(4):
             vals[i] = vec[i + 4]
         vals[4] = -2.0 * (
-            chl[0][0][1] * vec[4] * vec[5]
-            + chl[0][0][2] * vec[4] * vec[6]
-            + chl[0][1][3] * vec[5] * vec[7]
-            + chl[0][2][3] * vec[6] * vec[7]
+            chl[0, 0, 1] * vec[4] * vec[5]
+            + chl[0, 0, 2] * vec[4] * vec[6]
+            + chl[0, 1, 3] * vec[5] * vec[7]
+            + chl[0, 2, 3] * vec[6] * vec[7]
         )
         vals[5] = -1.0 * (
-            chl[1][0][0] * vec[4] * vec[4]
-            + 2 * chl[1][0][3] * vec[4] * vec[7]
-            + chl[1][1][1] * vec[5] * vec[5]
-            + 2 * chl[1][1][2] * vec[5] * vec[6]
-            + chl[1][2][2] * vec[6] * vec[6]
-            + chl[1][3][3] * vec[7] * vec[7]
+            chl[1, 0, 0] * vec[4] * vec[4]
+            + 2 * chl[1, 0, 3] * vec[4] * vec[7]
+            + chl[1, 1, 1] * vec[5] * vec[5]
+            + 2 * chl[1, 1, 2] * vec[5] * vec[6]
+            + chl[1, 2, 2] * vec[6] * vec[6]
+            + chl[1, 3, 3] * vec[7] * vec[7]
         )
         vals[6] = -1.0 * (
-            chl[2][0][0] * vec[4] * vec[4]
-            + 2 * chl[2][0][3] * vec[4] * vec[7]
-            + chl[2][1][1] * vec[5] * vec[5]
-            + 2 * chl[2][1][2] * vec[5] * vec[6]
-            + chl[2][2][2] * vec[6] * vec[6]
-            + chl[2][3][3] * vec[7] * vec[7]
+            chl[2, 0, 0] * vec[4] * vec[4]
+            + 2 * chl[2, 0, 3] * vec[4] * vec[7]
+            + chl[2, 1, 1] * vec[5] * vec[5]
+            + 2 * chl[2, 1, 2] * vec[5] * vec[6]
+            + chl[2, 2, 2] * vec[6] * vec[6]
+            + chl[2, 3, 3] * vec[7] * vec[7]
         )
         vals[7] = -2.0 * (
-            chl[3][0][1] * vec[4] * vec[5]
-            + chl[3][0][2] * vec[4] * vec[6]
-            + chl[3][1][3] * vec[5] * vec[7]
-            + chl[3][2][3] * vec[6] * vec[7]
+            chl[3, 0, 1] * vec[4] * vec[5]
+            + chl[3, 0, 2] * vec[4] * vec[6]
+            + chl[3, 1, 3] * vec[5] * vec[7]
+            + chl[3, 2, 3] * vec[6] * vec[7]
         )
         vals[4:] -= self.q.value * np.dot(
             vec[4:].reshape((4,)), np.matmul(metric, maxwell)
@@ -161,14 +161,17 @@ class KerrNewman:
             **OdeMethodKwargs
         )
 
-        _scr = self.scr.value * 1.001
+        _event_hor = (
+            kerrnewman_utils.event_horizon(self.M.value, self.a.value, self.Q.value)[0]
+            * 1.001
+        )
 
         while ODE.t < end_lambda:
             vecs.append(ODE.y)
             lambdas.append(ODE.t)
             ODE.step()
-            if (not crossed_event_horizon) and (ODE.y[1] <= _scr):
-                warnings.warn("particle reached Schwarzchild Radius. ", RuntimeWarning)
+            if (not crossed_event_horizon) and (ODE.y[1] <= _event_hor):
+                warnings.warn("particle reached Event horizon. ", RuntimeWarning)
                 if stop_on_singularity:
                     break
                 else:
@@ -226,7 +229,10 @@ class KerrNewman:
             **OdeMethodKwargs
         )
         crossed_event_horizon = False
-        _scr = self.scr.value * 1.001
+        _event_hor = (
+            kerrnewman_utils.event_horizon(self.M.value, self.a.value, self.Q.value)[0]
+            * 1.001
+        )
 
         while True:
             if not return_cartesian:
@@ -238,8 +244,8 @@ class KerrNewman:
                 ).convert_cartesian()
                 yield ODE.t, np.hstack((v[0], si_vals[:3], v[4], si_vals[3:]))
             ODE.step()
-            if (not crossed_event_horizon) and (ODE.y[1] <= _scr):
-                warnings.warn("particle reached Schwarzschild Radius. ", RuntimeWarning)
+            if (not crossed_event_horizon) and (ODE.y[1] <= _event_hor):
+                warnings.warn("particle reached event horizon. ", RuntimeWarning)
                 if stop_on_singularity:
                     break
                 else:
diff --git a/src/einsteinpy/utils/kerr_utils.py b/src/einsteinpy/utils/kerr_utils.py
index 15f113f..5458d8e 100644
--- a/src/einsteinpy/utils/kerr_utils.py
+++ b/src/einsteinpy/utils/kerr_utils.py
@@ -91,7 +91,7 @@ def sigma(r, theta, a):
     -------
     float
         The value r^2 + a^2 * cos^2(theta)
-    
+
     """
     return (r ** 2) + ((a * np.cos(theta)) ** 2)
 
@@ -114,7 +114,7 @@ def delta(r, M, a, c=constant.c.value, G=constant.G.value):
     -------
     float
         The value r^2 - Rs * r + a^2
-    
+
     """
     Rs = schwarzschild_radius_dimensionless(M, c, G)
     return (r ** 2) - (Rs * r) + (a ** 2)
@@ -126,7 +126,7 @@ def metric(r, theta, M, a, c=constant.c.value, G=constant.G.value):
 
     Parameters
     ----------
-    
+
     r : float
         Distance from the centre
     theta : float
@@ -166,7 +166,7 @@ def metric_inv(r, theta, M, a, c=constant.c.value, G=constant.G.value):
 
     Parameters
     ----------
-    
+
     r : float
         Distance from the centre
     theta : float
@@ -193,7 +193,7 @@ def dmetric_dx(r, theta, M, a, c=constant.c.value, G=constant.G.value):
 
     Parameters
     ----------
-    
+
     r : float
         Distance from the centre
     theta : float
@@ -261,7 +261,7 @@ def christoffels(r, theta, M, a, c=constant.c.value, G=constant.G.value):
 
     Parameters
     ----------
-    
+
     r : float
         Distance from the centre
     theta : float
@@ -385,7 +385,7 @@ def spin_factor(J, M, c):
     -------
     float
         Spin factor (J/(Mc))
-    
+
     """
     return J / (M * c)
 
@@ -406,12 +406,16 @@ def event_horizon(
         Angle from z-axis in Boyer-Lindquist coordinates in radians. Mandatory for coord=='Spherical'. Defaults to pi/2.
     coord : str
         Output coordinate system. 'BL' for Boyer-Lindquist & 'Spherical' for spherical. Defaults to 'BL'.
+    c : float
+        Speed of light
+    G : float
+        Gravitational constant
 
     Returns
     -------
     ~numpy.array
         [Radius of event horizon(R), angle from z axis(theta)] in BL/Spherical coordinates
-    
+
     """
     Rs = schwarzschild_radius_dimensionless(M, c, G)
     Rh = 0.5 * (Rs + np.sqrt((Rs ** 2) - 4 * (a ** 2)))
@@ -442,12 +446,16 @@ def radius_ergosphere(
         Angle from z-axis in Boyer-Lindquist coordinates in radians. Defaults to pi/2.
     coord : str
         Output coordinate system. 'BL' for Boyer-Lindquist & 'Spherical' for spherical. Defaults to 'BL'.
+    c : float
+        Speed of light
+    G : float
+        Gravitational constant
 
     Returns
     -------
     ~numpy.array
         [Radius of ergosphere(R), angle from z axis(theta)] in BL/Spherical coordinates
-    
+
     """
     Rs = schwarzschild_radius_dimensionless(M, c, G)
     Re = 0.5 * (Rs + np.sqrt((Rs ** 2) - 4 * (a ** 2) * (np.cos(theta) ** 2)))
diff --git a/src/einsteinpy/utils/kerrnewman_utils.py b/src/einsteinpy/utils/kerrnewman_utils.py
index 288e97a..574af88 100644
--- a/src/einsteinpy/utils/kerrnewman_utils.py
+++ b/src/einsteinpy/utils/kerrnewman_utils.py
@@ -2,6 +2,8 @@ import astropy.units as u
 import numpy as np
 
 from einsteinpy import constant, utils
+from einsteinpy.coordinates import BoyerLindquist, Spherical
+from einsteinpy.utils import schwarzschild_radius_dimensionless
 
 nonzero_christoffels_list = [
     (0, 0, 1),
@@ -83,7 +85,7 @@ def rho(r, theta, a):
     -------
     float
         The value sqrt(r^2 + a^2 * cos^2(theta))
-    
+
     """
     return np.sqrt((r ** 2) + ((a * np.cos(theta)) ** 2))
 
@@ -116,7 +118,7 @@ def delta(
     -------
     float
         The value r^2 - Rs * r + a^2 + Rq^2
-    
+
     """
     Rs = utils.schwarzschild_radius_dimensionless(M, c, G)
     return (r ** 2) - (Rs * r) + (a ** 2) + (charge_length_scale(Q, c, G, Cc) ** 2)
@@ -137,7 +139,7 @@ def metric(
 
     Parameters
     ----------
-    
+
     r : float
         Distance from the centre
     theta : float
@@ -193,7 +195,7 @@ def metric_inv(
 
     Parameters
     ----------
-    
+
     r : float
         Distance from the centre
     theta : float
@@ -234,7 +236,7 @@ def dmetric_dx(
 
     Parameters
     ----------
-    
+
     r : float
         Distance from the centre
     theta : float
@@ -251,7 +253,7 @@ def dmetric_dx(
         Gravitational constant
     Cc : float
         Coulomb's constant
-    
+
     Returns
     -------
     dmdx : ~numpy.array
@@ -335,7 +337,7 @@ def christoffels(
 
     Parameters
     ----------
-    
+
     r : float
         Distance from the centre
     theta : float
@@ -392,7 +394,7 @@ def em_potential(
 
     Parameters
     ----------
-    
+
     r : float
         Distance from the centre
     theta : float
@@ -413,7 +415,7 @@ def em_potential(
     -------
     ~numpy.array
         Numpy array of shape (4,)
-    
+
     """
     rq, rh2, c2 = charge_length_scale(Q, c, G, Cc), rho(r, theta, a) ** 2, c ** 2
     vec = np.zeros((4,), dtype=float)
@@ -437,7 +439,7 @@ def maxwell_tensor_covariant(
 
     Parameters
     ----------
-    
+
     r : float
         Distance from the centre
     theta : float
@@ -493,7 +495,7 @@ def maxwell_tensor_contravariant(
 
     Parameters
     ----------
-    
+
     r : float
         Distance from the centre
     theta : float
@@ -561,3 +563,107 @@ def kerrnewman_time_velocity(pos_vec, vel_vec, mass, a, Q):
     D = (B ** 2) - (4 * A * C)
     vt = (B + np.sqrt(D)) / (2 * A)
     return vt * u.one
+
+
+def event_horizon(
+    M,
+    a,
+    Q,
+    theta=np.pi / 2,
+    coord="BL",
+    c=constant.c.value,
+    G=constant.G.value,
+    Cc=constant.coulombs_const.value,
+):
+    """
+    Calculate the radius of event horizon of Kerr-Newman black hole
+
+    Parameters
+    ----------
+    M : float
+        Mass of massive body
+    a : float
+        Black hole spin factor
+    Q : float
+        Charge on the black hole
+    theta : float
+        Angle from z-axis in Boyer-Lindquist coordinates in radians. Mandatory for coord=='Spherical'. Defaults to pi/2.
+    coord : str
+        Output coordinate system. 'BL' for Boyer-Lindquist & 'Spherical' for spherical. Defaults to 'BL'.
+    c : float
+        Speed of light
+    G : float
+        Gravitational constant
+    Cc : float
+        Coulomb's constant
+
+    Returns
+    -------
+    ~numpy.array
+        [Radius of event horizon(R), angle from z axis(theta)] in BL/Spherical coordinates
+
+    """
+    Rs = schwarzschild_radius_dimensionless(M, c, G)
+    rQsq = (Q ** 2) * G * Cc / c ** 4
+    Rh = 0.5 * Rs + np.sqrt((Rs ** 2) / 4 - a ** 2 - rQsq)
+    if coord == "BL":
+        ans = np.array([Rh, theta], dtype=float)
+    else:
+        ans = (
+            BoyerLindquist(Rh * u.m, theta * u.rad, 0.0 * u.rad, a * u.m)
+            .to_spherical()
+            .si_values()[:2]
+        )
+    return ans
+
+
+def radius_ergosphere(
+    M,
+    a,
+    Q,
+    theta=np.pi / 2,
+    coord="BL",
+    c=constant.c.value,
+    G=constant.G.value,
+    Cc=constant.coulombs_const.value,
+):
+    """
+    Calculate the radius of ergospere of Kerr-Newman black hole at a specific azimuthal angle
+
+    Parameters
+    ----------
+    M : float
+        Mass of massive body
+    a : float
+        Black hole spin factor
+    Q : float
+        Charge on the black hole
+    theta : float
+        Angle from z-axis in Boyer-Lindquist coordinates in radians. Mandatory for coord=='Spherical'. Defaults to pi/2.
+    coord : str
+        Output coordinate system. 'BL' for Boyer-Lindquist & 'Spherical' for spherical. Defaults to 'BL'.
+    c : float
+        Speed of light
+    G : float
+        Gravitational constant
+    Cc : float
+        Coulomb's constant
+
+    Returns
+    -------
+    ~numpy.array
+        [Radius of event horizon(R), angle from z axis(theta)] in BL/Spherical coordinates
+
+    """
+    Rs = schwarzschild_radius_dimensionless(M, c, G)
+    rQsq = (Q ** 2) * G * Cc / c ** 4
+    Rh = 0.5 * Rs + np.sqrt((Rs ** 2) / 4 - a ** 2 * np.cos(theta) ** 2 - rQsq)
+    if coord == "BL":
+        ans = np.array([Rh, theta], dtype=float)
+    else:
+        ans = (
+            BoyerLindquist(Rh * u.m, theta * u.rad, 0.0 * u.rad, a * u.m)
+            .to_spherical()
+            .si_values()[:2]
+        )
+    return ans


Test patch:
diff --git a/src/einsteinpy/tests/test_utils/test_kerr_utils.py b/src/einsteinpy/tests/test_utils/test_kerr_utils.py
index bec812a..84c5120 100644
--- a/src/einsteinpy/tests/test_utils/test_kerr_utils.py
+++ b/src/einsteinpy/tests/test_utils/test_kerr_utils.py
@@ -26,8 +26,8 @@ def test_event_horizon_for_nonrotating_case():
     _scr = schwarzschild_radius_dimensionless(M)
     a1 = kerr_utils.event_horizon(M, a, np.pi / 4)
     a2 = kerr_utils.event_horizon(M, a, np.pi / 4, "Spherical")
-    assert_allclose(a1, a2, rtol=0.0, atol=1e-5)
-    assert_allclose(a1[0], _scr, rtol=0.0, atol=1e-5)
+    assert_allclose(a1, a2, rtol=1e-4, atol=0.0)
+    assert_allclose(a1[0], _scr, rtol=1e-4, atol=0.0)
 
 
 def test_radius_ergosphere_for_nonrotating_case():
@@ -36,8 +36,8 @@ def test_radius_ergosphere_for_nonrotating_case():
     _scr = schwarzschild_radius_dimensionless(M)
     a1 = kerr_utils.radius_ergosphere(M, a, np.pi / 5)
     a2 = kerr_utils.radius_ergosphere(M, a, np.pi / 5, "Spherical")
-    assert_allclose(a1, a2, rtol=0.0, atol=1e-5)
-    assert_allclose(a1[0], _scr, rtol=0.0, atol=1e-5)
+    assert_allclose(a1, a2, rtol=1e-4, atol=0.0)
+    assert_allclose(a1[0], _scr, rtol=1e-4, atol=0.0)
 
 
 def test_christoffels():
diff --git a/src/einsteinpy/tests/test_utils/test_kerrnewman_utils.py b/src/einsteinpy/tests/test_utils/test_kerrnewman_utils.py
index 5ab86c6..70007fe 100644
--- a/src/einsteinpy/tests/test_utils/test_kerrnewman_utils.py
+++ b/src/einsteinpy/tests/test_utils/test_kerrnewman_utils.py
@@ -4,7 +4,11 @@ from astropy import units as u
 from numpy.testing import assert_allclose
 
 from einsteinpy import constant, utils
-from einsteinpy.utils import kerr_utils, kerrnewman_utils
+from einsteinpy.utils import (
+    kerr_utils,
+    kerrnewman_utils,
+    schwarzschild_radius_dimensionless,
+)
 
 _c = constant.c.value
 _G = constant.G.value
@@ -139,3 +143,25 @@ def test_maxwell_tensor_contravariant_for_natural_units():
         i = int(t / 4) % 4
         j = t % 4
         assert_allclose(0, m[i, j] + m[j, i], rtol=0.0, atol=1e-10)
+
+
+def test_event_horizon_for_nonrotating_uncharged_case():
+    M = 5e27
+    a = 0.0
+    Q = 0.0
+    _scr = schwarzschild_radius_dimensionless(M)
+    a1 = kerrnewman_utils.event_horizon(M, a, Q, np.pi / 4, "Spherical")
+    a2 = kerr_utils.event_horizon(M, a, np.pi / 4)
+    assert_allclose(a1, a2, rtol=1e-4, atol=0.0)
+    assert_allclose(a1[0], _scr, rtol=1e-4, atol=0.0)
+
+
+def test_radius_ergosphere_for_nonrotating_uncharged_case():
+    M = 5e27
+    a = 0.0
+    Q = 0.0
+    _scr = schwarzschild_radius_dimensionless(M)
+    a1 = kerrnewman_utils.radius_ergosphere(M, a, Q, np.pi / 4, "Spherical")
+    a2 = kerr_utils.radius_ergosphere(M, a, np.pi / 4)
+    assert_allclose(a1, a2, rtol=1e-4, atol=0.0)
+    assert_allclose(a1[0], _scr, rtol=1e-4, atol=0.0)