Source code for pauxy.trial_wavefunction.utils

import numpy
import sys
from pauxy.trial_wavefunction.free_electron import FreeElectron
from pauxy.trial_wavefunction.uhf  import UHF
from pauxy.trial_wavefunction.hartree_fock import HartreeFock
from pauxy.trial_wavefunction.multi_determinant import MultiDeterminant
from pauxy.trial_wavefunction.multi_slater import MultiSlater
from pauxy.utils.io import read_qmcpack_wfn_hdf, get_input_value

[docs]def get_trial_wavefunction(system, options={}, mf=None, parallel=False, verbose=0): """Wrapper to select trial wavefunction class. Parameters ---------- options : dict Trial wavefunction input options. system : class System class. cplx : bool If true then trial wavefunction will be complex. parallel : bool If true then running in parallel. Returns ------- trial : class or None Trial wavfunction class. """ wfn_file = get_input_value(options, 'filename', default=None, alias=['wavefunction_file'], verbose=verbose) if wfn_file is not None: if verbose: print("# Reading wavefunction from {}.".format(wfn_file)) read, psi0 = read_qmcpack_wfn_hdf(wfn_file) thresh = options.get('threshold', None) if thresh is not None: coeff = read[0] ndets = len(coeff[abs(coeff)>thresh]) if verbose: print("# Discarding determinants with weight " " below {}.".format(thresh)) else: ndets = options.get('ndets', None) if verbose: print("# Numeber of determinants in trial wavefunction: {}" .format(ndets)) if ndets is not None: wfn = [] for x in read: wfn.append(x[:ndets]) else: wfn = read trial = MultiSlater(system, wfn, options=options, parallel=parallel, verbose=verbose, init=psi0) elif options['name'] == 'MultiSlater': if verbose: print("# Guessing RHF trial wavefunction.") na = system.nup nb = system.ndown wfn = numpy.zeros((1,system.nbasis,system.nup+system.ndown), dtype=numpy.complex128) coeffs = numpy.array([1.0+0j]) I = numpy.identity(system.nbasis, dtype=numpy.complex128) wfn[0,:,:na] = I[:,:na] wfn[0,:,na:] = I[:,:nb] trial = MultiSlater(system, (coeffs,wfn), options=options, parallel=parallel, verbose=verbose) elif options['name'] == 'hartree_fock': trial = HartreeFock(system, True, options, parallel=parallel, verbose=verbose) elif options['name'] == 'free_electron': trial = FreeElectron(system, True, options, parallel, verbose) elif options['name'] == 'UHF': trial = UHF(system, True, options, parallel, verbose) else: print("Unknown trial wavefunction type.") sys.exit() return trial