def _do_ramp(psi_0, H, basis, v, E_final, V_final): """ Auxiliary function to evolve the state and calculate the entropies after the ramp. --- arguments --- psi_0: initial state H: time-dependent Hamiltonian basis: spin_basis_1d object containing the spin basis (required for Sent) E_final, V_final: eigensystem of H(t_f) at the end of the ramp t_f=1/(2v) """ # determine total ramp time t_f = 0.5 / v # time-evolve state from time 0.0 to time t_f psi = H.evolve(psi_0, 0.0, t_f) # calculate entanglement entropy subsys = range(basis.L // 2) # define subsystem Sent = ent_entropy(psi, basis, chain_subsys=subsys)["Sent"] # calculate diagonal entropy in the basis of H(t_f) S_d = diag_ensemble(basis.L, psi, E_final, V_final, Sd_Renyi=True)["Sd_pure"] # return np.asarray([S_d, Sent])
DE_args = { "density": randint(2), "alpha": uniform(5), "rho_d": True, "Srdm_args": { "basis": basis } } ### pure state DE = diag_ensemble(L, psi0, E2, V2, Obs=O_zxz, delta_t_Obs=False, delta_q_Obs=False, Sd_Renyi=False, Srdm_Renyi=False, **DE_args) DE = diag_ensemble(L, psi0, E2, V2, Obs=O_zxz, delta_t_Obs=True, delta_q_Obs=False, Sd_Renyi=False, Srdm_Renyi=False, **DE_args) DE = diag_ensemble(L,
# H1=O_pm+O_zxz H2=O_pm-O_zxz # diagonalise H E1,V1 = H1.eigh() E2,V2 = H2.eigh() psi0=V1[:,0] rho0=np.outer(psi0.conj(),psi0) alpha=uniform(5) DE_args={"densities":randint(2),"alpha":uniform(5),"rho_d":True,"Srdm_args":{"basis":basis}} ### pure state DE = diag_ensemble(L,psi0,E2,V2,Obs=O_zxz,delta_t_Obs=False,delta_q_Obs=False,Sd_Renyi=False,Srdm_Renyi=False,**DE_args) DE = diag_ensemble(L,psi0,E2,V2,Obs=O_zxz,delta_t_Obs=True,delta_q_Obs=False,Sd_Renyi=False,Srdm_Renyi=False,**DE_args) DE = diag_ensemble(L,psi0,E2,V2,Obs=O_zxz,delta_t_Obs=True,delta_q_Obs=True,Sd_Renyi=False,Srdm_Renyi=False,**DE_args) DE = diag_ensemble(L,psi0,E2,V2,Obs=O_zxz,delta_t_Obs=True,delta_q_Obs=True,Sd_Renyi=True,Srdm_Renyi=False,**DE_args) DE = diag_ensemble(L,psi0,E2,V2,Obs=O_zxz,delta_t_Obs=True,delta_q_Obs=True,Sd_Renyi=True,Srdm_Renyi=True,**DE_args) ### DM DE = diag_ensemble(L,rho0,E2,V2,Obs=O_zxz,delta_t_Obs=False,delta_q_Obs=False,Sd_Renyi=False,Srdm_Renyi=False,**DE_args) DE = diag_ensemble(L,rho0,E2,V2,Obs=O_zxz,delta_t_Obs=True,delta_q_Obs=False,Sd_Renyi=False,Srdm_Renyi=False,**DE_args) DE = diag_ensemble(L,rho0,E2,V2,Obs=O_zxz,delta_t_Obs=True,delta_q_Obs=True,Sd_Renyi=False,Srdm_Renyi=False,**DE_args) DE = diag_ensemble(L,rho0,E2,V2,Obs=O_zxz,delta_t_Obs=True,delta_q_Obs=True,Sd_Renyi=True,Srdm_Renyi=False,**DE_args) DE = diag_ensemble(L,rho0,E2,V2,Obs=O_zxz,delta_t_Obs=True,delta_q_Obs=True,Sd_Renyi=True,Srdm_Renyi=True,**DE_args) ### thermal average beta=[10.0,1.0,0.1] in_state={'V1':V1,'E1':E1,'f_args':[beta],'V1_state':[0,2,4,6]}
# alternative way by solving Schroedinger's eqn psi_t = H.evolve(psi_i, t.i, t.vals, rtol=1E-9, atol=1E-9) meas = obs_vs_time(psi_t, t.vals, {"E_time": HF_02 / L}, Sent_args=Sent_args) #""" # read off measurements Energy_t = meas["E_time"] Entropy_t = meas["Sent_time"]["Sent"] # ##### calculate diagonal ensemble measurements DE_args = { "Obs": HF_02, "Sd_Renyi": True, "Srdm_Renyi": True, "Srdm_args": Sent_args } DE = diag_ensemble(L, psi_i, EF, VF, **DE_args) Ed = DE["Obs_pure"] Sd = DE["Sd_pure"] Srdm = DE["Srdm_pure"] # ##### plot results ##### import matplotlib.pyplot as plt import pylab # define legend labels str_E_t = "$\\mathcal{E}(lT)$" str_Sent_t = "$s_\mathrm{ent}(lT)$" str_Ed = "$\\overline{\mathcal{E}}$" str_Srdm = "$\\overline{s}_\mathrm{rdm}$" str_Sd = "$s_d^F$" # plot infinite-time data fig = plt.figure()
from quspin.operators import hamiltonian # Hamiltonians and operators from quspin.basis import spin_basis_1d # Hilbert space spin basis from quspin.tools.measurements import diag_ensemble import numpy as np # generic math functions # L=12 # syste size # coupling strenghts J=1.0 # spin-spin coupling h=0.8945 # x-field strength g=0.945 # z-field strength # create site-coupling lists J_zz=[[J,i,(i+1)%L] for i in range(L)] # PBC x_field=[[h,i] for i in range(L)] z_field=[[g,i] for i in range(L)] # create static and dynamic lists static_1=[["x",x_field],["z",z_field]] static_2=[["zz",J_zz],["x",x_field],["z",z_field]] dynamic=[] # create spin-1/2 basis basis=spin_basis_1d(L,kblock=0,pblock=1) # set up Hamiltonian H1=hamiltonian(static_1,dynamic,basis=basis,dtype=np.float64) H2=hamiltonian(static_2,dynamic,basis=basis,dtype=np.float64) # compute eigensystems of H1 and H2 E1,V1=H1.eigh() psi1=V1[:,14] # pick any state as initial state E2,V2=H2.eigh() # # calculate long-time (diagonal ensemble) expectations of H1 and its temporal fluctuations Diag_Ens=diag_ensemble(L,psi1,E2,V2,Obs=H1,delta_t_Obs=True) print(Diag_Ens['Obs_pure'],Diag_Ens['delta_t_Obs_pure'])