def make_calc(beta=2.0, h_field=0.0): # ------------------------------------------------------------------ # -- Hubbard atom with two bath sites, Hamiltonian p = ParameterCollection( beta = beta, h_field = h_field, U = 5.0, ntau = 40, niw = 15, ) p.mu = 0.5*p.U # ------------------------------------------------------------------ print '--> Solving SIAM with parameters' print p # ------------------------------------------------------------------ up, do = 'up', 'dn' docc = c_dag(up,0) * c(up,0) * c_dag(do,0) * c(do,0) mA = c_dag(up,0) * c(up,0) - c_dag(do,0) * c(do,0) nA = c_dag(up,0) * c(up,0) + c_dag(do,0) * c(do,0) p.H = -p.mu * nA + p.U * docc + p.h_field * mA # ------------------------------------------------------------------ fundamental_operators = [c(up,0), c(do,0)] ed = TriqsExactDiagonalization(p.H, fundamental_operators, p.beta) g_tau = GfImTime(beta=beta, statistic='Fermion', n_points=40, indices=[0]) g_iw = GfImFreq(beta=beta, statistic='Fermion', n_points=10, indices=[0]) p.G_tau = BlockGf(name_list=[up,do], block_list=[g_tau]*2, make_copies=True) p.G_iw = BlockGf(name_list=[up,do], block_list=[g_iw]*2, make_copies=True) ed.set_g2_tau(p.G_tau[up], c(up,0), c_dag(up,0)) ed.set_g2_tau(p.G_tau[do], c(do,0), c_dag(do,0)) ed.set_g2_iwn(p.G_iw[up], c(up,0), c_dag(up,0)) ed.set_g2_iwn(p.G_iw[do], c(do,0), c_dag(do,0)) p.magnetization = ed.get_expectation_value(0.5 * mA) p.magnetization2 = ed.get_expectation_value(0.25 * mA * mA) # ------------------------------------------------------------------ # -- Store to hdf5 filename = 'data_pyed_h_field_%4.4f.h5' % h_field with HDFArchive(filename,'w') as res: res['p'] = p
O1 = dagger(o1) * o2 O1 = O1 + dagger(O1) ed_p = TriqsExactDiagonalization(m.H + F * O1, m.op_full, m.beta) ed_m = TriqsExactDiagonalization(m.H - F * O1, m.op_full, m.beta) p.g_tau_field[(i1, i2)] = g_tau.copy() ed_p.set_g2_tau_matrix(p.g_tau_field[(i1, i2)], m.op_imp) for i3, i4 in itertools.product(range(4), repeat=2): o3, o4 = m.op_imp[i3], m.op_imp[i4] O2 = dagger(o3) * o4 O2_vec = np.zeros(2, dtype=np.complex) O2_vec[0] = ed_m.get_expectation_value(O2) O2_vec[1] = ed_p.get_expectation_value(O2) p.chi_field[i1, i2, i3, i4] = -(O2_vec[1] - O2_vec[0])/(2*F) p.chi_field[i2, i1, i3, i4] = p.chi_field[i1, i2, i3, i4] chi_tau = p.chi[i1, i2, i3, i4] + p.chi[i2, i1, i3, i4] chi_field = p.chi_field[i1, i2, i3, i4] np.testing.assert_almost_equal(chi_tau, chi_field, decimal=3) if(np.abs(chi_tau.real) > 1e-6): print i1, i2, i3, i4 print 'chi_tau = %+2.6f' % chi_tau.real print 'chi_field = %+2.6f' % chi_field.real print 'diff = %+2.6E' % (chi_field.real - chi_tau.real)
def make_calc(beta=2.0, h_field=0.0): # ------------------------------------------------------------------ # -- Hubbard atom with two bath sites, Hamiltonian p = ParameterCollection( beta=beta, V1=2.0, V2=5.0, epsilon1=0.10, epsilon2=3.00, h_field=h_field, mu=0.0, U=5.0, ntau=800, niw=15, ) # ------------------------------------------------------------------ print '--> Solving SIAM with parameters' print p # ------------------------------------------------------------------ up, do = 'up', 'dn' docc = c_dag(up, 0) * c(up, 0) * c_dag(do, 0) * c(do, 0) mA = c_dag(up, 0) * c(up, 0) - c_dag(do, 0) * c(do, 0) nA = c_dag(up, 0) * c(up, 0) + c_dag(do, 0) * c(do, 0) nB = c_dag(up, 1) * c(up, 1) + c_dag(do, 1) * c(do, 1) nC = c_dag(up, 2) * c(up, 2) + c_dag(do, 2) * c(do, 2) p.H = -p.mu * nA + p.U * docc + p.h_field * mA + \ p.epsilon1 * nB + p.epsilon2 * nC + \ p.V1 * (c_dag(up,0)*c(up,1) + c_dag(up,1)*c(up,0) + \ c_dag(do,0)*c(do,1) + c_dag(do,1)*c(do,0) ) + \ p.V2 * (c_dag(up,0)*c(up,2) + c_dag(up,2)*c(up,0) + \ c_dag(do,0)*c(do,2) + c_dag(do,2)*c(do,0) ) # ------------------------------------------------------------------ fundamental_operators = [ c(up, 0), c(do, 0), c(up, 1), c(do, 1), c(up, 2), c(do, 2) ] ed = TriqsExactDiagonalization(p.H, fundamental_operators, p.beta) g_tau = GfImTime(beta=beta, statistic='Fermion', n_points=400, indices=[0]) g_iw = GfImFreq(beta=beta, statistic='Fermion', n_points=10, indices=[0]) p.G_tau = BlockGf(name_list=[up, do], block_list=[g_tau] * 2, make_copies=True) p.G_iw = BlockGf(name_list=[up, do], block_list=[g_iw] * 2, make_copies=True) ed.set_g2_tau(p.G_tau[up][0, 0], c(up, 0), c_dag(up, 0)) ed.set_g2_tau(p.G_tau[do][0, 0], c(do, 0), c_dag(do, 0)) ed.set_g2_iwn(p.G_iw[up][0, 0], c(up, 0), c_dag(up, 0)) ed.set_g2_iwn(p.G_iw[do][0, 0], c(do, 0), c_dag(do, 0)) p.magnetization = ed.get_expectation_value(0.5 * mA) p.O_tau = Gf(mesh=MeshImTime(beta, 'Fermion', 400), target_shape=[]) ed.set_g2_tau(p.O_tau, n(up, 0), n(do, 0)) p.O_tau.data[:] *= -1. p.exp_val = ed.get_expectation_value(n(up, 0) * n(do, 0)) # ------------------------------------------------------------------ # -- Store to hdf5 filename = 'data_pyed_h_field_%4.4f.h5' % h_field with HDFArchive(filename, 'w') as res: res['p'] = p
target_shape=(4, 4, 4, 4)) p.chi = np.zeros_like(p.chi_static) tau = np.array([float(tau) for tau in p.chi_tau.mesh]) for i1, i2, i3, i4, in itertools.product(range(4), repeat=4): print i1, i2, i3, i4 o1, o2, o3, o4 = m.op_imp[i1], m.op_imp[i2], m.op_imp[i3], m.op_imp[i4] O1 = dagger(o1) * o2 O2 = dagger(o3) * o4 p.O1_exp[i1, i2] = ed.get_expectation_value(O1) p.O2_exp[i3, i4] = ed.get_expectation_value(O2) p.chi_dissconn[i1, i2, i3, i4] = p.O1_exp[i1, i2] * p.O2_exp[i3, i4] p.chi_static[i1, i2, i3, i4] = ed.get_expectation_value(O1 * O2) ed.set_g2_tau(p.chi_tau[i1, i2, i3, i4], O1, O2) chi_tau = p.chi_tau[i1, i2, i3, i4] chi_tau *= -1. # cancel gf -1 prefactor chi_dissconn = p.chi_dissconn[i1, i2, i3, i4] chi_tau.data[:] -= chi_dissconn p.chi[i1, i2, i3, i4] = np.trapz(chi_tau.data, x=tau) / m.beta