예제 #1
0
    def test8(self):
        print("Testing FastKick for Bridge: potential energy")
        numpy.random.seed(12345)
        stars = new_plummer_model(100)
        cluster = new_gravity_code(stars)

        first_half = stars.select_array(
            lambda x: (x > 0 | nbody_system.length), ['x'])
        second_half = stars - first_half
        cluster1 = new_gravity_code(first_half)
        cluster2 = new_gravity_code(second_half)
        kick_from_cluster1 = CalculateFieldForCodesUsingReinitialize(
            self.new_fastkick_instance(), (cluster1, ))
        kick_from_cluster2 = CalculateFieldForCodesUsingReinitialize(
            self.new_fastkick_instance(), (cluster2, ))
        bridgesys = Bridge()
        bridgesys.add_system(cluster1, (kick_from_cluster2, ))
        bridgesys.add_system(cluster2, (kick_from_cluster1, ))

        self.assertAlmostRelativeEqual(cluster.potential_energy,
                                       bridgesys.potential_energy, 7)
        self.assertAlmostRelativeEqual(cluster.kinetic_energy,
                                       bridgesys.kinetic_energy)
        kick_from_cluster1.code.stop()
        kick_from_cluster2.code.stop()
예제 #2
0
def new_gravity_field_from_gas(hydro_code, gravity_field_code):
    gravity_field = CalculateFieldForCodesUsingReinitialize(
        gravity_field_code, 
        [hydro_code], 
        required_attributes=['mass', 'x', 'y', 'z', 'vx', 'vy', 'vz', 'u']
    ) # "u" isn't really required, but get_state_sph is faster than get_mass+get_position+get_velocity
    return gravity_field
예제 #3
0
    def test9(self):
        print("Testing FastKick for Bridge: evolving a binary")
        particles = Particles(2)
        particles.mass = [3.0, 1.0] | units.MSun
        particles.position = [0, 0, 0] | units.AU
        particles.velocity = [0, 0, 0] | units.km / units.s
        particles[1].x = 2.0 | units.AU
        particles[1].vy = (constants.G * (4.0 | units.MSun) /
                           (2.0 | units.AU)).sqrt()
        particles.move_to_center()

        primary_sys = new_gravity_code(particles[:1])
        secondary_sys = new_gravity_code(particles[1:])

        primary = primary_sys.particles[0]
        P = 2 * math.pi * primary.x / primary.vy

        converter = nbody_system.nbody_to_si(1.0 | units.MSun, 1.0 | units.AU)
        kick_from_primary = CalculateFieldForCodesUsingReinitialize(
            self.new_fastkick_instance(converter), (primary_sys, ))
        kick_from_secondary = CalculateFieldForCodesUsingReinitialize(
            self.new_fastkick_instance(converter), (secondary_sys, ))

        bridgesys = Bridge(timestep=P / 64.0)
        bridgesys.add_system(primary_sys, (kick_from_secondary, ))
        bridgesys.add_system(secondary_sys, (kick_from_primary, ))

        position_at_start = primary.position.x
        bridgesys.evolve_model(P / 4.0)
        self.assertAlmostRelativeEqual(position_at_start, primary.position.y,
                                       2)

        bridgesys.evolve_model(P / 2.0)
        self.assertAlmostRelativeEqual(position_at_start, -primary.position.x,
                                       2)

        bridgesys.evolve_model(P)
        kick_from_primary.code.stop()
        kick_from_secondary.code.stop()
        self.assertAlmostRelativeEqual(position_at_start, primary.position.x,
                                       2)
예제 #4
0
def new_coupled_system(hydro, binary_system, t_end, n_steps):
    kick_from_hydro = CalculateFieldForParticles(particles=hydro.particles, gravity_constant=constants.G)
    kick_from_hydro.smoothing_length_squared = 100 | units.RSun**2
    
    unit_converter = nbody_system.nbody_to_si(binary_system.particles.total_mass(), t_end)
    kicker_code = MI6(unit_converter, redirection='file', redirect_file='kicker_code_mi6_out.log')
    kicker_code.parameters.epsilon_squared = 100 | units.RSun**2
    kick_from_binary = CalculateFieldForCodesUsingReinitialize(kicker_code, (binary_system,))
    
    coupled_system = Bridge(timestep=(t_end / (2 * n_steps)), verbose=False, use_threading=True)
    coupled_system.add_system(binary_system, (kick_from_hydro,), False)
    coupled_system.add_system(hydro, (kick_from_binary,), False)
    return coupled_system
