def handle_input(o, arguments):
    """ run one simulation based on the option parser input or a modified version """
    # Option Parser Dictionary (This isn't a dictionary?!)

    # Numbers
    if o.num_format == 3:
        o.sim_number = "%03d" % o.sim_number
    else:
        o.sim_number = "%06d" % o.sim_number

    o.iter_i = "%02d" % o.iter_i

    # Files
    o.snap_base = o.snap_dir

    o.snap_dir = o.snap_base + o.sim_number + "_" + o.iter_i
    o.fout = o.fout + o.sim_number + "_" + o.iter_i + ".hdf5"

    ps.mkdir(o.snap_dir, safety=True)

    # Begin

    #stars, time_peri = get_orbit_ini(o.m0, o.m1, o.peri, o.ecc, o.incl*pi_180, o.omega*pi_180,
    #                   o.rel_force, o.r_out)
    #planetesimals = get_planetesimals_disk(o.n_disk, o.r_in, o.r_out, o.m0, alpha = o.power, seed = o.seed)

    def process():
        sys.stdout = open(o.snap_dir + "/process" + str(os.getpid()) + ".out",
                          "w")

        stars, time_peri = get_orbit_ini(o.m0, o.m1, o.peri, o.ecc,
                                         o.incl * pi_180, o.omega * pi_180,
                                         o.rel_force, o.r_out)
        planetesimals = get_planetesimals_disk(o.n_disk,
                                               o.r_in,
                                               o.r_out,
                                               o.m0,
                                               alpha=o.power,
                                               seed=o.seed,
                                               disk_num=o.iter_i)

        r_step = o.r_in  ### set timestep based on period of innermost disk particles ###
        t_end = o.num_T * abs(time_peri)  # Current Target Period: 4.0 T

        # Save info in .txt and .p files
        write_info_file(o)

        integrate_disk_flyby(stars, planetesimals, t_end, time_peri, o.nb_end,
                             o.n_steps, r_step, o.snap_dir, o.fout, o.fredir,
                             o.br_dt, o.eta)

    print "Starting", o.sim_number, o.iter_i
    p = Process(target=process)
    p.start()

    return o, p
def handle_input(o, arguments):
  """ run one simulation based on the option parser input or a modified version """
  # Option Parser Dictionary (This isn't a dictionary?!)  

  # Numbers
  if o.num_format == 3:
     o.sim_number = "%03d" % o.sim_number
  else:
     o.sim_number = "%06d" % o.sim_number

  o.iter_i = "%02d" % o.iter_i

  # Files
  o.snap_base = o.snap_dir

  o.snap_dir = o.snap_base + o.sim_number + "_" + o.iter_i
  o.fout = o.fout + o.sim_number + "_" + o.iter_i + ".hdf5"

  ps.mkdir(o.snap_dir, safety = True)

  # Begin

  #stars, time_peri = get_orbit_ini(o.m0, o.m1, o.peri, o.ecc, o.incl*pi_180, o.omega*pi_180, 
  #                   o.rel_force, o.r_out)
  #planetesimals = get_planetesimals_disk(o.n_disk, o.r_in, o.r_out, o.m0, alpha = o.power, seed = o.seed)
  
  def process():
     sys.stdout = open(o.snap_dir + "/process" + str(os.getpid()) + ".out", "w")
    
     stars, time_peri = get_orbit_ini(o.m0, o.m1, o.peri, o.ecc, o.incl*pi_180, o.omega*pi_180, 
                     o.rel_force, o.r_out)
     planetesimals = get_planetesimals_disk(o.n_disk, o.r_in, o.r_out, o.m0, alpha = o.power, 
                                              seed = o.seed, disk_num = o.iter_i)

     r_step = o.r_in ### set timestep based on period of innermost disk particles ###
     t_end = o.num_T * abs(time_peri) # Current Target Period: 4.0 T

     # Save info in .txt and .p files
     write_info_file(o)

     integrate_disk_flyby(stars, planetesimals, t_end, time_peri, o.nb_end, o.n_steps,
                          r_step, o.snap_dir, o.fout, o.fredir, o.br_dt, o.eta)

  print "Starting", o.sim_number, o.iter_i
  p = Process(target = process)
  p.start()

  return o, p
