def vind(mo1): mo1aa, mo1ab, mo1ba, mo1bb = _split_mo1(mo1) dm1aa = _dm1_mo2ao(mo1aa, orbva, orboa) dm1ab = _dm1_mo2ao(mo1ab, orbva, orbob) dm1ba = _dm1_mo2ao(mo1ba, orbvb, orboa) dm1bb = _dm1_mo2ao(mo1bb, orbvb, orbob) # imaginary Hermitian dm1 = numpy.vstack([ dm1aa - dm1aa.transpose(0, 2, 1), dm1ab - dm1ba.transpose(0, 2, 1), dm1ba - dm1ab.transpose(0, 2, 1), dm1bb - dm1bb.transpose(0, 2, 1) ]) v1 = vresp(dm1) v1aa = _ao2mo.nr_e2(v1[:nset], mo_va_oa, (0, nvira, nvira, nvira + nocca)) v1ab = _ao2mo.nr_e2(v1[nset * 1:nset * 2], mo_va_ob, (0, nvira, nvira, nvira + noccb)) v1ba = _ao2mo.nr_e2(v1[nset * 2:nset * 3], mo_vb_oa, (0, nvirb, nvirb, nvirb + nocca)) v1bb = _ao2mo.nr_e2(v1[nset * 3:], mo_vb_ob, (0, nvirb, nvirb, nvirb + noccb)) v1aa = v1aa.reshape(nset, nvira, nocca) v1ab = v1ab.reshape(nset, nvira, noccb) v1ba = v1ba.reshape(nset, nvirb, nocca) v1bb = v1bb.reshape(nset, nvirb, noccb) v1aa *= eai_aa v1ab *= eai_ab v1ba *= eai_ba v1bb *= eai_bb v1mo = numpy.hstack((v1aa.reshape(nset, -1), v1ab.reshape(nset, -1), v1ba.reshape(nset, -1), v1bb.reshape(nset, -1))) return v1mo.ravel()
def vind(mo1): mo1aa, mo1ab, mo1ba, mo1bb = _split_mo1(mo1) dm1aa = _dm1_mo2ao(mo1aa, orbva, orboa) dm1ab = _dm1_mo2ao(mo1ab, orbva, orbob) dm1ba = _dm1_mo2ao(mo1ba, orbvb, orboa) dm1bb = _dm1_mo2ao(mo1bb, orbvb, orbob) dm1 = lib.asarray([ dm1aa + dm1aa.transpose(0, 2, 1), dm1ab + dm1ba.transpose(0, 2, 1), dm1ba + dm1ab.transpose(0, 2, 1), dm1bb + dm1bb.transpose(0, 2, 1) ]) v1 = vresp(dm1) v1aa = _ao2mo.nr_e2(v1[0], mo_va_oa, (0, nvira, nvira, nvira + nocca)) v1ab = _ao2mo.nr_e2(v1[1], mo_va_ob, (0, nvira, nvira, nvira + noccb)) v1ba = _ao2mo.nr_e2(v1[2], mo_vb_oa, (0, nvirb, nvirb, nvirb + nocca)) v1bb = _ao2mo.nr_e2(v1[3], mo_vb_ob, (0, nvirb, nvirb, nvirb + noccb)) v1aa = v1aa.reshape(nset, nvira, nocca) v1ab = v1ab.reshape(nset, nvira, noccb) v1ba = v1ba.reshape(nset, nvirb, nocca) v1bb = v1bb.reshape(nset, nvirb, noccb) v1aa *= eai_aa v1ab *= eai_ab v1ba *= eai_ba v1bb *= eai_bb v1mo = numpy.hstack( (v1aa.reshape(nset, -1), v1ab.reshape(nset, -1), v1ba.reshape(nset, -1), v1bb.reshape(nset, -1))) return v1mo.ravel()
def vind(mo1): mo1aa, mo1ab, mo1ba, mo1bb = _split_mo1(mo1) dm1aa = _dm1_mo2ao(mo1aa, orbva, orboa) dm1ab = _dm1_mo2ao(mo1ab, orbva, orbob) dm1ba = _dm1_mo2ao(mo1ba, orbvb, orboa) dm1bb = _dm1_mo2ao(mo1bb, orbvb, orbob) dm1 = lib.asarray([dm1aa+dm1aa.transpose(0,2,1), dm1ab+dm1ba.transpose(0,2,1), dm1ba+dm1ab.transpose(0,2,1), dm1bb+dm1bb.transpose(0,2,1)]) v1 = vresp(dm1) v1aa = _ao2mo.nr_e2(v1[0], mo_va_oa, (0,nvira,nvira,nvira+nocca)) v1ab = _ao2mo.nr_e2(v1[1], mo_va_ob, (0,nvira,nvira,nvira+noccb)) v1ba = _ao2mo.nr_e2(v1[2], mo_vb_oa, (0,nvirb,nvirb,nvirb+nocca)) v1bb = _ao2mo.nr_e2(v1[3], mo_vb_ob, (0,nvirb,nvirb,nvirb+noccb)) v1aa = v1aa.reshape(nset,nvira,nocca) v1ab = v1ab.reshape(nset,nvira,noccb) v1ba = v1ba.reshape(nset,nvirb,nocca) v1bb = v1bb.reshape(nset,nvirb,noccb) v1aa *= eai_aa v1ab *= eai_ab v1ba *= eai_ba v1bb *= eai_bb v1mo = numpy.hstack((v1aa.reshape(nset,-1), v1ab.reshape(nset,-1), v1ba.reshape(nset,-1), v1bb.reshape(nset,-1))) return v1mo.ravel()
def vind(mo1): mo1a = mo1.reshape(-1,nova+novb)[:,:nova].reshape(-1,nvira,nocca) mo1b = mo1.reshape(-1,nova+novb)[:,nova:].reshape(-1,nvirb,noccb) nset = mo1a.shape[0] dm1a = _dm1_mo2ao(mo1a, orbva, orboa) dm1b = _dm1_mo2ao(mo1b, orbvb, orbob) dm1 = numpy.vstack([dm1a-dm1a.transpose(0,2,1), dm1b-dm1b.transpose(0,2,1)]) v1 = vresp(dm1) v1a = _ao2mo.nr_e2(v1[ :nset], mo_va_oa, (0,nvira,nvira,nvira+nocca)) v1b = _ao2mo.nr_e2(v1[nset: ], mo_vb_ob, (0,nvirb,nvirb,nvirb+noccb)) v1mo = numpy.hstack((v1a.reshape(nset,-1), v1b.reshape(nset,-1))) return v1mo.ravel()
def vind(mo1): mo1a = mo1.reshape(-1, nova + novb)[:, :nova].reshape(-1, nvira, nocca) mo1b = mo1.reshape(-1, nova + novb)[:, nova:].reshape(-1, nvirb, noccb) nset = mo1a.shape[0] dm1a = _dm1_mo2ao(mo1a, orbva, orboa) dm1b = _dm1_mo2ao(mo1b, orbvb, orbob) dm1 = numpy.asarray( [dm1a - dm1a.transpose(0, 2, 1), dm1b - dm1b.transpose(0, 2, 1)]) v1 = vresp(dm1) v1a = _ao2mo.nr_e2(v1[0], mo_va_oa, (0, nvira, nvira, nvira + nocca)) v1b = _ao2mo.nr_e2(v1[1], mo_vb_ob, (0, nvirb, nvirb, nvirb + noccb)) v1mo = numpy.hstack((v1a.reshape(nset, -1), v1b.reshape(nset, -1))) return v1mo.ravel()
def make_pso_soc(hfcobj, hfc_nuc=None): '''Spin-orbit coupling correction''' mol = hfcobj.mol if hfc_nuc is None: hfc_nuc = range(mol.natm) mf = hfcobj._scf mo_coeff = mf.mo_coeff mo_occ = mf.mo_occ effspin = mol.spin * .5 e_gyro = .5 * lib.param.G_ELECTRON nuc_mag = .5 * (lib.param.E_MASS/lib.param.PROTON_MASS) # e*hbar/2m au2MHz = lib.param.HARTREE2J / lib.param.PLANCK * 1e-6 fac = lib.param.ALPHA**4 / 4 / effspin * e_gyro * au2MHz occidxa = mo_occ[0] > 0 occidxb = mo_occ[1] > 0 orboa = mo_coeff[0][:, occidxa] orbva = mo_coeff[0][:,~occidxa] orbob = mo_coeff[1][:, occidxb] orbvb = mo_coeff[1][:,~occidxb] # Note sigma_z is considered in h1_soc integral. # mo1b has the associated sign (-) mo1a, mo1b = hfcobj.solve_mo1()[0] dm1a = _dm1_mo2ao(mo1a, orbva, orboa) dm1b = _dm1_mo2ao(mo1b, orbvb, orbob) dm1 = dm1a + dm1b dm1 = dm1 - dm1.transpose(0,2,1) para = [] for n, atm_id in enumerate(hfc_nuc): nuc_gyro = get_nuc_g_factor(mol.atom_symbol(atm_id)) * nuc_mag # Imaginary part of H01 operator # Im[A01 dot p] = Im[vec{r}/r^3 x vec{p}] = Im[-i p (1/r) x p] = -p (1/r) x p mol.set_rinv_origin(mol.atom_coord(atm_id)) h1ao = -mol.intor_asymmetric('int1e_prinvxp', 3) de = numpy.einsum('xij,yij->xy', h1ao, dm1) de *= fac * nuc_gyro if hfcobj.verbose >= logger.INFO: _write(hfcobj, align(de)[0], 'PSO of atom %d (in MHz)' % atm_id) para.append(de) return numpy.asarray(para)
def make_pso_soc(hfcobj, hfc_nuc=None): '''Spin-orbit coupling correction''' mol = hfcobj.mol if hfc_nuc is None: hfc_nuc = range(mol.natm) mf = hfcobj._scf mo_coeff = mf.mo_coeff mo_occ = mf.mo_occ effspin = mol.spin * .5 e_gyro = .5 * nist.G_ELECTRON nuc_mag = .5 * (nist.E_MASS/nist.PROTON_MASS) # e*hbar/2m au2MHz = nist.HARTREE2J / nist.PLANCK * 1e-6 fac = nist.ALPHA**4 / 4 / effspin * e_gyro * au2MHz occidxa = mo_occ[0] > 0 occidxb = mo_occ[1] > 0 orboa = mo_coeff[0][:, occidxa] orbva = mo_coeff[0][:,~occidxa] orbob = mo_coeff[1][:, occidxb] orbvb = mo_coeff[1][:,~occidxb] # Note sigma_z is considered in h1_soc integral. # mo1b has the associated sign (-) mo1a, mo1b = hfcobj.solve_mo1()[0] dm1a = _dm1_mo2ao(mo1a, orbva, orboa) dm1b = _dm1_mo2ao(mo1b, orbvb, orbob) dm1 = dm1a + dm1b dm1 = dm1 - dm1.transpose(0,2,1) para = [] for n, atm_id in enumerate(hfc_nuc): nuc_gyro = get_nuc_g_factor(mol.atom_symbol(atm_id)) * nuc_mag # Imaginary part of H01 operator # Im[A01 dot p] = Im[vec{r}/r^3 x vec{p}] = Im[-i p (1/r) x p] = -p (1/r) x p mol.set_rinv_origin(mol.atom_coord(atm_id)) h1ao = -mol.intor_asymmetric('int1e_prinvxp', 3) de = numpy.einsum('xij,yij->xy', h1ao, dm1) de *= fac * nuc_gyro if hfcobj.verbose >= logger.INFO: _write(hfcobj, align(de)[0], 'PSO of atom %d (in MHz)' % atm_id) para.append(de) return numpy.asarray(para)