예제 #1
0
def test_tf_grid_hydrogen_few():
    # pylint: disable=redefined-outer-name
    def transform(x, np):
        left = 1e-2
        right = 1e3
        alpha = np.log(right / left)
        return left * (np.exp(alpha * (1 + x) / 2) - 1)

    grid = TransformedGrid(transform, 101)

    # Solutions of the radial equation (U=R/r)
    psi_1s = np.sqrt(4 * np.pi) * grid.points * np.exp(-grid.points) / np.sqrt(
        np.pi)
    psi_2s = np.sqrt(4 * np.pi) * grid.points * np.exp(-grid.points / 2) / \
        np.sqrt(2 * np.pi) / 4 * (2 - grid.points)

    # Check norms with vectorization
    norms = grid.integrate(np.array([psi_1s, psi_2s])**2)
    assert_allclose(norms, 1.0, atol=1e-14, rtol=0)

    # Check norms and energies
    for eps, psi in [(-0.5, psi_1s), (-0.125, psi_2s)]:
        ekin = grid.integrate(-psi * grid.derivative(grid.derivative(psi)) / 2)
        assert_allclose(ekin, -eps, atol=1e-11, rtol=0)
        epot = grid.integrate(-psi**2 / grid.points)
        assert_allclose(epot, 2 * eps, atol=1e-14, rtol=0)

    dot = grid.integrate(psi_1s * psi_2s)
    assert_allclose(dot, 0.0, atol=1e-15, rtol=0)
예제 #2
0
def test_tf_grid_exp_vectorized():
    # pylint: disable=redefined-outer-name
    def transform(x, np):
        return 15 * np.arctanh((1 + x) / 2)**2

    grid = TransformedGrid(transform, 201)
    exponents = np.array([1.0, 0.5, 2.0])
    fnsvals = np.exp(-np.outer(exponents, grid.points))
    fnsvalsa = grid.antiderivative(fnsvals)
    fnsvalsa += (-1 / exponents - fnsvalsa[:, 0])[:, np.newaxis]
    fnsvalsd = grid.derivative(fnsvals)
    assert_allclose(grid.integrate(fnsvals), 1 / exponents, atol=1e-13, rtol=0)
    assert_allclose(fnsvalsa,
                    -fnsvals / exponents[:, np.newaxis],
                    atol=1e-7,
                    rtol=0)
    assert_allclose(fnsvalsd,
                    -fnsvals * exponents[:, np.newaxis],
                    atol=1e-7,
                    rtol=0)
    fns_other = np.exp(-np.outer([1.1, 1.2, 0.8], grid.points))
    integrals2 = np.array([[grid.integrate(fn1 * fn2) for fn2 in fns_other]
                           for fn1 in fnsvals])
    assert_allclose(grid.integrate(fnsvals, fns_other),
                    integrals2,
                    atol=1e-14,
                    rtol=0)
예제 #3
0
def test_tf_grid_exp():
    # pylint: disable=redefined-outer-name
    def transform(x, np):
        return 10 * np.arctanh((1 + x) / 2)**2

    grid = TransformedGrid(transform, 201)
    fnvals = np.exp(-grid.points)
    fnvalsa = grid.antiderivative(fnvals)
    fnvalsa += -1 - fnvalsa[0]
    fnvalsd = grid.derivative(fnvals)
    assert_allclose(grid.integrate(fnvals), 1.0, atol=1e-13, rtol=0)
    assert_allclose(fnvalsa, -fnvals, atol=1e-7, rtol=0)
    assert_allclose(fnvalsd, -fnvals, atol=1e-7, rtol=0)