예제 #1
0
def main():

    f = h5py.File(args.filename, 'r')

    linecycler_1 = cycle(["-"])
    linecycler_2 = cycle(["-"])
    cmap = cm.jet

    for intr in f.values():
        fig = plt.figure()
        ax1 = fig.add_subplot(131)
        ax2 = fig.add_subplot(132)
        ax3 = fig.add_subplot(133)
        ax1.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))
        ax2.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))
        ax3.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

        for sim in intr.values():
            time = (quantify_dset(sim['time'])).value_in(units.yr)
            eccentricity = sim['p0/eccentricity'].value
            sma = (quantify_dset(sim['p0/sma'])).value_in(units.AU)
            ml_index = sim['p0/massloss_index'].value

            sma_clipped = sma[numpy.where(sma > 0)]
            time_clipped = time[numpy.where(sma > 0)]

            ax1.plot(time,
                     eccentricity,
                     lw=1,
                     ls=next(linecycler_1),
                     label="e0= " + str(round(eccentricity[0], 1)))
            ax2.plot(time_clipped,
                     sma_clipped,
                     lw=1,
                     ls=next(linecycler_2),
                     label="e0= " + str(round(eccentricity[0], 1)))
            ax3.plot(time,
                     ml_index,
                     lw=1,
                     ls=next(linecycler_2),
                     label="e0= " + str(round(eccentricity[0], 1)))

        adiabat = sma_analytical(sma[0], 5e-5, time_clipped, 1)
        ax2.plot(time_clipped, adiabat, lw=2, c='k', label='adiabat')

        ax1.set_xlabel('time [yr]')
        ax1.set_ylabel('eccentricity ')
        ax1.set_xlim(0, time[-1])
        ax1.set_ylim(0, 1.3)
        ax1.grid(True)
        ax1.legend(loc='upper left', ncol=2)

        ax2.set_xlabel('time [yr]')
        ax2.set_ylabel('semi-major-axis [AU]')
        ax2.set_xlim(0, time[-1])
        ax2.grid(True)

        ax3.set_xlabel('time [yr]')
        ax3.set_ylabel('massloss_index')
        ax3.set_xlim(0, time[-1])
        ax3.set_yscale('log')
        ax3.grid(True)

        if args.ylim2:
            ax2.set_ylim(args.ylim[0], args.ylim[1])
        else:
            ax2.set_ylim(sma_clipped.min(), sma_clipped.max())

        ax2.legend(loc='upper left', ncol=1)

        plt.show()
    def onpick(event):
        print("artist:{} ind:{}".format(event.artist, event.ind))
        print("button: {}".format(event.mouseevent.button))

        intr = f[event.artist.get_label()]
        sim = intr.values()[event.ind]

        time_vq = quantify_dset(sim['time'])
        time = time_vq.value_in(units.yr) 

        position_vq = quantify_dset(sim['position'])
        position = position_vq.value_in(units.AU)

        CM_position_vq = quantify_dset(sim['CM_position'])
        CM_position = CM_position_vq.value_in(units.AU)

        x, y = 0, 1
        central_x, central_y =  position[:, 0, x] - CM_position[:,x], position[:, 0, y] - CM_position[:,y]
        inner_x, inner_y =  position[:, 1, x] - CM_position[:,x], position[:, 1, y] - CM_position[:,y]
        outer_x, outer_y =  position[:, 2, x] - CM_position[:,x], position[:, 2, y] - CM_position[:,y]

        mass_vq = quantify_dset(sim['mass'])
        mass = mass_vq[:,0].value_in(units.MSun)

        if event.mouseevent.button == 1:

            mu0 = quantify_dset(sim['mass'])[0].sum()

            period_vq = quantify_dset(sim['p0/period'])
            period = period_vq.value_in(units.yr)

            true_anomaly = sim['p0/true_anomaly'].value
            argument_of_periapsis = sim['p0/argument_of_periapsis'].value

            sma_vq = quantify_dset(sim['p0/sma'])
            sma = sma_vq.value_in(units.AU)
            sma_an_vq = sma_analytical(sma_vq[0], 1.244e-5|(units.MSun/units.yr), time_vq, mu0)
            sma_an = sma_an_vq.value_in(units.AU)

            eccentricity = sim['p0/eccentricity'].value

            newfig = plt.figure()
            newax1 = newfig.add_subplot(511)
            newax2 = newfig.add_subplot(512)
            newax3 = newfig.add_subplot(513)
            newax4 = newfig.add_subplot(514)
            newax5 = newfig.add_subplot(515)

            newax1.plot(time, sma, label='numerical')
            newax1.plot(time, sma_an, label='analytical_adiabatic')
            
            newax1.set_xlabel('time [yr]')
            newax1.set_ylabel('sma [AU]')
            newax1.legend(loc='best')

            newax2.plot(time, eccentricity)
            newax2.set_xlabel('time [yr]')
            newax2.set_ylabel('eccentricity ')

            newax3.plot(time, true_anomaly)
            newax3.set_xlabel('time [yr]')
            newax3.set_ylabel('true anomaly [degrees] ')

            newax4.plot(time, argument_of_periapsis)
            newax4.set_xlabel('time [yr]')
            newax4.set_ylabel('argument of periapsis [degrees] ')

            newax5.plot(time, period)
            newax5.set_xlabel('time [yr]')
            newax5.set_ylabel('period')

        else:
            newfig = plt.figure()
            newax1 = newfig.add_subplot(321)
            newax2 = newfig.add_subplot(322)
            newax3 = newfig.add_subplot(323)
            newax4 = newfig.add_subplot(324)
            newax5 = newfig.add_subplot(325)
            newax6 = newfig.add_subplot(326)

            mass_vq = quantify_dset(sim['mass'])
            mass = mass_vq.value_in(units.MSun)

            kinetic_energy = sim['kinetic_energy'].value
            potential_energy = sim['potential_energy'].value
            total_energy = sim['total_energy'].value

            CM_velocity_vq = quantify_dset(sim['CM_velocity'])
            CM_velocity_mod = CM_velocity_vq.lengths().value_in(units.km/units.hour)

            walltime = sim['walltime'].value - sim['walltime'][0]

            newax1.plot(time, mass)
            newax1.set_ylabel('central mass [MSun]')
            newax1.set_xlabel('time [yr]')

            newax2.plot(time, kinetic_energy, label='kinetic', **line.red)
            newax2.plot(time, potential_energy,label='potential',  **line.orange)
            newax2.plot(time, total_energy, label='total', **line.white)
            newax2.set_xlabel('time [yr]')
            newax2.legend()

            newax3.plot(central_x, central_y, **dots.white)
            newax3.plot(inner_x, inner_y, **dots.red)
            newax3.plot(outer_x, outer_y, **dots.yellow)
            newax3.set_xlabel('x [AU]')
            newax3.set_ylabel('y [AU]')

            newax4.plot(CM_position[:, x], CM_position[:, y] )
            newax4.set_xlim(-5, 5)
            newax4.set_xlabel('CM position x [AU]')
            newax4.set_ylabel('CM position y [AU]')

            newax5.plot(time, CM_velocity_mod)
            newax5.set_ylim(20, 30)
            newax5.set_xlabel('time [yr]')
            newax5.set_ylabel('CM velocity [km/hour]')

            newax6.plot(time, walltime)
            newax6.set_xlabel('time [yr]')
            newax6.set_ylabel('walltime [s]')

        newfig.show()
예제 #3
0
def main():

    f = h5py.File(args.filename, 'r')

    linecycler_1 = cycle(["-"])
    linecycler_2 = cycle(["-"])
    cmap = cm.jet

    for intr in f.values():
        fig = plt.figure()
        ax1 = fig.add_subplot(131)
        ax2 = fig.add_subplot(132)
        ax3 = fig.add_subplot(133)
        ax1.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))
        ax2.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))
        ax3.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

        for sim in intr.values():
            time = (quantify_dset(sim['time'])).value_in(units.yr)
            eccentricity = sim['p0/eccentricity'].value
            sma = (quantify_dset(sim['p0/sma'])).value_in(units.AU)
            ml_index = sim['p0/massloss_index'].value

            sma_clipped = sma[numpy.where(sma>0)]
            time_clipped = time[numpy.where(sma>0)]

            ax1.plot(time, eccentricity, lw=1, ls=next(linecycler_1),
                     label="e0= "+str(round(eccentricity[0], 1)))
            ax2.plot(time_clipped, sma_clipped, lw=1, ls=next(linecycler_2),
                     label="e0= "+str(round(eccentricity[0], 1)))
            ax3.plot(time, ml_index, lw=1, ls=next(linecycler_2),
                     label="e0= "+str(round(eccentricity[0], 1)))

        adiabat = sma_analytical(sma[0], 5e-5, time_clipped, 1)
        ax2.plot(time_clipped, adiabat, lw=2, c='k', label='adiabat')

        ax1.set_xlabel('time [yr]')
        ax1.set_ylabel('eccentricity ')
        ax1.set_xlim(0, time[-1])
        ax1.set_ylim(0, 1.3)
        ax1.grid(True)
        ax1.legend(loc='upper left', ncol=2)

        ax2.set_xlabel('time [yr]')
        ax2.set_ylabel('semi-major-axis [AU]')
        ax2.set_xlim(0, time[-1])
        ax2.grid(True)

        ax3.set_xlabel('time [yr]')
        ax3.set_ylabel('massloss_index')
        ax3.set_xlim(0, time[-1])
        ax3.set_yscale('log')
        ax3.grid(True)
       
        if args.ylim2:
            ax2.set_ylim(args.ylim[0], args.ylim[1])
        else:
            ax2.set_ylim(sma_clipped.min(), sma_clipped.max())

        ax2.legend(loc='upper left', ncol=1)

        plt.show()
