def H_tracking_evolution_equation(current_time, gamma, fermihubbard, observables, J_target): D = fermihubbard.operator_dict['hop_left_op'].expt_value(gamma[:-1]) phi = fixed_point(H_tracking_implicit_phi_function, observables.phi[-1], args=(gamma, J_target(current_time), fermihubbard, observables)) # phi = 0 psi_dot = -expiphi(phi) * fermihubbard.perimeter_params.t \ * fermihubbard.operator_dict['hop_left_op'].dot(gamma[:-1]) psi_dot -= expiphiconj(phi) * fermihubbard.perimeter_params.t \ * fermihubbard.operator_dict['hop_right_op'].dot(gamma[:-1]) psi_dot += fermihubbard.operator_dict['H_onsite'].dot(gamma[:-1]) y_dot = -(-fermihubbard.perimeter_params.t * (expiphi(phi) * D + expiphiconj(phi) * D.conj()) + fermihubbard.operator_dict['H_onsite'].expt_value(gamma[:-1]))\ * (J_target.derivative())(current_time)/(J_target(current_time)**2) gamma_dot = np.append(psi_dot, y_dot) return gamma_dot
def R_tracking_evolution_equation(current_time, gamma, fermihubbard, observables, J_target): D = fermihubbard.operator_dict['hop_left_op'].expt_value(gamma[:-1]) comm = fermihubbard.operator_dict['commutator_HK'].expt_value(gamma[:-1]) R = np.abs(D) theta = np.angle(D) a = fermihubbard.perimeter_params.a t = fermihubbard.perimeter_params.t J_dot_target = J_target.derivative() R_dot = (comm.real * D.imag - comm.imag * D.real) / R # theta_dot = (comm.imag * D.imag + comm.real * D.real)/R**2 phi = observables.phi_init + theta - gamma[-1] psi_dot = -expiphi( phi) * t * fermihubbard.operator_dict['hop_left_op'].dot(gamma[:-1]) psi_dot -= expiphiconj( phi) * t * fermihubbard.operator_dict['hop_right_op'].dot(gamma[:-1]) psi_dot += fermihubbard.operator_dict['H_onsite'].dot(gamma[:-1]) psi_dot = -1j * psi_dot y_dot = (J_dot_target(current_time) / (2 * a * t) + R_dot * np.sin(phi - theta)) / (R * np.cos(phi - theta)) gamma_dot = np.append(psi_dot, y_dot) return gamma_dot
def append_observables(self, psi, phi): self.neighbour.append( self.fermihubbard.operator_dict['hop_left_op'].expt_value(psi)) self.current.append(-1j * self.fermihubbard.perimeter_params.a * self.fermihubbard.perimeter_params.t * (expiphi(phi) * self.neighbour[-1] - expiphiconj(phi) * self.neighbour[-1].conj())) self.energy.append( -self.fermihubbard.perimeter_params.t * (expiphi(phi) * self.neighbour[-1] + expiphiconj(phi) * self.neighbour[-1].conj()) + self.fermihubbard.operator_dict['H_onsite'].expt_value(psi)) while abs(phi.real - self.phi[-1].real) > PI: if phi.real - self.phi[-1].real > PI: phi -= 2 * PI elif phi.real - self.phi[-1].real < -PI: phi += 2 * PI self.phi.append(phi) if self.continuity: self.number.append( self.fermihubbard.operator_dict['n'].expt_value(psi)) for _ in range(self.fermihubbard.perimeter_params.nx - 1): self.numbersite[_].append( self.fermihubbard.operator_dict["num" + str(_)].expt_value(psi)) K_t = expiphi(phi) * self.fermihubbard.operator_dict[ "K" + str(_)].expt_value(psi) self.currentsite[_].append( -1j * self.fermihubbard.perimeter_params.t * self.fermihubbard.perimeter_params.a * (K_t - K_t.conj())) if self.fermihubbard.perimeter_params.pbc: self.numbersite[self.fermihubbard.perimeter_params.nx - 1].append( self.fermihubbard.operator_dict["num5"]. expt_value(psi)) K_t = expiphi(phi) * self.fermihubbard.operator_dict[ "K5"].expt_value(psi) self.currentsite[self.fermihubbard.perimeter_params.nx - 1].append( -1j * self.fermihubbard.perimeter_params.t * self.fermihubbard.perimeter_params.a * (K_t - K_t.conj()))
def H_tracking_implicit_phi_function(phi_j0, gamma, J_target, fermihubbard, observables): D = fermihubbard.operator_dict['hop_left_op'].expt_value(gamma[:-1]) a = fermihubbard.perimeter_params.a t = fermihubbard.perimeter_params.t expi = expiphi(phi_j0) doub = fermihubbard.operator_dict['H_onsite'].expt_value(gamma[:-1]) phi_0 = observables.phi_init bt = observables.boundary_term phi_j1 = -a * (-t * (expi * D + (expi * D).conj()) + doub) / J_target + phi_0 + a * gamma[-1] + bt return phi_j1.real
def switch_tracking_methods(self, method, fermihubbard, psi, J_target): if method == "R2H": D = fermihubbard.operator_dict['hop_left_op'].expt_value(psi) self.phi_init = self.phi[-1] self.boundary_term = fermihubbard.perimeter_params.a \ * (-fermihubbard.perimeter_params.t * (expiphi(self.phi_init) * D + expiphiconj(self.phi_init) * fermihubbard.perimeter_params.t * D.conj()) + fermihubbard.operator_dict['H_onsite'].expt_value(psi))/J_target elif method == "H2R": self.phi_init = self.phi[-1] self.boundary_term = 0.0 return 0.0
def __init__(self, psi_init, J_init, phi_init, fermihubbard, continuity=0): self.fermihubbard = fermihubbard self.psi = [ psi_init, ] self.neighbour = [ fermihubbard.operator_dict['hop_left_op'].expt_value(psi_init), ] self.current = [ J_init, ] self.phi = [ phi_init, ] D = self.neighbour[-1] expi = expiphi(phi_init) doub = fermihubbard.operator_dict['H_onsite'].expt_value(psi_init) a = fermihubbard.perimeter_params.a t = fermihubbard.perimeter_params.t self.energy = [ -t * (D * expi + (D * expi).conj()) + doub, ] # self.y = 0 # self.psi = psi_init self.phi_init = phi_init if np.isclose(J_init, 0): self.boundary_term = 0 else: self.boundary_term = a * self.energy[-1] / J_init self.number = [ self.fermihubbard.perimeter_params.nup + self.fermihubbard.perimeter_params.ndown, ] self.numbersite = [ [], ] self.currentsite = [ [], ] self.continuity = continuity if self.continuity: for _ in range(self.fermihubbard.perimeter_params.nx - 1): self.numbersite.append([]) self.currentsite.append([]) for _ in range(self.fermihubbard.perimeter_params.nx - 1): self.numbersite[_] = [ self.fermihubbard.operator_dict["num" + str(_)].expt_value( psi_init), ] K_t = expiphi(phi_init) * self.fermihubbard.operator_dict[ "K" + str(_)].expt_value(psi_init) self.currentsite[_] = [ -1j * self.fermihubbard.perimeter_params.t * self.fermihubbard.perimeter_params.a * (K_t - K_t.conj()), ] if self.fermihubbard.perimeter_params.pbc: self.numbersite[self.fermihubbard.perimeter_params.nx - 1].append( self.fermihubbard.operator_dict["num5"]. expt_value(psi_init)) K_t = expiphi(phi_init) * self.fermihubbard.operator_dict[ "K5"].expt_value(psi_init) self.currentsite[self.fermihubbard.perimeter_params.nx - 1].append( -1j * self.fermihubbard.perimeter_params.t * self.fermihubbard.perimeter_params.a * (K_t - K_t.conj())) self.add_var = dict()