Source code for pauxy.propagation.operations

import numpy


[docs]def propagate_single(psi, system, B): r"""Perform backpropagation for single configuration. Deals with GHF and RHF/UHF walkers. Parameters --------- phi : walker object Walker. system : system object in general. Container for model input options. B : :class:`numpy.ndarray` Propagator matrix. """ nup = system.nup if len(B.shape) == 3: psi[:,:nup] = B[0].dot(psi[:,:nup]) psi[:,nup:] = B[1].dot(psi[:,nup:]) else: M = system.nbasis psi[:M,:nup] = B[:M,:M].dot(psi[:M,:nup]) psi[M:,nup:] = B[M:,M:].dot(psi[M:,nup:])
# TODO: Rename this
[docs]def kinetic_real(phi, system, bt2, H1diag=False): r"""Propagate by the kinetic term by direct matrix multiplication. For use with the continuus algorithm and free propagation. todo : this is the same a propagating by an arbitrary matrix, remove. Parameters ---------- walker : :class:`pauxy.walker.Walker` Walker object to be updated. on output we have acted on :math:`|\phi_i\rangle` by :math:`B_{T/2}` and updated the weight appropriately. updates inplace. state : :class:`pauxy.state.State` Simulation state. """ nup = system.nup # Assuming that our walker is in UHF form. if (H1diag): phi[:,:nup] = numpy.einsum("ii,ij->ij", bt2[0],phi[:,:nup]) phi[:,nup:] = numpy.einsum("ii,ij->ij", bt2[1],phi[:,nup:]) else: phi[:,:nup] = bt2[0].dot(phi[:,:nup]) phi[:,nup:] = bt2[1].dot(phi[:,nup:])
[docs]def local_energy_bound(local_energy, mean, threshold): """Try to suppress rare population events by imposing local energy bound. See: Purwanto et al., Phys. Rev. B 80, 214116 (2009). Parameters ---------- local_energy : float Local energy of current walker mean : float Mean value of local energy about which we impose the threshold / bound. threshold : float Amount of lee-way for energy fluctuations about the mean. """ maximum = mean + threshold minimum = mean - threshold if (local_energy >= maximum): local_energy = maximum elif (local_energy < minimum): local_energy = minimum else: local_energy = local_energy return local_energy
[docs]def kinetic_ghf(phi, system, bt2): r"""Propagate by the kinetic term by direct matrix multiplication. For use with the GHF trial wavefunction. Parameters ---------- walker : :class:`pauxy.walker.Walker` Walker object to be updated. on output we have acted on :math:`|\phi_i\rangle` by :math:`B_{T/2}` and updated the weight appropriately. updates inplace. state : :class:`pauxy.state.State` Simulation state. """ nup = system.nup nb = system.nbasis # Assuming that our walker is in GHF form. phi[:nb,:nup] = bt2.dot(phi[:nb,:nup]) phi[nb:,nup:] = bt2.dot(phi[nb:,nup:])
[docs]def propagate_potential_auxf(phi, state, field_config): """Propagate walker given a fixed set of auxiliary fields. Useful for debugging. Parameters ---------- phi : :class:`numpy.ndarray` Walker's slater determinant to be updated. state : :class:`pauxy.state.State` Simulation state. field_config : numpy array Auxiliary field configurations to apply to walker. """ bv_up = numpy.array([state.auxf[xi, 0] for xi in field_config]) bv_down = numpy.array([state.auxf[xi, 1] for xi in field_config]) phi[:,:nup] = numpy.einsum('i,ij->ij', bv_up, phi[:,:nup]) phi[:,nup:] = numpy.einsum('i,ij->ij', bv_down, phi[:,nup:])