Skip to content

hydrogen_like_atom

Exactly solvable single-electron hydrogen-like atom.

HydrogenLikeWavefunction (Module) dataclass

Model which computes -decay_rate * r, with trainable decay_rate.

This model returns log|psi(x)|, where psi is the 1-s orbital exp(-decay_rate * r). This psi is an eigenfunction of the hydrogen-like Hamiltonian (one ion and one electron) when the decay rate is equal to 2 * nuclear_charge / (d - 1), with d > 1, where d is the dimension of the system.

Thus when the system is 3-d, then this model computes the ground-state wavefunction precisely when decay_rate = nuclear_charge.

Attributes:

Name Type Description
decay_rate jnp.float32

initial decay rate in the model

__call__(self, x) special

Log of isotropic exponential decay. Computes -decay_rate * ||x||.

Parameters:

Name Type Description Default
x Array

single electron positions, of shape (..., 1, d), where d is the dimension of the system

required

Returns:

Type Description
Array

log of exponential decay wavefunction, with shape x.shape[:-2]

Source code in vmcnet/examples/hydrogen_like_atom.py
@flax.linen.compact
def __call__(self, x: Array) -> Array:  # type: ignore[override]
    """Log of isotropic exponential decay. Computes -decay_rate * ||x||.

    Args:
        x (Array): single electron positions, of shape (..., 1, d), where d
            is the dimension of the system

    Returns:
        Array: log of exponential decay wavefunction, with shape x.shape[:-2]
    """
    r = jnp.linalg.norm(x, axis=-1)
    scaled_r = models.core.Dense(
        1,
        kernel_init=lambda key, shape, **kwargs: jnp.array(
            [[self.init_decay_rate]]
        ),
        use_bias=False,
    )(r)
    return -jnp.squeeze(scaled_r, axis=-1)

make_hydrogen_like_local_energy(log_psi_apply, charge, d=3)

Local energy calculation for the hydrogen-like atom in general dimension d.

Parameters:

Name Type Description Default
log_psi_apply Callable

a function which computes log|psi(x)| for single inputs x. It is okay for it to produce batch outputs on batches of x as long as it produces a single number for single x. Has the signature (params, single_x_in) -> log|psi(single_x_in)|

required
charge jnp.float32

charge of the nucleus

required
d int

Dimension of the system (number of coordinates that each ion and electron has). Defaults to 3.

3

Returns:

Type Description
Callable

local energy function which computes -0.5 nabla^2 psi / psi + (Z / r), where psi is the wavefn, and Z is the charge of the nucleus. Has the signature (params, x) -> local energy array of shape (x.shape[0],)

Source code in vmcnet/examples/hydrogen_like_atom.py
def make_hydrogen_like_local_energy(
    log_psi_apply: Callable[[P, Array], Union[jnp.float32, Array]],
    charge: jnp.float32,
    d: int = 3,
) -> ModelApply[P]:
    """Local energy calculation for the hydrogen-like atom in general dimension d.

    Args:
        log_psi_apply (Callable): a function which computes log|psi(x)| for single
            inputs x. It is okay for it to produce batch outputs on batches of x as long
            as it produces a single number for single x. Has the signature
            (params, single_x_in) -> log|psi(single_x_in)|
        charge (jnp.float32): charge of the nucleus
        d (int, optional): Dimension of the system (number of coordinates that each
            ion and electron has). Defaults to 3.

    Returns:
        Callable: local energy function which computes -0.5 nabla^2 psi / psi + (Z / r),
        where psi is the wavefn, and Z is the charge of the nucleus. Has the signature
        (params, x) -> local energy array of shape (x.shape[0],)
    """
    ion_location = jnp.zeros((1, d))
    ion_charge = jnp.array([charge])

    kinetic_fn = physics.kinetic.create_continuous_kinetic_energy(log_psi_apply)
    potential_fn = physics.potential.create_electron_ion_coulomb_potential(
        ion_location, ion_charge
    )

    return physics.core.combine_local_energy_terms([kinetic_fn, potential_fn])