コード例 #1
0
ファイル: runDMRGfull.py プロジェクト: vegaandagev/T-Nalg
para['l'] = 10  # number of sites
para['jxy'] = 0  # Jxy coupling constant
para['jz'] = 1  # Jz coupling constant
para['hx'] = 0.5  # magnetic field in x direction
para['hz'] = 0  # magnetic field in z direction
para['alpha'] = 0  # decaying parameter of the interaction strength
para['chi'] = 80  # dimension cut-off of DMRG
para['bound_cond'] = 'open'  # boundary condition: open or periodic
para['is_pauli'] = True
para['data_path'] = '.\\data_dmrg\\fullyConnected\\'
mkdir(para['data_path'])

nt = len(theta)
na = len(alpha)
for n1 in range(0, nt):
    for n2 in range(0, na):
        para['theta'] = theta[n1]
        para['alpha'] = alpha[n2]
        para['hx'] = np.cos(theta[n1])
        para['jz'] = np.sin(theta[n1])
        para = pm.make_consistent_parameter_dmrg(para)
        # Run DMRG
        ob, A, info, para = dmrg.dmrg_finite_size(para)
        save(para['data_path'], para['data_exp'] + '.pr', (ob, A, info, para),
             ('ob', 'A', 'info', 'para'))

# Calculate the two-body RDM of the p1 and p2 sites
# p1 = 2
# p2 = 3
# rho = A.reduced_density_matrix_two_body(p1, p2)
コード例 #2
0
def super_orthogonalization_honeycomb(para=None):
    if para is None:
        para = pm.generate_parameters_so_honeycomb()
    peps = PepsInfinite(para['lattice'], para['chi'], para['state_type'],
                        ini_way=para['ini_way'], is_debug=para['is_debug'])
    h = hm.hamiltonian_heisenberg(para['spin'], para['jxy'], para['jxy'], para['jz'],
                                  para['hx'], para['hz'])
    op = hm.spin_operators(para['spin'])
    ob = dict()
    if para['state_type'] is 'pure':
        ob['mx'] = np.zeros((para['tau'].__len__(), peps.nTensor))
        ob['mz'] = np.zeros((para['tau'].__len__(), peps.nTensor))
        ob['eb'] = np.zeros((para['tau'].__len__(), peps.nLm))
    else:
        ob['mx'] = np.zeros((para['beta'].__len__(), peps.nTensor))
        ob['mz'] = np.zeros((para['beta'].__len__(), peps.nTensor))
        ob['eb'] = np.zeros((para['beta'].__len__(), peps.nLm))
        ob['e_site'] = np.zeros((para['beta'].__len__(), ))
    if para['state_type'] is 'pure':
        for n_tau in range(0, para['tau'].__len__()):
            gate_t = hm.hamiltonian2gate_tensors(h, para['tau'][n_tau], 'exp')
            eb0 = np.ones((peps.nLm, ))
            eb = np.zeros((peps.nLm, ))
            for t in range(1, round(para['beta']/para['tau'][n_tau]) + 1):
                for n_lm in range(0, peps.nLm):
                    peps.evolve_once_tensor_and_lm(gate_t[0], gate_t[1], n_lm)
                    if para['so_time'] == 0:
                        peps.super_orthogonalization(n_lm)
                    else:
                        peps.super_orthogonalization('all', it_time=para['so_time'])
                    # if is_debug:
                    #     peps.check_super_orthogonality()
                if t % para['dt_ob'] == 0:
                    rho2 = peps.rho_two_body_simple('all')
                    for nr in range(0, peps.nLm):
                        eb[nr] = rho2[nr].reshape(1, -1).dot(h.reshape(-1, 1))
                    if para['if_print']:
                        print('For tau = %g, t = %g: ' % (para['tau'][n_tau], t) +
                              'bond energy  = ' + str(eb))
                    err = np.linalg.norm(eb0 - eb)
                    if err < para['tol']:
                        ob['eb'][n_tau, :] = eb.copy()
                        rho1 = peps.rho_one_body_simple('all')
                        for nr in range(0, peps.nTensor):
                            ob['mx'][n_tau, nr] = rho1[nr].reshape(1, -1).dot(op['sx'].reshape(-1, 1))
                            ob['mz'][n_tau, nr] = rho1[nr].reshape(1, -1).dot(op['sz'].reshape(-1, 1))
                        if para['if_print']:
                            print('Converged with error = %g' % err)
                        break
                    else:
                        eb0 = eb.copy()
    elif para['state_type'] is 'mixed':
        gate_t = hm.hamiltonian2gate_tensors(h, para['tau'], 'exp')
        beta_now = 0
        t_ob = 0
        for t in range(0, int(1e-6 + para['beta'][-1]/para['tau'])):
            for n_lm in range(0, peps.nLm):
                peps.evolve_once_tensor_and_lm(gate_t[0], gate_t[1], n_lm)
                if para['so_time'] == 0:
                    peps.super_orthogonalization(n_lm)
                else:
                    peps.super_orthogonalization('all', it_time=para['so_time'])
                # if is_debug:
                #     peps.check_super_orthogonality()
            beta_now += para['tau']
            if abs(para['beta'][t_ob] - beta_now) < 1e-8:
                rho2 = peps.rho_two_body_simple('all')
                for nr in range(0, peps.nLm):
                    ob['eb'][t_ob, nr] = rho2[nr].reshape(1, -1).dot(h.reshape(-1, 1))
                ob['e_site'][t_ob] = np.sum(ob['eb'][t_ob, :]) / 2
                if para['if_print']:
                    print('For beta = %g: ' % beta_now + 'energy per site  = ' + str(ob['e_site'][t_ob]))
                rho1 = peps.rho_one_body_simple('all')
                for nr in range(0, peps.nTensor):
                    ob['mx'][t_ob, nr] = rho1[nr].reshape(1, -1).dot(op['sx'].reshape(-1, 1))
                    ob['mz'][t_ob, nr] = rho1[nr].reshape(1, -1).dot(op['sz'].reshape(-1, 1))
                t_ob += 1
    para['data_exp'] = 'HoneycombSO_' + para['state_type'] + '_j(%g,%g)_h(%g,%g)_chi%d' % \
                       (para['jxy'], para['jz'], para['hx'], para['hz'],
                        para['chi'])
    save(para['data_path'], para['data_exp'], [peps, para, ob], ['peps', 'para', 'ob'])