예제 #4
0
    def binaries(simdata, **kwargs):
        f = simdata.hdf5file
        figdir = simdata.figdir
        targetdir = directory+figdir

        if not os.path.exists(targetdir):
            os.makedirs(targetdir)

        if 'integrator' in kwargs:
           integrator = kwargs['integrator'] 
        else: 
            integrator = simdata.available_integrators()[0]

        centralmass = float(simdata.parameters['M'].split()[0])
        interval = float(simdata.parameters['interval'].split()[0])
        datapoints = int(simdata.parameters['datapoints'])
        mdot = float(simdata.parameters['mdot'].split()[0]) 
        sma0 = float(simdata.parameters['sma'].split()[0]) 

        print("sma0 {} AU".format(sma0))

        firstavailablesim = f[integrator].values()[0]

        time = quantify_dset(firstavailablesim['time']).value_in(units.yr)
        totalmass = quantify_dset(firstavailablesim['mass']).lengths().value_in(units.MSun)

        smas = []
        eccentricities = []
        ecc_labels = []
        smas_ad = []
        ml_indices = []
        arguments_of_periapsis = []
        angular_momenta = []
        true_anomalies = []
        periods = []
        
        for sim in f[integrator].values():
            sma = quantify_dset(sim['p0/sma']).value_in(units.AU)
            smas.append(sma)
            smas_ad.append(sma_analytical(sma0, mdot, time, centralmass))
            ml_indices.append(sim['p0/massloss_index'].value)
            eccentricities.append(sim['p0/eccentricity'].value)
            ecc_labels.append("e0= "+str(round(sim['p0/eccentricity'][0], 1)) )
            arguments_of_periapsis.append(sim['p0/argument_of_periapsis'].value)
            periods.append(quantify_dset(sim['p0/period']).value_in(units.yr))
            angular_momenta.append(quantify_dset(sim['angular_momentum']).number)
            true_anomalies.append(sim['p0/true_anomaly'].value)

        cmap = cm.jet
        savefigargs = dict(bbox_inches='tight', dpi=150)

        def sma_vs_time():
            imgname = 'sma_vs_time.png'
            fig = plt.figure(figsize=(32,8))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for sma, lbl in zip(smas, ecc_labels):
                ax.plot(time, sma, lw=1, ls='-', label=lbl)

            ax.set_xlim(time[0], time[-1])
            ax.set_xlabel('time [yr]')
            ax.set_ylabel('sma [AU]')
            plt.savefig(targetdir+imgname, **savefigargs )
            plt.close()

        def sma_vs_adiabaticity():
            imgname = 'sma_vs_adiabaticity.png'
            fig = plt.figure(figsize=(32,8))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for sma, ml_index, lbl in zip(smas, ml_indices, ecc_labels):
                ax.plot(ml_index, sma, lw=1, ls='-', label=lbl)

            ax.set_xlim(ml_index[0], ml_index[-1])
            ax.set_xlabel('massloss-index')
            ax.set_ylabel('sma [AU]')
            plt.savefig(targetdir+imgname, **savefigargs)
            plt.close()

        def sma_error_vs_time():
            imgname = 'sma_error_vs_time.png'
            fig = plt.figure(figsize=(32,8))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for sma, sma_ad, lbl in zip(smas, smas_ad, ecc_labels):
                ax.plot(time, (sma-sma_ad)/sma_ad, lw=1, ls='-', label=lbl)
        
            ax.set_xlim(time[0], time[-1])
            ax.set_xlabel('time [yr]')
            ax.set_ylabel('(sma-sma_ad)/sma_ad ')
            plt.savefig(targetdir+imgname, **savefigargs)
            plt.close()

        def sma_error_vs_adiabaticity():
            imgname = 'sma_error_vs_adiabaticity.png'
            fig = plt.figure(figsize=(32,8))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for ml_index, sma_ad, lbl in zip(ml_indices, smas_ad, ecc_labels):
                ax.plot(ml_index, (sma-sma_ad)/sma_ad, lw=1, ls='-', label=lbl)
        
            ax.set_xlim(ml_index[0], ml_index[-1])
            ax.set_xlabel('massloss-index')
            ax.set_ylabel('(sma-sma_ad)/sma_ad ')
            plt.savefig(targetdir+imgname, **savefigargs)
            plt.close()

        def eccentricity_vs_time():
            imgname = 'eccentricity_vs_time.png'
            fig = plt.figure(figsize=(32,16))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for ecc, lbl in zip(eccentricities, ecc_labels):
                ax.plot(time, ecc, lw=2, ls='-', label=lbl)

            ax.set_xlim(time[0], time[-1])
            ax.set_xlabel('time [yr]')
            ax.set_ylabel('eccentricity')
            plt.savefig(targetdir+imgname, **savefigargs)
            plt.close()

        def eccentricity_vs_adiabaticity():
            imgname = 'eccentricity_vs_adiabaticity.png'
            fig = plt.figure(figsize=(32,16))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for ecc, ml_index, lbl in zip(eccentricities, ml_indices, ecc_labels):
                ax.plot(ml_index, ecc, lw=2, ls='-', label=lbl)

            ax.set_xlim(ml_index[0], ml_index[-1])
            ax.set_xlabel('massloss-index')
            ax.set_ylabel('eccentricity')
            plt.savefig(targetdir+imgname, **savefigargs)
            plt.close()

        def sma_error_vs_eccentricity_error():
            imgname = 'sma_error_vs_eccentricity_error.png'
            fig = plt.figure(figsize=(32,8))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for sma, sma_ad, ecc, lbl in zip(smas, smas_ad, eccentricities, ecc_labels):
                ax.plot((ecc-ecc[0])/ecc[0], (sma-sma_ad)/sma_ad, lw=1, ls='-', label=lbl)
        
            ax.set_xlabel('(ecc-ecc0)/ecc0')
            ax.set_ylabel('(sma-sma_ad)/sma_ad ')
            plt.savefig(targetdir+imgname, **savefigargs)
            plt.close()

        def true_anomaly_vs_time():
            imgname = 'true_anomaly_vs_time.png'
            fig = plt.figure(figsize=(30, 10))
            colorcycle = cycle(cmap(numpy.linspace(0, 0.95, 10)))
            position_generator = axis_position(10, 1) 

            totalsims = len(f[integrator].values())

            for i, true_anomaly, lbl in zip(range(totalsims), true_anomalies, ecc_labels):
                ax = fig.add_subplot(*next(position_generator))
                ax.plot(time, true_anomaly, lw=2, ls='-', c=next(colorcycle), label=lbl)

                if i+1 != totalsims:
                    ax.set_xticklabels([])
                else:
                    ax.set_xticks(numpy.arange(1000, 15000, 1000))

            ax.set_xlim(time[0], time[-1])
            ax.set_ylim(0, 360)
            ax.set_yticks([90, 180, 270])
            ax.set_xlabel('time [yr]')
            ax.set_ylabel('f [degrees]')
        
            plt.subplots_adjust(hspace=0.001)
            plt.savefig(targetdir+imgname, **savefigargs)
            plt.close()

        def argument_of_periapsis_vs_time():
            imgname = 'argument_of_periapsis_vs_time.png'
            fig = plt.figure(figsize=(20, 20))
            colorcycle = cycle(cmap(numpy.linspace(0, 0.95, 10)))
            position_generator = axis_position(3, 4) 

            for w, lbl in zip(arguments_of_periapsis, ecc_labels):
                ax = fig.add_subplot(*next(position_generator), polar=True)
                ax.plot(w, time, lw=1, ls='-',  c=next(colorcycle), label=lbl)
                ax.set_rgrids(numpy.array([5000,10000,15000]), angle=270)
        
            plt.savefig(targetdir+imgname, **savefigargs)
            plt.close()

        def adiabaticity_vs_time():
            imgname = 'adiabaticity_vs_time.png'
            fig = plt.figure(figsize=(8, 16))
            ax1 = fig.add_subplot(311)
            ax2 = fig.add_subplot(312)
            ax3 = fig.add_subplot(313)
            colorcycle1 = cycle(cmap(numpy.linspace(0, 0.95, 10)))
            colorcycle2 = cycle(cmap(numpy.linspace(0, 0.95, 10)))
            colorcycle3 = cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for ml_index, period, lbl in zip(ml_indices, periods, ecc_labels):
                ax1.plot(time, mdot/totalmass, lw=1, ls='-', c=next(colorcycle1), label=lbl)
                ax2.plot(time, period, lw=1, ls='-', c=next(colorcycle2), label=lbl)
                ax3.plot(time, ml_index, lw=1, ls='-', c=next(colorcycle3), label=lbl)

            ax3.set_yscale('log')
            ax1.set_xlabel('time [yr]')
            ax2.set_xlabel('time [yr]')
            ax3.set_xlabel('time [yr]')

            plt.subplots_adjust(hspace=0.001)
            plt.savefig(targetdir+imgname, **savefigargs)
            plt.close()

        def angular_momentum_error_vs_time():
            imgname = 'angular_momentum_error_vs_time.png'
            fig = plt.figure(figsize=(8, 8))
            ax = fig.add_subplot(111)
            colorcycle = cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for h, lbl in zip(angular_momenta, ecc_labels):
                h_error = (h[0] - h)/h[0]
                ax.plot(time, h_error, lw=1, ls='-', c=next(colorcycle), label=lbl)

            ax.set_xlim(time[0], time[-1])
            plt.savefig(targetdir+imgname, **savefigargs)
            plt.close()

        def angular_momentum_error_vs_adiabaticity():
            imgname = 'angular_momentum_error_vs_adiabaticity.png'
            fig = plt.figure(figsize=(8, 8))
            ax = fig.add_subplot(111)
            colorcycle = cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for h, ml_index, lbl in zip(angular_momenta, ml_indices, ecc_labels):
                h_error = (h[0] - h)/h[0]
                ax.plot(ml_index, h_error, lw=1, ls='-',  c=next(colorcycle), label=lbl)
                ax.set_xlim(ml_index[0], ml_index[-1])

            plt.savefig(targetdir+imgname, **savefigargs)
            plt.close()

        sma_vs_time()
        sma_vs_adiabaticity()
        sma_error_vs_time()
        sma_error_vs_adiabaticity()
        eccentricity_vs_time()
        eccentricity_vs_adiabaticity()
        sma_error_vs_eccentricity_error()
        true_anomaly_vs_time()
        argument_of_periapsis_vs_time()
        adiabaticity_vs_time()
        angular_momentum_error_vs_time()
        angular_momentum_error_vs_adiabaticity()
