예제 #1
0
    def test_differential_correction(self):
        """ Test solution obtained using differential correction """

        MASS_A = 1.0
        MASS_B = 1.0

        SADDLE_ENERGY = 0.0  # Energy of the saddle
        ALPHA = 1.00
        BETA = 1.00
        OMEGA = 1
        EPSILON = 0.00  # uncoupled
        parameters = np.array([MASS_A, MASS_B, SADDLE_ENERGY, \
                            ALPHA, BETA, OMEGA, EPSILON])

        deltaE_vals = [0.1]
        linecolors = ['b']
        save_final_plot = False
        show_final_plot = True
        diff_corr_unc.upo(deltaE_vals, linecolors, \
                            save_final_plot, show_final_plot)

        TSPAN = [0, 30]  # arbitrary range, just to finish the integration
        RelTol = 3.e-12
        AbsTol = 1.e-12

        for deltaE_val in deltaE_vals:
            # po_fam_file = "x0_diffcorr_deltaE%s_uncoupled.dat" %(deltaE_val)
            with open(path_to_data + "x0_diffcorr_deltaE%s_uncoupled.dat" %
                      (deltaE_val)) as po_fam_file:
                x0podata = np.loadtxt(po_fam_file.name)
                x0po_diffcorr = x0podata[0:4]
                # print(x0po_diffcorr)

            f = lambda t, x: uncoupled.ham2dof_uncoupled(t, x, parameters)
            soln = solve_ivp(f, TSPAN, x0po_diffcorr,method='RK45',dense_output=True, \
                 events = lambda t,x : uncoupled.half_period_uncoupled(t,x,parameters), \
                 rtol=RelTol, atol=AbsTol)

            te = soln.t_events[0]
            tt = [0, te[2]]
            t,x_diffcorr,phi_t1,PHI = diffcorr.state_transit_matrix(
                tt, x0po_diffcorr, parameters, \
                uncoupled.variational_eqns_uncoupled)

            total_energy = deltaE_val + parameters[2]
            y, py = uncoupled.upo_analytical(total_energy, t, parameters)

            numerical_orbit = np.array([x_diffcorr[:, 1], x_diffcorr[:, 3]])
            analytical_orbit = np.array([y, py])

            np.testing.assert_array_almost_equal(numerical_orbit,
                                                 analytical_orbit)

            hausd_dist = hausd_dist_numeric_analytic(x_diffcorr, t, deltaE_val,
                                                     parameters)
            self.assertLessEqual(hausd_dist, 1e-8)
예제 #2
0
def upo(deltaE_vals, linecolor, \
        save_final_plot = True, show_final_plot = False):
    
    eqNum = 1 
    eqPt = tp.get_eq_pts(eqNum, uncoupled.init_guess_eqpt_uncoupled, \
                        uncoupled.grad_pot_uncoupled, parameters)


    for i in range(len(deltaE_vals)):
        
        e = deltaE_vals[i] # total energy
        n = 12 # number of intervals we want to divide
        n_turn = 1 # nth turning point we want to choose
        deltaE = e - parameters[2]
        
        #Trial initial Condition s.t. one initial condition is on the LHS of the UPO and the 
        #other one is on the RHS of the UPO
        
        state0_2 = [-0.1 , -math.sqrt(2*e+0.1**2-0.5*0.1**4),0.0,0.0]
        state0_3 = [0.11 , -math.sqrt(2*e+0.11**2-0.5*0.11**4),0.0,0.0]
        
        with open("x0_turningpoint_deltaE%s_uncoupled.dat" %(deltaE),'a+') as po_fam_file:
            [x0po_1, T_1,energyPO_1] = tp.turningPoint(
                state0_2, state0_3, uncoupled.get_coord_uncoupled, \
                uncoupled.guess_coords_uncoupled, uncoupled.ham2dof_uncoupled, \
                uncoupled.half_period_uncoupled, uncoupled.variational_eqns_uncoupled, \
                uncoupled.pot_energy_uncoupled, uncoupled.plot_iter_orbit_uncoupled, \
                parameters, e, n, n_turn, show_itrsteps_plots, po_fam_file) 



    #%% Load periodic orbit data from ascii files
        
    x0po = np.zeros((4,len(deltaE_vals))) #each column is a different initial condition

    for i in range(len(deltaE_vals)):
        deltaE = deltaE_vals[i]

        with open("x0_turningpoint_deltaE%s_uncoupled.dat" %(deltaE),'a+') as po_fam_file:
            print('Loading the periodic orbit family from data file',po_fam_file.name,'\n') 
            x0podata = np.loadtxt(po_fam_file.name)
            x0po[:,i] = x0podata[-1,0:4] 


    #%% Plotting the Family

    TSPAN = [0,30]
    plt.close('all')
    axis_fs = 15
    RelTol = 3.e-10
    AbsTol = 1.e-10

    f = lambda t,x : uncoupled.ham2dof_uncoupled(t,x,parameters) 

    ax = plt.gca(projection='3d')

    for i in range(len(deltaE_vals)):
        
        soln = solve_ivp(f, TSPAN, x0po[:,i], method='RK45', dense_output=True, \
                        events = lambda t,x : uncoupled.half_period_uncoupled(t,x,parameters), \
                        rtol=RelTol, atol=AbsTol)
        te = soln.t_events[0]
        tt = [0,te[2]]
        t,x,phi_t1,PHI = tp.state_transit_matrix(tt, x0po[:,i], parameters, \
                                            uncoupled.variational_eqns_uncoupled)
        
        
        ax.plot(x[:,0],x[:,1],x[:,3],'-', color=linecolor[i], \
                label='$\Delta E$ = %.2f'%(deltaE_vals[i]))
        ax.scatter(x[0,0],x[0,1],x[0,3], s=10, marker='*')
        ax.plot(x[:,0], x[:,1], zs=0, zdir='z')


    resX = 100
    xVec = np.linspace(-4,4,resX)
    yVec = np.linspace(-4,4,resX)
    xMat, yMat = np.meshgrid(xVec, yVec)
    cset1 = ax.contour(
            xMat, yMat, tp.get_pot_surf_proj(
                xVec, yVec, uncoupled.pot_energy_uncoupled, parameters), \
            [0.01,0.1,1,2,4], zdir='z', offset=0, \
            linewidths = 1.0, cmap=cm.viridis, \
            alpha = 0.8)

    ax.scatter(eqPt[0], eqPt[1], s = 50, c = 'r', marker = 'X')
    ax.set_xlabel('$x$', fontsize=axis_fs)
    ax.set_ylabel('$y$', fontsize=axis_fs)
    ax.set_zlabel('$p_y$', fontsize=axis_fs)

    legend = ax.legend(loc='upper left')
    ax.set_xlim(-4, 4)
    ax.set_ylim(-4, 4)
    ax.set_zlim(-4, 4)

    plt.grid()

    if show_final_plot:
        plt.show()

    if save_final_plot:  
        plt.savefig( path_to_saveplot + 'tp_uncoupled_upos.pdf', \
                    format='pdf', bbox_inches='tight')
