Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
Simulation Archive file with the `getSimulation` method.
As the `mode` argument is set to `close`, the simulation
will be integrated from the nearest snapshot to the request time.
>>> sa = rebound.SimulationArchive("archive.bin")
>>> sim = sa.getSimulation(t=1e6, mode="close")
>>> print(sim.particles[1])
>>> for sim in sa:
>>> print(sim.t, sim.particles[1].e)
"""
if mode not in ['snapshot', 'close', 'exact']:
raise AttributeError("Unknown mode.")
bi, bt = self._getSnapshotIndex(t)
sim = Simulation()
w = c_int(0)
clibrebound.reb_create_simulation_from_simulationarchive_with_messages(byref(sim),byref(self),bi,byref(w))
# Restore function pointers and any additional setup required by the user provided functions
if self.setup:
self.setup(sim, *self.setup_args)
if mode=='snapshot':
if (sim.integrator=="whfast" and sim.ri_whfast.safe_mode == 1) or (sim.integrator=="saba" and sim.ri_saba.safe_mode == 1):
keep_unsynchronized = 0
sim.ri_whfast.keep_unsynchronized = keep_unsynchronized
sim.ri_saba.keep_unsynchronized = keep_unsynchronized
sim.integrator_synchronize()
return sim
else:
if mode=='exact':
Particle._fields_ = [("x", c_double),
("y", c_double),
("z", c_double),
("vx", c_double),
("vy", c_double),
("vz", c_double),
("ax", c_double),
("ay", c_double),
("az", c_double),
("m", c_double),
("r", c_double),
("lastcollision", c_double),
("c", c_void_p),
("id", c_int),
("ap", c_void_p),
("_sim", POINTER(Simulation))]
POINTER_REB_SIM = POINTER(Simulation)
AFF = CFUNCTYPE(None,POINTER_REB_SIM)
CORFF = CFUNCTYPE(c_double,POINTER_REB_SIM, c_double)
COLRFF = CFUNCTYPE(c_int, POINTER_REB_SIM, reb_collision)
# Import at the end to avoid circular dependence
from . import horizons
from . import debug
def copy(self):
"""
Returns a deep copy of a REBOUND simulation. You need to reset
any function pointers on the copy.
Returns
-------
A rebound.Simulation object.
"""
w = c_int(0)
sim = Simulation()
clibrebound._reb_copy_simulation_with_messages(byref(sim),byref(self),byref(w))
for majorerror, value, message in BINARY_WARNINGS:
if w.value & value:
if majorerror:
raise RuntimeError(message)
else:
# Just a warning
warnings.warn(message, RuntimeWarning)
return sim
snapshot = -1
if len(args)>1:
snapshot = args[1]
if "snapshot" in kw:
snapshot = kw["snapshot"]
# Create simulation
if filename==None:
# Create a new simulation
sim = super(Simulation,cls).__new__(cls)
clibrebound.reb_init_simulation(byref(sim))
return sim
else:
# Recreate exisitng simulation
sa = SimulationArchive(filename,process_warnings=False)
sim = super(Simulation,cls).__new__(cls)
clibrebound.reb_init_simulation(byref(sim))
w = sa.warnings # warnings will be appended to previous warnings (as to not repeat them)
clibrebound.reb_create_simulation_from_simulationarchive_with_messages(byref(sim),byref(sa),c_int(snapshot),byref(w))
for majorerror, value, message in BINARY_WARNINGS:
if w.value & value:
if majorerror:
raise RuntimeError(message)
else:
# Just a warning
warnings.warn(message, RuntimeWarning)
return sim
("ri_sei", reb_simulation_integrator_sei),
("ri_whfast", reb_simulation_integrator_whfast),
("ri_saba", reb_simulation_integrator_saba),
("ri_ias15", reb_simulation_integrator_ias15),
("ri_mercurius", reb_simulation_integrator_mercurius),
("ri_janus", reb_simulation_integrator_janus),
("ri_eos", reb_simulation_integrator_eos),
("_additional_forces", CFUNCTYPE(None,POINTER(Simulation))),
("_pre_timestep_modifications", CFUNCTYPE(None,POINTER(Simulation))),
("_post_timestep_modifications", CFUNCTYPE(None,POINTER(Simulation))),
("_heartbeat", CFUNCTYPE(None,POINTER(Simulation))),
("_display_heartbeat", CFUNCTYPE(None,POINTER(Simulation))),
("_coefficient_of_restitution", CFUNCTYPE(c_double,POINTER(Simulation), c_double)),
("_collision_resolve", CFUNCTYPE(c_int,POINTER(Simulation), reb_collision)),
("_free_particle_ap", CFUNCTYPE(None, POINTER(Particle))),
("_extras_cleanup", CFUNCTYPE(None, POINTER(Simulation))),
("extras", c_void_p),
]
Particle._fields_ = [("x", c_double),
("y", c_double),
("z", c_double),
("vx", c_double),
("vy", c_double),
("vz", c_double),
("ax", c_double),
("ay", c_double),
("az", c_double),
("m", c_double),
("r", c_double),
("lastcollision", c_double),
("c", c_void_p),
from ctypes import Structure, c_double, POINTER, c_float, c_int, c_uint, c_uint32, c_int64, c_long, c_ulong, c_ulonglong, c_void_p, c_char_p, CFUNCTYPE, byref, create_string_buffer, addressof, pointer, cast
from .simulation import Simulation, BINARY_WARNINGS
from . import clibrebound
import os
import sys
import math
import warnings
POINTER_REB_SIM = POINTER(Simulation)
class SimulationArchive(Structure):
"""
SimulationArchive Class.
The SimulationArchive is a binary file format which includes all
settings, constants as well as particle positions and velocities.
This makes it possible to reproduce a simulation exactly
(down to the last bit). The SimulationArchive allows you to add
an arbitrary number of snapshots. Simulations can be reconstructed
from these snapshots. Since version 2 of the SimulationArchive
(Spring 2018), you can change anything inbetween snapshots,
icluding settings like the integrator, the timestep, the number of
particles. The file format is efficient in that only data
that changed is stored in the SimulationArchive file. This is all
done automatically. All the user has to do is call the function
if PY3:
int_types = int,
else:
int_types = int, long,
if isinstance(key, slice):
raise AttributeError("Slicing not supported due to optimizations.")
if not isinstance(key, int_types):
raise AttributeError("Must access individual simulations with integer index.")
if key < 0:
key += len(self)
if key>= len(self) or key<0:
raise IndexError("Index out of range, number of snapshots stored in binary: %d."%len(self))
w = c_int(0)
sim = Simulation()
clibrebound.reb_create_simulation_from_simulationarchive_with_messages(byref(sim), byref(self), c_long(key), byref(w))
if self.setup:
self.setup(sim, *self.setup_args)
for majorerror, value, message in BINARY_WARNINGS:
if w.value & value:
if majorerror:
raise RuntimeError(message)
else:
# Just a warning
warnings.warn(message, RuntimeWarning)
return sim