Пример #1
0
def load_mol(chkfile):
    ''' Load the mol from the chkfile.

    See pyscf.lib.chkfile
    '''

    if mpi_helper.rank == 0:
        mol = chkutil.load_mol(chkfile)
        dumps = mol.dumps()
    else:
        dumps = None

    mpi_helper.barrier()
    dumps = mpi_helper.bcast_dict(dumps)
    mol = gto.loads(dumps)

    return mol
Пример #2
0
def load_mol(chkfile):
    '''Load Mole object from chkfile.
    The save_mol/load_mol operation can be used a serialization method for Mole object.
    
    Args:
        chkfile : str
            Name of chkfile.

    Returns:
        A (initialized/built) Mole object

    Examples:

    >>> from pyscf import gto, lib
    >>> mol = gto.M(atom='He 0 0 0')
    >>> lib.chkfile.save_mol(mol, 'He.chk')
    >>> lib.chkfile.load_mol('He.chk')
    <pyscf.gto.mole.Mole object at 0x7fdcd94d7f50>
    '''
    from numpy import array
    from pyscf import gto
    try:
        with h5py.File(chkfile, 'r') as fh5:
            mol = gto.loads(fh5['mol'].value)
    except:
        # Compatibility to the old serialization format
        # TODO: remove it in future release
        with h5py.File(chkfile, 'r') as fh5:
            mol = gto.Mole()
            mol.output = '/dev/null'
            moldic = eval(fh5['mol'].value)
            for key in ('mass', 'grids', 'light_speed'):
                if key in moldic:
                    del (moldic[key])
            mol.build(False, False, **moldic)
    return mol
Пример #3
0
def load_mol(chkfile):
    '''Load Mole object from chkfile.
    The save_mol/load_mol operation can be used a serialization method for Mole object.
    
    Args:
        chkfile : str
            Name of chkfile.

    Returns:
        A (initialized/built) Mole object

    Examples:

    >>> from pyscf import gto, lib
    >>> mol = gto.M(atom='He 0 0 0')
    >>> lib.chkfile.save_mol(mol, 'He.chk')
    >>> lib.chkfile.load_mol('He.chk')
    <pyscf.gto.mole.Mole object at 0x7fdcd94d7f50>
    '''
    from numpy import array
    from pyscf import gto
    try:
        with h5py.File(chkfile, 'r') as fh5:
            mol = gto.loads(fh5['mol'].value)
    except:
# Compatibility to the old serialization format
# TODO: remove it in future release
        with h5py.File(chkfile, 'r') as fh5:
            mol = gto.Mole()
            mol.output = '/dev/null'
            moldic = eval(fh5['mol'].value)
            for key in ('mass', 'grids', 'light_speed'):
                if key in moldic:
                    del(moldic[key])
            mol.build(False, False, **moldic)
    return mol