예제 #5
0
def new_gravity_field_from(codes, converter, epsilon_squared):
    gravity_field_code = Octgrav(
        converter,
        node_label="GPU",
        redirection="file",
        redirect_file="gravity_field_code{0}.log".format(
            new_gravity_field_from.counter))
    gravity_field_code.parameters.epsilon_squared = epsilon_squared
    gravity_field_code.parameters.opening_angle = 0.5

    gravity_field = CalculateFieldForCodesUsingReinitialize(
        gravity_field_code,
        codes,
        required_attributes=['mass', 'x', 'y', 'z', 'vx', 'vy', 'vz'])
    new_gravity_field_from.counter += 1
    return gravity_field
예제 #6
0
    def __init__(self,
                 grav_code,
                 gas_code,
                 se_code,
                 grav_couple_code,
                 conv,
                 mgas,
                 star_parts,
                 gas_parts,
                 dt_feedback,
                 dt_fast,
                 grav_parameters=(),
                 gas_parameters=(),
                 couple_parameters=(),
                 feedback_efficiency=.01,
                 feedback_radius=0.01 | units.parsec,
                 total_feedback_energy=zero,
                 evo_particles=None,
                 star_particles_addition=None,
                 start_time_offset=zero,
                 feedback_safety=1.e-4 * 1.e51 | units.erg,
                 feedback_dt=(10. | units.yr, 7500. | units.yr),
                 feedback_period=20000. | units.yr,
                 feedback_lasttime=None,
                 grav_code_extra=dict(mode='gpu', redirection='none'),
                 gas_code_extra=dict(number_of_workers=3,
                                     use_gl=False,
                                     redirection='none'),
                 se_code_extra=dict(redirection='none'),
                 grav_couple_code_extra=dict()):

        self.codes = (gas_code, grav_code, se_code, grav_couple_code)
        self.parameters = (grav_parameters, gas_parameters, couple_parameters)
        self.conv = conv
        self.sph = sys_from_parts(gas_code,
                                  gasparts=gas_parts,
                                  parameters=gas_parameters,
                                  converter=conv,
                                  extra=gas_code_extra)
        self.grav = sys_from_parts(grav_code,
                                   parts=star_parts,
                                   parameters=grav_parameters,
                                   converter=conv,
                                   extra=grav_code_extra)
        print gas_parameters
        print
        print self.sph.parameters

        #~self.sph_grav=reinitializecopycat(grav_couple_code, (self.sph,self.grav), conv,
        #~parameters=couple_parameters, extra=grav_couple_code_extra)
        #~self.star_grav=reinitializecopycat(grav_couple_code, (self.sph,), conv,
        #~parameters=couple_parameters, extra=grav_couple_code_extra)
        new_couple_code1 = grav_couple_code(conv, **grav_couple_code_extra)
        for param, value in couple_parameters:
            new_couple_code1.parameters.__setattr__(param, value)
        self.sph_grav = CalculateFieldForCodesUsingReinitialize(
            new_couple_code1, (self.sph, self.grav))
        new_couple_code2 = grav_couple_code(conv, **grav_couple_code_extra)
        for param, value in couple_parameters:
            new_couple_code2.parameters.__setattr__(param, value)
        self.star_grav = CalculateFieldForCodesUsingReinitialize(
            new_couple_code2, (self.sph, ))

        self.fast = Bridge(verbose=True, timestep=dt_fast)
        self.fast.add_system(self.sph, (self.sph_grav, ), False)
        self.fast.add_system(self.grav, (self.star_grav, ), False)

        self.evo = se_code(**se_code_extra)
        self.evo.initialize_module_with_default_parameters()
        if evo_particles is None:
            self.evo.particles.add_particles(star_parts)
        else:
            if len(evo_particles) != len(star_parts):
                print "evo parts != star parts"
                raise Exception
            self.evo.particles.add_particles(evo_particles)

        self.total_feedback_energy = total_feedback_energy
        self.dt_feedback = dt_feedback
        self.dt_fast = dt_fast
        self.mgas = mgas

        self.time = self.fast.model_time + start_time_offset
        self.time_offset = start_time_offset
        if star_particles_addition is None:
            self.star_particles_addition = star_parts.empty_copy()
            self.star_particles_addition.Emech_last_feedback = 0. | units.erg
        else:
            self.star_particles_addition = star_particles_addition

        self.feedback_efficiency = feedback_efficiency
        self.feedback_radius = feedback_radius

        self.feedback_safety = feedback_safety
        self.feedback_dt = feedback_dt
        self.feedback_period = feedback_period
        if self.feedback_period < 1.0001 * self.dt_feedback:
            print "feedback_period < dt_feedback, resetting to dt_feedback=", \
              self.dt_feedback.in_(units.yr)
            self.feedback_period = 1.0001 * self.dt_feedback
        if feedback_lasttime is None:
            self.feedback_lasttime = self.time - 2 * self.feedback_period
        else:
            self.feedback_lasttime = feedback_lasttime