Exemple #3
0
def handle_input(o, arguments):
    """ run one simulation based on the option parser input or a modified version """
    # Option Parser Dictionary (This isn't a dictionary?!)
    if o.num_format == 3:
        o.sim_number = "%03d" % o.sim_number
    else:
        o.sim_number = "%06d" % o.sim_number

    o.snap_base = o.snap_dir

    o.snap_dir = o.snap_dir + o.sim_number
    o.fout = o.fout + o.sim_number + ".hdf5"

    stars, time_peri = get_orbit_ini(o.m0, o.m1, o.peri, o.ecc,
                                     o.incl * pi_180, o.omega * pi_180,
                                     o.rel_force, o.r_out)

    planetesimals = get_planetesimals_disk(o.n_disk,
                                           o.r_in,
                                           o.r_out,
                                           o.m0,
                                           alpha=o.power,
                                           seed=o.seed)

    #print stars
    #print planetesimals

    ps.mkdir(o.snap_dir, safety=True)

    # Write Info File
    f = open(o.snap_dir + "/info.txt", 'a')
    f.write("Simulation ID Number: " + str(o.sim_number) + "\n")
    f.write("Disk Random Seed: " + str(o.seed) + "\n")
    f.write("Number of Iterations: " + str(o.iter) + "\n")
    f.write("Number of Pericenter Arcs: " + str(o.num_T) + "\n")
    f.write("End of N-Body Time: " + str(o.nb_end) + "\n")
    f.write("Mass (Disk Star): " + str(o.m0) + "\n")
    f.write("Mass (Other Star): " + str(o.m1) + "\n")
    f.write("Initial Relative Force: " + str(o.rel_force) + "\n")
    f.write("Bridge Timestep: " + str(o.br_dt) + "\n")
    f.write("Huayno Timestep (eta): " + str(o.eta) + "\n")
    f.write("Inner Disk Radius: " + str(o.r_in) + "\n")
    f.write("Outer Disk Radius: " + str(o.r_out) + "\n")
    f.write("Number of Disk Particles: " + str(o.n_disk) + "\n")
    f.write("Disk Particle Power Law: " + str(o.power) + "\n")
    f.write("Orbit Pericenter: " + str(o.peri) + "\n")
    f.write("Orbit Eccentricity: " + str(o.ecc) + "\n")
    f.write("Orbit Inclination: " + str(o.incl) + "\n")
    f.write("Orbit Argument of Periapsis: " + str(o.omega) + "\n")
    f.write("Number of Steps: " + str(o.n_steps) + "\n")
    f.close()

    # Write 'o' dictionary into file (using Pickle)
    pickle_f = open(o.snap_dir + "/info.p", "wb")
    pickle.dump(o, pickle_f)
    pickle_f.close()

    r_step = o.r_in  ### set timestep based on period of innermost disk particles ###
    t_end = o.num_T * abs(time_peri)  # Current Target Period: 4.0 T

    #t_end = 1300.0 | units.yr

    def process():
        integrate_disk_flyby(stars, planetesimals, t_end, time_peri, o.nb_end,
                             o.n_steps, r_step, o.snap_dir, o.fout, o.fredir,
                             o.br_dt, o.eta)

    p = Process(target=process)
    p.start()

    return o, p
