1
0
Fork 0
mirror of https://github.com/Findus23/rebound-collisions.git synced 2024-09-19 15:53:48 +02:00
rebound-collisions/extradata.py

184 lines
5.1 KiB
Python
Raw Normal View History

2020-03-31 15:39:59 +02:00
import json
2021-01-02 16:30:39 +01:00
from copy import deepcopy
2020-03-31 15:39:59 +02:00
from dataclasses import dataclass
from pathlib import Path
2021-01-02 16:30:39 +01:00
from typing import Dict, Tuple, List
2020-03-31 15:39:59 +02:00
from rebound import Particle
2021-01-02 16:30:39 +01:00
from scipy.constants import astronomical_unit, year
2020-03-31 15:39:59 +02:00
@dataclass
class ParticleData:
water_mass_fraction: float
type: str
escaped: float = None
collided_with_sun: float = None
2021-02-03 22:04:34 +01:00
total_mass: float = None
@property
def water_mass(self) -> float:
return self.total_mass * self.water_mass_fraction
2020-03-31 15:39:59 +02:00
2021-01-02 16:30:39 +01:00
@dataclass
class Input:
alpha: float
velocity_original: float
escape_velocity: float
gamma: float
projectile_mass: float
target_water_fraction: float
projectile_water_fraction: float
velocity_esc: float = None
def __post_init__(self):
self.velocity_esc = self.velocity_si / self.escape_velocity
@property
def velocity_si(self):
return self.velocity_original * astronomical_unit / year
@dataclass
class CollisionMeta:
collision_velocities: Tuple[List[float], List[float]] = None
2021-01-21 16:45:31 +01:00
collision_positions: Tuple[List[float], List[float]] = None
collision_radii: Tuple[float, float] = None
2021-01-02 16:30:39 +01:00
interpolation_input: List[float] = None
raw_water_retention: float = None
raw_mass_retention: float = None
water_retention: float = None
mass_retention: float = None
total_mass: float = None
final_wmf: float = None
final_radius: float = None
target_wmf: float = None
projectile_wmf: float = None
time: float = None
input: Input = None
adjusted_input: Input = None
2020-03-31 15:39:59 +02:00
@dataclass
class Meta:
tmax: float = None
num_savesteps: int = None
per_savestep: float = None
initial_N: int = None
initial_N_planetesimal: int = None
initial_N_embryo: int = None
2020-03-31 15:39:59 +02:00
walltime: int = None # seconds
cputime: int = None # seconds
current_time: float = None
2021-02-11 11:50:53 +01:00
git_hash: str = None
perfect_merging: bool = None
2020-03-31 15:39:59 +02:00
def save(self):
return self.__dict__
class CollisionTree:
def __init__(self):
self._tree = {}
2021-01-02 16:30:39 +01:00
def add(self, source1: Particle, source2: Particle, to: Particle, metadata: CollisionMeta):
data = {"parents": [source1.hash.value, source2.hash.value], "meta": metadata}
self._tree[to.hash.value] = data
2020-03-31 15:39:59 +02:00
def save(self):
2021-01-02 16:30:39 +01:00
savetree = {}
tmpcopy = deepcopy(self._tree)
for key, data in tmpcopy.items():
metadata = data["meta"]
metadata = metadata.__dict__
metadata["input"] = metadata["input"].__dict__
metadata["adjusted_input"] = metadata["adjusted_input"].__dict__
data["meta"] = metadata
savetree[key] = data
return savetree
2020-03-31 15:39:59 +02:00
def load(self, tree):
2021-01-02 16:30:39 +01:00
self._tree = {}
for key, data in tree.items():
metadata = data["meta"]
metadata["input"] = Input(**metadata["input"])
metadata["adjusted_input"] = Input(**metadata["adjusted_input"])
metadata = CollisionMeta(**metadata)
data["meta"] = metadata
2021-02-03 22:04:34 +01:00
self._tree[int(key)] = data
2021-01-02 16:30:39 +01:00
def get_tree(self) -> Dict:
return self._tree
2020-12-27 13:40:11 +01:00
2021-02-03 22:04:34 +01:00
def get(self, particle: Particle):
return self._tree[particle.hash.value]
2020-12-27 13:40:11 +01:00
2021-02-04 13:42:22 +01:00
class History:
2020-12-27 13:40:11 +01:00
def __init__(self):
2021-02-04 13:42:22 +01:00
self.energy = []
self.momentum = []
self.total_mass = []
self.time = []
self.N = []
self.N_active = []
def append(self, energy: float, momentum: float, total_mass: float, time: float, N: int, N_active: int):
self.energy.append(energy)
self.momentum.append(momentum)
self.total_mass.append(total_mass)
self.time.append(time)
self.N.append(N)
self.N_active.append(N_active)
def save(self):
2021-02-04 13:42:22 +01:00
return self.__dict__
def load(self, data):
2021-02-04 13:42:22 +01:00
self.__dict__ = data
2020-12-30 23:16:28 +01:00
class ExtraData:
def __init__(self):
self.tree = CollisionTree()
self.pdata: Dict[int, ParticleData] = {}
self.meta = Meta()
2021-02-04 13:42:22 +01:00
self.history = History()
2020-12-30 23:16:28 +01:00
2021-02-04 13:42:22 +01:00
def save(self, base_filename: Path):
2020-12-30 23:16:28 +01:00
pdata = {}
for k, v in self.pdata.items():
pdata[k] = v.__dict__
2021-02-04 13:42:22 +01:00
with base_filename.with_suffix(".extra.json").open("w") as f:
2020-12-30 23:16:28 +01:00
json.dump({
"meta": self.meta.save(),
"pdata": pdata,
"tree": self.tree.save(),
}, f, indent=2)
2021-02-04 13:42:22 +01:00
with base_filename.with_suffix(".history.json").open("w") as f:
json.dump(self.history.save(), f, indent=2)
2020-12-30 23:16:28 +01:00
@classmethod
2021-02-04 13:42:22 +01:00
def load(cls, base_filename: Path):
with base_filename.with_suffix(".extra.json").open() as f:
2020-12-30 23:16:28 +01:00
data = json.load(f)
2021-02-04 13:42:22 +01:00
with base_filename.with_suffix(".history.json").open() as f:
history = json.load(f)
2020-12-30 23:16:28 +01:00
self = cls()
self.meta = Meta(**data["meta"])
2021-02-04 13:42:22 +01:00
self.history = History()
self.history.load(history)
2020-12-30 23:16:28 +01:00
self.tree.load(data["tree"])
for k, v in data["pdata"].items():
self.pdata[int(k)] = ParticleData(**v)
return self
def pd(self, particle: Particle) -> ParticleData:
2021-01-02 13:44:54 +01:00
return self.pdata[particle.hash.value]