Пример #4
0
def _write_integral_file(mc_chkfile, nevpt_scratch, comm):
    mpi_size = comm.Get_size()
    rank = comm.Get_rank()

    if rank == 0:
        fh5 = h5py.File(mc_chkfile, 'r')

        def load(key):
            if key in fh5:
                return comm.bcast(fh5[key][()])
            else:
                return comm.bcast([])
    else:

        def load(key):
            return comm.bcast(None)

    mol = gto.loads(load('mol'))
    ncore = load('mc/ncore')
    ncas = load('mc/ncas')
    nvirt = load('mc/nvirt')
    orbe = load('mc/orbe')
    orbsym = list(load('mc/orbsym'))
    nelecas = load('mc/nelecas')
    h1e_Si = load('h1e_Si')
    h1e_Sr = load('h1e_Sr')
    h1e = load('h1e')
    e_core = load('e_core')
    h2e = load('h2e')
    h2e_Si = load('h2e_Si')
    h2e_Sr = load('h2e_Sr')

    if rank == 0:
        fh5.close()

    if mol.symmetry and len(orbsym) > 0:
        orbsym = orbsym[ncore:ncore + ncas] + orbsym[:ncore] + orbsym[ncore +
                                                                      ncas:]
        orbsym = dmrg_sym.convert_orbsym(mol.groupname, orbsym)
    else:
        orbsym = [1] * (ncore + ncas + nvirt)

    partial_size = int(math.floor((ncore + nvirt) / float(mpi_size)))
    num_of_orb_begin = min(rank * partial_size, ncore + nvirt)
    num_of_orb_end = min((rank + 1) * partial_size, ncore + nvirt)
    #Adjust the distrubution the non-active orbitals to make sure one processor has at most one more orbital than average.
    if rank < (ncore + nvirt - partial_size * mpi_size):
        num_of_orb_begin += rank
        num_of_orb_end += rank + 1
    else:
        num_of_orb_begin += ncore + nvirt - partial_size * mpi_size
        num_of_orb_end += ncore + nvirt - partial_size * mpi_size

    if num_of_orb_begin < ncore:
        if num_of_orb_end < ncore:
            h1e_Si = h1e_Si[:, num_of_orb_begin:num_of_orb_end]
            h2e_Si = h2e_Si[:, num_of_orb_begin:num_of_orb_end, :, :]
            h1e_Sr = []
            h2e_Sr = []
    # elif num_of_orb_end > ncore + nvirt :
    #     h1e_Si = h1e_Si[:,num_of_orb_begin:]
    #     h2e_Si = h2e_Si[:,num_of_orb_begin:,:,:]
    #     #h2e_Sr = []
    #     orbsym = orbsym[:ncas] + orbsym[num_of_orb_begin:]
    #     norb = ncas + ncore + nvirt - num_of_orb_begin
        else:
            h1e_Si = h1e_Si[:, num_of_orb_begin:]
            h2e_Si = h2e_Si[:, num_of_orb_begin:, :, :]
            h1e_Sr = h1e_Sr[:num_of_orb_end - ncore, :]
            h2e_Sr = h2e_Sr[:num_of_orb_end - ncore, :, :, :]
    elif num_of_orb_begin < ncore + nvirt:
        if num_of_orb_end <= ncore + nvirt:
            h1e_Si = []
            h2e_Si = []
            h1e_Sr = h1e_Sr[num_of_orb_begin - ncore:num_of_orb_end - ncore, :]
            h2e_Sr = h2e_Sr[num_of_orb_begin - ncore:num_of_orb_end -
                            ncore, :, :, :]
    #    else :
    #        h1e_Si = []
    #        h2e_Si = []
    #        h1e_Sr = h1e_Sr[num_of_orb_begin - ncore:,:]
    #        h2e_Sr = h2e_Sr[num_of_orb_begin - ncore:,:,:,:]
    #        orbsym = orbsym[:ncas] + orbsym[ncas+num_of_orb_begin: ]
    #        norb = ncas + ncore + nvirt - num_of_orb_begin
    else:
        raise RuntimeError(
            'No job for this processor.  It may block MPI.COMM_WORLD.barrier')

    norb = ncas + num_of_orb_end - num_of_orb_begin
    orbsym = orbsym[:ncas] + orbsym[ncas + num_of_orb_begin:ncas +
                                    num_of_orb_end]

    if num_of_orb_begin >= ncore:
        partial_core = 0
        partial_virt = num_of_orb_end - num_of_orb_begin
    else:
        if num_of_orb_end >= ncore:
            partial_core = ncore - num_of_orb_begin
            partial_virt = num_of_orb_end - ncore
        else:
            partial_core = num_of_orb_end - num_of_orb_begin
            partial_virt = 0

    tol = float(1e-15)

    f = open(os.path.join(nevpt_scratch, 'FCIDUMP'), 'w')
    nelec = nelecas[0] + nelecas[1]
    fcidump.write_head(f,
                       norb,
                       nelec,
                       ms=abs(nelecas[0] - nelecas[1]),
                       orbsym=orbsym)
    #h2e in active space
    writeh2e_sym(h2e, f, tol)
    #h1e in active space
    writeh1e_sym(h1e, f, tol)

    orbe = list(orbe[:ncore]) + list(orbe[ncore + ncas:])
    orbe = orbe[num_of_orb_begin:num_of_orb_end]
    for i in range(len(orbe)):
        f.write('% .16f  %4d  %4d  %4d  %4d\n' %
                (orbe[i], i + 1 + ncas, i + 1 + ncas, 0, 0))
    f.write('%.16f  %4d  %4d  %4d  %4d\n' % (e_core, 0, 0, 0, 0))
    if (len(h2e_Sr)):
        writeh2e(h2e_Sr, f, tol, shift0=ncas + partial_core + 1)
    f.write('% 4d  %4d  %4d  %4d  %4d\n' % (0, 0, 0, 0, 0))
    if (len(h2e_Si)):
        writeh2e(h2e_Si, f, tol, shift1=ncas + 1)
    f.write('% 4d  %4d  %4d  %4d  %4d\n' % (0, 0, 0, 0, 0))
    if (len(h1e_Sr)):
        writeh1e(h1e_Sr, f, tol, shift0=ncas + partial_core + 1)
    f.write('% 4d  %4d  %4d  %4d  %4d\n' % (0, 0, 0, 0, 0))
    if (len(h1e_Si)):
        writeh1e(h1e_Si, f, tol, shift1=ncas + 1)
    f.write('% 4d  %4d  %4d  %4d  %4d\n' % (0, 0, 0, 0, 0))
    f.write('% 4d  %4d  %4d  %4d  %4d\n' % (0, 0, 0, 0, 0))
    f.close()

    return ncas, partial_core, partial_virt