Exemple #4
0
def evolve_disk_flyby(stars,
                      planetesimals,
                      stars_gravity,
                      planetesimals_gravity,
                      t_start,
                      t_end,
                      n_steps,
                      converter,
                      snap_dir,
                      file_out,
                      r_step,
                      bridge_dt,
                      center=0):
    """
  Input Parameters:
  stars --- Star bodies
  planetesimals --- Non-star bodies
  stars_gravity --- 
  planetesimals_gravity --- 
  t_end --- Total Integration Time
  n_steps --- Number of Snapshots
  converter --- 
  snap_dir --- 
  file_out --- 
  r_step --- 
  bridge_dt --- Bridge Timestep
  """

    bodies = ParticlesSuperset([stars, planetesimals])

    channel_from_stars_to_framework = stars_gravity.particles.new_channel_to(
        stars)
    channel_from_planetesimals_to_framework = planetesimals_gravity.particles.new_channel_to(
        planetesimals)

    pl_gravity = planet_gravity_for_disk(Huayno,
                                         stars_gravity.particles,
                                         converter,
                                         center=center)
    gravity = bridge.Bridge(use_threading=False)
    gravity.add_system(planetesimals_gravity,
                       (pl_gravity, ))  # stars work on planetesimals
    gravity.add_system(stars_gravity,
                       ())  # stars are self aware (evolves itself)

    # timestep for BRIDGE relative to the period at r_step (or r_min, if no r_step is given)
    #   BRIDGE_timestep = bridge_dt * P(r_step)
    if r_step is None:
        Porb_min = orbital_period((bodies[2:].position.lengths()).min(),
                                  bodies[0].mass)
        print " ** P_min_disk = ", Porb_min.in_(units.yr)
        gravity.timestep = bridge_dt * Porb_min
    else:
        Porb_min = orbital_period(r_step, bodies[0].mass)
        print " ** P_rin_disk = ", Porb_min.in_(units.yr)
        gravity.timestep = bridge_dt * Porb_min

    time_step = stars_gravity.get_timestep_parameter()
    print ' ** timesteps: \t stars gravity timestep parameter =', time_step
    print '\t\t bridge =', gravity.timestep

    Etot_init = stars_gravity.kinetic_energy + stars_gravity.potential_energy
    Etot = Etot_init

    ps.mkdir(snap_dir)

    duration = t_end - t_start
    dt = duration / float(n_steps)
    time = 0.0 | units.yr

    print "Duration:", duration, "t_start", t_start, "t_end", t_end, "dt:", dt

    print " ** evolving: t_start = ", t_start.value_in(
        1000 * units.yr), "t_end = ", t_end.value_in(1000 *
                                                     units.yr), ", dt = ", dt
    print " \t", "time", "\t\t\t", "E", "\t\t", "dE"

    stdout = (file_out.split('.'))[0]
    stdout += '.txt'
    f = open(snap_dir + "/" + stdout, 'a')

    # Joules
    J = units.m**2 * units.kg * units.s**-2

    while time <= duration:
        gravity.evolve_model(time)
        channel_from_stars_to_framework.copy()
        channel_from_planetesimals_to_framework.copy()

        bodies.collection_attributes.timestamp = time + t_start

        Ekin = stars_gravity.kinetic_energy
        Epot = stars_gravity.potential_energy
        Etot = Ekin + Epot
        dE = Etot_init - Etot

        nb_E = converter.to_nbody(Etot)
        #nb_J = converter.nbody_length ** 2 * units.nbody_mass * units.nbody_time ** -2 # not supposed to work

        # A formatted string would work better than tabs. (Tabs never work)
        line = " \t" + str((time + t_start).value_in(
            units.yr)) + "\t" + str(nb_E) + "\t" + str(dE / Etot_init)
        print line

        f.write(line + "\n")

        # Write coordinates in Center of Mass frame

        # Move Stars to CoM (initially in CoM)
        #### The stars are already in CoM coordinates ####

        # Move planetesimals to CoM (initially w/ respect to star zero)
        planetesimals.velocity += stars[center].velocity
        planetesimals.position += stars[center].position

        write_set_to_file(bodies, snap_dir + "/" + file_out, "hdf5")

        time += dt

    f.close()  # stdout

    gravity.stop()
    stars_gravity.stop()
    planetesimals_gravity.stop()
    pl_gravity.stop()

    # retrieval?
    return stars, planetesimals
