Example #1
0
def para(mol, mo10, mo_coeff, mo_occ, shielding_nuc=None):
    if shielding_nuc is None:
        shielding_nuc = range(1, mol.natm + 1)
    n4c = mo_coeff.shape[1]
    n2c = n4c // 2
    msc_para = numpy.zeros((len(shielding_nuc), 3, 3))
    para_neg = numpy.zeros((len(shielding_nuc), 3, 3))
    para_occ = numpy.zeros((len(shielding_nuc), 3, 3))
    h01 = numpy.zeros((3, n4c, n4c), complex)
    for n, atm_id in enumerate(shielding_nuc):
        mol.set_rinv_origin(mol.atom_coord(atm_id - 1))
        t01 = mol.intor('cint1e_sa01sp', 3)
        for m in range(3):
            h01[m, :n2c, n2c:] = .5 * t01[m]
            h01[m, n2c:, :n2c] = .5 * t01[m].conj().T
        h01_mo = rhf_nmr._mat_ao2mo(h01, mo_coeff, mo_occ)
        for b in range(3):
            for m in range(3):
                # + c.c.
                p = numpy.einsum('ij,ij->i', mo10[b].conj(),
                                 h01_mo[m]).real * 2
                msc_para[n, b, m] = p.sum()
                para_neg[n, b, m] = p[:n2c].sum()
                para_occ[n, b, m] = p[mo_occ > 0].sum()
    para_pos = msc_para - para_neg - para_occ
    return msc_para, para_pos, para_neg, para_occ
Example #2
0
def para(mol, mo10, mo_coeff, mo_occ, shielding_nuc=None):
    if shielding_nuc is None:
        shielding_nuc = range(1, mol.natm+1)
    n4c = mo_coeff.shape[1]
    n2c = n4c // 2
    msc_para = numpy.zeros((len(shielding_nuc),3,3))
    para_neg = numpy.zeros((len(shielding_nuc),3,3))
    para_occ = numpy.zeros((len(shielding_nuc),3,3))
    h01 = numpy.zeros((3, n4c, n4c), complex)
    for n, atm_id in enumerate(shielding_nuc):
        mol.set_rinv_origin(mol.atom_coord(atm_id-1))
        t01 = mol.intor('cint1e_sa01sp', 3)
        for m in range(3):
            h01[m,:n2c,n2c:] = .5 * t01[m]
            h01[m,n2c:,:n2c] = .5 * t01[m].conj().T
        h01_mo = rhf_nmr._mat_ao2mo(h01, mo_coeff, mo_occ)
        for b in range(3):
            for m in range(3):
                # + c.c.
                p = numpy.einsum('ij,ij->i', mo10[b].conj(), h01_mo[m]).real * 2
                msc_para[n,b,m] = p.sum()
                para_neg[n,b,m] = p[:n2c].sum()
                para_occ[n,b,m] = p[mo_occ>0].sum()
    para_pos = msc_para - para_neg - para_occ
    return msc_para, para_pos, para_neg, para_occ
Example #3
0
 def get_vind(self, mo1):
     '''Induced potential'''
     mo_coeff = self._scf.mo_coeff
     mo_occ = self._scf.mo_occ
     dm1 = self.make_rdm1_1(mo1, mo_coeff, mo_occ)
     direct_scf_bak, self._scf.direct_scf = self._scf.direct_scf, False
     # hermi=1 because dm1 = C^1 C^{0dagger} + C^0 C^{1dagger}
     v_ao = self._scf.get_veff(self.mol, dm1, hermi=1)
     self._scf.direct_scf = direct_scf_bak
     return rhf_nmr._mat_ao2mo(v_ao, mo_coeff, mo_occ)
Example #4
0
    def get_vind(self, mo1):
        '''Induced potential'''
        mo_coeff = self._scf.mo_coeff
        mo_occ = self._scf.mo_occ
        dm1 = self.make_rdm1_1(mo1, mo_coeff, mo_occ)
        direct_scf_bak, self._scf.direct_scf = self._scf.direct_scf, False
# hermi=1 because dm1 = C^1 C^{0dagger} + C^0 C^{1dagger}
        v_ao = self._scf.get_veff(self.mol, dm1, hermi=1)
        self._scf.direct_scf = direct_scf_bak
        return rhf_nmr._mat_ao2mo(v_ao, mo_coeff, mo_occ)
Example #5
0
    def _vind(self, mo1):
        mol = self.mol
        hyb = pyscf.dft.vxc.hybrid_coeff(self._scf.xc, spin=(mol.spin>0)+1)

        if abs(hyb) > 1e-10:
            mo_coeff = self._scf.mo_coeff
            mo_occ = self._scf.mo_occ
            dm1 = self.make_rdm1_1(mo1, mo_coeff, mo_occ)
            direct_scf_bak, self._scf.direct_scf = self._scf.direct_scf, False
            vj, vk = self._scf.get_jk(self.mol, dm1, hermi=2)
            v_ao = -.5 * hyb * vk
            self._scf.direct_scf = direct_scf_bak
            return rhf_nmr._mat_ao2mo(v_ao, mo_coeff, mo_occ)
        else:
            nocc = (self._scf.mo_occ>0).sum()
            nmo = self._scf.mo_coeff.shape[1]
            return numpy.zeros((3,nmo,nocc))
Example #6
0
    def get_vind(self, mo1):
        mol = self.mol
        libxc = self._scf._numint.libxc
        hyb = libxc.hybrid_coeff(self._scf.xc, spin=(mol.spin > 0) + 1)

        if abs(hyb) > 1e-10:
            mo_coeff = self._scf.mo_coeff
            mo_occ = self._scf.mo_occ
            dm1 = self.make_rdm1_1(mo1, mo_coeff, mo_occ)
            direct_scf_bak, self._scf.direct_scf = self._scf.direct_scf, False
            vj, vk = self._scf.get_jk(self.mol, dm1, hermi=2)
            v_ao = -.5 * hyb * vk
            self._scf.direct_scf = direct_scf_bak
            return rhf_nmr._mat_ao2mo(v_ao, mo_coeff, mo_occ)
        else:
            nocc = (self._scf.mo_occ > 0).sum()
            nmo = self._scf.mo_coeff.shape[1]
            return numpy.zeros((3, nmo, nocc))