Пример #5
0
import pickle
from pyscf import gto
'''
Serialize Mole object

Mole.pack function transform the Mole object to a Python dict.  It can be
serialized using the standard serialization module in python, eg pickle.

There is a hacky way to serialize the Mole object for broadcasting or saving.
Use format or str function to convert the Mole-python-dict to a string.
Later, use the built-in eval function and Mole.unpack function to restore the
Mole object.
'''

mol = gto.M(
    atom='''
        O  0 0.     0
        H1 0 -2.757 2.587
        H2 0 2.757  2.587''',
    basis='ccpvdz',
)

# In Python pickled format
ar = pickle.dumps(format(mol.pack()))
mol1 = gto.unpack(eval(pickle.loads(ar)))

# In JSON format
ar = mol.dumps()
mol1 = gto.loads(ar)
Пример #6
0
from pyscf import gto

'''
Serialize Mole object

Mole.pack function transform the Mole object to a Python dict.  It can be
serialized using the standard serialization module in python, eg pickle.

There is a hacky way to serialize the Mole object for broadcasting or saving.
Use format or str function to convert the Mole-python-dict to a string.
Later, use the built-in eval function and Mole.unpack function to restore the
Mole object.
'''

mol = gto.M(
    atom = '''
        O  0 0.     0
        H1 0 -2.757 2.587
        H2 0 2.757  2.587''',
    basis = 'ccpvdz',
)

# In Python pickled format
ar = pickle.dumps(format(mol.pack()))
mol1 = gto.unpack(eval(pickle.loads(ar)))

# In JSON format
ar = mol.dumps()
mol1 = gto.loads(ar)

