def commit_particles(self): num = len(self.particles) ps = ParticleSystem(nstars=num) for (i, p) in enumerate(self.particles): ps.id[i] = i ps.mass[i] = p.mass ps.radius[i] = p.radius # XXX: 'radius' is not yet used in Tupan. ps.eps2[i] = self.eps2/2 ps.rx[i] = p.rx ps.ry[i] = p.ry ps.rz[i] = p.rz ps.vx[i] = p.vx ps.vy[i] = p.vy ps.vz[i] = p.vz self.integrator = Integrator(self.eta, self.time_begin, ps, method=self.integrator_method, pn_order=self.pn_order, clight=self.clight) return 0
class TupanImplementation(object): def __init__(self): self.eta = 0.03125 self.current_time = 0.0 self.eps2 = 0.0 self.time_begin = 0.0 self.integrator_method = "sia21h.dkd" self.pn_order = 0 self.clight = None self.particles = [] self.particles_initialized = False def initialize_code(self): return 0 def cleanup_code(self): return 0 def commit_parameters(self): if not self.integrator_method in Integrator.PROVIDED_METHODS: msg = "Unknown integrator: {0}. Provided methods are: {1}." print(msg.format(self.integrator_method, Integrator.PROVIDED_METHODS)) return -1 if self.pn_order > 0 and self.clight is None: print("'clight' is None. Please set the speed of light " "parameter 'clight' when using 'pn_order' > 0.") return -1 return 0 def commit_particles(self): num = len(self.particles) ps = ParticleSystem(nstars=num) for (i, p) in enumerate(self.particles): ps.id[i] = i ps.mass[i] = p.mass ps.radius[i] = p.radius # XXX: 'radius' is not yet used in Tupan. ps.eps2[i] = self.eps2/2 ps.rx[i] = p.rx ps.ry[i] = p.ry ps.rz[i] = p.rz ps.vx[i] = p.vx ps.vy[i] = p.vy ps.vz[i] = p.vz self.integrator = Integrator(self.eta, self.time_begin, ps, method=self.integrator_method, pn_order=self.pn_order, clight=self.clight) return 0 def synchronize_model(self): return 0 def new_particle(self, index_of_the_particle, mass, radius, x, y, z, vx, vy, vz): ps = ParticleSystem(nstars=1) ps.mass[0] = mass ps.radius[0] = radius ps.rx[0] = x ps.ry[0] = y ps.rz[0] = z ps.vx[0] = vx ps.vy[0] = vy ps.vz[0] = vz self.particles.append(ps) index_of_the_particle.value = len(self.particles)-1 return 0 def set_state(self, index_of_the_particle, mass, radius, x, y, z, vx, vy, vz): try: i = index_of_the_particle ps = self.integrator.particle_system ps.mass[i] = mass ps.radius[i] = radius ps.rx[i] = x ps.ry[i] = y ps.rz[i] = z ps.vx[i] = vx ps.vy[i] = vy ps.vz[i] = vz return 0 except Exception as exc: print(str(exc)) return -1 def set_mass(self, index_of_the_particle, mass): try: i = index_of_the_particle ps = self.integrator.particle_system ps.mass[i] = mass return 0 except Exception as exc: print(str(exc)) return -1 def set_radius(self, index_of_the_particle, radius): try: i = index_of_the_particle ps = self.integrator.particle_system ps.radius[i] = radius return 0 except Exception as exc: print(str(exc)) return -1 def set_position(self, index_of_the_particle, x, y, z): try: i = index_of_the_particle ps = self.integrator.particle_system ps.rx[i] = x ps.ry[i] = y ps.rz[i] = z return 0 except: return -1 def set_velocity(self, index_of_the_particle, vx, vy, vz): try: i = index_of_the_particle ps = self.integrator.particle_system ps.vx[i] = vx ps.vy[i] = vy ps.vz[i] = vz return 0 except: return -1 def get_state(self, index_of_the_particle, mass, radius, x, y, z, vx, vy, vz): try: i = index_of_the_particle ps = self.integrator.particle_system mass.value = ps.mass[i] radius.value = ps.radius[i] x.value, y.value, z.value = ps.rx[i], ps.ry[i], ps.rz[i] vx.value, vy.value, vz.value = ps.vx[i], ps.vy[i], ps.vz[i] return 0 except: return -1 def get_mass(self, index_of_the_particle, mass): try: i = index_of_the_particle ps = self.integrator.particle_system mass.value = ps.mass[i] return 0 except: return -1 def get_radius(self, index_of_the_particle, radius): try: i = index_of_the_particle ps = self.integrator.particle_system radius.value = ps.radius[i] return 0 except: return -1 def get_position(self, index_of_the_particle, x, y, z): try: i = index_of_the_particle ps = self.integrator.particle_system x.value, y.value, z.value = ps.rx[i], ps.ry[i], ps.rz[i] return 0 except: return -1 def get_velocity(self, index_of_the_particle, vx, vy, vz): try: i = index_of_the_particle ps = self.integrator.particle_system vx.value, vy.value, vz.value = ps.vx[i], ps.vy[i], ps.vz[i] return 0 except: return -1 def get_kinetic_energy(self, kinetic_energy): ps = self.integrator.particle_system ke = ps.kinetic_energy kinetic_energy.value = ke return 0 def get_potential_energy(self, potential_energy): ps = self.integrator.particle_system pe = ps.potential_energy potential_energy.value = pe return 0 def get_total_mass(self, total_mass): ps = self.integrator.particle_system mtot = ps.total_mass total_mass.value = mtot return 0 def get_center_of_mass_position(self, x, y, z): ps = self.integrator.particle_system com_r = ps.com_r x.value, y.value, z.value = com_r return 0 def get_center_of_mass_velocity(self, vx, vy, vz): ps = self.integrator.particle_system com_v = ps.com_v vx.value, vy.value, vz.value = com_v return 0 def get_gravity_at_point(self, eps, x, y, z, ax, ay, az, length): ax.value = 0.0 ay.value = 0.0 az.value = 0.0 return -2 # Not implemented def get_potential_at_point(self, eps, x, y, z, phi, length): phi.value = 0.0 return -2 # Not implemented def evolve_model(self, t_end): while (abs(self.integrator.time) < abs(t_end)): self.integrator.evolve_step(t_end) self.current_time = self.integrator.time return 0 def set_eta(self, eta): self.eta = eta return 0 def get_eta(self, eta): eta.value = self.eta return 0 def set_time(self, time): self.current_time = time return 0 def get_time(self, time): time.value = self.current_time return 0 def set_eps2(self, epsilon_squared): self.eps2 = epsilon_squared return 0 def get_eps2(self, epsilon_squared): epsilon_squared.value = self.eps2 return 0 def set_begin_time(self, time_begin): self.time_begin = time_begin return 0 def get_begin_time(self, time_begin): time_begin.value = self.time_begin return 0 def set_integrator_method(self, integrator_method): self.integrator_method = integrator_method return 0 def get_integrator_method(self, integrator_method): integrator_method.value = self.integrator_method return 0 def set_pn_order(self, pn_order): self.pn_order = pn_order return 0 def get_pn_order(self, pn_order): pn_order.value = self.pn_order return 0 def set_clight(self, clight): self.clight = clight return 0 def get_clight(self, clight): clight.value = self.clight return 0