def test_0066_al_atom(self): """ Spin-resolved case GW procedure. """ gw = gw_c(mf=gto_mf, gto=mol, verbosity=0, niter_max_ev=16, nocc=3, nvrt=3) self.assertEqual(gw.nspin, 2) gw.kernel_gw() #gw.report() np.savetxt('eigvals_g0w0_pyscf_rescf_al_0066.txt', gw.mo_energy_gw[0,:,:].T)
def test_rf0_ref(self): """ This is GW """ mol = gto.M( verbose=1, atom='''H 0 0 0; H 0.17 0.7 0.587''', basis='cc-pvdz', ) gto_mf = scf.RHF(mol) gto_mf.kernel() gw = gw_c(mf=gto_mf, gto=mol) ww = [0.0 + 1j * 4.0, 1.0 + 1j * 0.1, -2.0 - 1j * 0.1] rf0_fm = gw.rf0_cmplx_vertex_ac(ww) rf0_mv = np.zeros_like(rf0_fm) vec = np.zeros((gw.nprod), dtype=gw.dtypeComplex) for iw, w in enumerate(ww): for mu in range(gw.nprod): vec[:] = 0.0 vec[mu] = 1.0 rf0_mv[iw, mu, :] = gw.apply_rf0(vec, w) #print(rf0_fm.shape, rf0_mv.shape) #print('abs(rf0_fm-rf0_mv)', abs(rf0_fm-rf0_mv).sum()/rf0_fm.size) #print(abs(rf0_fm[0,:,:]-rf0_mv[0,:,:]).sum()) #print(rf0_fm[0,:,:]) self.assertTrue(abs(rf0_fm - rf0_mv).sum() / rf0_fm.size < 1e-15)
def test_rescf(self): """ reSCF then G0W0 """ fc = \ """-1.176137582599898090e+00 -6.697973984258517310e-01 -5.155143130039178123e-01 -4.365448724088398791e-01 2.104535161143837596e-01 2.985738190760626187e-01 5.383631831528181699e-01 5.960427511708059622e-01 6.298425248864513160e-01 6.702150570679562547e-01 7.488635881500678160e-01 1.030485556414411974e+00 1.133596236538136015e+00 1.308430815822860804e+00 1.322564760433334374e+00 1.444841711461231304e+00 1.831867938363858750e+00 1.902393397937107045e+00 1.977107479006525059e+00 2.119748779125555149e+00 2.150570967014801216e+00 2.899024682518652973e+00 3.912773887375614823e+00 """ dname = os.path.dirname(os.path.abspath(__file__)) gw = gw_c(label='water', cd=dname, verbosity=0, nocc=8, nvrt=6, nocc_conv=4, nvrt_conv=4, rescf=True, tol_ia=1e-6) gw.kernel_gw() np.savetxt('eigvals_g0w0_pyscf_rescf_water_0061.txt', gw.mo_energy_gw.T) for e,eref_str in zip(gw.mo_energy_gw[0,0,:],fc.splitlines()): self.assertAlmostEqual(e,float(eref_str))
def test_si_ref(self): """ This is GW """ mol = gto.M( verbose = 1, atom = '''H 0 0 0; H 0.17 0.7 0.587''', basis = 'cc-pvdz',) gto_mf = scf.RHF(mol) gto_mf.kernel() gw = gw_c(mf=gto_mf, gto=mol) ww = [0.0+1j*4.0, 1.0+1j*0.1, -2.0-1j*0.1] si0_fm = gw.si_c(ww)
def test_0061_gw_rescf_siesta_s2_triplet(self): """ reSCF then G0W0 """ dname = os.path.dirname(os.path.abspath(__file__)) + '/S2_triplet' gw = gw_c(label='S2', cd=dname, verbosity=1, rescf=True, tol_ia=1e-6, magnetization=2) #2 Unpaired electron gw.kernel_gw()
def test_gw(self): """ This is GW """ mol = gto.M( verbose = 0, atom = '''H 0.0 0.0 -0.3707; H 0.0 0.0 0.3707''', basis = 'cc-pvdz',) gto_mf = scf.RHF(mol) gto_mf.kernel() #print('gto_mf.mo_energy:', gto_mf.mo_energy) gw = gw_c(mf=gto_mf, gto=mol, verbosity=0) gw.kernel_gw() self.assertAlmostEqual(gw.mo_energy_gw[0,0,0], -0.59709476270318296) self.assertAlmostEqual(gw.mo_energy_gw[0,0,1], 0.19071318743971943)
def test_sf_gw_corr(self): """ This is choice of wmin and wmax in GW """ mol = gto.M( verbose = 1, atom = '''H 0.0 0.0 -0.3707; H 0.0 0.0 0.3707''', basis = 'cc-pvdz',) gto_mf = scf.RHF(mol) gto_mf.kernel() gw = gw_c(mf=gto_mf, gto=mol) sn2eval_gw = np.copy(gw.ksn2e[0,:,gw.nn]).T gw_corr_int = gw.gw_corr_int(sn2eval_gw) for c,cref in zip(gw_corr_int[0], [ -4.16459719e-02, -4.79778564e-03,-3.26848826e-03,-4.06138735e-05, -5.13947211e-03, -5.13947211e-03, 8.42977051e-03]): self.assertAlmostEqual(c[0], cref)
def test_sf_gw_res_corr(self): """ This is choice of wmin and wmax in GW """ mol = gto.M( verbose = 1, atom = '''H 0 0 0; H 0.17 0.7 0.587''', basis = 'cc-pvdz',) gto_mf = scf.RHF(mol) gto_mf.kernel() gw = gw_c(mf=gto_mf, gto=mol, tol_ia=1e-6) sn2eval_gw = [np.copy(gw.ksn2e[0,s,nn]) for s,nn in enumerate(gw.nn) ] gw_corr_res = gw.gw_corr_res(sn2eval_gw) fc = """0.03105265 -0.00339984 -0.01294826 -0.06934852 -0.03335821 -0.03335821 0.46324024""" for e,eref_str in zip(gw_corr_res[0],fc.split(' ')): self.assertAlmostEqual(e,float(eref_str),7)
def test_o2_gw_0087(self): from pyscf.nao.m_fermi_dirac import fermi_dirac_occupations """ Spin-resolved case GW procedure. """ #print(__name__, dir(gto_mf_uhf)) gw = gw_c(mf=gto_mf_uhf, gto=mol, verbosity=0, niter_max_ev=6) print(__name__, 'nfermi =', gw.nfermi) print(__name__, 'e_tot =', e_tot) self.assertEqual(gw.nspin, 2) gw.kernel_gw() print(gw.mo_energy) print(gw.mo_energy_gw) print(gw.ksn2f)
def test_gw(self): """ This is GW """ mol = gto.M( verbose=0, atom='''H 0.0 0.0 -0.3707; H 0.0 0.0 0.3707''', basis='cc-pvdz', ) gto_mf = scf.RHF(mol) gto_mf.kernel() #print('gto_mf.mo_energy:', gto_mf.mo_energy) gw = gw_c(mf=gto_mf, gto=mol, verbosity=0) gw.kernel_gw() self.assertAlmostEqual(gw.mo_energy_gw[0, 0, 0], -0.59709476270318296) self.assertAlmostEqual(gw.mo_energy_gw[0, 0, 1], 0.19071318743971943)
def test_wmin_wmax(self): """ This is choice of wmin and wmax in GW """ mol = gto.M( verbose = 1, atom = '''H 0 0 0; H 0.17 0.7 0.587''', basis = 'cc-pvdz',) gto_mf = scf.RHF(mol) gto_mf.kernel() gw = gw_c(mf=gto_mf, gto=mol, tol_ia=1e-3) self.assertEqual(gw.nocc, 1) self.assertEqual(gw.nvrt, 6) self.assertEqual(gw.start_st, 0) self.assertEqual(gw.finish_st, 7) self.assertAlmostEqual(gw.wmin_ia, 0.010963536607965261) self.assertAlmostEqual(gw.wmax_ia, 10.396997096859502) self.assertAlmostEqual(gw.ww_ia.sum(), 60.588528092301765) self.assertAlmostEqual(gw.tt_ia.sum(), 57.489242777049725)
def test_0068_F_atom(self): """ Spin-resolved case GW procedure. """ gw = gw_c(mf=gto_mf, gto=mol, verbosity=0, niter_max_ev=16, rescf=True, kmat_algo='dp_vertex_loops_sm') self.assertEqual(gw.nspin, 2) gw.kernel_gw() #gw.report() np.savetxt('eigvals_gw_pyscf_f_0068.txt', gw.mo_energy_gw[0, :, :].T) ev_ref = np.loadtxt('eigvals_gw_pyscf_f_0068.txt-ref').T for n2e, n2r in zip(gw.mo_energy_gw[0], ev_ref): for e, r in zip(n2e, n2r): self.assertAlmostEqual(e, r)
def test_sf_iter(self): """ This compares matrix element of W calculated by G0W0 and G0W0_iter """ mol = gto.M(atom='''C 0.0, 0.0, -0.611046 ; N 0.0, 0.0, 0.52375''', basis='ccpvdz', spin=1) gto_mf = scf.UHF(mol) gto_mf.kernel() gw = gw_c(mf=gto_mf, gto=mol, verbosity=0, niter_max_ev=20) gwi = gw_iter(mf=gto_mf, gto=mol, verbosity=0, niter_max_ev=20) sf = gw.get_snmw2sf() sf_it = gwi.get_snmw2sf_iter() self.assertEqual(len(sf), len(sf_it)) self.assertEqual(sf[0].shape, sf_it[0].shape) self.assertTrue(np.allclose(sf, sf_it, atol=gwi.gw_iter_tol))
def test_0089_he_atom(self): """ Spin-resolved case GW procedure. """ gw = gw_c(mf=gto_mf, gto=mol, verbosity=0, niter_max_ev=16, kmat_timing=0.0, kmat_algo='sm0_sum') self.assertEqual(gw.nspin, 2) gw.kernel_gw() #if gw.kmat_timing is not None: print('gw.kmat_timing', gw.kmat_timing) #gw.report() np.savetxt('eigvals_gw_pyscf_he_0067.txt', gw.mo_energy_gw[0, :, :].T) ev_ref = np.loadtxt('eigvals_gw_pyscf_he_0067.txt-ref').T for n2e, n2r in zip(gw.mo_energy_gw[0], ev_ref): for e, r in zip(n2e, n2r): self.assertAlmostEqual(e, r)
def test_o2_gw_0087(self): from io import StringIO """ Spin-resolved case GW procedure. """ #print(__name__, dir(gto_mf_uhf)) gw = gw_c(mf=gto_mf_uhf, gto=mol, verbosity=0, niter_max_ev=6, jcutoff=12) #print(__name__, 'nfermi =', gw.nfermi) #print(__name__, 'e_tot =', e_tot) self.assertEqual(gw.nspin, 2) gw.kernel_gw() #gw.report() np.savetxt('eigvals_g0w0_pyscf_rescf_o2_0087.txt', gw.mo_energy_gw[0,:,:].T) reflines = u"""-2.066794262507180235e+01 -2.059606842160618001e+01 -2.066739073401323168e+01 -2.026688493419162995e+01 -1.597844973588707695e+00 -1.404839916644314624e+00 -1.065759004553683331e+00 -9.223326834974986399e-01 -7.216185233670470156e-01 -6.604156965786966982e-01 -7.216185233670456833e-01 -5.819504613421641048e-01 -7.162888896288145402e-01 -5.819504613421628836e-01 -4.863444705681586600e-01 6.572791437724267993e-02 -4.863444705681552738e-01 6.572791437724459507e-02 3.374986529927169188e-01 3.989268256149947622e-01 9.723803394644109366e-01 9.945702181997964075e-01 1.012560504993975208e+00 1.085328723165654985e+00 1.012560504993977428e+00 1.085328723165656539e+00 1.097687223995805983e+00 1.116946344532482316e+00 1.110895503965524833e+00 1.221318278807398849e+00 1.120550633372836780e+00 1.221318278807399516e+00 1.274502871852798203e+00 1.289100602949988517e+00 1.871514450003718633e+00 1.907845159479740982e+00 2.323558750328121203e+00 2.380030399530845386e+00 2.323558750328121203e+00 2.380030399530846719e+00 2.594057749622432407e+00 2.699072541242792500e+00 2.594057749622432407e+00 2.699072541242792944e+00 2.863151521343340722e+00 2.996390061519241144e+00 2.863151521343342942e+00 2.996390061519242476e+00 2.986289867696291900e+00 3.043597277843169024e+00 3.519722767487217574e+00 3.582380444764414751e+00 3.519722767487221127e+00 3.582380444764418304e+00 4.112903441748526845e+00 4.146312536608574462e+00 """ #u unicodes the string in python 2.7 eeref = np.loadtxt(StringIO(reflines)).T for e1r,e2r, e1,e2 in zip(eeref[0], eeref[1], gw.mo_energy_gw[0,0,:], gw.mo_energy_gw[0,1,:]): #print(e1r,e1,e2r,e2) self.assertAlmostEqual(float(e1r), e1) self.assertAlmostEqual(float(e2r), e2)
def test_wmin_wmax(self): """ This is choice of wmin and wmax in GW """ mol = gto.M( verbose=1, atom='''H 0 0 0; H 0.17 0.7 0.587''', basis='cc-pvdz', ) gto_mf = scf.RHF(mol) gto_mf.kernel() gw = gw_c(mf=gto_mf, gto=mol, tol_ia=1e-3) self.assertEqual(gw.nocc, 1) self.assertEqual(gw.nvrt, 6) self.assertEqual(gw.start_st, 0) self.assertEqual(gw.finish_st, 7) self.assertAlmostEqual(gw.wmin_ia, 0.010963536607965261) self.assertAlmostEqual(gw.wmax_ia, 10.396997096859502) self.assertAlmostEqual(gw.ww_ia.sum(), 60.588528092301765) self.assertAlmostEqual(gw.tt_ia.sum(), 57.489242777049725)
def test_sf_gw_res_corr(self): """ This is choice of wmin and wmax in GW """ mol = gto.M( verbose=1, atom='''H 0 0 0; H 0.17 0.7 0.587''', basis='cc-pvdz', ) gto_mf = scf.RHF(mol) gto_mf.kernel() gw = gw_c(mf=gto_mf, gto=mol, tol_ia=1e-6) sn2eval_gw = [ np.copy(gw.ksn2e[0, s, nn]) for s, nn in enumerate(gw.nn) ] gw_corr_res = gw.gw_corr_res(sn2eval_gw) fc = """0.03105265 -0.00339984 -0.01294826 -0.06934852 -0.03335821 -0.03335821 0.46324024""" for e, eref_str in zip(gw_corr_res[0], fc.split(' ')): self.assertAlmostEqual(e, float(eref_str), 7)
def test_beh_gw_0088(self): from pyscf.nao.m_fermi_dirac import fermi_dirac_occupations """ Spin-resolved case GW procedure. """ #print(__name__, dir(gto_mf_uhf)) gw = gw_c(mf=gto_mf_uhf, gto=mol, verbosity=0, niter_max_ev=8, pb_algorithm='pp') self.assertEqual(gw.nspin, 2) #print(__name__, 'nfermi =', gw.nfermi) #print(__name__, 'e_tot =', e_tot) gw.kernel_gw() #gw.report() self.assertAlmostEqual(gw.mo_energy_gw[0, 0, 2] * 27.2114, -8.4558357834412305)
def test_0090_h_atom(self): """ Spin-resolved case GW procedure. """ return gw = gw_c(mf=gto_mf, gto=mol, verbosity=2, niter_max_ev=16, kmat_algo='dp_vertex_loops_sm') #nao_rdm = gw.make_rdm1() #print(__name__, (gw.get_hcore()*nao_rdm).sum()) #print((gw.get_j()*nao_rdm).sum()) #print((gw.get_k()*nao_rdm).sum()) self.assertEqual(gw.nspin, 1) gw.kernel_gw() gw.report() np.savetxt('eigvals_g0w0_pyscf_rescf_h_0090.txt', gw.mo_energy_gw[0, :, :].T)
def test_sf_gw_corr(self): """ This is choice of wmin and wmax in GW """ mol = gto.M( verbose=1, atom='''H 0.0 0.0 -0.3707; H 0.0 0.0 0.3707''', basis='cc-pvdz', ) gto_mf = scf.RHF(mol) gto_mf.kernel() gw = gw_c(mf=gto_mf, gto=mol) sn2eval_gw = np.copy(gw.ksn2e[0, :, gw.nn]).T gw_corr_int = gw.gw_corr_int(sn2eval_gw) for c, cref in zip(gw_corr_int[0], [ -4.16459719e-02, -4.79778564e-03, -3.26848826e-03, -4.06138735e-05, -5.13947211e-03, -5.13947211e-03, 8.42977051e-03 ]): self.assertAlmostEqual(c[0], cref)
def test_clo_gw_0089(self): """ Spin-resolved case GW procedure. By using frozen_core convergence has been reached""" gw = gw_c( mf=gto_mf_UHF, gto=mol, verbosity=1, niter_max_ev=20, frozen_core=30 ) #Frozen core is defined by True, False or a number(N) which corrects state index in a range btween N-fermi and N+fermi gw.kernel_gw() gw.report() self.assertEqual(gw.nspin, 2) self.assertAlmostEqual(gw.mo_energy_gw[0, 0, 2], -10.580537488540639) sf = gw.get_snmw2sf() self.assertEqual(len(sf), 2) #without fz 2 self.assertEqual(len(sf[0]), 18) #without fz 12 self.assertEqual(sf[0].shape, (18, 68, 32)) #without fz (12,68,32)
def test_rescf(self): """ Hartree-Fock than G0W0 N2 example is marked with level-ordering change """ dname = os.path.dirname(os.path.abspath(__file__)) gw = gw_c(label='n2', cd=dname, verbosity=0, jcutoff=9, nff_ia=64, tol_ia=1e-6, rescf=True) gw.kernel_gw() gw.report() #np.savetxt('eigvals_g0w0_pyscf_rescf_n2_0062.txt', gw.mo_energy_gw.T) fc = """-1.294910390463269723e+00 -6.914426700260764003e-01 -5.800631098408213226e-01 -5.800630912944181317e-01 -5.488682018442180288e-01 1.831305221095872460e-01 1.831305925807518165e-01 7.003698201553041347e-01 7.609521815330196892e-01 7.953706485575250396e-01 7.953707042048162590e-01 9.385062725430328712e-01 9.553819617686154508e-01 9.557372926158315130e-01 9.769254942961748123e-01 9.769258344753622980e-01 1.033749364514201741e+00 1.323622829437763881e+00 1.323622831800760569e+00 1.631897154460114852e+00 1.632680402343911652e+00 1.657952682599951544e+00 2.729770515636606998e+00 3.002491147471110899e+00 3.002491923857071310e+00 3.191379493098387865e+00 """ for e, eref_str in zip(gw.mo_energy_gw[0, 0, :], fc.splitlines()): self.assertAlmostEqual(e, float(eref_str))
def test_rf0_ref(self): """ This is GW """ mol = gto.M( verbose = 1, atom = '''H 0 0 0; H 0.17 0.7 0.587''', basis = 'cc-pvdz',) gto_mf = scf.RHF(mol) gto_mf.kernel() gw = gw_c(mf=gto_mf, gto=mol) ww = [0.0+1j*4.0, 1.0+1j*0.1, -2.0-1j*0.1] rf0_fm = gw.rf0_cmplx_vertex_ac(ww) rf0_mv = np.zeros_like(rf0_fm) vec = np.zeros((gw.nprod), dtype=gw.dtypeComplex) for iw,w in enumerate(ww): for mu in range(gw.nprod): vec[:] = 0.0; vec[mu] = 1.0 rf0_mv[iw, mu,:] = gw.apply_rf0(vec, w) #print(rf0_fm.shape, rf0_mv.shape) #print('abs(rf0_fm-rf0_mv)', abs(rf0_fm-rf0_mv).sum()/rf0_fm.size) #print(abs(rf0_fm[0,:,:]-rf0_mv[0,:,:]).sum()) #print(rf0_fm[0,:,:]) self.assertTrue(abs(rf0_fm-rf0_mv).sum()/rf0_fm.size<1e-15)
def test_mn_gw_0086(self): from pyscf.nao.m_fermi_dirac import fermi_dirac_occupations """ Spin-resolved case GW procedure. """ #print(__name__, dir(gto_mf_uhf)) gw = gw_c(mf=gto_mf_uhf, gto=mol, verbosity=0) self.assertEqual(gw.nspin, 2)
for i, (a, b) in enumerate( zip(sigma_gw_c.T * HARTREE2EV, self.mo_occ[0].T)): if (i == self.nfermi[0] or i == self.nfermi[1]): print('-' * 60) print(' %3d %16.6f %3d | %13.6f %3d' % (i, a[0], b[0], a[1], b[1])) # # Example of reporting expectation values of mean-field calculations. # if __name__ == '__main__': import numpy as np from pyscf import gto, scf from pyscf.nao import gw as gw_c HARTREE2EV = 27.2114 mol = gto.M(verbose=0, atom='O 0.0, 0.0, 0.622978 ; O 0.0, 0.0, -0.622978', basis='cc-pvdz', spin=2, charge=0) gto_mf = scf.UHF(mol) gto_mf.kernel() gw = gw_c(mf=gto_mf, gto=mol, verbosity=3, niter_max_ev=1, kmat_algo='sm0_sum') #gw.report_mf() #prints the energy levels of mean-field components gw.report() #gives G0W0 spectra
# Example of plotting DOS calculated by GW calculation. # if __name__ == '__main__': import numpy as np import matplotlib.pyplot as plt from pyscf import gto, scf from pyscf.nao import gw as gw_c mol = gto.M(verbose=0, atom='''C 0.0, 0.0, -0.611046 ; N 0.0, 0.0, 0.523753''', basis='cc-pvdz', spin=1, charge=0) gto_mf_UHF = scf.UHF(mol) gto_mf_UHF.kernel() gw = gw_c(mf=gto_mf_UHF, gto=mol, verbosity=1, niter_max_ev=20) omegas = np.arange(-1.0, 1.0, 0.005) + 1j * 0.01 dos = lsoa_dos(mf=gw, zomegas=omegas) pdos = pdos(mf=gw, zomegas=omegas) data = np.zeros((pdos.shape[0] + 2, pdos.shape[1])) data[0, :] = omegas.real * 27.2114 data[1, :] = dos.clip(min=0) data[2:, :] = pdos.clip(min=0) np.savetxt( 'dos.dat', data.T, fmt='%14.6f', header= ' Energy(eV)\t Total DOS\t s_state\t p_state\t d_state') #plotting DOS and PDOS
from pyscf.nao import gw as gw_c import os dname = os.getcwd() gw = gw_c(label='S2', cd=dname, verbosity=3, niter_max_ev=70, rescf=True, magnetization=2) gw.kernel_gw() gw.report()
def test_water_si_wgth(self): """ This is for initializing with SIESTA radial orbitals """ from pyscf.nao import gw as gw_c from pyscf.nao import mf as mf_c from pyscf.nao.m_x_zip import detect_maxima from pyscf.nao.m_lorentzian import overlap, lorentzian, overlap_imag, overlap_real from pyscf.nao.m_sf2f_rf import sf2f_rf import numpy as np import os from numpy import arange, einsum, array, linalg, savetxt, column_stack, conj from scipy.integrate import simps dname = os.path.dirname(os.path.abspath(__file__)) mf = gw_c(label='water', cd=dname, verbosity=0, nocc=8, nvrt=6, rescf=False, tol_ia=1e-9) #gw.kernel_gw() weps = 0.3 wmax = 1.1*(mf.mo_energy[0,0,-1]-mf.mo_energy[0,0,0]) ww = arange(0.0, wmax, weps/3.0)+1j*weps si0 = mf.si_c(ww) hk_inv = linalg.inv(mf.hkernel_den) print(__name__, si0.shape, hk_inv.shape) si0_dens = -einsum('wpq,pq->w', si0, hk_inv).imag si0_dens_re = einsum('wpq,pq->w', si0, hk_inv).real savetxt('w2scr_int.txt', column_stack((ww.real, si0_dens))) savetxt('w2scr_int_re.txt', column_stack((ww.real, si0_dens_re))) wwmx = list(detect_maxima(ww, si0_dens)) print('nmax', len(wwmx)) dww = ww[1].real-ww[0].real # Method 1 sf_si0 = np.zeros((len(wwmx), mf.nprod, mf.nprod)) for j,wmx in enumerate(wwmx): sf_si0[j] = -si0[np.argmin(abs(ww.real - wmx))].imag/np.pi # Method 2, using imaginary part sf_si0 = np.zeros((len(wwmx), mf.nprod, mf.nprod)) for j,wmx in enumerate(wwmx): for i,fw in enumerate(ww.real): sf_si0[j] += si0[i].imag*dww*lorentzian(fw, wmx, weps).imag loi = overlap_imag(wwmx, weps) iloi = np.linalg.inv(loi) sf_si0 = einsum('fg,gab->fab', iloi,sf_si0) ## Method 3, using real part #re_si0 = np.zeros((len(wwmx), mf.nprod, mf.nprod)) #for j,wmx in enumerate(wwmx): #for i,fw in enumerate(ww.real): #re_si0[j] += si0[i].real*dww*lorentzian(fw, wmx, weps).real #lor = overlap_real(wwmx, weps) #ilor = np.linalg.inv(lor) #sf_si0 = einsum('fg,gab->fab', ilor,re_si0) ivec = 0 for i,sf in enumerate(sf_si0): ee,xx = np.linalg.eigh(sf) sf_si0[i] = 0.0; for e,x in zip(ee,xx.T): if e>0.01: sf_si0[i] += np.outer(x*e, x) ivec += 1 print('nvecs', ivec) si0_recon = sf2f_rf(ww.real, weps, wwmx, sf_si0) si0_dens_recon = -einsum('wpq,pq->w', si0_recon, hk_inv).imag si0_dens_recon_re = einsum('wpq,pq->w', si0_recon, hk_inv).real savetxt('w2scr_int_recon.txt', column_stack((ww.real, si0_dens_recon))) savetxt('w2scr_int_recon_re.txt', column_stack((ww.real, si0_dens_recon_re)))