Пример #7
0
def _write_integral_file(mc_chkfile, nevpt_scratch, comm):
    mpi_size = comm.Get_size()
    rank = comm.Get_rank()

    if rank == 0:
        fh5 = h5py.File(mc_chkfile, 'r')
        def load(key):
            if key in fh5:
                return comm.bcast(fh5[key].value)
            else:
                return comm.bcast([])
    else:
        def load(key):
            return comm.bcast(None)

    mol       = gto.loads(load('mol'))
    ncore     = load('mc/ncore')
    ncas      = load('mc/ncas')
    nvirt     = load('mc/nvirt')
    orbe      = load('mc/orbe')
    orbsym    = list(load('mc/orbsym'))
    nelecas   = load('mc/nelecas')
    h1e_Si    = load('h1e_Si')
    h1e_Sr    = load('h1e_Sr')
    h1e       = load('h1e')
    e_core    = load('e_core')
    h2e       = load('h2e')
    h2e_Si    = load('h2e_Si')
    h2e_Sr    = load('h2e_Sr')

    if rank == 0:
        fh5.close()

    if mol.symmetry and len(orbsym) > 0:
        orbsym = orbsym[ncore:ncore+ncas] + orbsym[:ncore] + orbsym[ncore+ncas:]
        orbsym = dmrg_sym.convert_orbsym(mol.groupname, orbsym)
    else:
        orbsym = [1] * (ncore+ncas+nvirt)

    partial_size = int(math.floor((ncore+nvirt)/float(mpi_size)))
    num_of_orb_begin = min(rank*partial_size, ncore+nvirt)
    num_of_orb_end = min((rank+1)*partial_size, ncore+nvirt)
    #Adjust the distrubution the non-active orbitals to make sure one processor has at most one more orbital than average.
    if rank < (ncore+nvirt - partial_size*mpi_size):
        num_of_orb_begin += rank
        num_of_orb_end += rank + 1
    else :
        num_of_orb_begin += ncore+nvirt - partial_size*mpi_size
        num_of_orb_end += ncore+nvirt - partial_size*mpi_size

    if num_of_orb_begin < ncore:
        if num_of_orb_end < ncore:
            h1e_Si = h1e_Si[:,num_of_orb_begin:num_of_orb_end]
            h2e_Si = h2e_Si[:,num_of_orb_begin:num_of_orb_end,:,:]
            h1e_Sr = []
            h2e_Sr = []
       # elif num_of_orb_end > ncore + nvirt :
       #     h1e_Si = h1e_Si[:,num_of_orb_begin:]
       #     h2e_Si = h2e_Si[:,num_of_orb_begin:,:,:]
       #     #h2e_Sr = []
       #     orbsym = orbsym[:ncas] + orbsym[num_of_orb_begin:]
       #     norb = ncas + ncore + nvirt - num_of_orb_begin
        else :
            h1e_Si = h1e_Si[:,num_of_orb_begin:]
            h2e_Si = h2e_Si[:,num_of_orb_begin:,:,:]
            h1e_Sr = h1e_Sr[:num_of_orb_end - ncore,:]
            h2e_Sr = h2e_Sr[:num_of_orb_end - ncore,:,:,:]
    elif num_of_orb_begin < ncore + nvirt :
        if num_of_orb_end <= ncore + nvirt:
            h1e_Si = []
            h2e_Si = []
            h1e_Sr = h1e_Sr[num_of_orb_begin - ncore:num_of_orb_end - ncore,:]
            h2e_Sr = h2e_Sr[num_of_orb_begin - ncore:num_of_orb_end - ncore,:,:,:]
    #    else :
    #        h1e_Si = []
    #        h2e_Si = []
    #        h1e_Sr = h1e_Sr[num_of_orb_begin - ncore:,:]
    #        h2e_Sr = h2e_Sr[num_of_orb_begin - ncore:,:,:,:]
    #        orbsym = orbsym[:ncas] + orbsym[ncas+num_of_orb_begin: ]
    #        norb = ncas + ncore + nvirt - num_of_orb_begin
    else :
        raise RuntimeError('No job for this processor.  It may block MPI.COMM_WORLD.barrier')


    norb = ncas + num_of_orb_end - num_of_orb_begin
    orbsym = orbsym[:ncas] + orbsym[ncas + num_of_orb_begin:ncas + num_of_orb_end]

    if num_of_orb_begin >= ncore:
        partial_core = 0
        partial_virt = num_of_orb_end - num_of_orb_begin
    else:
        if num_of_orb_end >= ncore:
            partial_core = ncore -num_of_orb_begin
            partial_virt = num_of_orb_end - ncore
        else:
            partial_core = num_of_orb_end -num_of_orb_begin
            partial_virt = 0

    tol = float(1e-15)

    f = open(os.path.join(nevpt_scratch, 'FCIDUMP'), 'w')
    nelec = nelecas[0] + nelecas[1]
    fcidump.write_head(f,norb, nelec, ms=abs(nelecas[0]-nelecas[1]), orbsym=orbsym)
    #h2e in active space
    writeh2e_sym(h2e,f,tol)
    #h1e in active space
    writeh1e_sym(h1e,f,tol)


    orbe =list(orbe[:ncore]) + list(orbe[ncore+ncas:])
    orbe = orbe[num_of_orb_begin:num_of_orb_end]
    for i in range(len(orbe)):
        f.write('% .16f  %4d  %4d  %4d  %4d\n'%(orbe[i],i+1+ncas,i+1+ncas,0,0))
    f.write('%.16f  %4d  %4d  %4d  %4d\n'%(e_core,0,0,0,0))
    if (len(h2e_Sr)):
        writeh2e(h2e_Sr,f,tol, shift0 = ncas + partial_core+1)
    f.write('% 4d  %4d  %4d  %4d  %4d\n'%(0,0,0,0,0))
    if (len(h2e_Si)):
        writeh2e(h2e_Si,f,tol, shift1 = ncas+1)
    f.write('% 4d  %4d  %4d  %4d  %4d\n'%(0,0,0,0,0))
    if (len(h1e_Sr)):
        writeh1e(h1e_Sr,f,tol, shift0 = ncas + partial_core+1)
    f.write('% 4d  %4d  %4d  %4d  %4d\n'%(0,0,0,0,0))
    if (len(h1e_Si)):
        writeh1e(h1e_Si,f,tol, shift1 = ncas+1)
    f.write('% 4d  %4d  %4d  %4d  %4d\n'%(0,0,0,0,0))
    f.write('% 4d  %4d  %4d  %4d  %4d\n'%(0,0,0,0,0))
    f.close()

    return ncas, partial_core, partial_virt