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()
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 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)
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 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 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()