def main():

    dots = Dots()
    line = Line()

    f = h5py.File(args.filename, 'r')
    
    fig = plt.figure()
    ax1 = fig.add_subplot(211)
    ax2 = fig.add_subplot(212)

    for intr in f.values():

        timesteps_vq = AdaptingVectorQuantity()
        final_smas_p0_vq = AdaptingVectorQuantity()
        final_smas_p1_vq = AdaptingVectorQuantity()

        for sim in intr.values():
            timesteps_vq.append(sim['timestep'][0] | retrieve_unit(sim['timestep']))
            final_smas_p0_vq.append(sim['p0/sma'][-1]| retrieve_unit(sim['p0/sma']))
            final_smas_p1_vq.append(sim['p1/sma'][-1]| retrieve_unit(sim['p1/sma']))

        timesteps = timesteps_vq.value_in(units.yr)
        final_smas_p0 = final_smas_p0_vq.value_in(units.AU)
        final_smas_p1 = final_smas_p1_vq.value_in(units.AU)

        ax1.plot(timesteps, final_smas_p0, marker='o', label=intr.name, picker=5)
        ax2.plot(timesteps, final_smas_p1, marker='o', label=intr.name, picker=5)

        ax1.set_xlabel('Mass update interval [yr]')
        ax2.set_xlabel('Mass update interval [yr]')
        ax1.set_ylabel('final sma inner [AU]')
        ax2.set_ylabel('final sma outer [AU]')

    dset = f.values()[0].values()[0] #first dset available
        
    time = quantify_dset(dset['time']).value_in(units.yr)
    mass = quantify_dset(dset['mass']).value_in(units.MSun)
    inner_sma0 = quantify_dset(dset['p0/sma']).value_in(units.AU)
    outer_sma0 = quantify_dset(dset['p1/sma']).value_in(units.AU)

    inner_sma_final_adiabatic_approx = sma_analytical(inner_sma0[0], 1.244e-5, time[-1], mass[0].sum() )
    outer_sma_final_adiabatic_approx = sma_analytical(outer_sma0[0], 1.244e-5, time[-1], mass[0].sum() )

    ax1.axhline(inner_sma_final_adiabatic_approx, xmin=0, xmax=1, c='m', label='adiabatic approx')
    ax1.legend(loc='best')
    ax2.axhline(outer_sma_final_adiabatic_approx, xmin=0, xmax=1, c='m', label='adiabatic approx')
    ax2.legend(loc='best')

    if args.logscale:
        ax1.set_xscale('log')
        ax2.set_xscale('log')

    if args.ylim1:
        ax1.set_ylim(args.ylim1)
    if args.ylim2:
        ax2.set_ylim(args.ylim2)
    if args.xlim1:
        ax1.set_xlim(args.xlim1)
    if args.xlim2:
        ax2.set_xlim(args.xlim2)

    def onpick(event):
        print("artist:{} ind:{}".format(event.artist, event.ind))
        print("button: {}".format(event.mouseevent.button))

        intr = f[event.artist.get_label()]
        sim = intr.values()[event.ind]

        time_vq = quantify_dset(sim['time'])
        time = time_vq.value_in(units.yr) 

        position_vq = quantify_dset(sim['position'])
        position = position_vq.value_in(units.AU)

        CM_position_vq = quantify_dset(sim['CM_position'])
        CM_position = CM_position_vq.value_in(units.AU)

        x, y = 0, 1
        central_x, central_y =  position[:, 0, x] - CM_position[:,x], position[:, 0, y] - CM_position[:,y]
        inner_x, inner_y =  position[:, 1, x] - CM_position[:,x], position[:, 1, y] - CM_position[:,y]
        outer_x, outer_y =  position[:, 2, x] - CM_position[:,x], position[:, 2, y] - CM_position[:,y]

        mass_vq = quantify_dset(sim['mass'])
        mass = mass_vq[:,0].value_in(units.MSun)

        if event.mouseevent.button == 1:

            mu0 = quantify_dset(sim['mass'])[0].sum()

            period_vq = quantify_dset(sim['p0/period'])
            period = period_vq.value_in(units.yr)

            true_anomaly = sim['p0/true_anomaly'].value
            argument_of_periapsis = sim['p0/argument_of_periapsis'].value

            sma_vq = quantify_dset(sim['p0/sma'])
            sma = sma_vq.value_in(units.AU)
            sma_an_vq = sma_analytical(sma_vq[0], 1.244e-5|(units.MSun/units.yr), time_vq, mu0)
            sma_an = sma_an_vq.value_in(units.AU)

            eccentricity = sim['p0/eccentricity'].value

            newfig = plt.figure()
            newax1 = newfig.add_subplot(511)
            newax2 = newfig.add_subplot(512)
            newax3 = newfig.add_subplot(513)
            newax4 = newfig.add_subplot(514)
            newax5 = newfig.add_subplot(515)

            newax1.plot(time, sma, label='numerical')
            newax1.plot(time, sma_an, label='analytical_adiabatic')
            
            newax1.set_xlabel('time [yr]')
            newax1.set_ylabel('sma [AU]')
            newax1.legend(loc='best')

            newax2.plot(time, eccentricity)
            newax2.set_xlabel('time [yr]')
            newax2.set_ylabel('eccentricity ')

            newax3.plot(time, true_anomaly)
            newax3.set_xlabel('time [yr]')
            newax3.set_ylabel('true anomaly [degrees] ')

            newax4.plot(time, argument_of_periapsis)
            newax4.set_xlabel('time [yr]')
            newax4.set_ylabel('argument of periapsis [degrees] ')

            newax5.plot(time, period)
            newax5.set_xlabel('time [yr]')
            newax5.set_ylabel('period')

        else:
            newfig = plt.figure()
            newax1 = newfig.add_subplot(321)
            newax2 = newfig.add_subplot(322)
            newax3 = newfig.add_subplot(323)
            newax4 = newfig.add_subplot(324)
            newax5 = newfig.add_subplot(325)
            newax6 = newfig.add_subplot(326)

            mass_vq = quantify_dset(sim['mass'])
            mass = mass_vq.value_in(units.MSun)

            kinetic_energy = sim['kinetic_energy'].value
            potential_energy = sim['potential_energy'].value
            total_energy = sim['total_energy'].value

            CM_velocity_vq = quantify_dset(sim['CM_velocity'])
            CM_velocity_mod = CM_velocity_vq.lengths().value_in(units.km/units.hour)

            walltime = sim['walltime'].value - sim['walltime'][0]

            newax1.plot(time, mass)
            newax1.set_ylabel('central mass [MSun]')
            newax1.set_xlabel('time [yr]')

            newax2.plot(time, kinetic_energy, label='kinetic', **line.red)
            newax2.plot(time, potential_energy,label='potential',  **line.orange)
            newax2.plot(time, total_energy, label='total', **line.white)
            newax2.set_xlabel('time [yr]')
            newax2.legend()

            newax3.plot(central_x, central_y, **dots.white)
            newax3.plot(inner_x, inner_y, **dots.red)
            newax3.plot(outer_x, outer_y, **dots.yellow)
            newax3.set_xlabel('x [AU]')
            newax3.set_ylabel('y [AU]')

            newax4.plot(CM_position[:, x], CM_position[:, y] )
            newax4.set_xlim(-5, 5)
            newax4.set_xlabel('CM position x [AU]')
            newax4.set_ylabel('CM position y [AU]')

            newax5.plot(time, CM_velocity_mod)
            newax5.set_ylim(20, 30)
            newax5.set_xlabel('time [yr]')
            newax5.set_ylabel('CM velocity [km/hour]')

            newax6.plot(time, walltime)
            newax6.set_xlabel('time [yr]')
            newax6.set_ylabel('walltime [s]')

        newfig.show()

    fig.canvas.mpl_connect('pick_event', onpick) 
    plt.show()