예제 #3
0
def upo(deltaE_vals, linecolor, \
        save_final_plot = True, show_final_plot = False):
    #%% Setting up parameters and global variables

    eqPt = diffcorr.get_eq_pts(eqNum, uncoupled.init_guess_eqpt_uncoupled, \
                                uncoupled.grad_pot_uncoupled, \
                                parameters)

    #energy of the saddle eq pt
    eSaddle = diffcorr.get_total_energy([eqPt[0],eqPt[1],0,0], \
                                        uncoupled.pot_energy_uncoupled, \
                                        parameters)

    #%%
    nFam = 100  # use nFam = 10 for low energy

    # first two amplitudes for continuation procedure to get p.o. family
    Ax1 = 2.e-5  # initial amplitude (1 of 2) values to use: 2.e-3
    Ax2 = 2 * Ax1  # initial amplitude (2 of 2)

    t = time.time()

    # get the initial conditions and periods for a family of periodic orbits
    with open("x0_diffcorr_fam_eqPt%s_uncoupled.dat" % eqNum,
              'a+') as po_fam_file:
        [po_x0Fam,po_tpFam] = diffcorr.get_po_fam(
            eqNum, Ax1, Ax2, nFam, po_fam_file, uncoupled.init_guess_eqpt_uncoupled, \
            uncoupled.grad_pot_uncoupled, uncoupled.jacobian_uncoupled, \
            uncoupled.guess_lin_uncoupled, uncoupled.diffcorr_setup_uncoupled, \
            uncoupled.conv_coord_uncoupled, uncoupled.diffcorr_acc_corr_uncoupled, \
            uncoupled.ham2dof_uncoupled, uncoupled.half_period_uncoupled, \
            uncoupled.pot_energy_uncoupled, uncoupled.variational_eqns_uncoupled, \
            uncoupled.plot_iter_orbit_uncoupled, parameters)

        poFamRuntime = time.time() - t
        x0podata = np.concatenate((po_x0Fam, po_tpFam), axis=1)

    #%%

    for i in range(len(deltaE_vals)):
        deltaE = deltaE_vals[i]

        with open("x0_diffcorr_fam_eqPt%s_uncoupled.dat" % eqNum,
                  'a+') as po_fam_file:
            eTarget = eSaddle + deltaE
            print('Loading the periodic orbit family from data file',
                  po_fam_file.name, '\n')
            x0podata = np.loadtxt(po_fam_file.name)

        #%
        with open(
                "x0po_T_energyPO_eqPt%s_brac%s_uncoupled.dat" %
            (eqNum, deltaE), 'a+') as po_brac_file:
            t = time.time()

            x0poTarget,TTarget = diffcorr.po_bracket_energy(
                eTarget, x0podata, po_brac_file, \
                uncoupled.diffcorr_setup_uncoupled, uncoupled.conv_coord_uncoupled, \
                uncoupled.diffcorr_acc_corr_uncoupled, uncoupled.ham2dof_uncoupled, \
                uncoupled.half_period_uncoupled, uncoupled.pot_energy_uncoupled, \
                uncoupled.variational_eqns_uncoupled, uncoupled.plot_iter_orbit_uncoupled, \
                parameters)

            poTarE_runtime = time.time() - t
            with open(
                    "model_parameters_eqPt%s_DelE%s_uncoupled.dat" %
                (eqNum, deltaE), 'a+') as model_parameters_file:
                np.savetxt(model_parameters_file.name,
                           parameters,
                           fmt='%1.16e')

        # target specific periodic orbit
        # Target PO of specific energy with high precision does not work for the
        # model

        with open("x0_diffcorr_deltaE%s_uncoupled.dat" % (deltaE),
                  'a+') as po_target_file:

            [x0po, T,energyPO] = diffcorr.po_target_energy(
                x0poTarget,eTarget, po_target_file, \
                uncoupled.diffcorr_setup_uncoupled, uncoupled.conv_coord_uncoupled, \
                uncoupled.diffcorr_acc_corr_uncoupled, \
                uncoupled.ham2dof_uncoupled, uncoupled.half_period_uncoupled, \
                uncoupled.pot_energy_uncoupled, uncoupled.variational_eqns_uncoupled, \
                uncoupled.plot_iter_orbit_uncoupled, parameters)

    #%% Load periodic orbit data from ascii files

    x0po = np.zeros((4, len(deltaE_vals)))

    for i in range(len(deltaE_vals)):
        deltaE = deltaE_vals[i]

        with open("x0_diffcorr_deltaE%s_uncoupled.dat" % (deltaE),
                  'a+') as po_fam_file:
            print('Loading the periodic orbit family from data file',
                  po_fam_file.name, '\n')
            x0podata = np.loadtxt(po_fam_file.name)
        x0po[:, i] = x0podata[0:4]

    #%% Plotting the unstable periodic orbits at the specified energies

    TSPAN = [0, 30]  # arbitrary range, just to finish the integration
    plt.close('all')
    axis_fs = 15
    RelTol = 3.e-10
    AbsTol = 1.e-10

    for i in range(len(deltaE_vals)):
        deltaE = deltaE_vals[i]
        f = lambda t, x: uncoupled.ham2dof_uncoupled(t, x, parameters)
        soln = solve_ivp(f, TSPAN, x0po[:,i],method='RK45',dense_output=True, \
                        events = lambda t,x : uncoupled.half_period_uncoupled(
                            t,x,parameters), \
                        rtol=RelTol, atol=AbsTol)

        te = soln.t_events[0]
        tt = [0, te[1]]
        t,x,phi_t1,PHI = diffcorr.state_transit_matrix(tt, x0po[:,i], parameters, \
                                                uncoupled.variational_eqns_uncoupled)
        ax = plt.gca(projection='3d')
        ax.plot(x[:,0],x[:,1],x[:,3],'-',color = linecolor[i], \
                label = '$\Delta E$ = %.2f'%(deltaE))
        ax.plot(x[:, 0], x[:, 1], -x[:, 3], '-', color=linecolor[i])
        ax.scatter(x[0, 0], x[0, 1], x[0, 3], s=10, marker='*')
        ax.scatter(x[0, 0], x[0, 1], -x[0, 3], s=10, marker='o')
        ax.plot(x[:, 0], x[:, 1], zs=0, zdir='z')

    ax = plt.gca(projection='3d')
    resX = 100
    xVec = np.linspace(-4, 4, resX)
    yVec = np.linspace(-4, 4, resX)
    xMat, yMat = np.meshgrid(xVec, yVec)
    cset1 = ax.contour(
            xMat, yMat, diffcorr.get_pot_surf_proj(
                xVec, yVec, uncoupled.pot_energy_uncoupled, \
                parameters), \
            [0.01,0.1,1,2,4], zdir='z', offset=0, linewidths = 1.0, \
            cmap=cm.viridis, alpha = 0.8)

    ax.scatter(eqPt[0], eqPt[1], s=50, c='r', marker='X')
    ax.set_xlabel('$x$', fontsize=axis_fs)
    ax.set_ylabel('$y$', fontsize=axis_fs)
    ax.set_zlabel('$p_y$', fontsize=axis_fs)

    legend = ax.legend(loc='upper left')
    ax.set_xlim(-4, 4)
    ax.set_ylim(-4, 4)
    ax.set_zlim(-4, 4)

    plt.grid()

    if show_final_plot:
        plt.show()

    if save_final_plot:
        plt.savefig(path_to_saveplot + 'diff_corr_uncoupled_upos.pdf', \
                    format='pdf', bbox_inches='tight')