Exemple #5
0
def evolve_disk_flyby_together(stars, planetesimals, gravity, t_start, t_end,
                               n_steps, converter, snap_dir, file_out):
    bodies = ParticlesSuperset([stars, planetesimals])

    channel_from_gr_to_framework = gravity.particles.new_channel_to(bodies)

    rm_file(file_out)

    Etot_init = gravity.kinetic_energy + gravity.potential_energy
    Etot = Etot_init

    ps.mkdir(snap_dir)

    duration = t_end - t_start
    dt = duration / float(n_steps)
    time = 0.0 | units.yr

    print "Duration:", duration, "t_start", t_start, "t_end", t_end, "dt:", dt

    print " ** evolving: t_start = ", t_start.value_in(
        1000 * units.yr), "t_end = ", t_end.value_in(1000 *
                                                     units.yr), ", dt = ", dt
    print " \t", "time", "\t\t\t", "E", "\t\t", "dE"

    stdout = (file_out.split('.'))[0]
    stdout += '.txt'
    f = open(snap_dir + "/" + stdout, 'a')

    while time <= duration:
        gravity.evolve_model(time)
        channel_from_gr_to_framework.copy()

        bodies.collection_attributes.timestamp = time + t_start

        Ekin = gravity.kinetic_energy
        Epot = gravity.potential_energy
        Etot = Ekin + Epot
        dE = Etot_init - Etot

        nb_E = converter.to_nbody(Etot)
        #nb_J = converter.nbody_length ** 2 * units.nbody_mass * units.nbody_time ** -2 # not supposed to work

        # A formatted string would work better than tabs. (Tabs never work)
        line = " \t" + str((time + t_start).value_in(
            units.yr)) + "\t" + str(nb_E) + "\t" + str(dE / Etot_init)
        print line

        f.write(line + "\n")

        # Write coordinates in Center of Mass frame

        # Move Stars to CoM (initially in CoM)
        #### The stars are already in CoM coordinates ####

        # Move planetesimals to CoM (initially in CoM)
        #### The stars are already in CoM coordinates #### (Does this mean the other method is wrong?)

        write_set_to_file(bodies, snap_dir + "/" + file_out, "hdf5")

        time += dt

    gravity.stop()

    return stars, planetesimals
    def __init__(self,
                 number,
                 snapshot_base=None,
                 output_base=None,
                 location=None,
                 count=6,
                 iter_num=None,
                 grand=[]):

        # Output File
        if count == 3:
            number = '%03d' % int(number)  # Old Format
        else:
            number = '%06d' % int(
                number
            )  # New Format (will fail if count = 4 or 5, which is bad)

        # Check if part of a suite
        if iter_num is not None:
            number += "_%02d" % int(
                iter_num)  ##### This formatting will be added soon #####

        if output_base is None:
            self.f1 = "outfile" + number + ".hdf5"
        else:
            self.f1 = "" + output_base + number + ".hdf5"

        # Snapshot Directory

        if snapshot_base is None:
            snapshot_dir = "sim" + number
        else:
            snapshot_dir = "" + snapshot_base + number

        if location is not None:
            snapshot_dir = location + "/" + snapshot_dir  ## assume this is the directory for everything ##

        self.snapshot_dir = snapshot_dir  # Updates Here
        ps.set_snapshot_dir(snapshot_dir)  # Updates Elsewhere

        # Check if Encompassing Suite

        if (len(grand) > 0):
            # If the output
            print "Grand Output File", self.f1
            if (os.path.exists(self.snapshot_dir) and os.path.exists(self.f1)):
                pass
            else:
                ps.mkdir(self.snapshot_dir)  # initialize base directory
                # (1) Merge Output Files
                self.merge_output_files(
                    number, snapshot_base, output_base, location, count,
                    grand)  ####### not implemented yet #######
                # (2) Merge Info Files (.txt and .p) ^^^
                self.snapshot_dir = snapshot_dir  # Updates Here
                ps.set_snapshot_dir(
                    snapshot_dir
                )  # Updates Elsewhere <<<<---- NOTE: IT WAS RESET!!!!!!

        # Bodies

        self.bodies = ps.parse_file(self.f1)

        # Simulation Info

        self.read_info_file()

        # Time

        self.times = quantities.AdaptingVectorQuantity()

        # Initialize States

        self.init_states()
        self.num_snapshots = len(self.times)
        self.save_star_separation()

        # Sorted Bodies + Keys (Change this to particle sets instead)

        self.unbound = np.zeros(len(
            self.times), dtype=np.ndarray)  # These are arrays of Particle sets
        self.central = np.zeros(len(self.times), dtype=np.ndarray)
        self.passing = np.zeros(len(self.times), dtype=np.ndarray)
        self.both = np.zeros(len(self.times), dtype=np.ndarray)

        self.tmp_mask = np.zeros(len(
            self.times))  # for before the mask is applied
        self.mask = np.zeros(
            len(self.times
                ))  # 1 indicates 'sorting' has occured at particular timestep
        # This mask needs to be incorporated into functions using sorted sets
        # For instance, the self.times array will need to be restricted to masked values
        ################# DO NOT MODIFY THE MASK DIRECTLY!!!!!! (switch to private?) ################

        # Restore Sorts

        print " *** Restoring *** "
        self.restore()

        # Misc
        self.tmp_movie_dir = "tmp_movies_for_factory"