def create_mpeg(sim):

    time_vq = quantify_dset(sim['time'])
    time = time_vq.value_in(units.yr) 

    if args.frames is None:
        frames = range(1, len(time), 5)
    else:
        frames = range(args.frames[0], args.frames[1], args.frames[2])
    pbar = pb.ProgressBar(widgets=drawwidget(args.sim), 
                          maxval=frames[-1]).start()


    position_vq = quantify_dset(sim['position'])
    position = position_vq.value_in(units.AU)

    seperation_vq  = (position_vq[:, 1, :] - position_vq[:, 2, :]).lengths()
    seperation = seperation_vq.value_in(units.AU)

    CM_position_vq = quantify_dset(sim['CM_position'])
    CM_position = CM_position_vq.value_in(units.AU)

    period_inner_vq = quantify_dset(sim['p0/period'])
    period_inner = period_inner_vq.value_in(units.yr)

    mass_vq = quantify_dset(sim['mass'])
    mass = mass_vq[:,0].value_in(units.MSun)

    kinetic_energy = sim['kinetic_energy'].value
    potential_energy = sim['potential_energy'].value
    total_energy = sim['total_energy'].value

    mu0 = quantify_dset(sim['mass'])[0].sum()

    sma_inner_vq = quantify_dset(sim['p0/sma'])
    sma_inner = sma_inner_vq.value_in(units.AU)
    sma_outer_vq = quantify_dset(sim['p1/sma'])
    sma_outer = sma_outer_vq.value_in(units.AU)

    eccentricity_inner = sim['p0/eccentricity'].value
    eccentricity_outer = sim['p1/eccentricity'].value

    true_anomaly_inner = sim['p0/true_anomaly'].value
    true_anomaly_outer = sim['p1/true_anomaly'].value

    sma_inner_analytical_vq = sma_analytical(sma_inner_vq[0], 
                                  1.244e-5|(units.MSun/units.yr), time_vq, mu0)
    sma_inner_analytical = sma_inner_analytical_vq.value_in(units.AU)
    sma_outer_analytical_vq = sma_analytical(sma_outer_vq[0], 
                                  1.244e-5|(units.MSun/units.yr), time_vq, mu0)
    sma_outer_analytical = sma_outer_analytical_vq.value_in(units.AU)

    x, y = 0, 1
    central_x = position[:, 0, x] - CM_position[:,x]
    central_y = position[:, 0, y] - CM_position[:,y]
    inner_x = position[:, 1, x] - CM_position[:,x]
    inner_y = position[:, 1, y] - CM_position[:,y]
    outer_x = position[:, 2, x] - CM_position[:,x]
    outer_y = position[:, 2, y] - CM_position[:,y]

    nr_datapoints = len(time)
    yrs_per_datapoint =  time[-1]/nr_datapoints

    fig = plt.figure(figsize=(22, 12))
    gs = gridspec.GridSpec(4, 4)

    ax1 = fig.add_subplot(gs[:2, :2])
    ax2 = fig.add_subplot(gs[2,0])
    ax3 = fig.add_subplot(gs[3,0])
    ax4 = fig.add_subplot(gs[2,1])
    ax5 = fig.add_subplot(gs[3,1])
    ax6 = fig.add_subplot(gs[0,2:])
    ax7 = fig.add_subplot(gs[1,2:])
    ax8 = fig.add_subplot(gs[2,2:])
    ax9 = fig.add_subplot(gs[3,2:])

    orange = '#FF6500'
    green = '#07D100'

    central_loc, = ax1.plot([], [], c='y', ls="o", mfc="y", mec="y", marker='o',
                            ms=6)
    inner_loc, = ax1.plot([], [], c='w', ls="o", mfc="w", mec="w", marker='o',
                          ms=4)
    outer_loc, = ax1.plot([], [], c='w', ls="o", mfc="w", mec="w", marker='o',
                          ms=4)
    inner_artist, = ax1.plot([], [], c=green, ls="-", lw=2, alpha=0.8)
    outer_artist, = ax1.plot([], [], c='r', ls="-", lw=2, alpha=0.8)
    sma0_ana_artist, = ax2.plot([], [], c='w', ls="-", lw=2)
    sma1_ana_artist, = ax3.plot([], [], c='w', ls="-", lw=2)
    sma0_artist, = ax2.plot([], [], c=green, ls="-", lw=2)
    sma1_artist, = ax3.plot([], [], c='r', ls="-", lw=2)
    ecc0_artist, = ax4.plot([], [], c=green, ls="-", lw=2)
    ecc1_artist, = ax5.plot([], [], c='r', ls="-", lw=2)
    ecc0_ana_artist, = ax4.plot([], [], c='w', ls="-", lw=2)
    ecc1_ana_artist, = ax5.plot([], [], c='w', ls="-", lw=2)
    true_anomaly0_artist, = ax6.plot([], [], c=green, ls="-", lw=2)
    true_anomaly1_artist, = ax6.plot([], [], c='r', ls="-", lw=2)
    seperation_artist, = ax7.plot([], [], c=orange, ls="-", lw=2)
    K_artist, = ax8.plot([], [], c='r', ls="-", lw=2)
    U_artist, = ax8.plot([], [], c=green, ls="-", lw=2)
    E_artist, = ax8.plot([], [], c=orange, ls="-", lw=2)
    mass_artist, = ax9.plot([], [], c=orange, ls="-", lw=2)

    ax2.set_xlabel('time [yr]')
    ax2.set_ylabel('sma [AU]')

    ax3.set_xlabel('time [yr]')
    ax3.set_ylabel('sma [AU]')

    ax4.set_xlabel('time [yr]')
    ax4.set_ylabel('eccentricity ')

    ax5.set_xlabel('time [yr]')
    ax5.set_ylabel('eccentricity ')

    ax6.set_xlabel('time [yr]')
    ax6.set_ylabel('true anomaly [degrees] ')

    ax7.set_xlabel('time [yr]')
    ax7.set_ylabel('seperation [AU]')

    ax8.set_xlabel('time [yr]')
    ax8.set_ylabel('energies')

    ax9.set_ylabel('central mass [MSun]')
    ax9.set_xlabel('time [yr]')

    ax1.set_xlim(-200, 150)
    ax1.set_ylim(-250, 100)

    def update_fig(i):
        t = time[i]
        lag = int(20*period_inner[i]/(yrs_per_datapoint))
        orbitlag = int(0.9*period_inner[i]/(yrs_per_datapoint))

        if i <= lag :
            tbegin = time[0]
            time_range =  time[0:i]
            inner_artist.set_data(inner_x[0:i], inner_y[0:i])
            outer_artist.set_data(outer_x[0:i], outer_y[0:i])
            sma0_artist.set_data(time[0:i], sma_inner[0:i])
            sma1_artist.set_data(time[0:i], sma_outer[0:i])
            sma0_ana_artist.set_data(time[0:i], sma_inner_analytical[0:i])
            sma1_ana_artist.set_data(time[0:i], sma_outer_analytical[0:i])
            ecc0_artist.set_data(time[0:i], eccentricity_inner[0:i])
            ecc1_artist.set_data(time[0:i], eccentricity_outer[0:i])
            true_anomaly0_artist.set_data(time[0:i], true_anomaly_inner[0:i])
            true_anomaly1_artist.set_data(time[0:i], true_anomaly_outer[0:i])
            K_artist.set_data(time[0:i], kinetic_energy[0:i]) 
            U_artist.set_data(time[0:i], potential_energy[0:i]) 
            E_artist.set_data(time[0:i], total_energy[0:i]) 
            mass_artist.set_data(time[0:i], mass[0:i])
            seperation_artist.set_data(time[0:i], seperation[0:i])
        else:
            tbegin = time[i-lag]
            time_range = time[i-lag:i]

            inner_artist.set_data(inner_x[i-orbitlag:i], inner_y[i-orbitlag:i])
            outer_artist.set_data(outer_x[i-orbitlag:i], outer_y[i-orbitlag:i])
            sma0_artist.set_data(time_range, sma_inner[i-lag:i])
            sma1_artist.set_data(time_range, sma_outer[i-lag:i])
            sma0_ana_artist.set_data(time_range, sma_inner_analytical[i-lag:i])
            sma1_ana_artist.set_data(time_range, sma_outer_analytical[i-lag:i])
            ecc0_artist.set_data(time_range, eccentricity_inner[i-lag:i])
            ecc1_artist.set_data(time_range, eccentricity_outer[i-lag:i])
            true_anomaly0_artist.set_data(time_range, true_anomaly_inner[i-lag:i])
            true_anomaly1_artist.set_data(time_range, true_anomaly_outer[i-lag:i])
            K_artist.set_data(time_range, kinetic_energy[i-lag:i]) 
            U_artist.set_data(time_range, potential_energy[i-lag:i]) 
            E_artist.set_data(time_range, total_energy[i-lag:i]) 
            mass_artist.set_data(time_range, mass[i-lag:i])
            seperation_artist.set_data(time_range, seperation[i-lag:i])

        try:
            central_loc.set_data(central_x[i-1], central_y[i-1])
            inner_loc.set_data(inner_x[i-1], inner_y[i-1])
            outer_loc.set_data(outer_x[i-1], outer_y[i-1])
        except IndexError:
            pass

        ax2.set_ylim(sma_inner_analytical[i]*0.99, sma_inner_analytical[i]*1.01)
        ax3.set_ylim(sma_outer_analytical[i]*0.99, sma_outer_analytical[i]*1.01)
        ax4.set_ylim(eccentricity_inner[i]- 0.01, eccentricity_inner[i] + 0.01)
        ax5.set_ylim(eccentricity_outer[i]- 0.01, eccentricity_outer[i] + 0.01)
        ax6.set_ylim(0, 360)
        ax7.set_ylim(5, 250)
        ax8.set_ylim(-2.5e36, 2e36)
        ax9.set_ylim(mass[i]*0.99, mass[i]*1.01)

        ax2.set_xlim(tbegin, t)
        ax3.set_xlim(tbegin, t)
        ax4.set_xlim(tbegin, t)
        ax5.set_xlim(tbegin, t)
        ax6.set_xlim(tbegin, t)
        ax7.set_xlim(tbegin, t)
        ax8.set_xlim(tbegin, t)
        ax9.set_xlim(tbegin, t)
        pbar.update(i)

    ffmpeg = animation.FFMpegWriter(fps=30, codec='mpeg4', 
                                    extra_args=['-vcodec','libx264'])
    anim = animation.FuncAnimation(fig, update_fig, frames=frames, interval=50)

    if args.animate:
        plt.show()
    elif args.output:
        anim.save(args.output, writer=ffmpeg, dpi=args.dpi)
