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
Beispiel #3
0
    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
Beispiel #5
0
    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
Beispiel #6
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()