def handle_input(o, arguments):
  """ run one simulation based on the option parser input or a modified version """
  # Option Parser Dictionary (This isn't a dictionary?!)  
  if o.num_format == 3:
     o.sim_number = "%03d" % o.sim_number
  else:
     o.sim_number = "%06d" % o.sim_number

  o.snap_base = o.snap_dir

  o.snap_dir = o.snap_dir + o.sim_number
  o.fout = o.fout + o.sim_number + ".hdf5"
  
  stars, time_peri = get_orbit_ini(o.m0, o.m1, o.peri, o.ecc, o.incl*pi_180, o.omega*pi_180, 
                     o.rel_force, o.r_out)
  
  planetesimals = get_planetesimals_disk(o.n_disk, o.r_in, o.r_out, o.m0, alpha = o.power, seed = o.seed)
  
  #print stars
  #print planetesimals

  ps.mkdir(o.snap_dir, safety = True)

  # Write Info File
  f = open(o.snap_dir + "/info.txt", 'a')
  f.write("Simulation ID Number: " + str(o.sim_number) + "\n")
  f.write("Disk Random Seed: " + str(o.seed) + "\n")
  f.write("Number of Iterations: " + str(o.iter) + "\n")
  f.write("Number of Pericenter Arcs: " + str(o.num_T) + "\n")
  f.write("End of N-Body Time: " + str(o.nb_end) + "\n")
  f.write("Mass (Disk Star): " + str(o.m0) + "\n")
  f.write("Mass (Other Star): " + str(o.m1) + "\n")
  f.write("Initial Relative Force: " + str(o.rel_force) + "\n")
  f.write("Bridge Timestep: " + str(o.br_dt) + "\n")
  f.write("Huayno Timestep (eta): " + str(o.eta) + "\n")
  f.write("Inner Disk Radius: " + str(o.r_in) + "\n")
  f.write("Outer Disk Radius: " + str(o.r_out) + "\n")
  f.write("Number of Disk Particles: " + str(o.n_disk) + "\n")
  f.write("Disk Particle Power Law: " + str(o.power) + "\n")
  f.write("Orbit Pericenter: " + str(o.peri) + "\n")
  f.write("Orbit Eccentricity: " + str(o.ecc) + "\n")
  f.write("Orbit Inclination: " + str(o.incl) + "\n")
  f.write("Orbit Argument of Periapsis: " + str(o.omega) + "\n")
  f.write("Number of Steps: " + str(o.n_steps) + "\n")
  f.close()

  # Write 'o' dictionary into file (using Pickle)
  pickle_f = open(o.snap_dir + "/info.p", "wb")
  pickle.dump(o, pickle_f)
  pickle_f.close()

  r_step = o.r_in ### set timestep based on period of innermost disk particles ###
  t_end = o.num_T * abs(time_peri) # Current Target Period: 4.0 T
  #t_end = 1300.0 | units.yr
  
  def process():
     integrate_disk_flyby(stars, planetesimals, t_end, time_peri, o.nb_end, o.n_steps,
                          r_step, o.snap_dir, o.fout, o.fredir, o.br_dt, o.eta)

  p = Process(target = process)
  p.start()

  return o, p