예제 #7
0
    def binaries(simdata, **kwargs):
        f = simdata.hdf5file
        figdir = simdata.figdir
        targetdir = directory + figdir

        if not os.path.exists(targetdir):
            os.makedirs(targetdir)

        if 'integrator' in kwargs:
            integrator = kwargs['integrator']
        else:
            integrator = simdata.available_integrators()[0]

        centralmass = float(simdata.parameters['M'].split()[0])
        interval = float(simdata.parameters['interval'].split()[0])
        datapoints = int(simdata.parameters['datapoints'])
        mdot = float(simdata.parameters['mdot'].split()[0])
        sma0 = float(simdata.parameters['sma'].split()[0])

        print("sma0 {} AU".format(sma0))

        firstavailablesim = f[integrator].values()[0]

        time = quantify_dset(firstavailablesim['time']).value_in(units.yr)
        totalmass = quantify_dset(
            firstavailablesim['mass']).lengths().value_in(units.MSun)

        smas = []
        eccentricities = []
        ecc_labels = []
        smas_ad = []
        ml_indices = []
        arguments_of_periapsis = []
        angular_momenta = []
        true_anomalies = []
        periods = []

        for sim in f[integrator].values():
            sma = quantify_dset(sim['p0/sma']).value_in(units.AU)
            smas.append(sma)
            smas_ad.append(sma_analytical(sma0, mdot, time, centralmass))
            ml_indices.append(sim['p0/massloss_index'].value)
            eccentricities.append(sim['p0/eccentricity'].value)
            ecc_labels.append("e0= " +
                              str(round(sim['p0/eccentricity'][0], 1)))
            arguments_of_periapsis.append(
                sim['p0/argument_of_periapsis'].value)
            periods.append(quantify_dset(sim['p0/period']).value_in(units.yr))
            angular_momenta.append(
                quantify_dset(sim['angular_momentum']).number)
            true_anomalies.append(sim['p0/true_anomaly'].value)

        cmap = cm.jet
        savefigargs = dict(bbox_inches='tight', dpi=150)

        def sma_vs_time():
            imgname = 'sma_vs_time.png'
            fig = plt.figure(figsize=(32, 8))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for sma, lbl in zip(smas, ecc_labels):
                ax.plot(time, sma, lw=1, ls='-', label=lbl)

            ax.set_xlim(time[0], time[-1])
            ax.set_xlabel('time [yr]')
            ax.set_ylabel('sma [AU]')
            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        def sma_vs_adiabaticity():
            imgname = 'sma_vs_adiabaticity.png'
            fig = plt.figure(figsize=(32, 8))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for sma, ml_index, lbl in zip(smas, ml_indices, ecc_labels):
                ax.plot(ml_index, sma, lw=1, ls='-', label=lbl)

            ax.set_xlim(ml_index[0], ml_index[-1])
            ax.set_xlabel('massloss-index')
            ax.set_ylabel('sma [AU]')
            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        def sma_error_vs_time():
            imgname = 'sma_error_vs_time.png'
            fig = plt.figure(figsize=(32, 8))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for sma, sma_ad, lbl in zip(smas, smas_ad, ecc_labels):
                ax.plot(time, (sma - sma_ad) / sma_ad, lw=1, ls='-', label=lbl)

            ax.set_xlim(time[0], time[-1])
            ax.set_xlabel('time [yr]')
            ax.set_ylabel('(sma-sma_ad)/sma_ad ')
            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        def sma_error_vs_adiabaticity():
            imgname = 'sma_error_vs_adiabaticity.png'
            fig = plt.figure(figsize=(32, 8))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for ml_index, sma_ad, lbl in zip(ml_indices, smas_ad, ecc_labels):
                ax.plot(ml_index, (sma - sma_ad) / sma_ad,
                        lw=1,
                        ls='-',
                        label=lbl)

            ax.set_xlim(ml_index[0], ml_index[-1])
            ax.set_xlabel('massloss-index')
            ax.set_ylabel('(sma-sma_ad)/sma_ad ')
            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        def eccentricity_vs_time():
            imgname = 'eccentricity_vs_time.png'
            fig = plt.figure(figsize=(32, 16))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for ecc, lbl in zip(eccentricities, ecc_labels):
                ax.plot(time, ecc, lw=2, ls='-', label=lbl)

            ax.set_xlim(time[0], time[-1])
            ax.set_xlabel('time [yr]')
            ax.set_ylabel('eccentricity')
            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        def eccentricity_vs_adiabaticity():
            imgname = 'eccentricity_vs_adiabaticity.png'
            fig = plt.figure(figsize=(32, 16))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for ecc, ml_index, lbl in zip(eccentricities, ml_indices,
                                          ecc_labels):
                ax.plot(ml_index, ecc, lw=2, ls='-', label=lbl)

            ax.set_xlim(ml_index[0], ml_index[-1])
            ax.set_xlabel('massloss-index')
            ax.set_ylabel('eccentricity')
            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        def sma_error_vs_eccentricity_error():
            imgname = 'sma_error_vs_eccentricity_error.png'
            fig = plt.figure(figsize=(32, 8))
            ax = fig.add_subplot(111)
            ax.set_color_cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for sma, sma_ad, ecc, lbl in zip(smas, smas_ad, eccentricities,
                                             ecc_labels):
                ax.plot((ecc - ecc[0]) / ecc[0], (sma - sma_ad) / sma_ad,
                        lw=1,
                        ls='-',
                        label=lbl)

            ax.set_xlabel('(ecc-ecc0)/ecc0')
            ax.set_ylabel('(sma-sma_ad)/sma_ad ')
            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        def true_anomaly_vs_time():
            imgname = 'true_anomaly_vs_time.png'
            fig = plt.figure(figsize=(30, 10))
            colorcycle = cycle(cmap(numpy.linspace(0, 0.95, 10)))
            position_generator = axis_position(10, 1)

            totalsims = len(f[integrator].values())

            for i, true_anomaly, lbl in zip(range(totalsims), true_anomalies,
                                            ecc_labels):
                ax = fig.add_subplot(*next(position_generator))
                ax.plot(time,
                        true_anomaly,
                        lw=2,
                        ls='-',
                        c=next(colorcycle),
                        label=lbl)

                if i + 1 != totalsims:
                    ax.set_xticklabels([])
                else:
                    ax.set_xticks(numpy.arange(1000, 15000, 1000))

            ax.set_xlim(time[0], time[-1])
            ax.set_ylim(0, 360)
            ax.set_yticks([90, 180, 270])
            ax.set_xlabel('time [yr]')
            ax.set_ylabel('f [degrees]')

            plt.subplots_adjust(hspace=0.001)
            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        def argument_of_periapsis_vs_time():
            imgname = 'argument_of_periapsis_vs_time.png'
            fig = plt.figure(figsize=(20, 20))
            colorcycle = cycle(cmap(numpy.linspace(0, 0.95, 10)))
            position_generator = axis_position(3, 4)

            for w, lbl in zip(arguments_of_periapsis, ecc_labels):
                ax = fig.add_subplot(*next(position_generator), polar=True)
                ax.plot(w, time, lw=1, ls='-', c=next(colorcycle), label=lbl)
                ax.set_rgrids(numpy.array([5000, 10000, 15000]), angle=270)

            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        def adiabaticity_vs_time():
            imgname = 'adiabaticity_vs_time.png'
            fig = plt.figure(figsize=(8, 16))
            ax1 = fig.add_subplot(311)
            ax2 = fig.add_subplot(312)
            ax3 = fig.add_subplot(313)
            colorcycle1 = cycle(cmap(numpy.linspace(0, 0.95, 10)))
            colorcycle2 = cycle(cmap(numpy.linspace(0, 0.95, 10)))
            colorcycle3 = cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for ml_index, period, lbl in zip(ml_indices, periods, ecc_labels):
                ax1.plot(time,
                         mdot / totalmass,
                         lw=1,
                         ls='-',
                         c=next(colorcycle1),
                         label=lbl)
                ax2.plot(time,
                         period,
                         lw=1,
                         ls='-',
                         c=next(colorcycle2),
                         label=lbl)
                ax3.plot(time,
                         ml_index,
                         lw=1,
                         ls='-',
                         c=next(colorcycle3),
                         label=lbl)

            ax3.set_yscale('log')
            ax1.set_xlabel('time [yr]')
            ax2.set_xlabel('time [yr]')
            ax3.set_xlabel('time [yr]')

            plt.subplots_adjust(hspace=0.001)
            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        def angular_momentum_error_vs_time():
            imgname = 'angular_momentum_error_vs_time.png'
            fig = plt.figure(figsize=(8, 8))
            ax = fig.add_subplot(111)
            colorcycle = cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for h, lbl in zip(angular_momenta, ecc_labels):
                h_error = (h[0] - h) / h[0]
                ax.plot(time,
                        h_error,
                        lw=1,
                        ls='-',
                        c=next(colorcycle),
                        label=lbl)

            ax.set_xlim(time[0], time[-1])
            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        def angular_momentum_error_vs_adiabaticity():
            imgname = 'angular_momentum_error_vs_adiabaticity.png'
            fig = plt.figure(figsize=(8, 8))
            ax = fig.add_subplot(111)
            colorcycle = cycle(cmap(numpy.linspace(0, 0.95, 10)))

            for h, ml_index, lbl in zip(angular_momenta, ml_indices,
                                        ecc_labels):
                h_error = (h[0] - h) / h[0]
                ax.plot(ml_index,
                        h_error,
                        lw=1,
                        ls='-',
                        c=next(colorcycle),
                        label=lbl)
                ax.set_xlim(ml_index[0], ml_index[-1])

            plt.savefig(targetdir + imgname, **savefigargs)
            plt.close()

        sma_vs_time()
        sma_vs_adiabaticity()
        sma_error_vs_time()
        sma_error_vs_adiabaticity()
        eccentricity_vs_time()
        eccentricity_vs_adiabaticity()
        sma_error_vs_eccentricity_error()
        true_anomaly_vs_time()
        argument_of_periapsis_vs_time()
        adiabaticity_vs_time()
        angular_momentum_error_vs_time()
        angular_momentum_error_vs_adiabaticity()
