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)
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)
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)