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
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
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)
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))
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))