예제 #1
0
def get_transformed_Haldanechain(L=__L__):
    #transformed Heisenberg
    spins = ["S=1" for i in range(L)]  # S=1 chain
    sc2 = spinchain.Spin_Chain(spins)  # create spin chain object
    h = 0  # initialize Hamiltonian
    for i in range(len(spins) - 1):
        expSx = -2 * sc2.Sx[i + 1] * sc2.Sx[i + 1] + mo.obj2MO(1)
        expSz = -2 * sc2.Sz[i] * sc2.Sz[i] + mo.obj2MO(1)
        h = h + sc2.Sx[i] * sc2.Sx[i + 1]
        h = h + sc2.Sy[i] * expSz * expSx * sc2.Sy[i + 1]
        h = h + sc2.Sz[i] * sc2.Sz[i + 1]
    sc2.set_hamiltonian(h)
    return sc2
예제 #2
0
import numpy as np
import matplotlib.pyplot as plt
from dmrgpy import fermionchain
from dmrgpy import multioperator
n = 8
fc = fermionchain.Fermionic_Chain(n, spinful=False)  # create the chain
m = np.matrix(np.random.random((n, n)) + 1j * np.random.random((n, n)))
m = m + m.H


def ft(i, j):
    return m[i, j]
    if abs(j - i) == 1: return 1.0
    return 0.0


fc.set_hoppings(ft)  # hoppings

den = 0

for i in range(n):  # loop over sites
    deni = multioperator.obj2MO([["N", i]])
    den = den + deni

print("Total density with DMRG", fc.excited_vev(den, mode="DMRG", n=4).real)
print("Total density with ED", fc.excited_vev(den, mode="ED", n=4).real)

print("Energies with DMRG", fc.get_excited(mode="DMRG", n=4).real)
print("Energies with ED", fc.get_excited(mode="ED", n=4).real)
예제 #3
0
sys.path.append(os.getcwd() + '/../../src')
import numpy as np
from dmrgpy import spinchain, multioperator
from openfermion.ops import QubitOperator
from ..Utilities.WaveLocalProperties import two_DM_to_one_DMs, entropy_one_DM

"""
The file provides functions for classical precalculation by dmrgpy
Exact Diagonalization (ED) and Density Matrix Renormalization Group (DMRG) can be used
The output is the ground state energy and a array of two-body reduced density matrices
The main function is run_classcal_precalculation()
"""

MAX_N_QUBIT = 40
PauliX_MO = [2 * multioperator.obj2MO([["Sx", i]]) for i in range(MAX_N_QUBIT)]
PauliY_MO = [2 * multioperator.obj2MO([["Sy", i]]) for i in range(MAX_N_QUBIT)]
PauliZ_MO = [2 * multioperator.obj2MO([["Sz", i]]) for i in range(MAX_N_QUBIT)]
PauliMO = [None, PauliX_MO, PauliY_MO, PauliZ_MO]

MatI = np.array([[1, 0], [0, 1]], np.complex)
MatX = np.array([[0, 1], [1, 0]], np.complex)
MatY = np.array([[0, -1j], [1j, 0]], np.complex)
MatZ = np.array([[1, 0], [0, -1]], np.complex)
PauliMat = [MatI, MatX, MatY, MatZ]
PauliChar = ['I', 'X', 'Y', 'Z']


def get_one_two_density_matrix(n_qubit, spinchain):
    twodensity = np.array([[np.kron(MatI, MatI)] * n_qubit] * n_qubit)
    onedensity = [MatI] * n_qubit
예제 #4
0
m = m + m.H


def ft(i, j):
    return m[i, j]
    if abs(j - i) == 1: return 1.0
    return 0.0


h = 0
for i in range(n):
    for j in range(n):
        h = h + fc.Cdag[i] * fc.C[j] * ft(i, j)

fc.set_hamiltonian(h)  # hoppings

print("Energy with ED", fc.gs_energy(mode="ED"))
print("Energy with DMRG", fc.gs_energy(mode="DMRG"))

pairs = [(0, i) for i in range(n)]

den = []

for i in range(n):  # loop over sites
    cd = multioperator.obj2MO([["Cdag", i]])
    c = multioperator.obj2MO([["C", i]])
    den.append(cd * c)

print("Density DMRG", [fc.vev(di, mode="DMRG").real for di in den])
print("Density ED", [fc.vev(di, mode="ED").real for di in den])