Пример #1
0
def dip_moment(cell,
               dm_kpts,
               unit='Debye',
               verbose=logger.NOTE,
               grids=None,
               rho=None,
               kpts=np.zeros((1, 3))):
    ''' Dipole moment in the unit cell (is it well defined)?

    Args:
         cell : an instance of :class:`Cell`

         dm_kpts (a list of ndarrays) : density matrices of k-points

    Return:
        A list: the dipole moment on x, y and z components
    '''
    from pyscf.pbc.dft import gen_grid
    from pyscf.pbc.dft import numint
    if grids is None:
        grids = gen_grid.UniformGrids(cell)
    if rho is None:
        rho = numint.KNumInt().get_rho(cell, dm_kpts, grids, kpts,
                                       cell.max_memory)
    return pbchf.dip_moment(cell, dm_kpts, unit, verbose, grids, rho, kpts)
Пример #2
0
def get_j_kpts(mf, cell, dm_kpts, kpts, kpts_band=None):
    coords = gen_grid.gen_uniform_grids(cell)
    nkpts = len(kpts)
    ngrids = len(coords)
    dm_kpts = np.asarray(dm_kpts)
    nao = dm_kpts.shape[-1]

    ni = numint.KNumInt(kpts)
    aoR_kpts = ni.eval_ao(cell, coords, kpts)
    if kpts_band is not None:
        aoR_kband = numint.eval_ao(cell, coords, kpts_band)

    dms = dm_kpts.reshape(-1,nkpts,nao,nao)
    nset = dms.shape[0]

    vjR = [get_vjR(cell, dms[i], aoR_kpts) for i in range(nset)]
    if kpts_band is not None:
        vj_kpts = [cell.vol/ngrids * lib.dot(aoR_kband.T.conj()*vjR[i], aoR_kband)
                   for i in range(nset)]
        if dm_kpts.ndim == 3:  # One set of dm_kpts for KRHF
            vj_kpts = vj_kpts[0]
        return lib.asarray(vj_kpts)
    else:
        vj_kpts = []
        for i in range(nset):
            vj = [cell.vol/ngrids * lib.dot(aoR_k.T.conj()*vjR[i], aoR_k)
                  for aoR_k in aoR_kpts]
            vj_kpts.append(lib.asarray(vj))
        return lib.asarray(vj_kpts).reshape(dm_kpts.shape)
Пример #3
0
    def test_eval_ao_kpts(self):
        cell = pbcgto.Cell()
        cell.verbose = 5
        cell.output = '/dev/null'
        cell.a = np.eye(3) * 2.5
        cell.mesh = [21] * 3
        cell.atom = [
            ['He', (1., .8, 1.9)],
            ['He', (.1, .2, .3)],
        ]
        cell.basis = 'ccpvdz'
        cell.build(False, False)
        grids = gen_grid.UniformGrids(cell)
        grids.build()

        np.random.seed(1)
        kpts = np.random.random((4, 3))
        ni = numint.KNumInt(kpts)
        ao1 = ni.eval_ao(cell, grids.coords, kpts)
        self.assertAlmostEqual(finger(ao1[0]),
                               (-2.4066959390326477 - 0.98044994099240701j), 8)
        self.assertAlmostEqual(finger(ao1[1]),
                               (-0.30643153325360639 + 0.1571658820483913j), 8)
        self.assertAlmostEqual(finger(ao1[2]),
                               (-1.1937974302337684 - 0.39039259235266233j), 8)
        self.assertAlmostEqual(finger(ao1[3]),
                               (0.17701966968272009 - 0.20232879692603079j), 8)
Пример #4
0
def get_jk_kpts(mf, cell, dm_kpts, kpts, kpts_band=None):
    coords = gen_grid.gen_uniform_grids(cell)
    nkpts = len(kpts)
    ngrids = len(coords)
    dm_kpts = np.asarray(dm_kpts)
    nao = dm_kpts.shape[-1]

    dms = dm_kpts.reshape(-1,nkpts,nao,nao)
    nset = dms.shape[0]

    ni = numint.KNumInt(kpts)
    aoR_kpts = ni.eval_ao(cell, coords, kpts)
    if kpts_band is not None:
        aoR_kband = numint.eval_ao(cell, coords, kpts_band)

