Example #1
0
    def get_flip_error(self, eta, L):
        """Return the flip-error R = abs(a/b)."""
        self.kwargs["eta"] = eta
        self.kwargs["L"] = L

        # flip-error R0
        self.kwargs["loop_direction"] = "-"
        WG = Dirichlet(**self.kwargs)
        _, b0, b1 = WG.solve_ODE()
        R0_b0 = abs(b0[-1])
        R0_b1 = abs(b1[-1])
        R0 = abs(b0[-1] / b1[-1])

        # flip-error R1
        self.kwargs["loop_direction"] = "+"
        WG = Dirichlet(**self.kwargs)
        _, b0, b1 = WG.solve_ODE()
        R1_b0 = abs(b0[-1])
        R1_b1 = abs(b1[-1])
        R1 = abs(b0[-1] / b1[-1])

        self.f.write(
            ("{:>12}{:>10}{:>20}{:>20}" "{:>20}{:>20}{:>20}{:>20}").format(eta, L, R0, R0_b0, R0_b1, R1, R1_b0, R1_b1)
        )
        return R0, R1
    def update_boundary(eps, delta):
        L = abs(2*np.pi/(kr + delta))

        # choose discretization such that r_nx < len(x_range)
        r_nx_L = (L*(N*pphw + 1)).astype(int)
        x_range = np.linspace(0, L, r_nx_L)

        # no Delta-phase necessary if looking at loop_type constant!
        WG = Dirichlet(loop_type='Constant', N=N, L=L, W=W, eta=eta)

        xi_lower, xi_upper = WG.get_boundary(x=x_range, eps=eps, delta=delta)
        print "lower.boundary.shape", xi_lower.shape

        np.savetxt("lower.boundary", zip(x_range, xi_lower))
        np.savetxt("upper.boundary", zip(x_range, xi_upper))

        N_file_boundary = len(x_range)
        replacements = {'NAME': CALC_NAME,
                        'LENGTH': str(L),
                        'WIDTH': str(W),
                        'MODES': str(N),
                        'PPHW': str(pphw),
                        'GAMMA0': str(eta),
                        'NEUMANN': "0",
                        'N_FILE_BOUNDARY': str(N_file_boundary),
                        'BOUNDARY_UPPER': 'upper.boundary',
                        'BOUNDARY_LOWER': 'lower.boundary'}

        replace_in_file(xml_template, xml, **replacements)
