from itertools import combinations import matplotlib.pyplot as plt from mpmath import cbrt import sys import OrbitData times = [] masses = None positions = [] for time, bodies, _ in OrbitData.read(sys.stdin): times.append(time) positions.append(map(lambda b: b[1:3], bodies)) masses = map(lambda b: b[0], bodies) scale = min(masses) masses = [12*cbrt(m/scale)**2 for m in masses] print "Read all data" def update_plot(i, scat, pos, mass): scat.set_offsets(pos[i]) scat.set_sizes(mass) return scat minx = min(map(lambda p: min(map(lambda c: c[0], p)), positions)) maxx = max(map(lambda p: max(map(lambda c: c[0], p)), positions)) miny = min(map(lambda p: min(map(lambda c: c[1], p)), positions)) maxy = max(map(lambda p: max(map(lambda c: c[1], p)), positions)) xbuf = (maxx - minx)/10 maxx += xbuf
#G is accounted for in vdt p.ax -= b.mass * dx / h3 p.ay -= b.mass * dy / h3 b.ax += p.mass * dx / h3 b.ay += p.mass * dy / h3 #Update velocity & position p.vx += p.ax*vdt p.vy += p.ay*vdt p.x += p.vx*dt p.y += p.vy*dt p.ax = 0 p.ay = 0 reader = OrbitData.read(sys.stdin) time, b_info, _ = reader.next() minmass = min(map(lambda t: t[0], b_info)) G = G*minmass bodies = [Body(data[0]/minmass, *data[1:]) for data in b_info] timestep = args.step output_interval = args.out end = args.end step(bodies, timestep, True) for s in xrange(time, end, timestep): step(bodies, timestep, False) if s % output_interval == 0:
parser.add_argument('--smooth', dest='smooth', type=int, default=0) parser.add_argument('--tscale', dest='tscale', type=float, default=1) parser.add_argument('--start', dest='start', type=int, default=0) parser.add_argument('--stop', dest='stop', type=int, default=0) parser.add_argument('--f', dest='fname', type=str, default="") args = parser.parse_args() smooth = args.smooth start = args.start stop = args.stop tscale = max(args.tscale,1) xs = [] distances = [] for time, _, dlist in OrbitData.read(sys.stdin): xs.append(time) distances.append(dlist) print "Read all data" distances = numpy.transpose(distances) print "Transposed distance arrays" def movingaverage(interval, window_size): window = numpy.ones(int(window_size))/float(window_size) return numpy.convolve(interval, window, 'same') if smooth > 1: avrgdt = sum(b-a for a,b in zip(xs,xs[1:]))/(len(xs)-1)
class Body(): def __init__(self,mass,x,y,vx,vy): self.mass = mass self.x=x self.y=y self.vx=vx self.vy=vy G = mpf(6.67384e-11) R = mpf(2591111127.56519) M = mpf(1.59128e29) def calcInitial(mass, dist, angle): x = cos(angle)*dist y = sin(angle)*dist speed = sqrt(G*M/dist) vy = cos(angle)*speed vx = -sin(angle)*speed return Body(mass, x, y, vx, vy) Sun = Body(M,0,0,0,0) for i in xrange(1,10): Solia = calcInitial(5.972e24,R+i*5e7/4,radians(0)) Moon = calcInitial(5.972e24/4,R-i*5e7,radians(300)) with open("Solia%d.in"%(i,), "w") as f: OrbitData.write(f, 0, [Sun, Solia, Moon]) print "nbody.exe -o 2500 -t 1e8 < Solia%d.in > Solia%d.out" % (i,i) print "python GraphOrbits.py --smooth 2543000 --f Solia%d.png < Solia%d.out" % (i,i)