def evolve_disk_flyby(stars, planetesimals, stars_gravity, planetesimals_gravity, 
                    t_start, t_end, n_steps, converter, snap_dir, file_out, r_step, bridge_dt, center = 0):

  """
  Input Parameters:
  stars --- Star bodies
  planetesimals --- Non-star bodies
  stars_gravity --- 
  planetesimals_gravity --- 
  t_end --- Total Integration Time
  n_steps --- Number of Snapshots
  converter --- 
  snap_dir --- 
  file_out --- 
  r_step --- 
  bridge_dt --- Bridge Timestep
  """

  bodies = ParticlesSuperset([stars, planetesimals])
  
  channel_from_stars_to_framework = stars_gravity.particles.new_channel_to(stars)
  channel_from_planetesimals_to_framework = planetesimals_gravity.particles.new_channel_to(planetesimals)
  
  pl_gravity = planet_gravity_for_disk(Huayno, stars_gravity.particles, converter, center = center)
  gravity = bridge.Bridge(use_threading=False)
  gravity.add_system(planetesimals_gravity, (pl_gravity,) ) # stars work on planetesimals
  gravity.add_system(stars_gravity, () ) # stars are self aware (evolves itself)
  
  # timestep for BRIDGE relative to the period at r_step (or r_min, if no r_step is given)
  #   BRIDGE_timestep = bridge_dt * P(r_step)
  if r_step is None:
    Porb_min = orbital_period((bodies[2:].position.lengths()).min(), bodies[0].mass)
    print " ** P_min_disk = ", Porb_min.in_(units.yr)
    gravity.timestep = bridge_dt*Porb_min
  else:
    Porb_min = orbital_period(r_step, bodies[0].mass)
    print " ** P_rin_disk = ", Porb_min.in_(units.yr)
    gravity.timestep = bridge_dt*Porb_min
    
  time_step = stars_gravity.get_timestep_parameter()
  print ' ** timesteps: \t stars gravity timestep parameter =', time_step 
  print '\t\t bridge =', gravity.timestep
  
  Etot_init = stars_gravity.kinetic_energy + stars_gravity.potential_energy
  Etot = Etot_init

  ps.mkdir(snap_dir)
  
  duration = t_end - t_start
  dt = duration / float(n_steps)
  time = 0.0 | units.yr

  print "Duration:", duration, "t_start", t_start, "t_end", t_end, "dt:", dt
  
  print " ** evolving: t_start = ", t_start.value_in(1000 * units.yr), "t_end = ", t_end.value_in(1000 * units.yr), ", dt = ", dt
  print " \t", "time", "\t\t\t", "E", "\t\t", "dE"

  stdout = (file_out.split('.'))[0]
  stdout += '.txt'
  f = open(snap_dir + "/" + stdout, 'a')

  # Joules
  J = units.m ** 2 * units.kg * units.s ** -2

  while time<=duration:
    gravity.evolve_model(time)
    channel_from_stars_to_framework.copy()
    channel_from_planetesimals_to_framework.copy()
    
    bodies.collection_attributes.timestamp = time + t_start

    Ekin = stars_gravity.kinetic_energy 
    Epot = stars_gravity.potential_energy
    Etot = Ekin + Epot
    dE = Etot_init-Etot

    nb_E = converter.to_nbody(Etot)
    #nb_J = converter.nbody_length ** 2 * units.nbody_mass * units.nbody_time ** -2 # not supposed to work

    # A formatted string would work better than tabs. (Tabs never work)
    line = " \t" + str((time + t_start).value_in(units.yr)) + "\t" + str(nb_E) + "\t" + str(dE/Etot_init)
    print line
    
    f.write(line + "\n")

    # Write coordinates in Center of Mass frame

    # Move Stars to CoM (initially in CoM)
    #### The stars are already in CoM coordinates ####

    # Move planetesimals to CoM (initially w/ respect to star zero)
    planetesimals.velocity += stars[center].velocity
    planetesimals.position += stars[center].position
    
    write_set_to_file(bodies, snap_dir + "/" + file_out, "hdf5")
    
    time += dt

  f.close() # stdout
     
  gravity.stop()
  stars_gravity.stop()
  planetesimals_gravity.stop()
  pl_gravity.stop()
  
  # retrieval?
  return stars, planetesimals
