Ejemplo n.º 1
0
 def test_gausschebyshev(self):
     """Test Guass Chebyshev polynomial grid."""
     points, weights = np.polynomial.chebyshev.chebgauss(10)
     weights = weights * np.sqrt(1 - np.power(points, 2))
     grid = GaussChebyshev(10)
     assert_allclose(grid.points, np.sort(points))
     assert_allclose(grid.weights, weights)
Ejemplo n.º 2
0
    def test_poisson_solve_mtr_cmpl(self):
        """Test solve poisson equation and interpolate the result."""
        oned = GaussChebyshev(50)
        btf = BeckeRTransform(1e-7, 1.5)
        rad = btf.transform_1d_grid(oned)
        l_max = 7
        atgrid = AtomGrid(rad, degrees=[l_max])
        value_array = self.helper_func_gauss(atgrid.points)
        p_0 = atgrid.integrate(value_array)

        # test density sum up to np.pi**(3 / 2)
        assert_allclose(p_0, np.pi**1.5, atol=1e-4)
        sph_coor = atgrid.convert_cart_to_sph()[:, 1:3]
        spls_mt = Poisson._proj_sph_value(
            atgrid.rgrid,
            sph_coor,
            l_max // 2,
            value_array,
            atgrid.weights,
            atgrid.indices,
        )
        ibtf = InverseRTransform(btf)
        linsp = np.linspace(-1, 0.99, 50)
        bound = p_0 * np.sqrt(4 * np.pi)
        pois_mtr = Poisson.solve_poisson(spls_mt, linsp, bound, tfm=ibtf)
        assert pois_mtr.shape == (7, 4)
        near_rg_pts = np.array([1e-2, 0.1, 0.2, 0.3, 0.5, 0.7, 1.0, 1.2])
        near_tf_pts = ibtf.transform(near_rg_pts)
        ref_short_res = [
            6.28286,  # 0.01
            6.26219,  # 0.1
            6.20029,  # 0.2
            6.09956,  # 0.3
            5.79652,  # 0.5
            5.3916,  # 0.7
            4.69236,  # 1.0
            4.22403,  # 1.2
        ]
        for i, j in enumerate(near_tf_pts):
            assert_almost_equal(
                Poisson.interpolate_radial(pois_mtr, j, 0, True) /
                near_rg_pts[i],
                ref_short_res[i] * np.sqrt(4 * np.pi),
                decimal=3,
            )
            matrix_result = Poisson.interpolate_radial(pois_mtr, j)
            assert_almost_equal(
                matrix_result[0, 0] / near_rg_pts[i],
                ref_short_res[i] * np.sqrt(4 * np.pi),
                decimal=3,
            )
            # test interpolate with sph
            result = Poisson.interpolate(pois_mtr, j, np.random.rand(5),
                                         np.random.rand(5))
            assert_allclose(result / near_rg_pts[i] - ref_short_res[i],
                            np.zeros(5),
                            atol=1e-3)
Ejemplo n.º 3
0
    def test_becke_integral(self):
        """Test transform integral."""
        oned = GaussLegendre(20)
        btf = BeckeTF(0.00001, 1.0)
        rad = btf.transform_1d_grid(oned)

        def gauss(x):
            return np.exp(-(x**2))

        result = rad.integrate(gauss(rad.points))
        ref_result = np.sqrt(np.pi) / 2
        assert_almost_equal(result, ref_result, decimal=5)

        oned = GaussChebyshev(20)
        rad = btf.transform_1d_grid(oned)
        result = rad.integrate(gauss(rad.points))
        assert_almost_equal(result, ref_result, decimal=3)
