Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
			#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:
Ejemplo n.º 3
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)
Ejemplo n.º 4
0
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)