Example #3
0
def circle_EP(filename=None, write_profile=False, **kwargs):
    """Calculate trajectories around the EP."""

    f = FileOperations(filename)

    WG = Dirichlet(**kwargs)

    ##
    # plot amplitudes b0(x), b1(x)
    ##
    ax0 = plt.subplot2grid((3, 3), (0, 0), colspan=2)
    ax0.set_label("x [a.u.]")
    ax0.set_xlabel(r"x [a.u.]")
    ax0.set_ylabel(r"Amplitudes $|b_n(x)|$")
    set_scientific_axes(ax0)

    x, b0, b1 = WG.solve_ODE()

    # get adiabatic predictions
    b0_ad, b1_ad = (WG.Psi_adiabatic[:, 0], WG.Psi_adiabatic[:, 1])

    # account for initial population of states a and b
    b0_ad *= abs(b0[0])
    b1_ad *= abs(b1[0])

    ax0.semilogy(x, abs(b0), "r-", label=r"$|b_0|$")
    ax0.semilogy(x, abs(b1), "g-", label=r"$|b_1|$")
    ax0.semilogy(x, abs(b0_ad), "b--", label=r"$|b_0^{\mathrm{ad}}|$")
    ax0.semilogy(x, abs(b1_ad), "k--", label=r"$|b_1^{\mathrm{ad}}|$")

    f.write("")
    f.write("Diodicity D = {}".format(abs(b0[-1]) / abs(b1[-1])))
    f.write("Diodicity D^-1 = {}".format(abs(b1[-1]) / abs(b0[-1])))

    plt.rcParams.update({"font.size": 8})

    plt.legend(
        bbox_to_anchor=(0.0, 1.02, 1.0, 0.102),
        loc=3,
        ncol=4,
        mode="expand",
        borderaxespad=0.0,
        labelspacing=0.2,
        columnspacing=0.5,
        handlelength=3,
        handletextpad=0.2,
    )

    ##
    # plot real/imag(E1(t)), imag(E2(t))
    ##
    ax1 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
    ax2 = ax1.twinx()
    set_scientific_axes(ax1, axis="y")
    set_scientific_axes(ax2, axis="y")

    Ea, Eb = WG.eVals[:, 0], WG.eVals[:, 1]

    ax1.set_xlabel("x [a.u.]")
    ax1.set_ylabel("Energy")
    ax1.yaxis.set_label_position("left")
    ax1.plot(x, Ea.imag, "r-", label=r"$\mathrm{Im}(E_0)$")
    ax1.plot(x, Eb.imag, "g-", label=r"$\mathrm{Im}(E_1)$")
    ax2.plot(x, Ea.real, "r--", label=r"$\mathrm{Re}(E_0)$")
    ax2.plot(x, Eb.real, "g--", label=r"$\mathrm{Re}(E_1)$")

    t_imag = map_trajectory(b0, b1, Ea.imag, Eb.imag)
    t_real = map_trajectory(b0, b1, Ea.real, Eb.real)
    ax1.plot(x, t_imag, "k-")
    ax2.plot(x, t_real, "k--")

    lines1, labels1 = ax1.get_legend_handles_labels()
    lines2, labels2 = ax2.get_legend_handles_labels()
    ax2.legend(
        lines1 + lines2,
        labels1 + labels2,
        bbox_to_anchor=(0.0, 1.02, 1.0, 0.102),
        loc=3,
        ncol=4,
        mode="expand",
        borderaxespad=0.0,
        labelspacing=0.2,
        columnspacing=0.5,
        handlelength=2.5,
        handletextpad=0.2,
    )

    ##
    # plot wavefunction
    ##
    x0, y0 = WG.get_cycle_parameters(0.0)
    x1, y1 = WG.get_cycle_parameters(WG.t)
    ####
    ####ax3 = subplot2grid((3,3), (2,0), colspan=2)
    ####WG.draw_wavefunction()
    ####WG.draw_dissipation_coefficient()
    ####WG.draw_boundary()
    ####tick_params(labelleft='off', left='off', right='off')
    ####ax3.set_xlabel("x [a.u.]")
    ####ax3.set_frame_on(False)
    # ax3.xaxis.set_ticklabels([])
    # ax3.get_xaxis().tick_bottom()

    ##
    # plot path around EP
    ##
    ax4 = plt.subplot2grid((3, 3), (2, 0))
    set_scientific_axes(ax4, axis="both")
    ax4.xaxis.set_label_position("top")
    ax4.yaxis.set_label_position("right")
    plt.xticks(rotation=30)

    ax4.set_xlabel(r"$\epsilon$", fontsize=10)
    ax4.set_ylabel(r"$\delta$", fontsize=10)
    dx = dy = 0.5e-2
    # ax4.set_xlim(min(x1)-dx, max(x1)+dx)
    # ax4.set_ylim(min(y1)-dy, max(y1)+dy)

    offset = WG.tN / 5.0
    dx1 = np.diff(x1)
    dy1 = np.diff(y1)
    plt.plot(x1[:], y1[:], "grey", ls="dotted")
    plt.plot(x0, y0, "ro", mew=0.0, mec="r")
    plt.plot([WG.x_EP, -WG.x_EP], [WG.y_EP, WG.y_EP], "ko")

    plt.quiver(
        x1[offset:-1:offset],
        y1[offset:-1:offset],
        dx1[offset::offset],
        dy1[offset::offset],
        units="xy",
        angles="xy",
        headwidth=6.0,
        color="k",
        zorder=10,
    )
    # ylim(-0.1,0.1)
    # text(WG.x_EP - WG.x_R0*0.2,
    #     WG.y_EP + WG.y_R0*4, "EP")

    ##
    # save figure
    ##
    # tight_layout()
    plt.subplots_adjust(  # left=0.125,
        bottom=None,
        # right=0.9,
        top=None,
        wspace=0.5,
        hspace=0.6,
    )

    filename = "{0}_{1}".format(filename, kwargs.get("loop_direction"))
    f.write(filename + ".cfg")
    # plt.savefig(filename + ".pdf")
    plt.savefig(filename + ".png")
    if write_profile:
        xi_lower, _ = WG.get_boundary()
        np.savetxt(filename + ".profile", zip(WG.t, xi_lower))
    plt.clf()