Source code for body
from cortix import Module
from cortix import Port
import numpy as np
[docs]class Body(Module):
def __init__(self, mass=1, rad=(0, 0, 0), vel=(0, 0, 0), time=100, dt=0.01):
super().__init__()
self.G = 6.67408e-11
self.ep = 1e-20
self.mass = mass
self.rad = rad
self.vel = vel
self.acc = np.zeros(3)
self.other_bodies = None
self.dt = dt
self.time = time
self.trajectory = []
[docs] def force_from(self, other_mass, other_rad):
delta = np.linalg.norm(other_rad - self.rad)
if delta == 0:
print("Collision!")
exit(1)
return (self.G * self.mass * other_mass) / (delta ** 2)
[docs] def step(self):
self.acc = np.zeros(3)
total_force = np.zeros(3)
for (body_mass, body_rad) in self.other_bodies:
total_force += self.force_from(body_mass, body_rad)
acc = total_force / self.mass
self.acc = self.acc + acc
self.vel = self.vel + acc * self.dt
self.rad = self.rad + self.vel * self.dt
[docs] def broadcast_data(self):
# Broadcast (mass, pos) to every body
for port in self.ports:
self.send((self.mass, self.rad), port)
[docs] def gather_data(self):
# Get (mass, pos) from every other body
self.other_bodies = [self.recv(port) for port in self.ports]
[docs] def run(self):
t = 0.0
while t < self.time:
self.broadcast_data()
self.gather_data()
self.step()
self.trajectory.append(tuple(self.rad.flatten()))
t += self.dt
print(t)
self.dump()
[docs] def dump(self, file_name=None):
if file_name is None:
file_name = "body_{}.csv".format(id(self))
with open(file_name, "w") as f:
for (x, y, z) in self.trajectory:
f.write("{}, {}, {}\n".format(x, y, z))
def __repr__(self):
return "{}".format([self.mass, self.rad, self.vel, self.acc])