diff --git a/autogalaxy/profiles/mass/dark/abstract.py b/autogalaxy/profiles/mass/dark/abstract.py index 6fb60c2c..1f6d8f4e 100644 --- a/autogalaxy/profiles/mass/dark/abstract.py +++ b/autogalaxy/profiles/mass/dark/abstract.py @@ -67,26 +67,6 @@ def convergence_2d_from(self, grid: aa.type.Grid2DLike, xp=np, **kwargs): return self.convergence_func(grid_radius=grid_eta, xp=xp) - def tabulate_integral(self, grid, tabulate_bins, **kwargs): - """Tabulate an integral over the convergence of deflection potential of a mass profile. This is used in \ - the gNFW profile classes to speed up the integration procedure. - - Parameters - ---------- - grid - The grid of (y,x) arc-second coordinates the potential / deflection_stacks are computed on. - tabulate_bins - The number of bins to tabulate the inner integral of this profile. - """ - eta_min = 1.0e-4 - eta_max = 1.05 * np.max(self.elliptical_radii_grid_from(grid=grid, **kwargs)) - - minimum_log_eta = np.log10(eta_min) - maximum_log_eta = np.log10(eta_max) - bin_size = (maximum_log_eta - minimum_log_eta) / (tabulate_bins - 1) - - return eta_min, eta_max, minimum_log_eta, maximum_log_eta, bin_size - def density_3d_func(self, r, xp=np): x = r.array / self.scale_radius diff --git a/autogalaxy/profiles/mass/dark/gnfw.py b/autogalaxy/profiles/mass/dark/gnfw.py index 438ed867..8a182c17 100644 --- a/autogalaxy/profiles/mass/dark/gnfw.py +++ b/autogalaxy/profiles/mass/dark/gnfw.py @@ -28,118 +28,6 @@ def deflections_2d_via_mge_from(self, grid: aa.type.Grid2DLike, xp=np, **kwargs) ) return deflections_via_mge - @aa.grid_dec.to_vector_yx - @aa.grid_dec.transform - def deflections_2d_via_integral_from( - self, grid: aa.type.Grid2DLike, xp=np, tabulate_bins=1000, **kwargs - ): - """ - Calculate the deflection angles at a given set of arc-second gridded coordinates. - - Parameters - ---------- - grid - The grid of (y,x) arc-second coordinates the deflection angles are computed on. - tabulate_bins - The number of bins to tabulate the inner integral of this profile. - - """ - - def surface_density_integrand(x, kappa_radius, scale_radius, inner_slope): - return ( - (3 - inner_slope) - * (x + kappa_radius / scale_radius) ** (inner_slope - 4) - * (1 - np.sqrt(1 - x * x)) - ) - - def calculate_deflection_component(npow, yx_index): - - from scipy.integrate import quad - - deflection_grid = np.zeros(grid.shape[0]) - - for i in range(grid.shape[0]): - deflection_grid[i] = ( - 2.0 - * self.kappa_s - * self.axis_ratio(xp) - * grid[i, yx_index] - * quad( - self.deflection_func, - a=0.0, - b=1.0, - args=( - grid.array[i, 0], - grid.array[i, 1], - npow, - self.axis_ratio(xp), - minimum_log_eta, - maximum_log_eta, - tabulate_bins, - surface_density_integral, - ), - epsrel=gNFW.epsrel, - )[0] - ) - - return deflection_grid - - ( - eta_min, - eta_max, - minimum_log_eta, - maximum_log_eta, - bin_size, - ) = self.tabulate_integral(grid, tabulate_bins) - - surface_density_integral = np.zeros((tabulate_bins,)) - - for i in range(tabulate_bins): - from scipy.integrate import quad - - eta = 10.0 ** (minimum_log_eta + (i - 1) * bin_size) - - integral = quad( - surface_density_integrand, - a=0.0, - b=1.0, - args=(eta, self.scale_radius, self.inner_slope), - epsrel=gNFW.epsrel, - )[0] - - surface_density_integral[i] = ( - (eta / self.scale_radius) ** (1 - self.inner_slope) - ) * (((1 + eta / self.scale_radius) ** (self.inner_slope - 3)) + integral) - - deflection_y = calculate_deflection_component(npow=1.0, yx_index=0) - deflection_x = calculate_deflection_component(npow=0.0, yx_index=1) - - return self.rotated_grid_from_reference_frame_from( - np.multiply(1.0, np.vstack((deflection_y, deflection_x)).T), - ) - - @staticmethod - def deflection_func( - u, - y, - x, - npow, - axis_ratio, - minimum_log_eta, - maximum_log_eta, - tabulate_bins, - surface_density_integral, - ): - _eta_u = np.sqrt((u * ((x**2) + (y**2 / (1 - (1 - axis_ratio**2) * u))))) - bin_size = (maximum_log_eta - minimum_log_eta) / (tabulate_bins - 1) - i = 1 + int((np.log10(_eta_u) - minimum_log_eta) / bin_size) - r1 = 10.0 ** (minimum_log_eta + (i - 1) * bin_size) - r2 = r1 * 10.0**bin_size - kap = surface_density_integral[i] + ( - surface_density_integral[i + 1] - surface_density_integral[i] - ) * (_eta_u - r1) / (r2 - r1) - return kap / (1.0 - (1.0 - axis_ratio**2) * u) ** (npow + 0.5) - def convergence_func(self, grid_radius: float, xp=np) -> float: from scipy.integrate import quad @@ -170,108 +58,6 @@ def integral_y(y, eta): return grid_radius - @aa.over_sample - @aa.grid_dec.to_array - @aa.grid_dec.transform - def potential_2d_from( - self, grid: aa.type.Grid2DLike, xp=np, tabulate_bins=1000, **kwargs - ): - """ - Calculate the potential at a given set of arc-second gridded coordinates. - - Parameters - ---------- - grid - The grid of (y,x) arc-second coordinates the deflection angles are computed on. - tabulate_bins - The number of bins to tabulate the inner integral of this profile. - - """ - - from scipy import special - from scipy.integrate import quad - - def deflection_integrand(x, kappa_radius, scale_radius, inner_slope): - return (x + kappa_radius / scale_radius) ** (inner_slope - 3) * ( - (1 - np.sqrt(1 - x**2)) / x - ) - - ( - eta_min, - eta_max, - minimum_log_eta, - maximum_log_eta, - bin_size, - ) = self.tabulate_integral(grid, tabulate_bins) - - potential_grid = np.zeros(grid.shape[0]) - - deflection_integral = np.zeros((tabulate_bins,)) - - for i in range(tabulate_bins): - eta = 10.0 ** (minimum_log_eta + (i - 1) * bin_size) - - integral = quad( - deflection_integrand, - a=0.0, - b=1.0, - args=(eta, self.scale_radius, self.inner_slope), - epsrel=gNFW.epsrel, - )[0] - - deflection_integral[i] = ( - (eta / self.scale_radius) ** (2 - self.inner_slope) - ) * ( - (1.0 / (3 - self.inner_slope)) - * special.hyp2f1( - 3 - self.inner_slope, - 3 - self.inner_slope, - 4 - self.inner_slope, - -(eta / self.scale_radius), - ) - + integral - ) - - for i in range(grid.shape[0]): - potential_grid[i] = (2.0 * self.kappa_s * self.axis_ratio(xp)) * quad( - self.potential_func, - a=0.0, - b=1.0, - args=( - grid.array[i, 0], - grid.array[i, 1], - self.axis_ratio(xp), - minimum_log_eta, - maximum_log_eta, - tabulate_bins, - deflection_integral, - ), - epsrel=gNFW.epsrel, - )[0] - - return potential_grid - - @staticmethod - def potential_func( - u, - y, - x, - axis_ratio, - minimum_log_eta, - maximum_log_eta, - tabulate_bins, - potential_integral, - ): - _eta_u = np.sqrt((u * ((x**2) + (y**2 / (1 - (1 - axis_ratio**2) * u))))) - bin_size = (maximum_log_eta - minimum_log_eta) / (tabulate_bins - 1) - i = 1 + int((np.log10(_eta_u) - minimum_log_eta) / bin_size) - r1 = 10.0 ** (minimum_log_eta + (i - 1) * bin_size) - r2 = r1 * 10.0**bin_size - angle = potential_integral[i] + ( - potential_integral[i + 1] - potential_integral[i] - ) * (_eta_u - r1) / (r2 - r1) - return _eta_u * (angle / u) / (1.0 - (1.0 - axis_ratio**2) * u) ** 0.5 - class gNFWSph(gNFW): def __init__( @@ -306,55 +92,4 @@ def __init__( scale_radius=scale_radius, ) - @aa.grid_dec.to_vector_yx - @aa.grid_dec.transform - def deflections_2d_via_integral_from( - self, grid: aa.type.Grid2DLike, xp=np, **kwargs - ): - """ - Calculate the deflection angles at a given set of arc-second gridded coordinates. - - Parameters - ---------- - grid - The grid of (y,x) arc-second coordinates the deflection angles are computed on. - """ - - eta = np.multiply( - 1.0 / self.scale_radius, self.radial_grid_from(grid, **kwargs).array - ) - - deflection_grid = np.zeros(grid.shape[0]) - - for i in range(grid.shape[0]): - deflection_grid[i] = np.multiply( - 4.0 * self.kappa_s * self.scale_radius, self.deflection_func_sph(eta[i]) - ) - - return self._cartesian_grid_via_radial_from( - grid=grid, radius=deflection_grid, xp=xp - ) - - @staticmethod - def deflection_integrand(y, eta, inner_slope): - return (y + eta) ** (inner_slope - 3) * ((1 - np.sqrt(1 - y**2)) / y) - - def deflection_func_sph(self, eta): - - from scipy import special - from scipy.integrate import quad - - integral_y_2 = quad( - self.deflection_integrand, - a=0.0, - b=1.0, - args=(eta, self.inner_slope), - epsrel=1.49e-6, - )[0] - return eta ** (2 - self.inner_slope) * ( - (1.0 / (3 - self.inner_slope)) - * special.hyp2f1( - 3 - self.inner_slope, 3 - self.inner_slope, 4 - self.inner_slope, -eta - ) - + integral_y_2 - ) + pass diff --git a/autogalaxy/profiles/mass/dark/nfw.py b/autogalaxy/profiles/mass/dark/nfw.py index cd823333..092affc2 100644 --- a/autogalaxy/profiles/mass/dark/nfw.py +++ b/autogalaxy/profiles/mass/dark/nfw.py @@ -109,80 +109,11 @@ def deflections_2d_via_analytic_from( **kwargs, ) - @aa.grid_dec.to_vector_yx - @aa.grid_dec.transform - def deflections_2d_via_integral_from( - self, grid: aa.type.Grid2DLike, xp=np, **kwargs - ): - """ - Calculate the deflection angles at a given set of arc-second gridded coordinates. - - Parameters - ---------- - grid - The grid of (y,x) arc-second coordinates the deflection angles are computed on. - - """ - from scipy.integrate import quad - - def calculate_deflection_component(npow, index): - deflection_grid = np.array(self.axis_ratio(xp) * grid.array[:, index]) - - for i in range(grid.shape[0]): - deflection_grid[i] *= ( - self.kappa_s - * quad( - self.deflection_func, - a=0.0, - b=1.0, - args=( - grid.array[i, 0], - grid.array[i, 1], - npow, - self.axis_ratio(xp), - self.scale_radius, - ), - )[0] - ) - - return deflection_grid - - deflection_y = calculate_deflection_component(1.0, 0) - deflection_x = calculate_deflection_component(0.0, 1) - - return self.rotated_grid_from_reference_frame_from( - np.multiply(1.0, np.vstack((deflection_y, deflection_x)).T) - ) - @aa.grid_dec.to_vector_yx @aa.grid_dec.transform def deflections_2d_via_cse_from(self, grid: aa.type.Grid2DLike, xp=np, **kwargs): return self._deflections_2d_via_cse_from(grid=grid, **kwargs) - @staticmethod - def deflection_func(u, y, x, npow, axis_ratio, scale_radius): - _eta_u = (1.0 / scale_radius) * np.sqrt( - (u * ((x**2) + (y**2 / (1 - (1 - axis_ratio**2) * u)))) - ) - - if _eta_u > 1: - _eta_u_2 = (1.0 / np.sqrt(_eta_u**2 - 1)) * np.arctan( - np.sqrt(_eta_u**2 - 1) - ) - elif _eta_u < 1: - _eta_u_2 = (1.0 / np.sqrt(1 - _eta_u**2)) * np.arctanh( - np.sqrt(1 - _eta_u**2) - ) - else: - _eta_u_2 = 1 - - return ( - 2.0 - * (1 - _eta_u_2) - / (_eta_u**2 - 1) - / ((1 - (1 - axis_ratio**2) * u) ** (npow + 0.5)) - ) - @aa.over_sample @aa.grid_dec.to_array @aa.grid_dec.transform @@ -213,67 +144,6 @@ def convergence_func(self, grid_radius: float, xp=np) -> float: * xp.array(self.coord_func_g(grid_radius=grid_radius, xp=xp)) ) - @aa.over_sample - @aa.grid_dec.to_array - @aa.grid_dec.transform - def potential_2d_from(self, grid: aa.type.Grid2DLike, xp=np, **kwargs): - """ - Calculate the potential at a given set of arc-second gridded coordinates. - - Parameters - ---------- - grid - The grid of (y,x) arc-second coordinates the deflection angles are computed on. - - """ - from scipy.integrate import quad - - potential_grid = np.zeros(grid.shape[0]) - - for i in range(grid.shape[0]): - potential_grid[i] = quad( - self.potential_func, - a=0.0, - b=1.0, - args=( - grid.array[i, 0], - grid.array[i, 1], - self.axis_ratio(xp), - self.kappa_s, - self.scale_radius, - ), - epsrel=1.49e-5, - )[0] - - return potential_grid - - @staticmethod - def potential_func(u, y, x, axis_ratio, kappa_s, scale_radius): - _eta_u = (1.0 / scale_radius) * np.sqrt( - (u * ((x**2) + (y**2 / (1 - (1 - axis_ratio**2) * u)))) - ) - - if _eta_u > 1: - _eta_u_2 = (1.0 / np.sqrt(_eta_u**2 - 1)) * np.arctan( - np.sqrt(_eta_u**2 - 1) - ) - elif _eta_u < 1: - _eta_u_2 = (1.0 / np.sqrt(1 - _eta_u**2)) * np.arctanh( - np.sqrt(1 - _eta_u**2) - ) - else: - _eta_u_2 = 1 - - return ( - 4.0 - * kappa_s - * scale_radius - * (axis_ratio / 2.0) - * (_eta_u / u) - * ((np.log(_eta_u / 2.0) + _eta_u_2) / _eta_u) - / ((1 - (1 - axis_ratio**2) * u) ** 0.5) - ) - def decompose_convergence_via_cse( self, grid_radii: np.ndarray, total_cses=30, sample_points=60 ): diff --git a/autogalaxy/profiles/mass/stellar/gaussian.py b/autogalaxy/profiles/mass/stellar/gaussian.py index 6ca7a576..b5946d7f 100644 --- a/autogalaxy/profiles/mass/stellar/gaussian.py +++ b/autogalaxy/profiles/mass/stellar/gaussian.py @@ -80,64 +80,6 @@ def deflections_2d_via_analytic_from( xp=xp, ) - @aa.grid_dec.to_vector_yx - @aa.grid_dec.transform - def deflections_2d_via_integral_from( - self, grid: aa.type.Grid2DLike, xp=np, **kwargs - ): - """ - Calculate the deflection angles at a given set of arc-second gridded coordinates. - - Parameters - ---------- - grid - The grid of (y,x) arc-second coordinates the deflection angles are computed on. - - Note: sigma is divided by sqrt(q) here. - - """ - from scipy.integrate import quad - - def calculate_deflection_component(npow, index): - deflection_grid = np.array(self.axis_ratio(xp) * grid.array[:, index]) - - for i in range(grid.shape[0]): - deflection_grid[i] *= ( - self.intensity - * self.mass_to_light_ratio - * quad( - self.deflection_func, - a=0.0, - b=1.0, - args=( - grid.array[i, 0], - grid.array[i, 1], - npow, - self.axis_ratio(xp), - self.sigma / xp.sqrt(self.axis_ratio(xp)), - ), - )[0] - ) - - return deflection_grid - - deflection_y = calculate_deflection_component(1.0, 0) - deflection_x = calculate_deflection_component(0.0, 1) - - return self.rotated_grid_from_reference_frame_from( - np.multiply(1.0, np.vstack((deflection_y, deflection_x)).T), xp=xp - ) - - @staticmethod - def deflection_func(u, y, x, npow, axis_ratio, sigma, xp=np): - _eta_u = xp.sqrt(axis_ratio) * xp.sqrt( - (u * ((x**2) + (y**2 / (1 - (1 - axis_ratio**2) * u)))) - ) - - return xp.exp(-0.5 * xp.square(xp.divide(_eta_u, sigma))) / ( - (1 - (1 - axis_ratio**2) * u) ** (npow + 0.5) - ) - @aa.over_sample @aa.grid_dec.to_array @aa.grid_dec.transform diff --git a/autogalaxy/profiles/mass/stellar/sersic.py b/autogalaxy/profiles/mass/stellar/sersic.py index 853ab044..c058729a 100644 --- a/autogalaxy/profiles/mass/stellar/sersic.py +++ b/autogalaxy/profiles/mass/stellar/sersic.py @@ -296,68 +296,7 @@ def elliptical_effective_radius(self): class Sersic(AbstractSersic, MassProfileCSE): - @aa.grid_dec.to_vector_yx - @aa.grid_dec.transform - def deflections_2d_via_integral_from( - self, grid: aa.type.Grid2DLike, xp=np, **kwargs - ): - """ - Calculate the deflection angles at a given set of arc-second gridded coordinates. - - Parameters - ---------- - grid - The grid of (y,x) arc-second coordinates the deflection angles are computed on. - - """ - from scipy.integrate import quad - - def calculate_deflection_component(npow, index): - sersic_constant = self.sersic_constant - - deflection_grid = self.axis_ratio() * grid.array[:, index] - - for i in range(grid.shape[0]): - deflection_grid[i] = deflection_grid[i] * ( - self.intensity - * self.mass_to_light_ratio - * quad( - self.deflection_func, - a=0.0, - b=1.0, - args=( - grid.array[i, 0], - grid.array[i, 1], - npow, - self.axis_ratio(), - self.sersic_index, - self.effective_radius, - sersic_constant, - ), - )[0] - ) - - return deflection_grid - - deflection_y = calculate_deflection_component(1.0, 0) - deflection_x = calculate_deflection_component(0.0, 1) - - return self.rotated_grid_from_reference_frame_from( - np.multiply(1.0, np.vstack((deflection_y, deflection_x)).T), xp=xp - ) - - @staticmethod - def deflection_func( - u, y, x, npow, axis_ratio, sersic_index, effective_radius, sersic_constant - ): - _eta_u = np.sqrt(axis_ratio) * np.sqrt( - (u * ((x**2) + (y**2 / (1 - (1 - axis_ratio**2) * u)))) - ) - - return np.exp( - -sersic_constant - * (((_eta_u / effective_radius) ** (1.0 / sersic_index)) - 1) - ) / ((1 - (1 - axis_ratio**2) * u) ** (npow + 0.5)) + pass class SersicSph(Sersic): diff --git a/autogalaxy/profiles/mass/stellar/sersic_gradient.py b/autogalaxy/profiles/mass/stellar/sersic_gradient.py index 3b096d9a..aac7a3cf 100644 --- a/autogalaxy/profiles/mass/stellar/sersic_gradient.py +++ b/autogalaxy/profiles/mass/stellar/sersic_gradient.py @@ -49,81 +49,6 @@ def __init__( ) self.mass_to_light_gradient = mass_to_light_gradient - @aa.grid_dec.to_vector_yx - @aa.grid_dec.transform - def deflections_2d_via_integral_from( - self, grid: aa.type.Grid2DLike, xp=np, **kwargs - ): - """ - Calculate the deflection angles at a given set of arc-second gridded coordinates. - - Parameters - ---------- - grid - The grid of (y,x) arc-second coordinates the deflection angles are computed on. - - """ - from scipy.integrate import quad - - def calculate_deflection_component(npow, index): - sersic_constant = self.sersic_constant - - deflection_grid = np.array(self.axis_ratio() * grid.array[:, index]) - - for i in range(grid.shape[0]): - deflection_grid[i] *= ( - self.intensity - * self.mass_to_light_ratio - * quad( - self.deflection_func, - a=0.0, - b=1.0, - args=( - grid.array[i, 0], - grid.array[i, 1], - npow, - self.axis_ratio(), - self.sersic_index, - self.effective_radius, - self.mass_to_light_gradient, - sersic_constant, - ), - )[0] - ) - return deflection_grid - - deflection_y = calculate_deflection_component(1.0, 0) - deflection_x = calculate_deflection_component(0.0, 1) - - return self.rotated_grid_from_reference_frame_from( - np.multiply(1.0, np.vstack((deflection_y, deflection_x)).T) - ) - - @staticmethod - def deflection_func( - u, - y, - x, - npow, - axis_ratio, - sersic_index, - effective_radius, - mass_to_light_gradient, - sersic_constant, - ): - _eta_u = np.sqrt(axis_ratio) * np.sqrt( - (u * ((x**2) + (y**2 / (1 - (1 - axis_ratio**2) * u)))) - ) - - return ( - (((axis_ratio * _eta_u) / effective_radius) ** -mass_to_light_gradient) - * np.exp( - -sersic_constant - * (((_eta_u / effective_radius) ** (1.0 / sersic_index)) - 1) - ) - / ((1 - (1 - axis_ratio**2) * u) ** (npow + 0.5)) - ) - @aa.over_sample @aa.grid_dec.to_array @aa.grid_dec.transform diff --git a/test_autogalaxy/profiles/mass/abstract/test_mge.py b/test_autogalaxy/profiles/mass/abstract/test_mge.py index e40aad76..17a5a203 100644 --- a/test_autogalaxy/profiles/mass/abstract/test_mge.py +++ b/test_autogalaxy/profiles/mass/abstract/test_mge.py @@ -1,674 +1,666 @@ -import numpy as np -import pytest - -from autogalaxy.profiles.mass import MGEDecomposer - -import autogalaxy as ag - - -def test__gnfw_deflections_yx_2d_via_mge__config_1__inner_slope_05(): - nfw = ag.mp.gNFW( - centre=(0.0, 0.0), - kappa_s=1.0, - ell_comps=ag.convert.ell_comps_from(axis_ratio=0.3, angle=100.0), - inner_slope=0.5, - scale_radius=8.0, - ) - - radii_min = nfw.scale_radius / 2000.0 - radii_max = nfw.scale_radius * 30.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - deflections_via_integral = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) - ) - - mge_decomp = ag.mp.MGEDecomposer(mass_profile=nfw) - - deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), - xp=np, - sigma_log_list=sigmas, - ellipticity_convention="major", - three_D=True, - ) - - assert deflections_via_integral == pytest.approx(deflections_via_mge, 1.0e-3) - - -def test__gnfw_deflections_yx_2d_via_mge__config_2__inner_slope_15(): - nfw = ag.mp.gNFW( - centre=(0.3, 0.2), - kappa_s=2.5, - ell_comps=ag.convert.ell_comps_from(axis_ratio=0.5, angle=100.0), - inner_slope=1.5, - scale_radius=4.0, - ) - - radii_min = nfw.scale_radius / 20000.0 - radii_max = nfw.scale_radius * 30.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 30) - sigmas = np.exp(log_sigmas) - - deflections_via_integral = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) - ) - mge_decomp = ag.mp.MGEDecomposer(mass_profile=nfw) - - deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), - xp=np, - sigma_log_list=sigmas, - ellipticity_convention="major", - three_D=True, - ) - - assert deflections_via_integral == pytest.approx(deflections_via_mge, 1.0e-3) - - -def test__sersic_deflections_yx_2d_via_mge__sersic_index_2(): - mp = ag.mp.Sersic( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - mge_decomp = ag.mp.MGEDecomposer(mass_profile=mp) - - deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]), - xp=np, - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert deflections_via_integral == pytest.approx(deflections_via_mge, 1.0e-3) - - -def test__sersic_deflections_yx_2d_via_mge__sersic_index_3(): - mp = ag.mp.Sersic( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=10.0, - effective_radius=0.2, - sersic_index=3.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - mge_decomp = ag.mp.MGEDecomposer(mass_profile=mp) - - deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]), - xp=np, - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert deflections_via_integral == pytest.approx(deflections_via_mge, 1.0e-3) - - -def test__cnfw_deflections_yx_2d_via_mge(): - cnfw = ag.mp.cNFWSph( - centre=(0.3, 0.2), kappa_s=0.05, scale_radius=1.1, core_radius=0.01 - ) - - radii_min = cnfw.scale_radius / 1000.0 - radii_max = cnfw.scale_radius * 200.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - deflections_analytic = cnfw.deflections_yx_2d_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), xp=np - ) - - mge_decomp = ag.mp.MGEDecomposer(mass_profile=cnfw) - - deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), - xp=np, - sigma_log_list=sigmas, - ellipticity_convention="major", - three_D=True, - ) - - assert deflections_analytic == pytest.approx(deflections_via_mge, 1.0e-3) - - -def test__powerlaw_deflections_yx_2d_via_mge(): - mp = ag.mp.PowerLaw( - centre=(-0.4, -0.2), - ell_comps=(0.17142, -0.285116), - einstein_radius=0.2, - slope=1.8, - ) - - radii_min = mp.einstein_radius / 10000.0 - radii_max = mp.einstein_radius * 1000.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 30) - sigmas = np.exp(log_sigmas) - - deflections_analytic = mp.deflections_yx_2d_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), xp=np - ) - - mge_decomp = ag.mp.MGEDecomposer(mass_profile=mp) - - deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), - xp=np, - sigma_log_list=sigmas, - ellipticity_convention="major", - three_D=False, - ) - - assert deflections_analytic == pytest.approx(deflections_via_mge, 1.0e-2) - - -def test__chameleon_deflections_yx_2d_via_mge(): - mp = ag.mp.Chameleon( - centre=(-0.4, -0.2), ell_comps=(0.17142, -0.285116), intensity=2.8 - ) - - radii_min = mp.core_radius_0 / 10000.0 - radii_max = mp.core_radius_0 * 10000.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 30) - sigmas = np.exp(log_sigmas) - - deflections_analytic = mp.deflections_yx_2d_from( - grid=ag.Grid2DIrregular([[-0.1875, 0.1625]]), xp=np - ) - - mge_decomp = ag.mp.MGEDecomposer(mass_profile=mp) - - deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( - grid=ag.Grid2DIrregular([[-0.1875, 0.1625]]), - xp=np, - sigma_log_list=sigmas, - ellipticity_convention="major", - three_D=False, - ) - - assert deflections_analytic == pytest.approx(deflections_via_mge, 1.0e-3) - - -def test__DevVaucouleurs_convergence_2d_via_mge_from__config_1(): - mp = ag.mp.DevVaucouleurs( - ell_comps=(0.0, 0.333333), - intensity=3.0, - effective_radius=2.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]), - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert convergence == pytest.approx(5.6697, 1e-3) - - -def test__DevVaucouleurs_convergence_2d_via_mge_from__config_2(): - mp = ag.mp.DevVaucouleurs( - ell_comps=(0.0, -0.333333), - intensity=2.0, - effective_radius=3.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.0, 1.0]]), - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert convergence == pytest.approx(7.4455, 1e-3) - - -def test__DevVaucouleurs_convergence_2d_via_mge_from__intensity_4(): - mp = ag.mp.DevVaucouleurs( - ell_comps=(0.0, -0.333333), - intensity=4.0, - effective_radius=3.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.0, 1.0]]), - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert convergence == pytest.approx(2.0 * 7.4455, 1e-3) - - -def test__DevVaucouleurs_convergence_2d_via_mge_from__mass_to_light_2(): - mp = ag.mp.DevVaucouleurs( - ell_comps=(0.0, -0.333333), - intensity=2.0, - effective_radius=3.0, - mass_to_light_ratio=2.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.0, 1.0]]), - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert convergence == pytest.approx(2.0 * 7.4455, 1e-3) - - -def test__DevVaucouleurs_convergence_2d_via_mge_from__small_effective_radius(): - mp = ag.mp.DevVaucouleurs( - centre=(0.0, 0.0), - intensity=1.0, - effective_radius=0.6, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.0, 1.0]]), - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert convergence == pytest.approx(0.351797, 1e-3) - - -def test__exponential_convergence_2d_via_mge_from__config_1(): - mp = ag.mp.Exponential( - ell_comps=(0.0, 0.333333), - intensity=3.0, - effective_radius=2.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]), - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert convergence == pytest.approx(4.9047, 1e-3) - - -def test__exponential_convergence_2d_via_mge_from__config_2(): - mp = ag.mp.Exponential( - ell_comps=(0.0, -0.333333), - intensity=2.0, - effective_radius=3.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.0, 1.0]]), - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert convergence == pytest.approx(4.8566, 1e-3) - - -def test__exponential_convergence_2d_via_mge_from__intensity_4(): - mp = ag.mp.Exponential( - ell_comps=(0.0, -0.333333), - intensity=4.0, - effective_radius=3.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.0, 1.0]]), - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert convergence == pytest.approx(2.0 * 4.8566, 1e-3) - - -def test__exponential_convergence_2d_via_mge_from__mass_to_light_2(): - mp = ag.mp.Exponential( - ell_comps=(0.0, -0.333333), - intensity=2.0, - effective_radius=3.0, - mass_to_light_ratio=2.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.0, 1.0]]), - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert convergence == pytest.approx(2.0 * 4.8566, 1e-3) - - -def test__exponential_convergence_2d_via_mge_from__mass_to_light_1(): - mp = ag.mp.Exponential( - ell_comps=(0.0, -0.333333), - intensity=2.0, - effective_radius=3.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.0, 1.0]]), - sigma_log_list=sigmas, - ellipticity_convention="circularised", - three_D=False, - ) - - assert convergence == pytest.approx(4.8566, 1e-3) - - -def test__nfw_convergence_2d_via_mge_from__grid_2(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) - - radii_min = nfw.scale_radius / 2000.0 - radii_max = nfw.scale_radius * 30.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=nfw) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[2.0, 0.0]]), - sigma_log_list=sigmas, - ellipticity_convention="major", - three_D=True, - ) - - assert convergence == pytest.approx(0.263600141, 1e-2) - - -def test__nfw_convergence_2d_via_mge_from__grid_05(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) - - radii_min = nfw.scale_radius / 2000.0 - radii_max = nfw.scale_radius * 30.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=nfw) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.5, 0.0]]), - sigma_log_list=sigmas, - ellipticity_convention="major", - three_D=True, - ) - - assert convergence == pytest.approx(1.388511, 1e-2) - - -def test__nfw_convergence_2d_via_mge_from__kappa_s_2(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=2.0, scale_radius=1.0) - - radii_min = nfw.scale_radius / 2000.0 - radii_max = nfw.scale_radius * 30.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=nfw) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.5, 0.0]]), - sigma_log_list=sigmas, - ellipticity_convention="major", - three_D=True, - ) - - assert convergence == pytest.approx(2.0 * 1.388511, 1e-2) - - -def test__nfw_convergence_2d_via_mge_from__scale_radius_2(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=2.0) - - radii_min = nfw.scale_radius / 2000.0 - radii_max = nfw.scale_radius * 30.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=nfw) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]), - sigma_log_list=sigmas, - ellipticity_convention="major", - three_D=True, - ) - - assert convergence == pytest.approx(1.388511, 1e-2) - - -def test__nfw_convergence_2d_via_mge_from__elliptical(): - nfw = ag.mp.NFW( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.333333), - kappa_s=1.0, - scale_radius=1.0, - ) - - radii_min = nfw.scale_radius / 2000.0 - radii_max = nfw.scale_radius * 30.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=nfw) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.25, 0.0]]), - sigma_log_list=sigmas, - ellipticity_convention="major", - three_D=True, - ) - - assert convergence == pytest.approx(1.388511, 1e-3) - - -def test__sersic_convergence_2d_via_mge_from__intensity_3(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.0, 1.5]]), - sigma_log_list=sigmas, - three_D=False, - ellipticity_convention="circularised", - ) - - assert convergence == pytest.approx(4.90657319276, 1e-3) - - -def test__sersic_convergence_2d_via_mge_from__intensity_6(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - intensity=6.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.0, 1.5]]), - sigma_log_list=sigmas, - three_D=False, - ellipticity_convention="circularised", - ) - - assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) - - -def test__sersic_convergence_2d_via_mge_from__mass_to_light_2(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=2.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[0.0, 1.5]]), - sigma_log_list=sigmas, - three_D=False, - ellipticity_convention="circularised", - ) - - assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) - - -def test__sersic_convergence_2d_via_mge_from__elliptical(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.333333), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - radii_min = mp.effective_radius / 100.0 - radii_max = mp.effective_radius * 20.0 - log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) - sigmas = np.exp(log_sigmas) - - mge_decomp = MGEDecomposer(mass_profile=mp) - - convergence = mge_decomp.convergence_2d_via_mge_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]), - sigma_log_list=sigmas, - three_D=False, - ellipticity_convention="circularised", - ) - - assert convergence == pytest.approx(5.38066670129, 1e-3) +import numpy as np +import pytest + +from autogalaxy.profiles.mass import MGEDecomposer + +import autogalaxy as ag + + +def test__gnfw_deflections_yx_2d_via_mge__config_1__inner_slope_05(): + nfw = ag.mp.gNFW( + centre=(0.0, 0.0), + kappa_s=1.0, + ell_comps=ag.convert.ell_comps_from(axis_ratio=0.3, angle=100.0), + inner_slope=0.5, + scale_radius=8.0, + ) + + radii_min = nfw.scale_radius / 2000.0 + radii_max = nfw.scale_radius * 30.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + deflections_via_integral = np.array([[0.26604, 0.58988]]) + + mge_decomp = ag.mp.MGEDecomposer(mass_profile=nfw) + + deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), + xp=np, + sigma_log_list=sigmas, + ellipticity_convention="major", + three_D=True, + ) + + assert deflections_via_integral == pytest.approx(deflections_via_mge, 1.0e-3) + + +def test__gnfw_deflections_yx_2d_via_mge__config_2__inner_slope_15(): + nfw = ag.mp.gNFW( + centre=(0.3, 0.2), + kappa_s=2.5, + ell_comps=ag.convert.ell_comps_from(axis_ratio=0.5, angle=100.0), + inner_slope=1.5, + scale_radius=4.0, + ) + + radii_min = nfw.scale_radius / 20000.0 + radii_max = nfw.scale_radius * 30.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 30) + sigmas = np.exp(log_sigmas) + + deflections_via_integral = np.array([[-5.99032, -4.02541]]) + mge_decomp = ag.mp.MGEDecomposer(mass_profile=nfw) + + deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), + xp=np, + sigma_log_list=sigmas, + ellipticity_convention="major", + three_D=True, + ) + + assert deflections_via_integral == pytest.approx(deflections_via_mge, 1.0e-3) + + +def test__sersic_deflections_yx_2d_via_mge__sersic_index_2(): + mp = ag.mp.Sersic( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=5.0, + effective_radius=0.2, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + deflections_via_integral = np.array([[1.1446, 0.79374]]) + mge_decomp = ag.mp.MGEDecomposer(mass_profile=mp) + + deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]), + xp=np, + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert deflections_via_integral == pytest.approx(deflections_via_mge, 1.0e-3) + + +def test__sersic_deflections_yx_2d_via_mge__sersic_index_3(): + mp = ag.mp.Sersic( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=10.0, + effective_radius=0.2, + sersic_index=3.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + deflections_via_integral = np.array([[2.6134, 1.80719]]) + + mge_decomp = ag.mp.MGEDecomposer(mass_profile=mp) + + deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]), + xp=np, + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert deflections_via_integral == pytest.approx(deflections_via_mge, 1.0e-3) + + +def test__cnfw_deflections_yx_2d_via_mge(): + cnfw = ag.mp.cNFWSph( + centre=(0.3, 0.2), kappa_s=0.05, scale_radius=1.1, core_radius=0.01 + ) + + radii_min = cnfw.scale_radius / 1000.0 + radii_max = cnfw.scale_radius * 200.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + deflections_analytic = cnfw.deflections_yx_2d_from( + grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), xp=np + ) + + mge_decomp = ag.mp.MGEDecomposer(mass_profile=cnfw) + + deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), + xp=np, + sigma_log_list=sigmas, + ellipticity_convention="major", + three_D=True, + ) + + assert deflections_analytic == pytest.approx(deflections_via_mge, 1.0e-3) + + +def test__powerlaw_deflections_yx_2d_via_mge(): + mp = ag.mp.PowerLaw( + centre=(-0.4, -0.2), + ell_comps=(0.17142, -0.285116), + einstein_radius=0.2, + slope=1.8, + ) + + radii_min = mp.einstein_radius / 10000.0 + radii_max = mp.einstein_radius * 1000.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 30) + sigmas = np.exp(log_sigmas) + + deflections_analytic = mp.deflections_yx_2d_from( + grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), xp=np + ) + + mge_decomp = ag.mp.MGEDecomposer(mass_profile=mp) + + deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.1875, 0.1625]]), + xp=np, + sigma_log_list=sigmas, + ellipticity_convention="major", + three_D=False, + ) + + assert deflections_analytic == pytest.approx(deflections_via_mge, 1.0e-2) + + +def test__chameleon_deflections_yx_2d_via_mge(): + mp = ag.mp.Chameleon( + centre=(-0.4, -0.2), ell_comps=(0.17142, -0.285116), intensity=2.8 + ) + + radii_min = mp.core_radius_0 / 10000.0 + radii_max = mp.core_radius_0 * 10000.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 30) + sigmas = np.exp(log_sigmas) + + deflections_analytic = mp.deflections_yx_2d_from( + grid=ag.Grid2DIrregular([[-0.1875, 0.1625]]), xp=np + ) + + mge_decomp = ag.mp.MGEDecomposer(mass_profile=mp) + + deflections_via_mge = mge_decomp.deflections_2d_via_mge_from( + grid=ag.Grid2DIrregular([[-0.1875, 0.1625]]), + xp=np, + sigma_log_list=sigmas, + ellipticity_convention="major", + three_D=False, + ) + + assert deflections_analytic == pytest.approx(deflections_via_mge, 1.0e-3) + + +def test__DevVaucouleurs_convergence_2d_via_mge_from__config_1(): + mp = ag.mp.DevVaucouleurs( + ell_comps=(0.0, 0.333333), + intensity=3.0, + effective_radius=2.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]), + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert convergence == pytest.approx(5.6697, 1e-3) + + +def test__DevVaucouleurs_convergence_2d_via_mge_from__config_2(): + mp = ag.mp.DevVaucouleurs( + ell_comps=(0.0, -0.333333), + intensity=2.0, + effective_radius=3.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.0, 1.0]]), + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert convergence == pytest.approx(7.4455, 1e-3) + + +def test__DevVaucouleurs_convergence_2d_via_mge_from__intensity_4(): + mp = ag.mp.DevVaucouleurs( + ell_comps=(0.0, -0.333333), + intensity=4.0, + effective_radius=3.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.0, 1.0]]), + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert convergence == pytest.approx(2.0 * 7.4455, 1e-3) + + +def test__DevVaucouleurs_convergence_2d_via_mge_from__mass_to_light_2(): + mp = ag.mp.DevVaucouleurs( + ell_comps=(0.0, -0.333333), + intensity=2.0, + effective_radius=3.0, + mass_to_light_ratio=2.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.0, 1.0]]), + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert convergence == pytest.approx(2.0 * 7.4455, 1e-3) + + +def test__DevVaucouleurs_convergence_2d_via_mge_from__small_effective_radius(): + mp = ag.mp.DevVaucouleurs( + centre=(0.0, 0.0), + intensity=1.0, + effective_radius=0.6, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.0, 1.0]]), + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert convergence == pytest.approx(0.351797, 1e-3) + + +def test__exponential_convergence_2d_via_mge_from__config_1(): + mp = ag.mp.Exponential( + ell_comps=(0.0, 0.333333), + intensity=3.0, + effective_radius=2.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]), + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert convergence == pytest.approx(4.9047, 1e-3) + + +def test__exponential_convergence_2d_via_mge_from__config_2(): + mp = ag.mp.Exponential( + ell_comps=(0.0, -0.333333), + intensity=2.0, + effective_radius=3.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.0, 1.0]]), + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert convergence == pytest.approx(4.8566, 1e-3) + + +def test__exponential_convergence_2d_via_mge_from__intensity_4(): + mp = ag.mp.Exponential( + ell_comps=(0.0, -0.333333), + intensity=4.0, + effective_radius=3.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.0, 1.0]]), + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert convergence == pytest.approx(2.0 * 4.8566, 1e-3) + + +def test__exponential_convergence_2d_via_mge_from__mass_to_light_2(): + mp = ag.mp.Exponential( + ell_comps=(0.0, -0.333333), + intensity=2.0, + effective_radius=3.0, + mass_to_light_ratio=2.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.0, 1.0]]), + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert convergence == pytest.approx(2.0 * 4.8566, 1e-3) + + +def test__exponential_convergence_2d_via_mge_from__mass_to_light_1(): + mp = ag.mp.Exponential( + ell_comps=(0.0, -0.333333), + intensity=2.0, + effective_radius=3.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.0, 1.0]]), + sigma_log_list=sigmas, + ellipticity_convention="circularised", + three_D=False, + ) + + assert convergence == pytest.approx(4.8566, 1e-3) + + +def test__nfw_convergence_2d_via_mge_from__grid_2(): + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) + + radii_min = nfw.scale_radius / 2000.0 + radii_max = nfw.scale_radius * 30.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=nfw) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[2.0, 0.0]]), + sigma_log_list=sigmas, + ellipticity_convention="major", + three_D=True, + ) + + assert convergence == pytest.approx(0.263600141, 1e-2) + + +def test__nfw_convergence_2d_via_mge_from__grid_05(): + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) + + radii_min = nfw.scale_radius / 2000.0 + radii_max = nfw.scale_radius * 30.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=nfw) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.5, 0.0]]), + sigma_log_list=sigmas, + ellipticity_convention="major", + three_D=True, + ) + + assert convergence == pytest.approx(1.388511, 1e-2) + + +def test__nfw_convergence_2d_via_mge_from__kappa_s_2(): + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=2.0, scale_radius=1.0) + + radii_min = nfw.scale_radius / 2000.0 + radii_max = nfw.scale_radius * 30.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=nfw) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.5, 0.0]]), + sigma_log_list=sigmas, + ellipticity_convention="major", + three_D=True, + ) + + assert convergence == pytest.approx(2.0 * 1.388511, 1e-2) + + +def test__nfw_convergence_2d_via_mge_from__scale_radius_2(): + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=2.0) + + radii_min = nfw.scale_radius / 2000.0 + radii_max = nfw.scale_radius * 30.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=nfw) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]), + sigma_log_list=sigmas, + ellipticity_convention="major", + three_D=True, + ) + + assert convergence == pytest.approx(1.388511, 1e-2) + + +def test__nfw_convergence_2d_via_mge_from__elliptical(): + nfw = ag.mp.NFW( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.333333), + kappa_s=1.0, + scale_radius=1.0, + ) + + radii_min = nfw.scale_radius / 2000.0 + radii_max = nfw.scale_radius * 30.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=nfw) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.25, 0.0]]), + sigma_log_list=sigmas, + ellipticity_convention="major", + three_D=True, + ) + + assert convergence == pytest.approx(1.388511, 1e-3) + + +def test__sersic_convergence_2d_via_mge_from__intensity_3(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.0, 1.5]]), + sigma_log_list=sigmas, + three_D=False, + ellipticity_convention="circularised", + ) + + assert convergence == pytest.approx(4.90657319276, 1e-3) + + +def test__sersic_convergence_2d_via_mge_from__intensity_6(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + intensity=6.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.0, 1.5]]), + sigma_log_list=sigmas, + three_D=False, + ellipticity_convention="circularised", + ) + + assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) + + +def test__sersic_convergence_2d_via_mge_from__mass_to_light_2(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=2.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[0.0, 1.5]]), + sigma_log_list=sigmas, + three_D=False, + ellipticity_convention="circularised", + ) + + assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) + + +def test__sersic_convergence_2d_via_mge_from__elliptical(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.333333), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + + radii_min = mp.effective_radius / 100.0 + radii_max = mp.effective_radius * 20.0 + log_sigmas = np.linspace(np.log(radii_min), np.log(radii_max), 20) + sigmas = np.exp(log_sigmas) + + mge_decomp = MGEDecomposer(mass_profile=mp) + + convergence = mge_decomp.convergence_2d_via_mge_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]), + sigma_log_list=sigmas, + three_D=False, + ellipticity_convention="circularised", + ) + + assert convergence == pytest.approx(5.38066670129, 1e-3) diff --git a/test_autogalaxy/profiles/mass/dark/test_gnfw.py b/test_autogalaxy/profiles/mass/dark/test_gnfw.py index df474307..9946941f 100644 --- a/test_autogalaxy/profiles/mass/dark/test_gnfw.py +++ b/test_autogalaxy/profiles/mass/dark/test_gnfw.py @@ -1,208 +1,95 @@ -import numpy as np -import pytest - -import autogalaxy as ag - -grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) - - -def test__deflections_2d_via_integral_from__gnfw_sph_config_1(): - mp = ag.mp.gNFWSph( - centre=(0.0, 0.0), kappa_s=1.0, inner_slope=0.5, scale_radius=8.0 - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(0.43501, 1e-3) - assert deflections[0, 1] == pytest.approx(0.37701, 1e-3) - - -def test__deflections_2d_via_integral_from__gnfw_sph_config_2(): - mp = ag.mp.gNFWSph( - centre=(0.3, 0.2), kappa_s=2.5, inner_slope=1.5, scale_radius=4.0 - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(-9.31254, 1e-3) - assert deflections[0, 1] == pytest.approx(-3.10418, 1e-3) - - -def test__deflections_2d_via_integral_from__gnfw_ell_config_1(): - mp = ag.mp.gNFW( - centre=(0.0, 0.0), - kappa_s=1.0, - ell_comps=ag.convert.ell_comps_from(axis_ratio=0.3, angle=100.0), - inner_slope=0.5, - scale_radius=8.0, - ) - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) - ) - assert deflections[0, 0] == pytest.approx(0.26604, 1e-3) - assert deflections[0, 1] == pytest.approx(0.58988, 1e-3) - - -def test__deflections_2d_via_integral_from__gnfw_ell_config_2(): - mp = ag.mp.gNFW( - centre=(0.3, 0.2), - kappa_s=2.5, - ell_comps=ag.convert.ell_comps_from(axis_ratio=0.5, angle=100.0), - inner_slope=1.5, - scale_radius=4.0, - ) - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) - ) - assert deflections[0, 0] == pytest.approx(-5.99032, 1e-3) - assert deflections[0, 1] == pytest.approx(-4.02541, 1e-3) - - -def test__deflections_yx_2d_from__gnfw(): - mp = ag.mp.gNFW() - - deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) - - -def test__deflections_yx_2d_from__gnfw_sph(): - mp = ag.mp.gNFWSph() - - deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) - - -def test__deflections_yx_2d_from__elliptical_vs_spherical(): - elliptical = ag.mp.gNFW( - centre=(0.1, 0.2), - ell_comps=(0.0, 0.0), - kappa_s=2.0, - inner_slope=1.5, - scale_radius=3.0, - ) - spherical = ag.mp.gNFWSph( - centre=(0.1, 0.2), kappa_s=2.0, inner_slope=1.5, scale_radius=3.0 - ) - - assert elliptical.deflections_yx_2d_from(grid) == pytest.approx( - spherical.deflections_yx_2d_from(grid).array, 1e-4 - ) - - -def test__convergence_2d_from__gnfw_sph(): - mp = ag.mp.gNFWSph( - centre=(0.0, 0.0), kappa_s=1.0, inner_slope=1.5, scale_radius=1.0 - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[2.0, 0.0]])) - - assert convergence == pytest.approx(0.30840, 1e-2) - - -def test__convergence_2d_from__elliptical_vs_spherical(): - elliptical = ag.mp.gNFW( - centre=(0.1, 0.2), - ell_comps=(0.0, 0.0), - kappa_s=2.0, - inner_slope=1.5, - scale_radius=3.0, - ) - spherical = ag.mp.gNFWSph( - centre=(0.1, 0.2), kappa_s=2.0, inner_slope=1.5, scale_radius=3.0 - ) - - assert elliptical.potential_2d_from(grid) == pytest.approx( - spherical.potential_2d_from(grid), 1e-4 - ) - - -def test__potential_2d_from__gnfw_sph_inner_slope_05(): - mp = ag.mp.gNFWSph( - centre=(0.0, 0.0), kappa_s=1.0, inner_slope=0.5, scale_radius=8.0 - ) - - potential = mp.potential_2d_from(grid=ag.Grid2DIrregular([[0.1625, 0.1875]])) - - assert potential == pytest.approx(0.00920, 1e-3) - - -def test__potential_2d_from__gnfw_sph_inner_slope_15(): - mp = ag.mp.gNFWSph( - centre=(0.0, 0.0), kappa_s=1.0, inner_slope=1.5, scale_radius=8.0 - ) - - potential = mp.potential_2d_from(grid=ag.Grid2DIrregular([[0.1625, 0.1875]])) - - assert potential == pytest.approx(0.17448, 1e-3) - - -def test__potential_2d_from__gnfw_ell(): - mp = ag.mp.gNFW( - centre=(1.0, 1.0), - kappa_s=5.0, - ell_comps=ag.convert.ell_comps_from(axis_ratio=0.5, angle=100.0), - inner_slope=1.0, - scale_radius=10.0, - ) - assert mp.potential_2d_from(grid=ag.Grid2DIrregular([[2.0, 2.0]])) == pytest.approx( - 2.4718, 1e-4 - ) - - -def test__potential_2d_from__elliptical_vs_spherical(): - elliptical = ag.mp.gNFW( - centre=(0.1, 0.2), - ell_comps=(0.0, 0.0), - kappa_s=2.0, - inner_slope=1.5, - scale_radius=3.0, - ) - spherical = ag.mp.gNFWSph( - centre=(0.1, 0.2), kappa_s=2.0, inner_slope=1.5, scale_radius=3.0 - ) - - assert elliptical.convergence_2d_from(grid) == pytest.approx( - spherical.convergence_2d_from(grid).array, 1e-4 - ) - - -def test__compare_to_nfw(): - nfw = ag.mp.NFW( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.111111), - kappa_s=1.0, - scale_radius=20.0, - ) - gnfw = ag.mp.gNFW( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.111111), - kappa_s=1.0, - inner_slope=1.0, - scale_radius=20.0, - ) - - assert nfw.deflections_yx_2d_from(grid) == pytest.approx( - gnfw.deflections_yx_2d_from(grid).array, 1e-3 - ) - assert nfw.deflections_yx_2d_from(grid) == pytest.approx( - gnfw.deflections_yx_2d_from(grid).array, 1e-3 - ) - - assert nfw.potential_2d_from(grid) == pytest.approx( - gnfw.potential_2d_from(grid).array, 1e-3 - ) - assert nfw.potential_2d_from(grid) == pytest.approx( - gnfw.potential_2d_from(grid).array, 1e-3 - ) +import numpy as np +import pytest + +import autogalaxy as ag + +grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) + + +def test__deflections_yx_2d_from__gnfw(): + mp = ag.mp.gNFW() + + deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_integral = mp.deflections_2d_via_mge_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) + + +def test__deflections_yx_2d_from__gnfw_sph(): + mp = ag.mp.gNFWSph() + + deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_integral = mp.deflections_2d_via_mge_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) + + +def test__deflections_yx_2d_from__elliptical_vs_spherical(): + elliptical = ag.mp.gNFW( + centre=(0.1, 0.2), + ell_comps=(0.0, 0.0), + kappa_s=2.0, + inner_slope=1.5, + scale_radius=3.0, + ) + spherical = ag.mp.gNFWSph( + centre=(0.1, 0.2), kappa_s=2.0, inner_slope=1.5, scale_radius=3.0 + ) + + assert elliptical.deflections_yx_2d_from(grid) == pytest.approx( + spherical.deflections_yx_2d_from(grid).array, 1e-4 + ) + + +def test__convergence_2d_from__gnfw_sph(): + mp = ag.mp.gNFWSph( + centre=(0.0, 0.0), kappa_s=1.0, inner_slope=1.5, scale_radius=1.0 + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[2.0, 0.0]])) + + assert convergence == pytest.approx(0.30840, 1e-2) + + +def test__potential_2d_from__elliptical_vs_spherical(): + elliptical = ag.mp.gNFW( + centre=(0.1, 0.2), + ell_comps=(0.0, 0.0), + kappa_s=2.0, + inner_slope=1.5, + scale_radius=3.0, + ) + spherical = ag.mp.gNFWSph( + centre=(0.1, 0.2), kappa_s=2.0, inner_slope=1.5, scale_radius=3.0 + ) + + assert elliptical.convergence_2d_from(grid) == pytest.approx( + spherical.convergence_2d_from(grid).array, 1e-4 + ) + + +def test__compare_to_nfw(): + nfw = ag.mp.NFW( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.111111), + kappa_s=1.0, + scale_radius=20.0, + ) + gnfw = ag.mp.gNFW( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.111111), + kappa_s=1.0, + inner_slope=1.0, + scale_radius=20.0, + ) + + assert nfw.deflections_yx_2d_from(grid) == pytest.approx( + gnfw.deflections_yx_2d_from(grid).array, 1e-3 + ) + assert nfw.deflections_yx_2d_from(grid) == pytest.approx( + gnfw.deflections_yx_2d_from(grid).array, 1e-3 + ) diff --git a/test_autogalaxy/profiles/mass/dark/test_gnfw_virial_mass_conc.py b/test_autogalaxy/profiles/mass/dark/test_gnfw_virial_mass_conc.py index 5d49b705..63949b4e 100644 --- a/test_autogalaxy/profiles/mass/dark/test_gnfw_virial_mass_conc.py +++ b/test_autogalaxy/profiles/mass/dark/test_gnfw_virial_mass_conc.py @@ -1,25 +1,6 @@ -import numpy as np -import pytest - -import autogalaxy as ag - -grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) - - -def test__deflections_2d_via_integral_from(): - mp = ag.mp.gNFWVirialMassConcSph( - centre=(0.0, 0.0), - log10m_vir=12.0, - c_2=10.0, - overdens=0.0, - redshift_object=0.5, - redshift_source=1.0, - inner_slope=1.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(0.0466231, 1e-3) - assert deflections[0, 1] == pytest.approx(0.04040671, 1e-3) +import numpy as np +import pytest + +import autogalaxy as ag + +grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) diff --git a/test_autogalaxy/profiles/mass/dark/test_nfw.py b/test_autogalaxy/profiles/mass/dark/test_nfw.py index f9c894d6..ff608ff2 100644 --- a/test_autogalaxy/profiles/mass/dark/test_nfw.py +++ b/test_autogalaxy/profiles/mass/dark/test_nfw.py @@ -1,426 +1,358 @@ -import numpy as np -import pytest - -import autogalaxy as ag - -grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) - - -def test__deflections_via_analytical_from__nfw_config_1(): - nfw = ag.mp.NFW( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - kappa_s=1.0, - scale_radius=1.0, - ) - - deflections = nfw.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(0.56194, 1e-3) - assert deflections[0, 1] == pytest.approx(0.56194, 1e-3) - - -def test__deflections_via_analytical_from__nfw_config_2(): - nfw = ag.mp.NFW( - centre=(0.3, 0.2), - ell_comps=(0.03669, 0.172614), - kappa_s=2.5, - scale_radius=4.0, - ) - - deflections = nfw.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([(0.1625, 0.1625)]) - ) - - assert deflections[0, 0] == pytest.approx(-2.59480, 1e-3) - assert deflections[0, 1] == pytest.approx(-0.44204, 1e-3) - - -def test__deflections_via_analytical_from__analytic_vs_cse_config_1(): - nfw = ag.mp.NFW( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - kappa_s=1.0, - scale_radius=1.0, - ) - - deflections_via_analytic = nfw.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[0.0, 0.0]]) - ) - deflections_via_cse = nfw.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.0, 0.0]]) - ) - - assert deflections_via_analytic == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_via_analytical_from__analytic_vs_cse_config_2(): - nfw = ag.mp.NFW( - centre=(0.3, -0.2), - ell_comps=(0.09, 0.172614), - kappa_s=0.05, - scale_radius=4.0, - ) - - deflections_via_analytic = nfw.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[0.1625, -0.1625]]) - ) - deflections_via_cse = nfw.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, -0.1625]]) - ) - - assert deflections_via_analytic == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_via_integral_from__nfw_sph_config_1(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) - - deflections = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(0.56194, 1e-3) - assert deflections[0, 1] == pytest.approx(0.56194, 1e-3) - - -def test__deflections_via_integral_from__nfw_sph_config_2(): - nfw = ag.mp.NFWSph(centre=(0.3, 0.2), kappa_s=2.5, scale_radius=4.0) - - deflections = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(-2.08909, 1e-3) - assert deflections[0, 1] == pytest.approx(-0.69636, 1e-3) - - -def test__deflections_via_integral_from__nfw_ell_config_1(): - nfw = ag.mp.NFW( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - kappa_s=1.0, - scale_radius=1.0, - ) - - deflections = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(0.56194, 1e-3) - assert deflections[0, 1] == pytest.approx(0.56194, 1e-3) - - -def test__deflections_via_integral_from__nfw_ell_config_2(): - nfw = ag.mp.NFW( - centre=(0.3, 0.2), - ell_comps=(0.03669, 0.172614), - kappa_s=2.5, - scale_radius=4.0, - ) - - deflections = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([(0.1625, 0.1625)]) - ) - - assert deflections[0, 0] == pytest.approx(-2.59480, 1e-3) - assert deflections[0, 1] == pytest.approx(-0.44204, 1e-3) - - -def test__deflections_2d_via_cse_from__nfw_sph_config_1(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) - - deflections_via_integral = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = nfw.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_2d_via_cse_from__nfw_sph_config_2(): - nfw = ag.mp.NFWSph(centre=(0.3, 0.2), kappa_s=2.5, scale_radius=4.0) - - deflections_via_integral = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = nfw.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_2d_via_cse_from__nfw_ell_config_1(): - nfw = ag.mp.NFW( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - kappa_s=1.0, - scale_radius=1.0, - ) - - deflections_via_integral = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = nfw.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_2d_via_cse_from__nfw_ell_config_2(): - nfw = ag.mp.NFW( - centre=(0.3, 0.2), - ell_comps=(0.03669, 0.172614), - kappa_s=2.5, - scale_radius=4.0, - ) - - deflections_via_integral = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = nfw.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_2d_numerical_precision__config_1(): - nfw = ag.mp.NFW( - centre=(0.3, 0.2), - ell_comps=(0.03669, 0.172614), - kappa_s=2.5, - scale_radius=4.0, - ) - - deflections_via_integral = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[1.0, 2.0]]) - ) - deflections_via_cse = nfw.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[1.0, 2.0]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_2d_numerical_precision__config_2(): - nfw = ag.mp.NFW( - centre=(0.3, 0.2), - ell_comps=(0.2, 0.3), - kappa_s=3.5, - scale_radius=40.0, - ) - - deflections_via_integral = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[100.0, 200.0]]) - ) - deflections_via_cse = nfw.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[100.0, 200.0]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_2d_numerical_precision__config_3(): - nfw = ag.mp.NFW( - centre=(0.3, 0.2), - ell_comps=(0.2, 0.3), - kappa_s=3.5, - scale_radius=40.0, - ) - - deflections_via_integral = nfw.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[-1000.0, -2000.0]]) - ) - deflections_via_cse = nfw.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[-1000.0, -2000.0]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_yx_2d_from(): - nfw = ag.mp.NFW(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) - - deflections = nfw.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_integral = nfw.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) - - -def test__convergence_2d_via_cse_from__nfw_grid_2(): - # r = 2.0 (> 1.0) - # F(r) = (1/(sqrt(3))*atan(sqrt(3)) = 0.60459978807 - # kappa(r) = 2 * kappa_s * (1 - 0.60459978807) / (4-1) = 0.263600141 - - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) - - convergence = nfw.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[2.0, 0.0]])) - - assert convergence == pytest.approx(0.263600141, 1e-2) - - -def test__convergence_2d_via_cse_from__nfw_grid_05(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) - - convergence = nfw.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[0.5, 0.0]])) - - assert convergence == pytest.approx(1.388511, 1e-2) - - -def test__convergence_2d_via_cse_from__nfw_kappa_s_2(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=2.0, scale_radius=1.0) - - convergence = nfw.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[0.5, 0.0]])) - - assert convergence == pytest.approx(2.0 * 1.388511, 1e-2) - - -def test__convergence_2d_via_cse_from__nfw_scale_radius_2(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=2.0) - - convergence = nfw.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - - assert convergence == pytest.approx(1.388511, 1e-2) - - -def test__convergence_2d_via_cse_from__nfw_ell(): - nfw = ag.mp.NFW( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.333333), - kappa_s=1.0, - scale_radius=1.0, - ) - - convergence = nfw.convergence_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.25, 0.0]]) - ) - - assert convergence == pytest.approx(1.388511, 1e-3) - - -def test__convergence_2d_from__nfw_sph_grid_2(): - # r = 2.0 (> 1.0) - # F(r) = (1/(sqrt(3))*atan(sqrt(3)) = 0.60459978807 - # kappa(r) = 2 * kappa_s * (1 - 0.60459978807) / (4-1) = 0.263600141 - - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) - - convergence = nfw.convergence_2d_from(grid=ag.Grid2DIrregular([[2.0, 0.0]])) - - assert convergence == pytest.approx(0.263600141, 1e-3) - - -def test__convergence_2d_from__nfw_sph_grid_05(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) - - convergence = nfw.convergence_2d_from(grid=ag.Grid2DIrregular([[0.5, 0.0]])) - - assert convergence == pytest.approx(1.388511, 1e-3) - - -def test__convergence_2d_from__nfw_sph_kappa_s_2(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=2.0, scale_radius=1.0) - - convergence = nfw.convergence_2d_from(grid=ag.Grid2DIrregular([[0.5, 0.0]])) - - assert convergence == pytest.approx(2.0 * 1.388511, 1e-3) - - -def test__convergence_2d_from__nfw_sph_scale_radius_2(): - nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=2.0) - - convergence = nfw.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - - assert convergence == pytest.approx(1.388511, 1e-3) - - -def test__convergence_2d_from__nfw_ell(): - nfw = ag.mp.NFW( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.333333), - kappa_s=1.0, - scale_radius=1.0, - ) - - convergence = nfw.convergence_2d_from(grid=ag.Grid2DIrregular([[0.25, 0.0]])) - - assert convergence == pytest.approx(1.388511, 1e-3) - - -# def test__potential_2d_from(): -# nfw = ag.mp.NFWSph(centre=(0.3, 0.2), kappa_s=2.5, scale_radius=4.0) -# -# potential = nfw.potential_2d_from(grid=ag.Grid2DIrregular([[0.1875, 0.1625]])) -# -# assert potential == pytest.approx(0.03702, 1e-3) -# -# nfw = ag.mp.NFWSph(centre=(0.3, 0.2), kappa_s=2.5, scale_radius=4.0) -# -# potential = nfw.potential_2d_from(grid=ag.Grid2DIrregular([[0.1875, 0.1625]])) -# -# assert potential == pytest.approx(0.03702, 1e-3) -# -# nfw = ag.mp.NFW( -# centre=(0.3, 0.2), -# ell_comps=(0.03669, 0.172614), -# kappa_s=2.5, -# scale_radius=4.0, -# ) -# -# potential = nfw.potential_2d_from(grid=ag.Grid2DIrregular([[0.1625, 0.1625]])) -# -# assert potential == pytest.approx(0.05380, 1e-3) -# -# nfw_spherical = ag.mp.NFWSph(centre=(0.3, 0.2), kappa_s=2.5, scale_radius=4.0) -# nfw_elliptical = ag.mp.NFW( -# centre=(0.3, 0.2), -# ell_comps=(0.0, 0.0), -# kappa_s=2.5, -# scale_radius=4.0, -# ) -# -# potential_spherical = nfw_spherical.potential_2d_from( -# grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) -# ) -# potential_elliptical = nfw_elliptical.potential_2d_from( -# grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) -# ) -# -# assert potential_spherical == pytest.approx(potential_elliptical, 1e-3) - - -def test__shear_yx_2d_from__nfw_sph_config_1(): - mp = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) - - shear = mp.shear_yx_2d_from(grid=ag.Grid2DIrregular([[2.0, 1.0]])) - - assert shear[0, 0] == pytest.approx(-0.24712463, abs=1e-3) - assert shear[0, 1] == pytest.approx(0.185340150, abs=1e-3) - - -def test__shear_yx_2d_from__nfw_sph_config_2(): - mp = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) - - shear = mp.shear_yx_2d_from(grid=ag.Grid2DIrregular([[3.0, 5.0]])) - - assert shear[0, 0] == pytest.approx(-0.09588857, abs=1e-3) - assert shear[0, 1] == pytest.approx(-0.05114060, abs=1e-3) - - -def test__shear_yx_2d_from__nfw_ell(): - mp = ag.mp.NFW( - centre=(0.0, 0.0), ell_comps=(0.3, 0.4), kappa_s=1.0, scale_radius=1.0 - ) - - shear = mp.shear_yx_2d_from(grid=ag.Grid2DIrregular([[2.0, 1.0]])) - - assert shear[0, 0] == pytest.approx(-0.08554797, abs=1e-3) - assert shear[0, 1] == pytest.approx(0.111356360, abs=1e-3) +import numpy as np +import pytest + +import autogalaxy as ag + +grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) + + +def test__deflections_via_analytical_from__nfw_config_1(): + nfw = ag.mp.NFW( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + kappa_s=1.0, + scale_radius=1.0, + ) + + deflections = nfw.deflections_2d_via_analytic_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections[0, 0] == pytest.approx(0.56194, 1e-3) + assert deflections[0, 1] == pytest.approx(0.56194, 1e-3) + + +def test__deflections_via_analytical_from__nfw_config_2(): + nfw = ag.mp.NFW( + centre=(0.3, 0.2), + ell_comps=(0.03669, 0.172614), + kappa_s=2.5, + scale_radius=4.0, + ) + + deflections = nfw.deflections_2d_via_analytic_from( + grid=ag.Grid2DIrregular([(0.1625, 0.1625)]) + ) + + assert deflections[0, 0] == pytest.approx(-2.59480, 1e-3) + assert deflections[0, 1] == pytest.approx(-0.44204, 1e-3) + + +def test__deflections_via_analytical_from__analytic_vs_cse_config_1(): + nfw = ag.mp.NFW( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + kappa_s=1.0, + scale_radius=1.0, + ) + + deflections_via_analytic = nfw.deflections_2d_via_analytic_from( + grid=ag.Grid2DIrregular([[0.0, 0.0]]) + ) + deflections_via_cse = nfw.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.0, 0.0]]) + ) + + assert deflections_via_analytic == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_via_analytical_from__analytic_vs_cse_config_2(): + nfw = ag.mp.NFW( + centre=(0.3, -0.2), + ell_comps=(0.09, 0.172614), + kappa_s=0.05, + scale_radius=4.0, + ) + + deflections_via_analytic = nfw.deflections_2d_via_analytic_from( + grid=ag.Grid2DIrregular([[0.1625, -0.1625]]) + ) + deflections_via_cse = nfw.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, -0.1625]]) + ) + + assert deflections_via_analytic == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_via_cse_from__nfw_sph_config_1(): + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) + + deflections_via_integral = np.array([[0.56194, 0.56194]]) + deflections_via_cse = nfw.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_via_cse_from__nfw_sph_config_2(): + nfw = ag.mp.NFWSph(centre=(0.3, 0.2), kappa_s=2.5, scale_radius=4.0) + + deflections_via_integral = np.array([[-2.4275514589, -0.6620594888]]) + deflections_via_cse = nfw.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_via_cse_from__nfw_ell_config_1(): + nfw = ag.mp.NFW( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + kappa_s=1.0, + scale_radius=1.0, + ) + + deflections_via_integral = np.array([[0.56194, 0.56194]]) + deflections_via_cse = nfw.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_via_cse_from__nfw_ell_config_2(): + nfw = ag.mp.NFW( + centre=(0.3, 0.2), + ell_comps=(0.03669, 0.172614), + kappa_s=2.5, + scale_radius=4.0, + ) + + deflections_via_integral = np.array([[-2.59480, -0.44204]]) + deflections_via_cse = nfw.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_numerical_precision__config_1(): + nfw = ag.mp.NFW( + centre=(0.3, 0.2), + ell_comps=(0.03669, 0.172614), + kappa_s=2.5, + scale_radius=4.0, + ) + + deflections_via_integral = np.array([[3.7984113660, 7.7612406998]]) + deflections_via_cse = nfw.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[1.0, 2.0]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_numerical_precision__config_2(): + nfw = ag.mp.NFW( + centre=(0.3, 0.2), + ell_comps=(0.2, 0.3), + kappa_s=3.5, + scale_radius=40.0, + ) + + deflections_via_integral = np.array([[36.8433139810, 60.3308895404]]) + deflections_via_cse = nfw.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[100.0, 200.0]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_numerical_precision__config_3(): + nfw = ag.mp.NFW( + centre=(0.3, 0.2), + ell_comps=(0.2, 0.3), + kappa_s=3.5, + scale_radius=40.0, + ) + + deflections_via_integral = np.array([[-8.4199994072, -15.0162989892]]) + deflections_via_cse = nfw.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[-1000.0, -2000.0]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_yx_2d_from(): + nfw = ag.mp.NFW(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) + + deflections = nfw.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_integral = nfw.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) + + +def test__convergence_2d_via_cse_from__nfw_grid_2(): + # r = 2.0 (> 1.0) + # F(r) = (1/(sqrt(3))*atan(sqrt(3)) = 0.60459978807 + # kappa(r) = 2 * kappa_s * (1 - 0.60459978807) / (4-1) = 0.263600141 + + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) + + convergence = nfw.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[2.0, 0.0]])) + + assert convergence == pytest.approx(0.263600141, 1e-2) + + +def test__convergence_2d_via_cse_from__nfw_grid_05(): + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) + + convergence = nfw.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[0.5, 0.0]])) + + assert convergence == pytest.approx(1.388511, 1e-2) + + +def test__convergence_2d_via_cse_from__nfw_kappa_s_2(): + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=2.0, scale_radius=1.0) + + convergence = nfw.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[0.5, 0.0]])) + + assert convergence == pytest.approx(2.0 * 1.388511, 1e-2) + + +def test__convergence_2d_via_cse_from__nfw_scale_radius_2(): + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=2.0) + + convergence = nfw.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + + assert convergence == pytest.approx(1.388511, 1e-2) + + +def test__convergence_2d_via_cse_from__nfw_ell(): + nfw = ag.mp.NFW( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.333333), + kappa_s=1.0, + scale_radius=1.0, + ) + + convergence = nfw.convergence_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.25, 0.0]]) + ) + + assert convergence == pytest.approx(1.388511, 1e-3) + + +def test__convergence_2d_from__nfw_sph_grid_2(): + # r = 2.0 (> 1.0) + # F(r) = (1/(sqrt(3))*atan(sqrt(3)) = 0.60459978807 + # kappa(r) = 2 * kappa_s * (1 - 0.60459978807) / (4-1) = 0.263600141 + + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) + + convergence = nfw.convergence_2d_from(grid=ag.Grid2DIrregular([[2.0, 0.0]])) + + assert convergence == pytest.approx(0.263600141, 1e-3) + + +def test__convergence_2d_from__nfw_sph_grid_05(): + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) + + convergence = nfw.convergence_2d_from(grid=ag.Grid2DIrregular([[0.5, 0.0]])) + + assert convergence == pytest.approx(1.388511, 1e-3) + + +def test__convergence_2d_from__nfw_sph_kappa_s_2(): + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=2.0, scale_radius=1.0) + + convergence = nfw.convergence_2d_from(grid=ag.Grid2DIrregular([[0.5, 0.0]])) + + assert convergence == pytest.approx(2.0 * 1.388511, 1e-3) + + +def test__convergence_2d_from__nfw_sph_scale_radius_2(): + nfw = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=2.0) + + convergence = nfw.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + + assert convergence == pytest.approx(1.388511, 1e-3) + + +def test__convergence_2d_from__nfw_ell(): + nfw = ag.mp.NFW( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.333333), + kappa_s=1.0, + scale_radius=1.0, + ) + + convergence = nfw.convergence_2d_from(grid=ag.Grid2DIrregular([[0.25, 0.0]])) + + assert convergence == pytest.approx(1.388511, 1e-3) + + +# def test__potential_2d_from(): +# nfw = ag.mp.NFWSph(centre=(0.3, 0.2), kappa_s=2.5, scale_radius=4.0) +# +# potential = nfw.potential_2d_from(grid=ag.Grid2DIrregular([[0.1875, 0.1625]])) +# +# assert potential == pytest.approx(0.03702, 1e-3) +# +# nfw = ag.mp.NFWSph(centre=(0.3, 0.2), kappa_s=2.5, scale_radius=4.0) +# +# potential = nfw.potential_2d_from(grid=ag.Grid2DIrregular([[0.1875, 0.1625]])) +# +# assert potential == pytest.approx(0.03702, 1e-3) +# +# nfw = ag.mp.NFW( +# centre=(0.3, 0.2), +# ell_comps=(0.03669, 0.172614), +# kappa_s=2.5, +# scale_radius=4.0, +# ) +# +# potential = nfw.potential_2d_from(grid=ag.Grid2DIrregular([[0.1625, 0.1625]])) +# +# assert potential == pytest.approx(0.05380, 1e-3) +# +# nfw_spherical = ag.mp.NFWSph(centre=(0.3, 0.2), kappa_s=2.5, scale_radius=4.0) +# nfw_elliptical = ag.mp.NFW( +# centre=(0.3, 0.2), +# ell_comps=(0.0, 0.0), +# kappa_s=2.5, +# scale_radius=4.0, +# ) +# +# potential_spherical = nfw_spherical.potential_2d_from( +# grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) +# ) +# potential_elliptical = nfw_elliptical.potential_2d_from( +# grid=ag.Grid2DIrregular([[0.1875, 0.1625]]) +# ) +# +# assert potential_spherical == pytest.approx(potential_elliptical, 1e-3) + + +def test__shear_yx_2d_from__nfw_sph_config_1(): + mp = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) + + shear = mp.shear_yx_2d_from(grid=ag.Grid2DIrregular([[2.0, 1.0]])) + + assert shear[0, 0] == pytest.approx(-0.24712463, abs=1e-3) + assert shear[0, 1] == pytest.approx(0.185340150, abs=1e-3) + + +def test__shear_yx_2d_from__nfw_sph_config_2(): + mp = ag.mp.NFWSph(centre=(0.0, 0.0), kappa_s=1.0, scale_radius=1.0) + + shear = mp.shear_yx_2d_from(grid=ag.Grid2DIrregular([[3.0, 5.0]])) + + assert shear[0, 0] == pytest.approx(-0.09588857, abs=1e-3) + assert shear[0, 1] == pytest.approx(-0.05114060, abs=1e-3) + + +def test__shear_yx_2d_from__nfw_ell(): + mp = ag.mp.NFW( + centre=(0.0, 0.0), ell_comps=(0.3, 0.4), kappa_s=1.0, scale_radius=1.0 + ) + + shear = mp.shear_yx_2d_from(grid=ag.Grid2DIrregular([[2.0, 1.0]])) + + assert shear[0, 0] == pytest.approx(-0.08554797, abs=1e-3) + assert shear[0, 1] == pytest.approx(0.111356360, abs=1e-3) diff --git a/test_autogalaxy/profiles/mass/stellar/test_dev_vaucouleurs.py b/test_autogalaxy/profiles/mass/stellar/test_dev_vaucouleurs.py index d49ee19a..7aeb0814 100644 --- a/test_autogalaxy/profiles/mass/stellar/test_dev_vaucouleurs.py +++ b/test_autogalaxy/profiles/mass/stellar/test_dev_vaucouleurs.py @@ -1,170 +1,149 @@ -import numpy as np -import pytest - -import autogalaxy as ag - -grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) - - -def test__deflections_yx_2d_from__dev_vaucouleurs(): - mp = ag.mp.DevVaucouleurs() - - deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_yx_2d_from__dev_vaucouleurs_sph(): - mp = ag.mp.DevVaucouleursSph() - - deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_via_integral_from(): - mp = ag.mp.DevVaucouleurs( - centre=(0.4, 0.2), - ell_comps=(0.0180010, 0.0494575), - intensity=2.0, - effective_radius=0.8, - mass_to_light_ratio=3.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([(0.1625, 0.1625)]) - ) - - assert deflections[0, 0] == pytest.approx(-24.528, 1e-3) - assert deflections[0, 1] == pytest.approx(-3.37605, 1e-3) - - -def test__deflections_2d_via_cse_from__config_1(): - mp = ag.mp.DevVaucouleurs( - centre=(0.4, 0.2), - ell_comps=(0.0180010, 0.0494575), - intensity=2.0, - effective_radius=0.8, - mass_to_light_ratio=3.0, - ) - - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_2d_via_cse_from__config_2(): - mp = ag.mp.DevVaucouleurs( - centre=(0.4, 0.2), - ell_comps=(0.4180010, 0.694575), - intensity=2.0, - effective_radius=0.2, - mass_to_light_ratio=3.0, - ) - - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__convergence_2d_from__dev_vaucouleurs_config_1(): - mp = ag.mp.DevVaucouleurs( - ell_comps=(0.0, 0.333333), - intensity=3.0, - effective_radius=2.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - - assert convergence == pytest.approx(5.6697, 1e-3) - - -def test__convergence_2d_from__dev_vaucouleurs_config_2(): - mp = ag.mp.DevVaucouleurs( - ell_comps=(0.0, -0.333333), - intensity=2.0, - effective_radius=3.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(7.4455, 1e-3) - - -def test__convergence_2d_from__dev_vaucouleurs_intensity_4(): - mp = ag.mp.DevVaucouleurs( - ell_comps=(0.0, -0.333333), - intensity=4.0, - effective_radius=3.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(2.0 * 7.4455, 1e-3) - - -def test__convergence_2d_from__dev_vaucouleurs_mass_to_light_2(): - mp = ag.mp.DevVaucouleurs( - ell_comps=(0.0, -0.333333), - intensity=2.0, - effective_radius=3.0, - mass_to_light_ratio=2.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(2.0 * 7.4455, 1e-3) - - -def test__convergence_2d_from__dev_vaucouleurs_small_effective_radius(): - mp = ag.mp.DevVaucouleurs( - centre=(0.0, 0.0), - intensity=1.0, - effective_radius=0.6, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(0.351797, 1e-3) - - -def test__convergence_2d_from__elliptical_vs_spherical(): - elliptical = ag.mp.DevVaucouleurs( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - mass_to_light_ratio=1.0, - ) - - spherical = ag.mp.DevVaucouleurs( - centre=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - mass_to_light_ratio=1.0, - ) - - ell_convergence_2d = elliptical.convergence_2d_from(grid=grid) - sph_convergence_2d = spherical.convergence_2d_from(grid=grid) - - assert ell_convergence_2d == pytest.approx(sph_convergence_2d, 1.0e-4) +import numpy as np +import pytest + +import autogalaxy as ag + +grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) + + +def test__deflections_yx_2d_from__dev_vaucouleurs(): + mp = ag.mp.DevVaucouleurs() + + deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_yx_2d_from__dev_vaucouleurs_sph(): + mp = ag.mp.DevVaucouleursSph() + + deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_via_cse_from__config_1(): + mp = ag.mp.DevVaucouleurs( + centre=(0.4, 0.2), + ell_comps=(0.0180010, 0.0494575), + intensity=2.0, + effective_radius=0.8, + mass_to_light_ratio=3.0, + ) + + deflections_via_integral = np.array([[-24.528, -3.37605]]) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_via_cse_from__config_2(): + mp = ag.mp.DevVaucouleurs( + centre=(0.4, 0.2), + ell_comps=(0.4180010, 0.694575), + intensity=2.0, + effective_radius=0.2, + mass_to_light_ratio=3.0, + ) + + deflections_via_integral = np.array([[-3.1360329449, 0.1181013046]]) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__convergence_2d_from__dev_vaucouleurs_config_1(): + mp = ag.mp.DevVaucouleurs( + ell_comps=(0.0, 0.333333), + intensity=3.0, + effective_radius=2.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + + assert convergence == pytest.approx(5.6697, 1e-3) + + +def test__convergence_2d_from__dev_vaucouleurs_config_2(): + mp = ag.mp.DevVaucouleurs( + ell_comps=(0.0, -0.333333), + intensity=2.0, + effective_radius=3.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(7.4455, 1e-3) + + +def test__convergence_2d_from__dev_vaucouleurs_intensity_4(): + mp = ag.mp.DevVaucouleurs( + ell_comps=(0.0, -0.333333), + intensity=4.0, + effective_radius=3.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(2.0 * 7.4455, 1e-3) + + +def test__convergence_2d_from__dev_vaucouleurs_mass_to_light_2(): + mp = ag.mp.DevVaucouleurs( + ell_comps=(0.0, -0.333333), + intensity=2.0, + effective_radius=3.0, + mass_to_light_ratio=2.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(2.0 * 7.4455, 1e-3) + + +def test__convergence_2d_from__dev_vaucouleurs_small_effective_radius(): + mp = ag.mp.DevVaucouleurs( + centre=(0.0, 0.0), + intensity=1.0, + effective_radius=0.6, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(0.351797, 1e-3) + + +def test__convergence_2d_from__elliptical_vs_spherical(): + elliptical = ag.mp.DevVaucouleurs( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + mass_to_light_ratio=1.0, + ) + + spherical = ag.mp.DevVaucouleurs( + centre=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + mass_to_light_ratio=1.0, + ) + + ell_convergence_2d = elliptical.convergence_2d_from(grid=grid) + sph_convergence_2d = spherical.convergence_2d_from(grid=grid) + + assert ell_convergence_2d == pytest.approx(sph_convergence_2d, 1.0e-4) diff --git a/test_autogalaxy/profiles/mass/stellar/test_exponential.py b/test_autogalaxy/profiles/mass/stellar/test_exponential.py index e1b9f4dc..10a8b324 100644 --- a/test_autogalaxy/profiles/mass/stellar/test_exponential.py +++ b/test_autogalaxy/profiles/mass/stellar/test_exponential.py @@ -1,186 +1,148 @@ -import numpy as np -import pytest - -import autogalaxy as ag - -grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) - - -def test__deflections_yx_2d_from__exponential(): - mp = ag.mp.Exponential() - - deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_yx_2d_from__exponential_sph(): - mp = ag.mp.ExponentialSph() - - deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_2d_via_integral_from__config_1(): - mp = ag.mp.Exponential( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(0.90493, 1e-3) - assert deflections[0, 1] == pytest.approx(0.62569, 1e-3) - - -def test__deflections_2d_via_integral_from__config_2(): - mp = ag.mp.Exponential( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([(0.1625, 0.1625)]) - ) - - assert deflections[0, 0] == pytest.approx(0.90493, 1e-3) - assert deflections[0, 1] == pytest.approx(0.62569, 1e-3) - - -def test__deflections_2d_via_cse_from__config_1(): - mp = ag.mp.Exponential( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.8, - mass_to_light_ratio=1.0, - ) - - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_2d_via_cse_from__config_2(): - mp = ag.mp.Exponential( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.8, - mass_to_light_ratio=1.0, - ) - - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__convergence_2d_from__exponential_config_1(): - mp = ag.mp.Exponential( - ell_comps=(0.0, 0.333333), - intensity=3.0, - effective_radius=2.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - - assert convergence == pytest.approx(4.9047, 1e-3) - - -def test__convergence_2d_from__exponential_config_2(): - mp = ag.mp.Exponential( - ell_comps=(0.0, -0.333333), - intensity=2.0, - effective_radius=3.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(4.8566, 1e-3) - - -def test__convergence_2d_from__exponential_intensity_4(): - mp = ag.mp.Exponential( - ell_comps=(0.0, -0.333333), - intensity=4.0, - effective_radius=3.0, - mass_to_light_ratio=1.0, - ) - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(2.0 * 4.8566, 1e-3) - - -def test__convergence_2d_from__exponential_mass_to_light_2(): - mp = ag.mp.Exponential( - ell_comps=(0.0, -0.333333), - intensity=2.0, - effective_radius=3.0, - mass_to_light_ratio=2.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(2.0 * 4.8566, 1e-3) - - -def test__convergence_2d_from__exponential_config_5(): - mp = ag.mp.Exponential( - ell_comps=(0.0, -0.333333), - intensity=2.0, - effective_radius=3.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(4.8566, 1e-3) - - -def test__convergence_2d_from__elliptical_vs_spherical(): - elliptical = ag.mp.Exponential( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - mass_to_light_ratio=1.0, - ) - - spherical = ag.mp.Exponential( - centre=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - mass_to_light_ratio=1.0, - ) - - ell_convergence_2d = elliptical.convergence_2d_from(grid=grid) - sph_convergence_2d = spherical.convergence_2d_from(grid=grid) - - assert ell_convergence_2d == pytest.approx(sph_convergence_2d, 1.0e-4) +import numpy as np +import pytest + +import autogalaxy as ag + +grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) + + +def test__deflections_yx_2d_from__exponential(): + mp = ag.mp.Exponential() + + deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_yx_2d_from__exponential_sph(): + mp = ag.mp.ExponentialSph() + + deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_via_cse_from__config_1(): + mp = ag.mp.Exponential( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=5.0, + effective_radius=0.8, + mass_to_light_ratio=1.0, + ) + + deflections_via_integral = np.array([[5.9679849756, 4.5901980642]]) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_via_cse_from__config_2(): + mp = ag.mp.Exponential( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=5.0, + effective_radius=0.8, + mass_to_light_ratio=1.0, + ) + + deflections_via_integral = np.array([[5.9679849756, 4.5901980642]]) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__convergence_2d_from__exponential_config_1(): + mp = ag.mp.Exponential( + ell_comps=(0.0, 0.333333), + intensity=3.0, + effective_radius=2.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + + assert convergence == pytest.approx(4.9047, 1e-3) + + +def test__convergence_2d_from__exponential_config_2(): + mp = ag.mp.Exponential( + ell_comps=(0.0, -0.333333), + intensity=2.0, + effective_radius=3.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(4.8566, 1e-3) + + +def test__convergence_2d_from__exponential_intensity_4(): + mp = ag.mp.Exponential( + ell_comps=(0.0, -0.333333), + intensity=4.0, + effective_radius=3.0, + mass_to_light_ratio=1.0, + ) + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(2.0 * 4.8566, 1e-3) + + +def test__convergence_2d_from__exponential_mass_to_light_2(): + mp = ag.mp.Exponential( + ell_comps=(0.0, -0.333333), + intensity=2.0, + effective_radius=3.0, + mass_to_light_ratio=2.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(2.0 * 4.8566, 1e-3) + + +def test__convergence_2d_from__exponential_config_5(): + mp = ag.mp.Exponential( + ell_comps=(0.0, -0.333333), + intensity=2.0, + effective_radius=3.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(4.8566, 1e-3) + + +def test__convergence_2d_from__elliptical_vs_spherical(): + elliptical = ag.mp.Exponential( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + mass_to_light_ratio=1.0, + ) + + spherical = ag.mp.Exponential( + centre=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + mass_to_light_ratio=1.0, + ) + + ell_convergence_2d = elliptical.convergence_2d_from(grid=grid) + sph_convergence_2d = spherical.convergence_2d_from(grid=grid) + + assert ell_convergence_2d == pytest.approx(sph_convergence_2d, 1.0e-4) diff --git a/test_autogalaxy/profiles/mass/stellar/test_gaussian.py b/test_autogalaxy/profiles/mass/stellar/test_gaussian.py index e820ffee..169e880a 100644 --- a/test_autogalaxy/profiles/mass/stellar/test_gaussian.py +++ b/test_autogalaxy/profiles/mass/stellar/test_gaussian.py @@ -1,330 +1,254 @@ -import numpy as np -import pytest - -import autogalaxy as ag - -grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) - - -def test__deflections_2d_via_analytic_from__config_1_positive_y(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.05263), - intensity=1.0, - sigma=3.0, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections[0, 0] == pytest.approx(1.024423, 1.0e-4) - assert deflections[0, 1] == pytest.approx(0.0, abs=1.0e-4) - - -def test__deflections_2d_via_analytic_from__config_1_negative_y(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.05263), - intensity=1.0, - sigma=3.0, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[-1.0, 0.0]]) - ) - - assert deflections[0, 0] == pytest.approx(-1.024423, 1.0e-4) - assert deflections[0, 1] == pytest.approx(0.0, abs=1.0e-4) - - -def test__deflections_2d_via_analytic_from__config_2_positive(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.111111), - intensity=1.0, - sigma=5.0, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[0.5, 0.2]]) - ) - - assert deflections[0, 0] == pytest.approx(0.554062, 1.0e-4) - assert deflections[0, 1] == pytest.approx(0.177336, 1.0e-4) - - -def test__deflections_2d_via_analytic_from__config_2_negative(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.111111), - intensity=1.0, - sigma=5.0, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[-0.5, -0.2]]) - ) - - assert deflections[0, 0] == pytest.approx(-0.554062, 1.0e-4) - assert deflections[0, 1] == pytest.approx(-0.177336, 1.0e-4) - - -def test__deflections_2d_via_analytic_from__mass_to_light_2(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.111111), - intensity=1.0, - sigma=5.0, - mass_to_light_ratio=2.0, - ) - - deflections = mp.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[0.5, 0.2]]) - ) - - assert deflections[0, 0] == pytest.approx(1.108125, 1.0e-4) - assert deflections[0, 1] == pytest.approx(0.35467, 1.0e-4) - - -def test__deflections_2d_via_analytic_from__intensity_2(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.111111), - intensity=2.0, - sigma=5.0, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[0.5, 0.2]]) - ) - - assert deflections[0, 0] == pytest.approx(1.10812, 1.0e-4) - assert deflections[0, 1] == pytest.approx(0.35467, 1.0e-4) - - -def test__deflections_2d_via_integral_from__config_1(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.05263), - intensity=1.0, - sigma=3.0, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - deflections_via_analytic = mp.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_analytic.array, 1.0e-3) - - -def test__deflections_2d_via_integral_from__config_2(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.111111), - intensity=1.0, - sigma=5.0, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.5, 0.2]]) - ) - deflections_via_analytic = mp.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[0.5, 0.2]]) - ) - - assert deflections == pytest.approx(deflections_via_analytic.array, 1.0e-3) - - -def test__deflections_2d_via_integral_from__mass_to_light_2(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.111111), - intensity=1.0, - sigma=5.0, - mass_to_light_ratio=2.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.5, 0.2]]) - ) - deflections_via_analytic = mp.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[0.5, 0.2]]) - ) - - assert deflections == pytest.approx(deflections_via_analytic.array, 1.0e-3) - - -def test__deflections_2d_via_integral_from__intensity_2(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.111111), - intensity=2.0, - sigma=5.0, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.5, 0.2]]) - ) - deflections_via_analytic = mp.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[0.5, 0.2]]) - ) - - assert deflections == pytest.approx(deflections_via_analytic.array, 1.0e-3) - - -def test__deflections_yx_2d_from(): - mp = ag.mp.Gaussian() - - deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_integral = mp.deflections_2d_via_analytic_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) - - -def test__convergence_2d_from__gaussian_config_1(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - intensity=1.0, - sigma=1.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(0.60653, 1e-2) - - -def test__convergence_2d_from__gaussian_mass_to_light_2(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - intensity=1.0, - sigma=1.0, - mass_to_light_ratio=2.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(2.0 * 0.60653, 1e-2) - - -def test__convergence_2d_from__gaussian_elliptical(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.333333), - intensity=2.0, - sigma=3.0, - mass_to_light_ratio=4.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(7.88965, 1e-2) - - -def test__intensity_and_convergence_match_for_mass_light_ratio_1(): - lp = ag.lp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.333333), - intensity=2.0, - sigma=3.0, - ) - - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.333333), - intensity=2.0, - sigma=3.0, - mass_to_light_ratio=1.0, - ) - - intensity = lp.image_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - - assert (intensity == convergence).all() - - -def test__image_2d_via_radii_from__config_1(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=1.0, sigma=1.0 - ) - - intensity = mp.image_2d_via_radii_from(grid_radii=ag.ArrayIrregular(1.0)) - - assert intensity == pytest.approx(0.60653, 1e-2) - - -def test__image_2d_via_radii_from__intensity_2(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=2.0, sigma=1.0 - ) - - intensity = mp.image_2d_via_radii_from(grid_radii=ag.ArrayIrregular(1.0)) - - assert intensity == pytest.approx(2.0 * 0.60653, 1e-2) - - -def test__image_2d_via_radii_from__sigma_2(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=1.0, sigma=2.0 - ) - intensity = mp.image_2d_via_radii_from(grid_radii=ag.ArrayIrregular(1.0)) - - assert intensity == pytest.approx(0.882496, 1e-2) - - -def test__image_2d_via_radii_from__sigma_2_radii_3(): - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=1.0, sigma=2.0 - ) - - intensity = mp.image_2d_via_radii_from(grid_radii=ag.ArrayIrregular(3.0)) - - assert intensity == pytest.approx(0.32465, 1e-2) - - -def test__wofz__regions_1_2_3(): - from scipy.special import wofz - - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=1.0, sigma=2.0 - ) - - wofz_approx_reg_1 = mp.wofz(20.0 + 1j * 0.001) - wofz_approx_reg_2 = mp.wofz(2.0 + 1j * 0.001) - wofz_approx_reg_3 = mp.wofz(1.0 + 1j * 0.001) - - assert wofz_approx_reg_1 == pytest.approx(wofz(20.0 + 1j * 0.001), 1e-4) - assert wofz_approx_reg_2 == pytest.approx(wofz(2.0 + 1j * 0.001), 1e-4) - assert wofz_approx_reg_3 == pytest.approx(wofz(1.0 + 1j * 0.001), 1e-4) - - -def test__wofz__regions_4_5_6(): - from scipy.special import wofz - - mp = ag.mp.Gaussian( - centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=1.0, sigma=2.0 - ) - - wofz_approx_reg_1 = mp.wofz(7.0 + 1j * 0.1) - wofz_approx_reg_2 = mp.wofz(7.0 + 1j * 1e-11) - wofz_approx_reg_3 = mp.wofz(2.0 + 1j * 1.0) - - assert wofz_approx_reg_1 == pytest.approx(wofz(7.0 + 1j * 0.1), 1e-4) - assert wofz_approx_reg_2 == pytest.approx(wofz(7.0 + 1j * 1e-11), 1e-4) - assert wofz_approx_reg_3 == pytest.approx(wofz(2.0 + 1j * 1.0), 1e-4) +import numpy as np +import pytest + +import autogalaxy as ag + +grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) + + +def test__deflections_2d_via_analytic_from__config_1_positive_y(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.05263), + intensity=1.0, + sigma=3.0, + mass_to_light_ratio=1.0, + ) + + deflections = mp.deflections_2d_via_analytic_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections[0, 0] == pytest.approx(1.024423, 1.0e-4) + assert deflections[0, 1] == pytest.approx(0.0, abs=1.0e-4) + + +def test__deflections_2d_via_analytic_from__config_1_negative_y(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.05263), + intensity=1.0, + sigma=3.0, + mass_to_light_ratio=1.0, + ) + + deflections = mp.deflections_2d_via_analytic_from( + grid=ag.Grid2DIrregular([[-1.0, 0.0]]) + ) + + assert deflections[0, 0] == pytest.approx(-1.024423, 1.0e-4) + assert deflections[0, 1] == pytest.approx(0.0, abs=1.0e-4) + + +def test__deflections_2d_via_analytic_from__config_2_positive(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.111111), + intensity=1.0, + sigma=5.0, + mass_to_light_ratio=1.0, + ) + + deflections = mp.deflections_2d_via_analytic_from( + grid=ag.Grid2DIrregular([[0.5, 0.2]]) + ) + + assert deflections[0, 0] == pytest.approx(0.554062, 1.0e-4) + assert deflections[0, 1] == pytest.approx(0.177336, 1.0e-4) + + +def test__deflections_2d_via_analytic_from__config_2_negative(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.111111), + intensity=1.0, + sigma=5.0, + mass_to_light_ratio=1.0, + ) + + deflections = mp.deflections_2d_via_analytic_from( + grid=ag.Grid2DIrregular([[-0.5, -0.2]]) + ) + + assert deflections[0, 0] == pytest.approx(-0.554062, 1.0e-4) + assert deflections[0, 1] == pytest.approx(-0.177336, 1.0e-4) + + +def test__deflections_2d_via_analytic_from__mass_to_light_2(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.111111), + intensity=1.0, + sigma=5.0, + mass_to_light_ratio=2.0, + ) + + deflections = mp.deflections_2d_via_analytic_from( + grid=ag.Grid2DIrregular([[0.5, 0.2]]) + ) + + assert deflections[0, 0] == pytest.approx(1.108125, 1.0e-4) + assert deflections[0, 1] == pytest.approx(0.35467, 1.0e-4) + + +def test__deflections_2d_via_analytic_from__intensity_2(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.111111), + intensity=2.0, + sigma=5.0, + mass_to_light_ratio=1.0, + ) + + deflections = mp.deflections_2d_via_analytic_from( + grid=ag.Grid2DIrregular([[0.5, 0.2]]) + ) + + assert deflections[0, 0] == pytest.approx(1.10812, 1.0e-4) + assert deflections[0, 1] == pytest.approx(0.35467, 1.0e-4) + + +def test__deflections_yx_2d_from(): + mp = ag.mp.Gaussian() + + deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_integral = mp.deflections_2d_via_analytic_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) + + +def test__convergence_2d_from__gaussian_config_1(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + intensity=1.0, + sigma=1.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(0.60653, 1e-2) + + +def test__convergence_2d_from__gaussian_mass_to_light_2(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + intensity=1.0, + sigma=1.0, + mass_to_light_ratio=2.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(2.0 * 0.60653, 1e-2) + + +def test__convergence_2d_from__gaussian_elliptical(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.333333), + intensity=2.0, + sigma=3.0, + mass_to_light_ratio=4.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(7.88965, 1e-2) + + +def test__intensity_and_convergence_match_for_mass_light_ratio_1(): + lp = ag.lp.Gaussian( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.333333), + intensity=2.0, + sigma=3.0, + ) + + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.333333), + intensity=2.0, + sigma=3.0, + mass_to_light_ratio=1.0, + ) + + intensity = lp.image_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + + assert (intensity == convergence).all() + + +def test__image_2d_via_radii_from__config_1(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=1.0, sigma=1.0 + ) + + intensity = mp.image_2d_via_radii_from(grid_radii=ag.ArrayIrregular(1.0)) + + assert intensity == pytest.approx(0.60653, 1e-2) + + +def test__image_2d_via_radii_from__intensity_2(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=2.0, sigma=1.0 + ) + + intensity = mp.image_2d_via_radii_from(grid_radii=ag.ArrayIrregular(1.0)) + + assert intensity == pytest.approx(2.0 * 0.60653, 1e-2) + + +def test__image_2d_via_radii_from__sigma_2(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=1.0, sigma=2.0 + ) + intensity = mp.image_2d_via_radii_from(grid_radii=ag.ArrayIrregular(1.0)) + + assert intensity == pytest.approx(0.882496, 1e-2) + + +def test__image_2d_via_radii_from__sigma_2_radii_3(): + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=1.0, sigma=2.0 + ) + + intensity = mp.image_2d_via_radii_from(grid_radii=ag.ArrayIrregular(3.0)) + + assert intensity == pytest.approx(0.32465, 1e-2) + + +def test__wofz__regions_1_2_3(): + from scipy.special import wofz + + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=1.0, sigma=2.0 + ) + + wofz_approx_reg_1 = mp.wofz(20.0 + 1j * 0.001) + wofz_approx_reg_2 = mp.wofz(2.0 + 1j * 0.001) + wofz_approx_reg_3 = mp.wofz(1.0 + 1j * 0.001) + + assert wofz_approx_reg_1 == pytest.approx(wofz(20.0 + 1j * 0.001), 1e-4) + assert wofz_approx_reg_2 == pytest.approx(wofz(2.0 + 1j * 0.001), 1e-4) + assert wofz_approx_reg_3 == pytest.approx(wofz(1.0 + 1j * 0.001), 1e-4) + + +def test__wofz__regions_4_5_6(): + from scipy.special import wofz + + mp = ag.mp.Gaussian( + centre=(0.0, 0.0), ell_comps=(0.0, 0.0), intensity=1.0, sigma=2.0 + ) + + wofz_approx_reg_1 = mp.wofz(7.0 + 1j * 0.1) + wofz_approx_reg_2 = mp.wofz(7.0 + 1j * 1e-11) + wofz_approx_reg_3 = mp.wofz(2.0 + 1j * 1.0) + + assert wofz_approx_reg_1 == pytest.approx(wofz(7.0 + 1j * 0.1), 1e-4) + assert wofz_approx_reg_2 == pytest.approx(wofz(7.0 + 1j * 1e-11), 1e-4) + assert wofz_approx_reg_3 == pytest.approx(wofz(2.0 + 1j * 1.0), 1e-4) diff --git a/test_autogalaxy/profiles/mass/stellar/test_sersic.py b/test_autogalaxy/profiles/mass/stellar/test_sersic.py index 46f22bc3..2d4c0563 100644 --- a/test_autogalaxy/profiles/mass/stellar/test_sersic.py +++ b/test_autogalaxy/profiles/mass/stellar/test_sersic.py @@ -1,286 +1,244 @@ -import numpy as np -import pytest - -import autogalaxy as ag - -grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) - - -def test__deflections_via_integral_from__config_1(): - mp = ag.mp.Sersic( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(1.1446, 1e-3) - assert deflections[0, 1] == pytest.approx(0.79374, 1e-3) - - -def test__deflections_via_integral_from__config_2(): - mp = ag.mp.Sersic( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=10.0, - effective_radius=0.2, - sersic_index=3.0, - mass_to_light_ratio=1.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(2.6134, 1e-3) - assert deflections[0, 1] == pytest.approx(1.80719, 1e-3) - - -def test__deflections_2d_via_cse_from__config_1(): - mp = ag.mp.Sersic( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_2d_via_cse_from__config_2(): - mp = ag.mp.Sersic( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=10.0, - effective_radius=0.2, - sersic_index=3.0, - mass_to_light_ratio=1.0, - ) - - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-3) - - -def test__deflections_2d_via_cse_from__config_3(): - mp = ag.mp.Sersic( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - sersic_index=1.5, - mass_to_light_ratio=2.0, - ) - - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-3) - - -def test__deflections_yx_2d_from__sersic(): - mp = ag.mp.Sersic() - - deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_integral = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) - - -def test__deflections_yx_2d_from__sersic_sph(): - mp = ag.mp.SersicSph() - - deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_integral = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) - - -def test__deflections_yx_2d_from__elliptical_vs_spherical(): - elliptical = ag.mp.Sersic( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - sersic_index=4.0, - mass_to_light_ratio=1.0, - ) - - spherical = ag.mp.SersicSph( - centre=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - sersic_index=4.0, - mass_to_light_ratio=1.0, - ) - - elliptical_deflections = elliptical.deflections_2d_via_integral_from(grid=grid) - spherical_deflections = spherical.deflections_2d_via_integral_from(grid=grid) - - assert elliptical_deflections == pytest.approx(spherical_deflections.array, 1.0e-4) - - -def test__convergence_2d_via_cse_from__sersic_intensity_3(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) - - assert convergence == pytest.approx(4.90657319276, 1e-3) - - -def test__convergence_2d_via_cse_from__sersic_intensity_6(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - intensity=6.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) - - assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) - - -def test__convergence_2d_via_cse_from__sersic_mass_to_light_2(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=2.0, - ) - - convergence = mp.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) - - assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) - - -def test__convergence_2d_via_cse_from__sersic_elliptical(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.333333), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - - assert convergence == pytest.approx(5.38066670129, 1e-3) - - -def test__convergence_2d_from__sersic_intensity_3(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) - - assert convergence == pytest.approx(4.90657319276, 1e-3) - - -def test__convergence_2d_from__sersic_intensity_6(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - intensity=6.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) - - assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) - - -def test__convergence_2d_from__sersic_mass_to_light_2(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=2.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) - - assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) - - -def test__convergence_2d_from__sersic_elliptical(): - mp = ag.mp.Sersic( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.333333), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - - assert convergence == pytest.approx(5.38066670129, 1e-3) - - -def test__convergence_2d_from__elliptical_vs_spherical(): - elliptical = ag.mp.Sersic( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - sersic_index=4.0, - mass_to_light_ratio=1.0, - ) - - spherical = ag.mp.SersicSph( - centre=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - sersic_index=4.0, - mass_to_light_ratio=1.0, - ) - - ell_convergence_2d = elliptical.convergence_2d_from(grid=grid) - sph_convergence_2d = spherical.convergence_2d_from(grid=grid) - - assert ell_convergence_2d == pytest.approx(sph_convergence_2d, 1.0e-4) +import numpy as np +import pytest + +import autogalaxy as ag + +grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) + + +def test__deflections_2d_via_cse_from__config_1(): + mp = ag.mp.Sersic( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=5.0, + effective_radius=0.2, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + + deflections_via_integral = np.array([[1.1446, 0.79374]]) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_via_cse_from__config_2(): + mp = ag.mp.Sersic( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=10.0, + effective_radius=0.2, + sersic_index=3.0, + mass_to_light_ratio=1.0, + ) + + deflections_via_integral = np.array([[2.6134, 1.80719]]) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-3) + + +def test__deflections_2d_via_cse_from__config_3(): + mp = ag.mp.Sersic( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=5.0, + effective_radius=0.2, + sersic_index=1.5, + mass_to_light_ratio=2.0, + ) + + deflections_via_integral = np.array([[2.0810915255, 1.4433668621]]) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-3) + + +def test__deflections_yx_2d_from__sersic(): + mp = ag.mp.Sersic() + + deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_integral = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) + + +def test__deflections_yx_2d_from__sersic_sph(): + mp = ag.mp.SersicSph() + + deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_integral = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) + + +def test__deflections_yx_2d_from__elliptical_vs_spherical(): + elliptical = ag.mp.Sersic( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + sersic_index=4.0, + mass_to_light_ratio=1.0, + ) + + spherical = ag.mp.SersicSph( + centre=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + sersic_index=4.0, + mass_to_light_ratio=1.0, + ) + + elliptical_deflections = elliptical.deflections_yx_2d_from(grid=grid) + spherical_deflections = spherical.deflections_yx_2d_from(grid=grid) + + assert elliptical_deflections == pytest.approx(spherical_deflections.array, 1.0e-4) + + +def test__convergence_2d_via_cse_from__sersic_intensity_3(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) + + assert convergence == pytest.approx(4.90657319276, 1e-3) + + +def test__convergence_2d_via_cse_from__sersic_intensity_6(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + intensity=6.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) + + assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) + + +def test__convergence_2d_via_cse_from__sersic_mass_to_light_2(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=2.0, + ) + + convergence = mp.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) + + assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) + + +def test__convergence_2d_via_cse_from__sersic_elliptical(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.333333), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_via_cse_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + + assert convergence == pytest.approx(5.38066670129, 1e-3) + + +def test__convergence_2d_from__sersic_intensity_3(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) + + assert convergence == pytest.approx(4.90657319276, 1e-3) + + +def test__convergence_2d_from__sersic_intensity_6(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + intensity=6.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) + + assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) + + +def test__convergence_2d_from__sersic_mass_to_light_2(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=2.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.5]])) + + assert convergence == pytest.approx(2.0 * 4.90657319276, 1e-3) + + +def test__convergence_2d_from__sersic_elliptical(): + mp = ag.mp.Sersic( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.333333), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + + assert convergence == pytest.approx(5.38066670129, 1e-3) + + +def test__convergence_2d_from__elliptical_vs_spherical(): + elliptical = ag.mp.Sersic( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + sersic_index=4.0, + mass_to_light_ratio=1.0, + ) + + spherical = ag.mp.SersicSph( + centre=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + sersic_index=4.0, + mass_to_light_ratio=1.0, + ) + + ell_convergence_2d = elliptical.convergence_2d_from(grid=grid) + sph_convergence_2d = spherical.convergence_2d_from(grid=grid) + + assert ell_convergence_2d == pytest.approx(sph_convergence_2d, 1.0e-4) diff --git a/test_autogalaxy/profiles/mass/stellar/test_sersic_gradient.py b/test_autogalaxy/profiles/mass/stellar/test_sersic_gradient.py index 4d09ed21..c011d8ae 100644 --- a/test_autogalaxy/profiles/mass/stellar/test_sersic_gradient.py +++ b/test_autogalaxy/profiles/mass/stellar/test_sersic_gradient.py @@ -1,364 +1,323 @@ -import pytest - -import autogalaxy as ag - -grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) - - -def test__deflections_via_integral_from__gradient_1(): - mp = ag.mp.SersicGradient( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - sersic_index=2.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=1.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(3.60324873535244, 1e-3) - assert deflections[0, 1] == pytest.approx(2.3638898009652, 1e-3) - - -def test__deflections_via_integral_from__gradient_neg_1(): - mp = ag.mp.SersicGradient( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - sersic_index=2.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=-1.0, - ) - - deflections = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections[0, 0] == pytest.approx(0.97806399756448, 1e-3) - assert deflections[0, 1] == pytest.approx(0.725459334118341, 1e-3) - - -# def test__deflections_2d_via_mge_from(): -# mp = ag.mp.SersicGradient( -# centre=(-0.4, -0.2), -# ell_comps=(-0.07142, -0.085116), -# intensity=5.0, -# effective_radius=0.2, -# sersic_index=2.0, -# mass_to_light_ratio=1.0, -# mass_to_light_gradient=-1.0, -# ) -# -# deflections_via_integral = mp.deflections_2d_via_integral_from( -# grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) -# ) -# deflections_via_mge = mp.deflections_2d_via_mge_from( -# grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) -# ) -# -# assert deflections_via_integral == pytest.approx(deflections_via_mge.array, 1.0e-3) - - -def test__deflections_2d_via_cse_from__gradient_1(): - mp = ag.mp.SersicGradient( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - sersic_index=2.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=1.0, - ) - - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_2d_via_cse_from__gradient_neg_1(): - mp = ag.mp.SersicGradient( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - sersic_index=2.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=-1.0, - ) - - deflections_via_integral = mp.deflections_2d_via_integral_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - deflections_via_cse = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) - - -def test__deflections_yx_2d_from__sersic_gradient(): - mp = ag.mp.SersicGradient() - - deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_integral = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) - - -def test__deflections_yx_2d_from__sersic_gradient_sph(): - mp = ag.mp.SersicGradientSph() - - deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - deflections_via_integral = mp.deflections_2d_via_cse_from( - grid=ag.Grid2DIrregular([[1.0, 0.0]]) - ) - - assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) - - -def test__deflections_yx_2d_from__elliptical_vs_spherical(): - elliptical = ag.mp.SersicGradient( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - sersic_index=4.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=1.0, - ) - - spherical = ag.mp.SersicGradient( - centre=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - sersic_index=4.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=1.0, - ) - - ell_deflections_yx_2d = elliptical.deflections_yx_2d_from(grid=grid) - sph_deflections_yx_2d = spherical.deflections_yx_2d_from(grid=grid) - - ell_deflections_yx_2d == pytest.approx(sph_deflections_yx_2d.array, 1.0e-4) - - -def test__convergence_2d_from__sersic_gradient_config_1(): - # ((axis_ratio*radius/effective_radius)**-mass_to_light_gradient) = (1/0.6)**-1.0 = 0.6 - mp = ag.mp.SersicGradient( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - intensity=1.0, - effective_radius=0.6, - sersic_index=4.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) - - assert convergence == pytest.approx(0.6 * 0.351797, 1e-3) - - -def test__convergence_2d_from__sersic_gradient_config_2(): - # ((axis_ratio*radius/effective_radius)**-mass_to_light_gradient) = (1.5/2.0)**1.0 = 0.75 - - mp = ag.mp.SersicGradient( - ell_comps=(0.0, 0.0), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=-1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.5, 0.0]])) - - assert convergence == pytest.approx(0.75 * 4.90657319276, 1e-3) - - -def test__convergence_2d_from__sersic_gradient_intensity_6(): - mp = ag.mp.SersicGradient( - ell_comps=(0.0, 0.0), - intensity=6.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=-1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.5, 0.0]])) - - assert convergence == pytest.approx(2.0 * 0.75 * 4.90657319276, 1e-3) - - -def test__convergence_2d_from__sersic_gradient_mass_to_light_2(): - mp = ag.mp.SersicGradient( - ell_comps=(0.0, 0.0), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=2.0, - mass_to_light_gradient=-1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.5, 0.0]])) - - assert convergence == pytest.approx(2.0 * 0.75 * 4.90657319276, 1e-3) - - -def test__convergence_2d_from__sersic_gradient_elliptical(): - # ((axis_ratio*radius/effective_radius)**-mass_to_light_gradient) = ((0.5*1.41)/2.0)**-1.0 = 2.836 - mp = ag.mp.SersicGradient( - ell_comps=(0.0, 0.333333), - intensity=3.0, - effective_radius=2.0, - sersic_index=2.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=1.0, - ) - - convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) - - assert convergence == pytest.approx(2.836879 * 5.38066670129, abs=2e-01) - - -def test__convergence_2d_from__elliptical_vs_spherical(): - elliptical = ag.mp.SersicGradient( - centre=(0.0, 0.0), - ell_comps=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - sersic_index=4.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=1.0, - ) - - spherical = ag.mp.SersicGradient( - centre=(0.0, 0.0), - intensity=1.0, - effective_radius=1.0, - sersic_index=4.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=1.0, - ) - - ell_convergence_2d = elliptical.convergence_2d_from(grid=grid) - sph_convergence_2d = spherical.convergence_2d_from(grid=grid) - - assert ell_convergence_2d == pytest.approx(sph_convergence_2d.array, 1.0e-4) - - -def test__compare_to_sersic__gradient_0_vs_exponential(): - mp = ag.mp.SersicGradient( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - sersic_index=1.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=0.0, - ) - - sersic_deflections = mp.deflections_yx_2d_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - exponential = ag.mp.Exponential( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - mass_to_light_ratio=1.0, - ) - exponential_deflections = exponential.deflections_yx_2d_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert sersic_deflections[0, 0] == pytest.approx( - exponential_deflections.array[0, 0], 1e-3 - ) - assert sersic_deflections[0, 0] == pytest.approx(0.90493, 1e-3) - assert sersic_deflections[0, 1] == pytest.approx( - exponential_deflections.array[0, 1], 1e-3 - ) - assert sersic_deflections[0, 1] == pytest.approx(0.62569, 1e-3) - - -def test__compare_to_sersic__gradient_0_vs_dev_vaucouleurs(): - mp = ag.mp.SersicGradient( - centre=(0.4, 0.2), - ell_comps=(0.0180010, 0.0494575), - intensity=2.0, - effective_radius=0.8, - sersic_index=4.0, - mass_to_light_ratio=3.0, - mass_to_light_gradient=0.0, - ) - sersic_deflections = mp.deflections_yx_2d_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - dev = ag.mp.DevVaucouleurs( - centre=(0.4, 0.2), - ell_comps=(0.0180010, 0.0494575), - intensity=2.0, - effective_radius=0.8, - mass_to_light_ratio=3.0, - ) - - dev_deflections = dev.deflections_yx_2d_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - # assert sersic_deflections[0, 0] == pytest.approx(dev_deflections[0, 0], 1e-3) - # assert sersic_deflections[0, 0] == pytest.approx(-24.528, 1e-3) - # assert sersic_deflections[0, 1] == pytest.approx(dev_deflections[0, 1], 1e-3) - # assert sersic_deflections[0, 1] == pytest.approx(-3.37605, 1e-3) - - -def test__compare_to_sersic__gradient_0_vs_sersic(): - sersic_grad = ag.mp.SersicGradient( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - sersic_index=2.0, - mass_to_light_ratio=1.0, - mass_to_light_gradient=0.0, - ) - sersic_grad_deflections = sersic_grad.deflections_yx_2d_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - mp = ag.mp.Sersic( - centre=(-0.4, -0.2), - ell_comps=(-0.07142, -0.085116), - intensity=5.0, - effective_radius=0.2, - sersic_index=2.0, - mass_to_light_ratio=1.0, - ) - sersic_deflections = mp.deflections_yx_2d_from( - grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) - ) - - assert sersic_deflections[0, 0] == pytest.approx( - sersic_grad_deflections.array[0, 0], 1e-3 - ) - assert sersic_deflections[0, 0] == pytest.approx(1.1446, 1e-3) - assert sersic_deflections[0, 1] == pytest.approx( - sersic_grad_deflections.array[0, 1], 1e-3 - ) - assert sersic_deflections[0, 1] == pytest.approx(0.79374, 1e-3) +import numpy as np +import pytest + +import autogalaxy as ag + +grid = ag.Grid2DIrregular([[1.0, 1.0], [2.0, 2.0], [3.0, 3.0], [2.0, 4.0]]) + + +# def test__deflections_2d_via_mge_from(): +# mp = ag.mp.SersicGradient( +# centre=(-0.4, -0.2), +# ell_comps=(-0.07142, -0.085116), +# intensity=5.0, +# effective_radius=0.2, +# sersic_index=2.0, +# mass_to_light_ratio=1.0, +# mass_to_light_gradient=-1.0, +# ) +# +# deflections_via_integral = mp.deflections_2d_via_integral_from( +# grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) +# ) +# deflections_via_mge = mp.deflections_2d_via_mge_from( +# grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) +# ) +# +# assert deflections_via_integral == pytest.approx(deflections_via_mge.array, 1.0e-3) + + +def test__deflections_2d_via_cse_from__gradient_1(): + mp = ag.mp.SersicGradient( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=5.0, + effective_radius=0.2, + sersic_index=2.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=1.0, + ) + + deflections_via_integral = np.array([[3.60324873535244, 2.3638898009652]]) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_2d_via_cse_from__gradient_neg_1(): + mp = ag.mp.SersicGradient( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=5.0, + effective_radius=0.2, + sersic_index=2.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=-1.0, + ) + + deflections_via_integral = np.array([[0.97806399756448, 0.725459334118341]]) + deflections_via_cse = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert deflections_via_integral == pytest.approx(deflections_via_cse.array, 1.0e-4) + + +def test__deflections_yx_2d_from__sersic_gradient(): + mp = ag.mp.SersicGradient() + + deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_integral = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) + + +def test__deflections_yx_2d_from__sersic_gradient_sph(): + mp = ag.mp.SersicGradientSph() + + deflections = mp.deflections_yx_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + deflections_via_integral = mp.deflections_2d_via_cse_from( + grid=ag.Grid2DIrregular([[1.0, 0.0]]) + ) + + assert deflections == pytest.approx(deflections_via_integral.array, 1.0e-4) + + +def test__deflections_yx_2d_from__elliptical_vs_spherical(): + elliptical = ag.mp.SersicGradient( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + sersic_index=4.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=1.0, + ) + + spherical = ag.mp.SersicGradient( + centre=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + sersic_index=4.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=1.0, + ) + + ell_deflections_yx_2d = elliptical.deflections_yx_2d_from(grid=grid) + sph_deflections_yx_2d = spherical.deflections_yx_2d_from(grid=grid) + + ell_deflections_yx_2d == pytest.approx(sph_deflections_yx_2d.array, 1.0e-4) + + +def test__convergence_2d_from__sersic_gradient_config_1(): + # ((axis_ratio*radius/effective_radius)**-mass_to_light_gradient) = (1/0.6)**-1.0 = 0.6 + mp = ag.mp.SersicGradient( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + intensity=1.0, + effective_radius=0.6, + sersic_index=4.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[0.0, 1.0]])) + + assert convergence == pytest.approx(0.6 * 0.351797, 1e-3) + + +def test__convergence_2d_from__sersic_gradient_config_2(): + # ((axis_ratio*radius/effective_radius)**-mass_to_light_gradient) = (1.5/2.0)**1.0 = 0.75 + + mp = ag.mp.SersicGradient( + ell_comps=(0.0, 0.0), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=-1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.5, 0.0]])) + + assert convergence == pytest.approx(0.75 * 4.90657319276, 1e-3) + + +def test__convergence_2d_from__sersic_gradient_intensity_6(): + mp = ag.mp.SersicGradient( + ell_comps=(0.0, 0.0), + intensity=6.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=-1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.5, 0.0]])) + + assert convergence == pytest.approx(2.0 * 0.75 * 4.90657319276, 1e-3) + + +def test__convergence_2d_from__sersic_gradient_mass_to_light_2(): + mp = ag.mp.SersicGradient( + ell_comps=(0.0, 0.0), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=2.0, + mass_to_light_gradient=-1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.5, 0.0]])) + + assert convergence == pytest.approx(2.0 * 0.75 * 4.90657319276, 1e-3) + + +def test__convergence_2d_from__sersic_gradient_elliptical(): + # ((axis_ratio*radius/effective_radius)**-mass_to_light_gradient) = ((0.5*1.41)/2.0)**-1.0 = 2.836 + mp = ag.mp.SersicGradient( + ell_comps=(0.0, 0.333333), + intensity=3.0, + effective_radius=2.0, + sersic_index=2.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=1.0, + ) + + convergence = mp.convergence_2d_from(grid=ag.Grid2DIrregular([[1.0, 0.0]])) + + assert convergence == pytest.approx(2.836879 * 5.38066670129, abs=2e-01) + + +def test__convergence_2d_from__elliptical_vs_spherical(): + elliptical = ag.mp.SersicGradient( + centre=(0.0, 0.0), + ell_comps=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + sersic_index=4.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=1.0, + ) + + spherical = ag.mp.SersicGradient( + centre=(0.0, 0.0), + intensity=1.0, + effective_radius=1.0, + sersic_index=4.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=1.0, + ) + + ell_convergence_2d = elliptical.convergence_2d_from(grid=grid) + sph_convergence_2d = spherical.convergence_2d_from(grid=grid) + + assert ell_convergence_2d == pytest.approx(sph_convergence_2d.array, 1.0e-4) + + +def test__compare_to_sersic__gradient_0_vs_exponential(): + mp = ag.mp.SersicGradient( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=5.0, + effective_radius=0.2, + sersic_index=1.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=0.0, + ) + + sersic_deflections = mp.deflections_yx_2d_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + exponential = ag.mp.Exponential( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=5.0, + effective_radius=0.2, + mass_to_light_ratio=1.0, + ) + exponential_deflections = exponential.deflections_yx_2d_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert sersic_deflections[0, 0] == pytest.approx( + exponential_deflections.array[0, 0], 1e-3 + ) + assert sersic_deflections[0, 0] == pytest.approx(0.90493, 1e-3) + assert sersic_deflections[0, 1] == pytest.approx( + exponential_deflections.array[0, 1], 1e-3 + ) + assert sersic_deflections[0, 1] == pytest.approx(0.62569, 1e-3) + + +def test__compare_to_sersic__gradient_0_vs_dev_vaucouleurs(): + mp = ag.mp.SersicGradient( + centre=(0.4, 0.2), + ell_comps=(0.0180010, 0.0494575), + intensity=2.0, + effective_radius=0.8, + sersic_index=4.0, + mass_to_light_ratio=3.0, + mass_to_light_gradient=0.0, + ) + sersic_deflections = mp.deflections_yx_2d_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + dev = ag.mp.DevVaucouleurs( + centre=(0.4, 0.2), + ell_comps=(0.0180010, 0.0494575), + intensity=2.0, + effective_radius=0.8, + mass_to_light_ratio=3.0, + ) + + dev_deflections = dev.deflections_yx_2d_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + # assert sersic_deflections[0, 0] == pytest.approx(dev_deflections[0, 0], 1e-3) + # assert sersic_deflections[0, 0] == pytest.approx(-24.528, 1e-3) + # assert sersic_deflections[0, 1] == pytest.approx(dev_deflections[0, 1], 1e-3) + # assert sersic_deflections[0, 1] == pytest.approx(-3.37605, 1e-3) + + +def test__compare_to_sersic__gradient_0_vs_sersic(): + sersic_grad = ag.mp.SersicGradient( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=5.0, + effective_radius=0.2, + sersic_index=2.0, + mass_to_light_ratio=1.0, + mass_to_light_gradient=0.0, + ) + sersic_grad_deflections = sersic_grad.deflections_yx_2d_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + mp = ag.mp.Sersic( + centre=(-0.4, -0.2), + ell_comps=(-0.07142, -0.085116), + intensity=5.0, + effective_radius=0.2, + sersic_index=2.0, + mass_to_light_ratio=1.0, + ) + sersic_deflections = mp.deflections_yx_2d_from( + grid=ag.Grid2DIrregular([[0.1625, 0.1625]]) + ) + + assert sersic_deflections[0, 0] == pytest.approx( + sersic_grad_deflections.array[0, 0], 1e-3 + ) + assert sersic_deflections[0, 0] == pytest.approx(1.1446, 1e-3) + assert sersic_deflections[0, 1] == pytest.approx( + sersic_grad_deflections.array[0, 1], 1e-3 + ) + assert sersic_deflections[0, 1] == pytest.approx(0.79374, 1e-3)