# J
    vjR = [get_vjR_kpts(cell, dms[i], aoR_kpts) for i in range(nset)]
    if kpts_band is not None:
        vj_kpts = [cell.vol/ngrids * lib.dot(aoR_kband.T.conj()*vjR[i], aoR_kband)
                   for i in range(nset)]
    else:
        vj_kpts = []
        for i in range(nset):
            vj = [cell.vol/ngrids * lib.dot(aoR_k.T.conj()*vjR[i], aoR_k)
                  for aoR_k in aoR_kpts]
            vj_kpts.append(lib.asarray(vj))
    vj_kpts = lib.asarray(vj_kpts)
    vjR = None

# K
    weight = 1./nkpts * (cell.vol/ngrids)
    vk_kpts = np.zeros_like(vj_kpts)
    if kpts_band is not None:
        for k2, kpt2 in enumerate(kpts):
            aoR_dms = [lib.dot(aoR_kpts[k2], dms[i,k2]) for i in range(nset)]
            vkR_k1k2 = get_vkR(mf, cell, aoR_kband, aoR_kpts[k2],
                               kpts_band, kpt2)
            #:vk_kpts = 1./nkpts * (cell.vol/ngrids) * np.einsum('rs,Rp,Rqs,Rr->pq',
            #:            dm_kpts[k2], aoR_kband.conj(),
            #:            vkR_k1k2, aoR_kpts[k2])
            for i in range(nset):
                tmp_Rq = np.einsum('Rqs,Rs->Rq', vkR_k1k2, aoR_dms[i])
                vk_kpts[i] += weight * lib.dot(aoR_kband.T.conj(), tmp_Rq)
            vkR_k1k2 = None
        if dm_kpts.ndim == 3:
            vj_kpts = vj_kpts[0]
            vk_kpts = vk_kpts[0]
        return lib.asarray(vj_kpts), lib.asarray(vk_kpts)
    else:
        for k2, kpt2 in enumerate(kpts):
            aoR_dms = [lib.dot(aoR_kpts[k2], dms[i,k2]) for i in range(nset)]
            for k1, kpt1 in enumerate(kpts):
                vkR_k1k2 = get_vkR(mf, cell, aoR_kpts[k1], aoR_kpts[k2],
                                   kpt1, kpt2)
                for i in range(nset):
                    tmp_Rq = np.einsum('Rqs,Rs->Rq', vkR_k1k2, aoR_dms[i])
                    vk_kpts[i,k1] += weight * lib.dot(aoR_kpts[k1].T.conj(), tmp_Rq)
            vkR_k1k2 = None
        return vj_kpts.reshape(dm_kpts.shape), vk_kpts.reshape(dm_kpts.shape)
Пример #5
0
def write_esh5_orbitals(cell,
                        name,
                        kpts=numpy.zeros((1, 3), dtype=numpy.float64)):
    """Writes periodic AO basis to hdf5 file.  

    Parameters
    ----------
    cell: PySCF get.Cell object
      PySCF cell object which contains information of the system, including 
      AO basis set, FFT mesh, unit cell information, etc.
    name: string 
      Name of hdf5 file.
    kpts: array. Default: numpy.zeros((1,3)
      K-point array of dimension (nkpts, 3)
    dtype: datatype. Default: numpy.float64
      Datatype of orbitals in file.   

    """
    def to_qmcpack_complex(array):
        shape = array.shape
        return array.view(numpy.float64).reshape(shape + (2, ))

    nao = cell.nao_nr()

    fh5 = File(name, 'w')
    coords = cell.gen_uniform_grids(cell.mesh)

    kpts = numpy.asarray(kpts)
    nkpts = len(kpts)
    norbs = numpy.zeros((nkpts, ), dtype=int)
    norbs[:] = nao

    grp = fh5.create_group("OrbsG")
    dset = grp.create_dataset("reciprocal_vectors",
                              data=cell.reciprocal_vectors())
    dset = grp.create_dataset("number_of_kpoints", data=len(kpts))
    dset = grp.create_dataset("kpoints", data=kpts)
    dset = grp.create_dataset("number_of_orbitals", data=norbs)
    dset = grp.create_dataset("fft_grid", data=cell.mesh)
    dset = grp.create_dataset("grid_type", data=int(0))
    nnr = cell.mesh[0] * cell.mesh[1] * cell.mesh[2]
    # loop over kpoints later
    for (ik, k) in enumerate(kpts):
        ao = numint.KNumInt().eval_ao(cell, coords, k)[0]
        fac = numpy.exp(-1j * numpy.dot(coords, k))
        for i in range(norbs[ik]):
            aoi = fac * numpy.asarray(ao[:, i].T, order='C')
            aoi_G = tools.fft(aoi, cell.mesh)
            aoi_G = aoi_G.reshape(cell.mesh).transpose(2, 1, 0).reshape(nnr)
            dset = grp.create_dataset('kp' + str(ik) + '_b' + str(i),
                                      data=to_qmcpack_complex(aoi_G))
    fh5.close()