def evolve_disk_flyby_together(stars, planetesimals, gravity, 
                      t_start, t_end, n_steps, converter, snap_dir, file_out):
  bodies = ParticlesSuperset([stars, planetesimals])
  
  channel_from_gr_to_framework = gravity.particles.new_channel_to(bodies)
  
  rm_file(file_out)
    
  Etot_init = gravity.kinetic_energy + gravity.potential_energy
  Etot = Etot_init
  
  ps.mkdir(snap_dir)
  
  duration = t_end - t_start
  dt = duration / float(n_steps)
  time = 0.0 | units.yr

  print "Duration:", duration, "t_start", t_start, "t_end", t_end, "dt:", dt
  
  print " ** evolving: t_start = ", t_start.value_in(1000 * units.yr), "t_end = ", t_end.value_in(1000 * units.yr), ", dt = ", dt
  print " \t", "time", "\t\t\t", "E", "\t\t", "dE"

  stdout = (file_out.split('.'))[0]
  stdout += '.txt'
  f = open(snap_dir + "/" + stdout, 'a')


  while time<=duration:
    gravity.evolve_model(time)
    channel_from_gr_to_framework.copy()
    
    bodies.collection_attributes.timestamp = time + t_start

    Ekin = gravity.kinetic_energy 
    Epot = gravity.potential_energy
    Etot = Ekin + Epot
    dE = Etot_init-Etot

    nb_E = converter.to_nbody(Etot)
    #nb_J = converter.nbody_length ** 2 * units.nbody_mass * units.nbody_time ** -2 # not supposed to work

    # A formatted string would work better than tabs. (Tabs never work)
    line = " \t" + str((time + t_start).value_in(units.yr)) + "\t" + str(nb_E) + "\t" + str(dE/Etot_init)
    print line
    
    f.write(line + "\n")

    # Write coordinates in Center of Mass frame

    # Move Stars to CoM (initially in CoM)
    #### The stars are already in CoM coordinates ####

    # Move planetesimals to CoM (initially in CoM)
    #### The stars are already in CoM coordinates #### (Does this mean the other method is wrong?)
    
    write_set_to_file(bodies, snap_dir + "/" + file_out, "hdf5")
    
    time += dt
  
  gravity.stop()
  
  return stars, planetesimals
    stars, time_peri = get_orbit_ini(o.m0, o.m1, o.peri, o.ecc,
                                     o.incl * pi_180, o.omega * pi_180,
                                     o.rel_force, o.r_out)

    planetesimals = get_planetesimals_disk(o.n_disk,
                                           o.r_in,
                                           o.r_out,
                                           o.m0,
                                           alpha=o.power,
                                           seed=o.seed)

    #print stars
    #print planetesimals

    ps.mkdir(o.snap_dir, safety=True)

    # Write Info File
    f = open(o.snap_dir + "/info.txt", 'a')
    f.write("Simulation ID Number: " + str(o.sim_number) + "\n")
    f.write("Disk Random Seed: " + str(o.seed) + "\n")
    f.write("Number of Pericenter Arcs: " + str(o.num_T) + "\n")
    f.write("End of N-Body Time: " + str(o.nb_end) + "\n")
    f.write("Mass (Disk Star): " + str(o.m0) + "\n")
    f.write("Mass (Other Star): " + str(o.m1) + "\n")
    f.write("Initial Relative Force: " + str(o.rel_force) + "\n")
    f.write("Bridge Timestep: " + str(o.br_dt) + "\n")
    f.write("Huayno Timestep (eta): " + str(o.eta) + "\n")
    f.write("Inner Disk Radius: " + str(o.r_in) + "\n")
    f.write("Outer Disk Radius: " + str(o.r_out) + "\n")
    f.write("Number of Disk Particles: " + str(o.n_disk) + "\n")
    def __init__(self, number, snapshot_base = None, output_base = None, location = None, count = 6,
                       iter_num = None, grand = []):

        # Output File
        if count == 3:
           number = '%03d' % int(number) # Old Format
        else:
           number = '%06d' % int(number) # New Format (will fail if count = 4 or 5, which is bad)

        # Check if part of a suite
        if iter_num is not None:
           number += "_%02d" % int(iter_num)  ##### This formatting will be added soon #####

        if output_base is None:
           self.f1 = "outfile" + number + ".hdf5"
        else:
           self.f1 = "" + output_base + number + ".hdf5"


        # Snapshot Directory

        if snapshot_base is None:
           snapshot_dir = "sim" + number
        else:
           snapshot_dir = "" + snapshot_base + number

        if location is not None:
           snapshot_dir = location + "/" + snapshot_dir ## assume this is the directory for everything ##

        self.snapshot_dir = snapshot_dir # Updates Here
        ps.set_snapshot_dir(snapshot_dir) # Updates Elsewhere

        # Check if Encompassing Suite

        if (len(grand) > 0):
           # If the output
           print "Grand Output File", self.f1
           if (os.path.exists(self.snapshot_dir) and os.path.exists(self.f1)):
              pass
           else:
              ps.mkdir(self.snapshot_dir) # initialize base directory
              # (1) Merge Output Files
              self.merge_output_files(number, snapshot_base, output_base, location,
                                          count, grand) ####### not implemented yet ####### 
              # (2) Merge Info Files (.txt and .p) ^^^
              self.snapshot_dir = snapshot_dir # Updates Here
              ps.set_snapshot_dir(snapshot_dir) # Updates Elsewhere <<<<---- NOTE: IT WAS RESET!!!!!!

        # Bodies

        self.bodies = ps.parse_file(self.f1)

        # Simulation Info

        self.read_info_file() 

        # Time

        self.times = quantities.AdaptingVectorQuantity()

        # Initialize States

        self.init_states()
        self.num_snapshots = len(self.times)
        self.save_star_separation()

        # Sorted Bodies + Keys (Change this to particle sets instead)

        self.unbound = np.zeros(len(self.times), dtype = np.ndarray) # These are arrays of Particle sets
        self.central = np.zeros(len(self.times), dtype = np.ndarray)
        self.passing = np.zeros(len(self.times), dtype = np.ndarray) 
        self.both = np.zeros(len(self.times), dtype = np.ndarray) 

        self.tmp_mask = np.zeros(len(self.times)) # for before the mask is applied
        self.mask = np.zeros(len(self.times)) # 1 indicates 'sorting' has occured at particular timestep
        # This mask needs to be incorporated into functions using sorted sets
        # For instance, the self.times array will need to be restricted to masked values
        ################# DO NOT MODIFY THE MASK DIRECTLY!!!!!! (switch to private?) ################

        # Restore Sorts

        print " *** Restoring *** "
        self.restore()

        # Misc
        self.tmp_movie_dir = "tmp_movies_for_factory"
     o.sim_number = "%06d" % o.sim_number

  snap_base = o.snap_dir

  o.snap_dir = o.snap_dir + o.sim_number
  o.fout = o.fout + o.sim_number + ".hdf5"
  
  stars, time_peri = get_orbit_ini(o.m0, o.m1, o.peri, o.ecc, o.incl*pi_180, o.omega*pi_180, 
                     o.rel_force, o.r_out)
  
  planetesimals = get_planetesimals_disk(o.n_disk, o.r_in, o.r_out, o.m0, alpha = o.power, seed = o.seed)
  
  #print stars
  #print planetesimals

  ps.mkdir(o.snap_dir, safety = True)

  # Write Info File
  f = open(o.snap_dir + "/info.txt", 'a')
  f.write("Simulation ID Number: " + str(o.sim_number) + "\n")
  f.write("Disk Random Seed: " + str(o.seed) + "\n")
  f.write("Number of Pericenter Arcs: " + str(o.num_T) + "\n")
  f.write("End of N-Body Time: " + str(o.nb_end) + "\n")
  f.write("Mass (Disk Star): " + str(o.m0) + "\n")
  f.write("Mass (Other Star): " + str(o.m1) + "\n")
  f.write("Initial Relative Force: " + str(o.rel_force) + "\n")
  f.write("Bridge Timestep: " + str(o.br_dt) + "\n")
  f.write("Huayno Timestep (eta): " + str(o.eta) + "\n")
  f.write("Inner Disk Radius: " + str(o.r_in) + "\n")
  f.write("Outer Disk Radius: " + str(o.r_out) + "\n")
  f.write("Number of Disk Particles: " + str(o.n_disk) + "\n")