Source code for run_planets

#!/usr/bin/env python
from cortix import Cortix
from cortix import Module
from cortix import Network
from cortix import Port
from body import Body

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib.patches import Patch

import os
import numpy as np

[docs]def main(): um = False sim_time = 365 * 24 * 3600 #157788000.0 * 10 time_step = 24 * 3600 #25000.0 universe_rad = 2.5e11 cortix = Cortix(use_mpi=um) cortix.network = Network() earth_mass = 5.9740e+24 earth_pos = np.array([1.4960e+11, 0.0, 0.0]) earth_vel = np.array([(0.0, 2.9800e+04, 0.0)]) earth = Body(earth_mass, earth_pos, earth_vel) earth.name = "earth" cortix.network.module(earth) mars_mass = 6.4190e+23 mars_pos = np.array([2.2790e+11, 0.0, 0.0]) mars_vel = np.array([0.0, 2.4100e+04, 0.0]) mars = Body(mars_mass, mars_pos, mars_vel) mars.name = "mars" cortix.network.module(mars) mercury_mass = 3.3020e+23 mercury_pos = np.array([5.7900e+10, 0.0, 0.0]) mercury_vel = np.array([0.0, 4.7900e+04, 0.0]) mercury = Body(mercury_mass, mercury_pos, mercury_vel) mercury.name = "mercury" cortix.network.module(mercury) venus_mass = 4.8690e+24 venus_pos = np.array([1.0820e+11, 0.0, 0.0]) venus_vel = np.array([0.0, 3.5000e+04 , 0.0]) venus = Body(venus_mass, venus_pos, venus_vel) venus.name = "venus" cortix.network.module(venus) sun_mass = 1.9890e+30 sun_pos = np.array([0.0, 0.0, 0.0]) sun_vel = np.array([0.0, 0.0, 0.0]) sun = Body(sun_mass, sun_pos, sun_vel) sun.name = "sun" cortix.network.module(sun) for x, i in enumerate(cortix.network.modules): i.save = True i.dt = time_step i.time = sim_time for y, j in enumerate(cortix.network.modules): pi = Port("body_{}".format(y), um) if x != y and pi not in i.ports: i.ports.append(pi) pj = Port("body_{}".format(x), um) j.ports.append(pj) pj.connect(pi) cortix.network.gv_edges.append((str(x), str(y))) cortix.run() cortix.network.draw() return [(b.name, b.trajectory) for b in cortix.network.modules]
[docs]def plot_trajectories(traj=None): au = (149.6e6 * 1000) scale = 250 / au if traj is None: traj = [] for file in os.listdir("."): if file.endswith(".csv"): with open(file, "r") as f: lines = [l.strip().split(",") for l in f.readlines()] name = lines[0] lines = line[1:] t = [(float(i[0]), float(i[1]), float(i[2])) for i in lines] traj.append((name, t)) fig = plt.figure(1) ax = fig.gca(projection='3d') patches = [] plt.draw() plt.pause(.1) plt.legend(handles=[Patch(label=name) for (name, t) in traj]) for (name, t) in traj: patches.append(name) x = [i[0] * scale for i in t] y = [i[1] * scale for i in t] z = [i[2] * scale for i in t] ax.plot(x, y, z) plt.savefig("planets.png")
if __name__ == "__main__": trajectories = main() import matplotlib matplotlib.use("GTK3Agg") plot_trajectories(trajectories) plt.show()