Ejemplo n.º 4
0
    def test_poisson_proj(self):
        """Test the project function."""
        oned = GaussChebyshev(30)
        btf = BeckeRTransform(0.0001, 1.5)
        rad = btf.transform_1d_grid(oned)
        l_max = 7
        atgrid = AtomGrid(rad, degrees=[l_max])
        value_array = self.helper_func_gauss(atgrid.points)
        spl_res = spline_with_atomic_grid(atgrid, value_array)
        # test for random, r, theta, phi
        for _ in range(20):
            r = np.random.rand(1)[0] * 2
            theta = np.random.rand(10) * 3.14
            phi = np.random.rand(10) * 3.14
            result = interpolate(spl_res, r, theta, phi)
            x = r * np.sin(phi) * np.cos(theta)
            y = r * np.sin(phi) * np.sin(theta)
            z = r * np.cos(phi)
            result_ref = self.helper_func_gauss(np.array([x, y, z]).T)
            # assert similar value less than 1e-4 discrepancy
            assert_allclose(result, result_ref, atol=1e-4)

        sph_coor = atgrid.convert_cart_to_sph()[:, 1:3]
        spls_mt = Poisson._proj_sph_value(
            atgrid.rgrid,
            sph_coor,
            l_max // 2,
            value_array,
            atgrid.weights,
            atgrid.indices,
        )
        # test each point is the same
        for _ in range(20):
            r = np.random.rand(1)[0] * 2
            # random spherical point
            int_res = np.zeros((l_max, l_max // 2 + 1), dtype=float)
            for j in range(l_max // 2 + 1):
                for i in range(-j, j + 1):
                    int_res[i, j] += spls_mt[i, j](r)
            assert_allclose(spl_res(r), int_res)
Ejemplo n.º 5
0
    def test_raises_errors(self):
        """Test proper error raises."""
        oned = GaussChebyshev(50)
        btf = BeckeRTransform(1e-7, 1.5)
        rad = btf.transform_1d_grid(oned)
        l_max = 7
        atgrid = AtomGrid(rad, degrees=[l_max])
        value_array = self.helper_func_gauss(atgrid.points)
        p_0 = atgrid.integrate(value_array)

        # test density sum up to np.pi**(3 / 2)
        assert_allclose(p_0, np.pi**1.5, atol=1e-4)
        sph_coor = atgrid.convert_cart_to_sph()
        with self.assertRaises(ValueError):
            Poisson._proj_sph_value(
                atgrid.rgrid,
                sph_coor,
                l_max // 2,
                value_array,
                atgrid.weights,
                atgrid.indices,
            )
Ejemplo n.º 6
0
 def test_errors_raise(self):
     """Test errors raise."""
     with self.assertRaises(ValueError):
         GaussLaguerre(10, -1)
     with self.assertRaises(ValueError):
         GaussLaguerre(0, 1)
     with self.assertRaises(ValueError):
         GaussLegendre(-10)
     with self.assertRaises(ValueError):
         GaussChebyshev(-10)
     with self.assertRaises(ValueError):
         HortonLinear(-10)
     with self.assertRaises(ValueError):
         TanhSinh(10, 1)
     with self.assertRaises(ValueError):
         Simpson(4)
     with self.assertRaises(ValueError):
         GaussChebyshevType2(-10)
     with self.assertRaises(ValueError):
         GaussChebyshevLobatto(-10)
     with self.assertRaises(ValueError):
         Trapezoidal(-10)
     with self.assertRaises(ValueError):
         RectangleRuleSineEndPoints(-10)
     with self.assertRaises(ValueError):
         RectangleRuleSine(-10)
     with self.assertRaises(ValueError):
         TanhSinh(-11, 1)
     with self.assertRaises(ValueError):
         Simpson(-11)
     with self.assertRaises(ValueError):
         MidPoint(-10)
     with self.assertRaises(ValueError):
         ClenshawCurtis(-10)
     with self.assertRaises(ValueError):
         FejerFirst(-10)
     with self.assertRaises(ValueError):
         FejerSecond(-10)
Ejemplo n.º 7
0
basis = from_iodata(molecule)
q = np.array([0.1])
R = np.array([[2.574156, -0.181816, -2.453822]])
alc_hf = Alchemical_tools(
    basis,
    molecule,
    point_charge_positions=R,
    point_charges_values=q,
    coord_type="cartesian",
    k="HF",
)
r0 = 1e-10
radii = get_cov_radii(molecule.atnums)
n_rad_points = 100
deg = 5
onedgrid = GaussChebyshev(n_rad_points)
molecule_at_grid = []
for i in range(len(molecule.atnums)):
    Rad = BeckeTF.find_parameter(onedgrid.points, r0, radii[i])
    rad_grid = BeckeTF(r0, Rad).transform_grid(onedgrid)
    molecule_at_grid = molecule_at_grid + [
        AtomicGrid.special_init(rad_grid, radii[i], degs=[deg], scales=[])
    ]
molgrid = MolGrid(molecule_at_grid, molecule.atnums)
alc_lda = Alchemical_tools(
    basis,
    molecule,
    point_charge_positions=R,
    point_charges_values=q,
    coord_type="cartesian",
    k="lda_x",
Ejemplo n.º 8
0
    def test_poisson_solve(self):
        """Test the poisson solve function."""
        oned = GaussChebyshev(30)
        oned = GaussChebyshev(50)
        btf = BeckeRTransform(1e-7, 1.5)
        rad = btf.transform_1d_grid(oned)
        l_max = 7
        atgrid = AtomGrid(rad, degrees=[l_max])
        value_array = self.helper_func_gauss(atgrid.points)
        p_0 = atgrid.integrate(value_array)

        # test density sum up to np.pi**(3 / 2)
        assert_allclose(p_0, np.pi**1.5, atol=1e-4)
        sph_coor = atgrid.convert_cart_to_sph()[:, 1:3]
        spls_mt = Poisson._proj_sph_value(
            atgrid.rgrid,
            sph_coor,
            l_max // 2,
            value_array,
            atgrid.weights,
            atgrid.indices,
        )

        # test splines project fit gauss function well

        def gauss(r):
            return np.exp(-(r**2))

        for _ in range(20):
            coors = np.random.rand(10, 3)
            r = np.linalg.norm(coors, axis=-1)
            spl_0_0 = spls_mt[0, 0]
            interp_v = spl_0_0(r)
            ref_v = gauss(r) * np.sqrt(4 * np.pi)
            # 0.28209479 is the value in spherical harmonic Z_0_0
            assert_allclose(interp_v, ref_v, atol=1e-3)
        ibtf = InverseRTransform(btf)
        linsp = np.linspace(-1, 0.99, 50)
        bound = p_0 * np.sqrt(4 * np.pi)
        res_bv = Poisson.solve_poisson_bv(spls_mt[0, 0],
                                          linsp,
                                          bound,
                                          tfm=ibtf)

        near_rg_pts = np.array([1e-2, 0.1, 0.2, 0.3, 0.5, 0.7, 1.0, 1.2])
        near_tf_pts = ibtf.transform(near_rg_pts)
        long_rg_pts = np.array([2, 3, 4, 5, 6, 7, 8, 9, 10])
        long_tf_pts = ibtf.transform(long_rg_pts)
        short_res = res_bv(near_tf_pts)[0] / near_rg_pts / (2 * np.sqrt(np.pi))
        long_res = res_bv(long_tf_pts)[0] / long_rg_pts / (2 * np.sqrt(np.pi))
        # ref are calculated with mathemetical
        # integrate[exp[-x^2 - y^2 - z^2] / sqrt[(x - a)^2 + y^2 +z^2], range]
        ref_short_res = [
            6.28286,  # 0.01
            6.26219,  # 0.1
            6.20029,  # 0.2
            6.09956,  # 0.3
            5.79652,  # 0.5
            5.3916,  # 0.7
            4.69236,  # 1.0
            4.22403,  # 1.2
        ]
        ref_long_res = [
            2.77108,  # 2
            1.85601,  # 3
            1.39203,  # 4
            1.11362,  # 5
            0.92802,  # 6
            0.79544,  # 7
            0.69601,  # 8
            0.61867,  # 9
            0.55680,  # 10
        ]
        assert_allclose(short_res, ref_short_res, atol=5e-4)
        assert_allclose(long_res, ref_long_res, atol=5e-4)
        # solve same poisson equation with gauss directly
        gauss_pts = btf.transform(linsp)
        res_gs = Poisson.solve_poisson_bv(gauss, gauss_pts, p_0)
        gs_int_short = res_gs(near_rg_pts)[0] / near_rg_pts
        gs_int_long = res_gs(long_rg_pts)[0] / long_rg_pts
        assert_allclose(gs_int_short, ref_short_res, 5e-4)
        assert_allclose(gs_int_long, ref_long_res, 5e-4)
Ejemplo n.º 9
0
 def test_gausschebyshev(self):
     """Test Guass Chebyshev polynomial grid."""
     points, weights = np.polynomial.chebyshev.chebgauss(10)
     grid = GaussChebyshev(10)
     assert_allclose(grid.points, points)
     assert_allclose(grid.weights, weights)