Пример #6
0
def _dft_common_init_(mf):
    mf.xc = 'LDA,VWN'
    mf.grids = gen_grid.UniformGrids(mf.cell)
    # Use rho to filter grids
    mf.small_rho_cutoff = getattr(__config__,
                                  'pbc_dft_rks_RKS_small_rho_cutoff', 1e-7)
    ##################################################
    # don't modify the following attributes, they are not input options
    # Note Do not refer to .with_df._numint because mesh/coords may be different
    if isinstance(mf, khf.KSCF):
        mf._numint = numint.KNumInt(mf.kpts)
    else:
        mf._numint = numint.NumInt()
    mf._keys = mf._keys.union(['xc', 'grids', 'small_rho_cutoff'])
Пример #7
0
def get_rho(mf, dm=None, grids=None, kpts=None):
    '''Compute density in real space
    '''
    from pyscf.pbc.dft import gen_grid
    from pyscf.pbc.dft import numint
    if dm is None:
        dm = mf.make_rdm1()
    if getattr(dm[0], 'ndim', None) != 2:  # KUHF
        dm = dm[0] + dm[1]
    if grids is None:
        grids = gen_grid.UniformGrids(mf.cell)
    if kpts is None:
        kpts = mf.kpts
    ni = numint.KNumInt()
    return ni.get_rho(mf.cell, dm, grids, kpts, mf.max_memory)
Пример #8
0
    def test_nr_rks(self):
        cell = pbcgto.Cell()
        cell.verbose = 5
        cell.output = '/dev/null'
        cell.a = np.eye(3) * 2.5
        cell.mesh = [21] * 3
        cell.atom = [
            ['He', (1., .8, 1.9)],
            ['He', (.1, .2, .3)],
        ]
        cell.basis = 'ccpvdz'
        cell.build(False, False)
        grids = gen_grid.UniformGrids(cell)
        grids.build()
        nao = cell.nao_nr()

        np.random.seed(1)
        kpts = np.random.random((2, 3))
        dms = np.random.random((2, nao, nao))
        dms = (dms + dms.transpose(0, 2, 1)) * .5
        ni = numint.NumInt()
        with lib.temporary_env(pbcgto.eval_gto, EXTRA_PREC=1e-5):
            ne, exc, vmat = ni.nr_rks(cell, grids, 'blyp', dms[0], 1, kpts[0])
        self.assertAlmostEqual(ne, 5.0499199224525153, 8)
        self.assertAlmostEqual(exc, -3.8870579114663886, 8)
        self.assertAlmostEqual(lib.fp(vmat),
                               0.42538491159934377 + 0.14139753327162483j, 8)

        ni = numint.KNumInt()
        with lib.temporary_env(pbcgto.eval_gto, EXTRA_PREC=1e-5):
            ne, exc, vmat = ni.nr_rks(cell, grids, 'blyp', dms, 1, kpts)
        self.assertAlmostEqual(ne, 6.0923292346269742, 8)
        self.assertAlmostEqual(exc, -3.9899423803106466, 8)
        self.assertAlmostEqual(lib.fp(vmat[0]),
                               -2348.9577179701278 - 60.733087913116719j, 7)
        self.assertAlmostEqual(lib.fp(vmat[1]),
                               -2353.0350086740673 - 117.74811536967495j, 7)

        with lib.temporary_env(pbcgto.eval_gto, EXTRA_PREC=1e-5):
            ne, exc, vmat = ni.nr_rks(cell, grids, 'blyp', [dms, dms], 1, kpts)
        self.assertAlmostEqual(ne[1], 6.0923292346269742, 8)
        self.assertAlmostEqual(exc[1], -3.9899423803106466, 8)
        self.assertAlmostEqual(lib.fp(vmat[1][0]),
                               -2348.9577179701278 - 60.733087913116719j, 7)
        self.assertAlmostEqual(lib.fp(vmat[1][1]),
                               -2353.0350086740673 - 117.74811536967495j, 7)