예제 #8
0
def create_mpeg(sim):

    time_vq = quantify_dset(sim['time'])
    time = time_vq.value_in(units.yr)

    if args.frames is None:
        frames = range(1, len(time), 5)
    else:
        frames = range(args.frames[0], args.frames[1], args.frames[2])
    pbar = pb.ProgressBar(widgets=drawwidget(args.sim),
                          maxval=frames[-1]).start()

    position_vq = quantify_dset(sim['position'])
    position = position_vq.value_in(units.AU)

    seperation_vq = (position_vq[:, 1, :] - position_vq[:, 2, :]).lengths()
    seperation = seperation_vq.value_in(units.AU)

    CM_position_vq = quantify_dset(sim['CM_position'])
    CM_position = CM_position_vq.value_in(units.AU)

    period_inner_vq = quantify_dset(sim['p0/period'])
    period_inner = period_inner_vq.value_in(units.yr)

    mass_vq = quantify_dset(sim['mass'])
    mass = mass_vq[:, 0].value_in(units.MSun)

    kinetic_energy = sim['kinetic_energy'].value
    potential_energy = sim['potential_energy'].value
    total_energy = sim['total_energy'].value

    mu0 = quantify_dset(sim['mass'])[0].sum()

    sma_inner_vq = quantify_dset(sim['p0/sma'])
    sma_inner = sma_inner_vq.value_in(units.AU)
    sma_outer_vq = quantify_dset(sim['p1/sma'])
    sma_outer = sma_outer_vq.value_in(units.AU)

    eccentricity_inner = sim['p0/eccentricity'].value
    eccentricity_outer = sim['p1/eccentricity'].value

    true_anomaly_inner = sim['p0/true_anomaly'].value
    true_anomaly_outer = sim['p1/true_anomaly'].value

    sma_inner_analytical_vq = sma_analytical(
        sma_inner_vq[0], 1.244e-5 | (units.MSun / units.yr), time_vq, mu0)
    sma_inner_analytical = sma_inner_analytical_vq.value_in(units.AU)
    sma_outer_analytical_vq = sma_analytical(
        sma_outer_vq[0], 1.244e-5 | (units.MSun / units.yr), time_vq, mu0)
    sma_outer_analytical = sma_outer_analytical_vq.value_in(units.AU)

    x, y = 0, 1
    central_x = position[:, 0, x] - CM_position[:, x]
    central_y = position[:, 0, y] - CM_position[:, y]
    inner_x = position[:, 1, x] - CM_position[:, x]
    inner_y = position[:, 1, y] - CM_position[:, y]
    outer_x = position[:, 2, x] - CM_position[:, x]
    outer_y = position[:, 2, y] - CM_position[:, y]

    nr_datapoints = len(time)
    yrs_per_datapoint = time[-1] / nr_datapoints

    fig = plt.figure(figsize=(22, 12))
    gs = gridspec.GridSpec(4, 4)

    ax1 = fig.add_subplot(gs[:2, :2])
    ax2 = fig.add_subplot(gs[2, 0])
    ax3 = fig.add_subplot(gs[3, 0])
    ax4 = fig.add_subplot(gs[2, 1])
    ax5 = fig.add_subplot(gs[3, 1])
    ax6 = fig.add_subplot(gs[0, 2:])
    ax7 = fig.add_subplot(gs[1, 2:])
    ax8 = fig.add_subplot(gs[2, 2:])
    ax9 = fig.add_subplot(gs[3, 2:])

    orange = '#FF6500'
    green = '#07D100'

    central_loc, = ax1.plot([], [],
                            c='y',
                            ls="o",
                            mfc="y",
                            mec="y",
                            marker='o',
                            ms=6)
    inner_loc, = ax1.plot([], [],
                          c='w',
                          ls="o",
                          mfc="w",
                          mec="w",
                          marker='o',
                          ms=4)
    outer_loc, = ax1.plot([], [],
                          c='w',
                          ls="o",
                          mfc="w",
                          mec="w",
                          marker='o',
                          ms=4)
    inner_artist, = ax1.plot([], [], c=green, ls="-", lw=2, alpha=0.8)
    outer_artist, = ax1.plot([], [], c='r', ls="-", lw=2, alpha=0.8)
    sma0_ana_artist, = ax2.plot([], [], c='w', ls="-", lw=2)
    sma1_ana_artist, = ax3.plot([], [], c='w', ls="-", lw=2)
    sma0_artist, = ax2.plot([], [], c=green, ls="-", lw=2)
    sma1_artist, = ax3.plot([], [], c='r', ls="-", lw=2)
    ecc0_artist, = ax4.plot([], [], c=green, ls="-", lw=2)
    ecc1_artist, = ax5.plot([], [], c='r', ls="-", lw=2)
    ecc0_ana_artist, = ax4.plot([], [], c='w', ls="-", lw=2)
    ecc1_ana_artist, = ax5.plot([], [], c='w', ls="-", lw=2)
    true_anomaly0_artist, = ax6.plot([], [], c=green, ls="-", lw=2)
    true_anomaly1_artist, = ax6.plot([], [], c='r', ls="-", lw=2)
    seperation_artist, = ax7.plot([], [], c=orange, ls="-", lw=2)
    K_artist, = ax8.plot([], [], c='r', ls="-", lw=2)
    U_artist, = ax8.plot([], [], c=green, ls="-", lw=2)
    E_artist, = ax8.plot([], [], c=orange, ls="-", lw=2)
    mass_artist, = ax9.plot([], [], c=orange, ls="-", lw=2)

    ax2.set_xlabel('time [yr]')
    ax2.set_ylabel('sma [AU]')

    ax3.set_xlabel('time [yr]')
    ax3.set_ylabel('sma [AU]')

    ax4.set_xlabel('time [yr]')
    ax4.set_ylabel('eccentricity ')

    ax5.set_xlabel('time [yr]')
    ax5.set_ylabel('eccentricity ')

    ax6.set_xlabel('time [yr]')
    ax6.set_ylabel('true anomaly [degrees] ')

    ax7.set_xlabel('time [yr]')
    ax7.set_ylabel('seperation [AU]')

    ax8.set_xlabel('time [yr]')
    ax8.set_ylabel('energies')

    ax9.set_ylabel('central mass [MSun]')
    ax9.set_xlabel('time [yr]')

    ax1.set_xlim(-200, 150)
    ax1.set_ylim(-250, 100)

    def update_fig(i):
        t = time[i]
        lag = int(20 * period_inner[i] / (yrs_per_datapoint))
        orbitlag = int(0.9 * period_inner[i] / (yrs_per_datapoint))

        if i <= lag:
            tbegin = time[0]
            time_range = time[0:i]
            inner_artist.set_data(inner_x[0:i], inner_y[0:i])
            outer_artist.set_data(outer_x[0:i], outer_y[0:i])
            sma0_artist.set_data(time[0:i], sma_inner[0:i])
            sma1_artist.set_data(time[0:i], sma_outer[0:i])
            sma0_ana_artist.set_data(time[0:i], sma_inner_analytical[0:i])
            sma1_ana_artist.set_data(time[0:i], sma_outer_analytical[0:i])
            ecc0_artist.set_data(time[0:i], eccentricity_inner[0:i])
            ecc1_artist.set_data(time[0:i], eccentricity_outer[0:i])
            true_anomaly0_artist.set_data(time[0:i], true_anomaly_inner[0:i])
            true_anomaly1_artist.set_data(time[0:i], true_anomaly_outer[0:i])
            K_artist.set_data(time[0:i], kinetic_energy[0:i])
            U_artist.set_data(time[0:i], potential_energy[0:i])
            E_artist.set_data(time[0:i], total_energy[0:i])
            mass_artist.set_data(time[0:i], mass[0:i])
            seperation_artist.set_data(time[0:i], seperation[0:i])
        else:
            tbegin = time[i - lag]
            time_range = time[i - lag:i]

            inner_artist.set_data(inner_x[i - orbitlag:i],
                                  inner_y[i - orbitlag:i])
            outer_artist.set_data(outer_x[i - orbitlag:i],
                                  outer_y[i - orbitlag:i])
            sma0_artist.set_data(time_range, sma_inner[i - lag:i])
            sma1_artist.set_data(time_range, sma_outer[i - lag:i])
            sma0_ana_artist.set_data(time_range,
                                     sma_inner_analytical[i - lag:i])
            sma1_ana_artist.set_data(time_range,
                                     sma_outer_analytical[i - lag:i])
            ecc0_artist.set_data(time_range, eccentricity_inner[i - lag:i])
            ecc1_artist.set_data(time_range, eccentricity_outer[i - lag:i])
            true_anomaly0_artist.set_data(time_range,
                                          true_anomaly_inner[i - lag:i])
            true_anomaly1_artist.set_data(time_range,
                                          true_anomaly_outer[i - lag:i])
            K_artist.set_data(time_range, kinetic_energy[i - lag:i])
            U_artist.set_data(time_range, potential_energy[i - lag:i])
            E_artist.set_data(time_range, total_energy[i - lag:i])
            mass_artist.set_data(time_range, mass[i - lag:i])
            seperation_artist.set_data(time_range, seperation[i - lag:i])

        try:
            central_loc.set_data(central_x[i - 1], central_y[i - 1])
            inner_loc.set_data(inner_x[i - 1], inner_y[i - 1])
            outer_loc.set_data(outer_x[i - 1], outer_y[i - 1])
        except IndexError:
            pass

        ax2.set_ylim(sma_inner_analytical[i] * 0.99,
                     sma_inner_analytical[i] * 1.01)
        ax3.set_ylim(sma_outer_analytical[i] * 0.99,
                     sma_outer_analytical[i] * 1.01)
        ax4.set_ylim(eccentricity_inner[i] - 0.01,
                     eccentricity_inner[i] + 0.01)
        ax5.set_ylim(eccentricity_outer[i] - 0.01,
                     eccentricity_outer[i] + 0.01)
        ax6.set_ylim(0, 360)
        ax7.set_ylim(5, 250)
        ax8.set_ylim(-2.5e36, 2e36)
        ax9.set_ylim(mass[i] * 0.99, mass[i] * 1.01)

        ax2.set_xlim(tbegin, t)
        ax3.set_xlim(tbegin, t)
        ax4.set_xlim(tbegin, t)
        ax5.set_xlim(tbegin, t)
        ax6.set_xlim(tbegin, t)
        ax7.set_xlim(tbegin, t)
        ax8.set_xlim(tbegin, t)
        ax9.set_xlim(tbegin, t)
        pbar.update(i)

    ffmpeg = animation.FFMpegWriter(fps=30,
                                    codec='mpeg4',
                                    extra_args=['-vcodec', 'libx264'])
    anim = animation.FuncAnimation(fig, update_fig, frames=frames, interval=50)

    if args.animate:
        plt.show()
    elif args.output:
        anim.save(args.output, writer=ffmpeg, dpi=args.dpi)
    def onpick(event):
        print("artist:{} ind:{}".format(event.artist, event.ind))
        print("button: {}".format(event.mouseevent.button))

        intr = f[event.artist.get_label()]
        sim = intr.values()[event.ind]

        time_vq = quantify_dset(sim['time'])
        time = time_vq.value_in(units.yr) 

        position_vq = quantify_dset(sim['position'])
        position = position_vq.value_in(units.AU)

        CM_position_vq = quantify_dset(sim['CM_position'])
        CM_position = CM_position_vq.value_in(units.AU)

        x, y = 0, 1
        central_x, central_y =  position[:, 0, x] - CM_position[:,x], position[:, 0, y] - CM_position[:,y]
        inner_x, inner_y =  position[:, 1, x] - CM_position[:,x], position[:, 1, y] - CM_position[:,y]
        outer_x, outer_y =  position[:, 2, x] - CM_position[:,x], position[:, 2, y] - CM_position[:,y]

        mass_vq = quantify_dset(sim['mass'])
        mass = mass_vq[:,0].value_in(units.MSun)

        if event.mouseevent.button == 1:

            mu0 = quantify_dset(sim['mass'])[0].sum()

            period_vq = quantify_dset(sim['p0/period'])
            period = period_vq.value_in(units.yr)

            true_anomaly = sim['p0/true_anomaly'].value
            argument_of_periapsis = sim['p0/argument_of_periapsis'].value

            sma_vq = quantify_dset(sim['p0/sma'])
            sma = sma_vq.value_in(units.AU)
            sma_an_vq = sma_analytical(sma_vq[0], 1.244e-5|(units.MSun/units.yr), time_vq, mu0)
            sma_an = sma_an_vq.value_in(units.AU)

            eccentricity = sim['p0/eccentricity'].value

            newfig = plt.figure()
            newax1 = newfig.add_subplot(511)
            newax2 = newfig.add_subplot(512)
            newax3 = newfig.add_subplot(513)
            newax4 = newfig.add_subplot(514)
            newax5 = newfig.add_subplot(515)

            newax1.plot(time, sma, label='numerical')
            newax1.plot(time, sma_an, label='analytical_adiabatic')
            
            newax1.set_xlabel('time [yr]')
            newax1.set_ylabel('sma [AU]')
            newax1.legend(loc='best')

            newax2.plot(time, eccentricity)
            newax2.set_xlabel('time [yr]')
            newax2.set_ylabel('eccentricity ')

            newax3.plot(time, true_anomaly)
            newax3.set_xlabel('time [yr]')
            newax3.set_ylabel('true anomaly [degrees] ')

            newax4.plot(time, argument_of_periapsis)
            newax4.set_xlabel('time [yr]')
            newax4.set_ylabel('argument of periapsis [degrees] ')

            newax5.plot(time, period)
            newax5.set_xlabel('time [yr]')
            newax5.set_ylabel('period')

        else:
            newfig = plt.figure()
            newax1 = newfig.add_subplot(321)
            newax2 = newfig.add_subplot(322)
            newax3 = newfig.add_subplot(323)
            newax4 = newfig.add_subplot(324)
            newax5 = newfig.add_subplot(325)
            newax6 = newfig.add_subplot(326)

            mass_vq = quantify_dset(sim['mass'])
            mass = mass_vq.value_in(units.MSun)

            kinetic_energy = sim['kinetic_energy'].value
            potential_energy = sim['potential_energy'].value
            total_energy = sim['total_energy'].value

            CM_velocity_vq = quantify_dset(sim['CM_velocity'])
            CM_velocity_mod = CM_velocity_vq.lengths().value_in(units.km/units.hour)

            walltime = sim['walltime'].value - sim['walltime'][0]

            newax1.plot(time, mass)
            newax1.set_ylabel('central mass [MSun]')
            newax1.set_xlabel('time [yr]')

            newax2.plot(time, kinetic_energy, label='kinetic', **line.red)
            newax2.plot(time, potential_energy,label='potential',  **line.orange)
            newax2.plot(time, total_energy, label='total', **line.white)
            newax2.set_xlabel('time [yr]')
            newax2.legend()

            newax3.plot(central_x, central_y, **dots.white)
            newax3.plot(inner_x, inner_y, **dots.red)
            newax3.plot(outer_x, outer_y, **dots.yellow)
            newax3.set_xlabel('x [AU]')
            newax3.set_ylabel('y [AU]')

            newax4.plot(CM_position[:, x], CM_position[:, y] )
            newax4.set_xlim(-5, 5)
            newax4.set_xlabel('CM position x [AU]')
            newax4.set_ylabel('CM position y [AU]')

            newax5.plot(time, CM_velocity_mod)
            newax5.set_ylim(20, 30)
            newax5.set_xlabel('time [yr]')
            newax5.set_ylabel('CM velocity [km/hour]')

            newax6.plot(time, walltime)
            newax6.set_xlabel('time [yr]')
            newax6.set_ylabel('walltime [s]')

        newfig.show()
