Example #1
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
Example #2
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