Пример #9
0
    def __init__(self, cell, kpts=numpy.zeros((1, 3))):
        from pyscf.pbc.dft import gen_grid
        from pyscf.pbc.dft import numint
        self.cell = cell
        self.stdout = cell.stdout
        self.verbose = cell.verbose
        self.max_memory = cell.max_memory
        self.low_dim_ft_type = cell.low_dim_ft_type

        self.kpts = kpts
        self.grids = gen_grid.UniformGrids(cell)

        # to mimic molecular DF object
        self.blockdim = getattr(__config__, 'pbc_df_df_DF_blockdim', 240)

        # Not input options
        self.exxdiv = None  # to mimic KRHF/KUHF object in function get_coulG
        self._numint = numint.KNumInt()
        self._keys = set(self.__dict__.keys())
Пример #10
0
    def __init__(self, cell, kpts=numpy.zeros((1, 3))):
        from pyscf.pbc.dft import gen_grid
        from pyscf.pbc.dft import numint
        self.cell = cell
        self.stdout = cell.stdout
        self.verbose = cell.verbose
        self.max_memory = cell.max_memory

        self.kpts = kpts
        self.grids = gen_grid.UniformGrids(cell)

        # to mimic molecular DF object
        self.blockdim = getattr(__config__, 'pbc_df_df_DF_blockdim', 240)

        # The following attributes are not input options.
        # self.exxdiv has no effects. It was set in the get_k_kpts function to
        # mimic the KRHF/KUHF object in the call to tools.get_coulG.
        self.exxdiv = None
        self._numint = numint.KNumInt()
        self._keys = set(self.__dict__.keys())
Пример #11
0
def test_pbc_cgto_eval_dm(pbc_h1):
    torch.manual_seed(123)
    h_dqc, df_scf = pbc_h1
    nkpts = h_dqc.kpts.shape[0]
    nao = h_dqc.nao

    # generate random hermitian density matrix
    dm = torch.rand((nkpts, nao, nao), dtype=cdtype)
    dm = dm + dm.conj().transpose(-2, -1)

    npts = 100
    xcoords = torch.linspace(-3, 3, npts)[:,None].to(dtype)
    ycoords = torch.zeros(npts)[:,None].to(dtype)
    zcoords = torch.zeros(npts)[:,None].to(dtype)
    xyz = torch.cat((xcoords, ycoords, zcoords), dim=-1)
    # xyz = torch.rand((10, 3), dtype=dtype)
    dens = h_dqc.aodm2dens(dm, xyz)

    assert dens.dtype == dtype
    kpts_np = h_dqc.kpts.numpy()
    knumint = pbc_numint.KNumInt(kpts=kpts_np)
    cell = df_scf.cell
    ao = knumint.eval_ao(cell, xyz.numpy(), kpts=kpts_np)
    dens_scf = knumint.eval_rho(cell, ao, dm.numpy())
    dens_scf = torch.as_tensor(dens_scf, dtype=dens.dtype)

    # print("dens pyscf:")
    # print(dens_scf)
    # print("dens dqc:")
    # print(dens)
    # print(dens / dens_scf)
    #
    # import matplotlib.pyplot as plt
    # plt.plot(xcoords.view(-1), dens)
    # plt.plot(xcoords.view(-1), dens_scf)
    # plt.show()

    assert torch.allclose(dens, dens_scf)