def main():

    dots = Dots()
    line = Line()

    f = h5py.File(args.filename, 'r')
    
    fig = plt.figure()
    ax1 = fig.add_subplot(211)
    ax2 = fig.add_subplot(212)

    for intr in f.values():

        etas = [] 
        final_smas_p0_vq = AdaptingVectorQuantity()
        final_smas_p1_vq = AdaptingVectorQuantity()

        for sim in intr.values():
            etas.append(sim['eta'][0])
            final_smas_p0_vq.append(sim['p0/sma'][-1]| retrieve_unit(sim['p0/sma']))
            final_smas_p1_vq.append(sim['p1/sma'][-1]| retrieve_unit(sim['p1/sma']))

        final_smas_p0 = final_smas_p0_vq.value_in(units.AU)
        final_smas_p1 = final_smas_p1_vq.value_in(units.AU)

        ax1.plot(etas, final_smas_p0, marker='o', label=intr.name, picker=5)
        ax2.plot(etas, final_smas_p1, marker='o', label=intr.name, picker=5)

        ax1.set_xlabel('eta')
        ax2.set_xlabel('eta')
        ax1.set_ylabel('final sma inner [AU]')
        ax2.set_ylabel('final sma outer [AU]')

    dset = f.values()[0].values()[0] #first dset available
        
    time = quantify_dset(dset['time']).value_in(units.yr)
    mass = quantify_dset(dset['mass']).value_in(units.MSun)
    inner_sma0 = quantify_dset(dset['p0/sma']).value_in(units.AU)
    outer_sma0 = quantify_dset(dset['p1/sma']).value_in(units.AU)

    inner_sma_final_adiabatic_approx = sma_analytical(inner_sma0[0], 1.244e-5, time[-1], mass[0].sum() )
    outer_sma_final_adiabatic_approx = sma_analytical(outer_sma0[0], 1.244e-5, time[-1], mass[0].sum() )

    ax1.axhline(inner_sma_final_adiabatic_approx, xmin=0, xmax=1, c='m', label='adiabatic approx')
    ax1.legend(loc='best')
    ax2.axhline(outer_sma_final_adiabatic_approx, xmin=0, xmax=1, c='m', label='adiabatic approx')
    ax2.legend(loc='best')

    if args.logscale:
        ax1.set_xscale('log')
        ax2.set_xscale('log')

    if args.ylim1:
        ax1.set_ylim(args.ylim1)
    if args.ylim2:
        ax2.set_ylim(args.ylim2)
    if args.xlim1:
        ax1.set_xlim(args.xlim1)
    if args.xlim2:
        ax2.set_xlim(args.xlim2)

    def onpick(event):
        print("artist:{} ind:{}".format(event.artist, event.ind))
        print("button: {}".format(event.mouseevent.button))

        intr = f[event.artist.get_label()]
        sim = intr.values()[event.ind]

        time_vq = quantify_dset(sim['time'])
        time = time_vq.value_in(units.yr) 

        position_vq = quantify_dset(sim['position'])
        position = position_vq.value_in(units.AU)

        CM_position_vq = quantify_dset(sim['CM_position'])
        CM_position = CM_position_vq.value_in(units.AU)

        x, y = 0, 1
        central_x, central_y =  position[:, 0, x] - CM_position[:,x], position[:, 0, y] - CM_position[:,y]
        inner_x, inner_y =  position[:, 1, x] - CM_position[:,x], position[:, 1, y] - CM_position[:,y]
        outer_x, outer_y =  position[:, 2, x] - CM_position[:,x], position[:, 2, y] - CM_position[:,y]

        mass_vq = quantify_dset(sim['mass'])
        mass = mass_vq[:,0].value_in(units.MSun)

        if event.mouseevent.button == 1:

            mu0 = quantify_dset(sim['mass'])[0].sum()

            period_vq = quantify_dset(sim['p0/period'])
            period = period_vq.value_in(units.yr)

            true_anomaly = sim['p0/true_anomaly'].value
            argument_of_periapsis = sim['p0/argument_of_periapsis'].value

            sma_vq = quantify_dset(sim['p0/sma'])
            sma = sma_vq.value_in(units.AU)
            sma_an_vq = sma_analytical(sma_vq[0], 1.244e-5|(units.MSun/units.yr), time_vq, mu0)
            sma_an = sma_an_vq.value_in(units.AU)

            eccentricity = sim['p0/eccentricity'].value

            newfig = plt.figure()
            newax1 = newfig.add_subplot(511)
            newax2 = newfig.add_subplot(512)
            newax3 = newfig.add_subplot(513)
            newax4 = newfig.add_subplot(514)
            newax5 = newfig.add_subplot(515)

            newax1.plot(time, sma, label='numerical')
            newax1.plot(time, sma_an, label='analytical_adiabatic')
            
            newax1.set_xlabel('time [yr]')
            newax1.set_ylabel('sma [AU]')
            newax1.legend(loc='best')

            newax2.plot(time, eccentricity)
            newax2.set_xlabel('time [yr]')
            newax2.set_ylabel('eccentricity ')

            newax3.plot(time, true_anomaly)
            newax3.set_xlabel('time [yr]')
            newax3.set_ylabel('true anomaly [degrees] ')

            newax4.plot(time, argument_of_periapsis)
            newax4.set_xlabel('time [yr]')
            newax4.set_ylabel('argument of periapsis [degrees] ')

            newax5.plot(time, period)
            newax5.set_xlabel('time [yr]')
            newax5.set_ylabel('period')

        else:
            newfig = plt.figure()
            newax1 = newfig.add_subplot(321)
            newax2 = newfig.add_subplot(322)
            newax3 = newfig.add_subplot(323)
            newax4 = newfig.add_subplot(324)
            newax5 = newfig.add_subplot(325)
            newax6 = newfig.add_subplot(326)

            mass_vq = quantify_dset(sim['mass'])
            mass = mass_vq.value_in(units.MSun)

            kinetic_energy = sim['kinetic_energy'].value
            potential_energy = sim['potential_energy'].value
            total_energy = sim['total_energy'].value

            CM_velocity_vq = quantify_dset(sim['CM_velocity'])
            CM_velocity_mod = CM_velocity_vq.lengths().value_in(units.km/units.hour)

            walltime = sim['walltime'].value - sim['walltime'][0]

            newax1.plot(time, mass)
            newax1.set_ylabel('central mass [MSun]')
            newax1.set_xlabel('time [yr]')

            newax2.plot(time, kinetic_energy, label='kinetic', **line.red)
            newax2.plot(time, potential_energy,label='potential',  **line.orange)
            newax2.plot(time, total_energy, label='total', **line.white)
            newax2.set_xlabel('time [yr]')
            newax2.legend()

            newax3.plot(central_x, central_y, **dots.white)
            newax3.plot(inner_x, inner_y, **dots.red)
            newax3.plot(outer_x, outer_y, **dots.yellow)
            newax3.set_xlabel('x [AU]')
            newax3.set_ylabel('y [AU]')

            newax4.plot(CM_position[:, x], CM_position[:, y] )
            newax4.set_xlim(-5, 5)
            newax4.set_xlabel('CM position x [AU]')
            newax4.set_ylabel('CM position y [AU]')

            newax5.plot(time, CM_velocity_mod)
            newax5.set_ylim(20, 30)
            newax5.set_xlabel('time [yr]')
            newax5.set_ylabel('CM velocity [km/hour]')

            newax6.plot(time, walltime)
            newax6.set_xlabel('time [yr]')
            newax6.set_ylabel('walltime [s]')

        newfig.show()

    fig.canvas.mpl_connect('pick_event', onpick) 
    plt.show()