Exemple #1
0
            my_chemistry.local_dust_to_gas_ratio
    fc["energy"][:] = initial_temperature / \
        fc.chemistry_data.temperature_units
    fc["x-velocity"][:] = 0.0
    fc["y-velocity"][:] = 0.0
    fc["z-velocity"][:] = 0.0

    # timestepping safety factor
    safety_factor = 0.01

    # let the gas cool at constant density from the starting temperature
    # down to a lower temperature to get the species fractions in a
    # reasonable state.
    cooling_temperature = 100.
    data0 = evolve_constant_density(fc,
                                    final_temperature=cooling_temperature,
                                    safety_factor=safety_factor)

    # evolve density and temperature according to free-fall collapse
    data = evolve_freefall(fc, final_density, safety_factor=safety_factor)

    # make a plot of rho/f_H2 vs. T
    plots = pyplot.loglog(data["density"],
                          data["temperature"],
                          color="black",
                          label="T$_{gas}$")
    if os.environ.get("METAL_COOLING", 0) == "1":
        plots.extend(
            pyplot.loglog(data["density"],
                          data["dust_temperature"],
                          color="black",
Exemple #2
0
    fc["x-velocity"][:] = 0.0
    fc["y-velocity"][:] = 0.0
    fc["z-velocity"][:] = 0.0

    fc["energy"][:] = initial_temperature / \
        fc.chemistry_data.temperature_units
    fc.calculate_temperature()
    fc["energy"][:] *= initial_temperature / fc["temperature"]

    # timestepping safety factor
    safety_factor = 0.01

    # let gas cool at constant density
    data = evolve_constant_density(fc,
                                   final_time=final_time,
                                   safety_factor=safety_factor)

    p1, = pyplot.loglog(data["time"].to("Myr"),
                        data["temperature"],
                        color="black",
                        label="T")
    pyplot.xlabel("Time [Myr]")
    pyplot.ylabel("T [K]")

    data["mu"] = data["temperature"] / \
        (data["energy"] * (my_chemistry.Gamma - 1.) *
         fc.chemistry_data.temperature_units)
    pyplot.twinx()
    p2, = pyplot.semilogx(data["time"].to("Myr"),
                          data["mu"],
Exemple #3
0
def run_grackle(initial_temperature, density, final_time, safety_factor=1e-2):
    current_redshift = 0.
    tiny_number = 1.0e-20

    pygrackle.evolve_constant_density = _new_evolve_constant_density

    # Set solver parameters
    my_chemistry = chemistry_data()
    my_chemistry.three_body_rate = 4
    my_chemistry.use_grackle = 1
    my_chemistry.with_radiative_cooling = 0
    my_chemistry.primordial_chemistry = 2
    my_chemistry.metal_cooling = 0
    my_chemistry.UVbackground = 0
    my_chemistry.self_shielding_method = 0
    my_chemistry.H2_self_shielding = 0
    grackle_dir = os.path.dirname(
        os.path.dirname(
            os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
    my_chemistry.grackle_data_file = os.sep.join(
        [grackle_dir, "input", "CloudyData_UVB=HM2012.h5"])

    # Set units
    my_chemistry.comoving_coordinates = 0  # proper units
    my_chemistry.a_units = 1.0
    my_chemistry.three_body_rate = 4
    my_chemistry.a_value = 1. / (1. + current_redshift) / \
        my_chemistry.a_units
    my_chemistry.density_units = 1.66053904e-24  # 1u: amu # rho = 1.0 is 1.67e-24 g
    my_chemistry.length_units = 1.0  #  cm
    my_chemistry.time_units = 1.0  #  s
    my_chemistry.velocity_units = my_chemistry.a_units * \
        (my_chemistry.length_units / my_chemistry.a_value) / \
        my_chemistry.time_units

    rval = my_chemistry.initialize()

    fc = FluidContainer(my_chemistry, 1)
    fc["density"][:] = density

    tiny_number = 1.0e-20
    if my_chemistry.primordial_chemistry > 0:
        # these are in mass_density
        fc["HI"][:] = 0.76 * fc["density"] / 3.
        fc["HII"][:] = 0.76 * fc["density"] / 3.
        fc["HeI"][:] = (1 - 0.76) * fc["density"] / 2.
        fc["HeII"][:] = (1 - 0.76) * fc["density"] / 2.
        fc["HeIII"][:] = tiny_number

    if my_chemistry.primordial_chemistry > 1:

        fc["H2I"][:] = 0.76 * fc["density"] / 3.
        fc["H2II"][:] = tiny_number  #0.76 * fc["density"] /4.
        fc["HM"][:] = tiny_number  #0.76 * fc["density"] /4.

    if my_chemistry.primordial_chemistry > 2:
        fc["DI"][:] = 2.0 * 3.4e-5 * fc["density"]
        fc["DII"][:] = tiny_number * fc["density"]
        fc["HDI"][:] = tiny_number * fc["density"]
    if my_chemistry.metal_cooling == 1:
        fc["metal"][:] = 0.1 * fc["density"] * \
          my_chemistry.SolarMetalFractionByMass

    fc["x-velocity"][:] = 0.0
    fc["y-velocity"][:] = 0.0
    fc["z-velocity"][:] = 0.0

    fc["energy"][:] = initial_temperature / \
        fc.chemistry_data.temperature_units
    fc.calculate_temperature()
    fc["energy"][:] *= initial_temperature / fc["temperature"]

    # let gas cool at constant density
    data = pygrackle.evolve_constant_density(fc,
                                             final_time=final_time,
                                             safety_factor=safety_factor)

    return data
def run_grackle(density = 1e10, initial_temperature = 1e3, final_time = 1e5, safety_factor=1e-2):
    current_redshift = 0.
    tiny_number = 1.0e-20

    pygrackle.evolve_constant_density = _new_evolve_constant_density

    # Set solver parameters
    my_chemistry = chemistry_data()
    my_chemistry.three_body_rate = 4
    my_chemistry.use_grackle = 1
    my_chemistry.with_radiative_cooling = 1
    my_chemistry.primordial_chemistry = 2
    my_chemistry.metal_cooling = 0
    my_chemistry.UVbackground = 0
    my_chemistry.self_shielding_method = 0
    my_chemistry.H2_self_shielding = 0
    my_chemistry.cie_cooling = 0
    grackle_dir = "/home/kwoksun2/grackle"
    my_chemistry.grackle_data_file = os.sep.join(
        [grackle_dir, "input", "CloudyData_UVB=HM2012.h5"])

    # Set units
    my_chemistry.comoving_coordinates = 0 # proper units
    my_chemistry.a_units = 1.0
    my_chemistry.three_body_rate = 4
    my_chemistry.a_value = 1. / (1. + current_redshift) / \
        my_chemistry.a_units
    my_chemistry.density_units = 1.66053904e-24 # 1u: amu # rho = 1.0 is 1.67e-24 g
    my_chemistry.length_units = 1.0         #  cm
    my_chemistry.time_units = 1.0           #  s
    my_chemistry.velocity_units = my_chemistry.a_units * \
        (my_chemistry.length_units / my_chemistry.a_value) / \
        my_chemistry.time_units

    rval = my_chemistry.initialize()

    fc = FluidContainer(my_chemistry, 1)
    fc["density"][:] = density

    tiny_number = 1.0e-20
    if my_chemistry.primordial_chemistry > 0:
        # these are in mass_density
        fc["HI"][:] = 0.76 * fc["density"] /3.
        fc["HII"][:] =  0.76 * fc["density"] /3.
        fc["HeI"][:] =  (1 - 0.76) * fc["density"] /2.
        fc["HeII"][:] =  (1 - 0.76) * fc["density"] /2.
        fc["HeIII"][:] =  tiny_number

    if my_chemistry.primordial_chemistry > 1:

        fc["H2I"][:]  = 0.76 * fc["density"] /3.
        fc["H2II"][:] = tiny_number
        fc["HM"][:]   = tiny_number

        fc["de"][:] = fc["HII"][:] + fc["HeII"][:]/4. + fc["HeIII"][:]/4.*2.0

    if my_chemistry.primordial_chemistry > 2:
        fc["DI"][:] = 2.0 * 3.4e-5 * fc["density"]
        fc["DII"][:] = tiny_number * fc["density"]
        fc["HDI"][:] = tiny_number * fc["density"]
    if my_chemistry.metal_cooling == 1:
        fc["metal"][:] = 0.1 * fc["density"] * \
          my_chemistry.SolarMetalFractionByMass

    fc["x-velocity"][:] = 0.0
    fc["y-velocity"][:] = 0.0
    fc["z-velocity"][:] = 0.0

    fc["energy"][:] = initial_temperature / \
        fc.chemistry_data.temperature_units
    fc.calculate_temperature()
    fc["energy"][:] *= initial_temperature / fc["temperature"]

    tic = timeit.default_timer()
    # let gas cool at constant density
    data = pygrackle.evolve_constant_density(
        fc, final_time=final_time,
        safety_factor=safety_factor)
    toc = timeit.default_timer()
    run_time = toc - tic
    print("time lapsed", run_time)

    # convert grackle language to dengo language
    name_map_dict = { 'HI':'H_1',
                  'HII':'H_2',
                  'HeI':'He_1',
                  'HeII':'He_2',
                  'HeIII':'He_3',
                  'H2I' : 'H2_1',
                  'H2II': 'H2_2',
                  'HM' : 'H_m0',
                    'de':'de',
                    'temperature':'T',
                    'time': 't',
                    'energy':'ge'}

    weight_map_dict = { 'HI':1.00794,
                  'HII':1.00794,
                  'HeI':4.002602,
                  'HeII':4.002602,
                  'HeIII':4.002602,
                   'H2II': 2.01588,
                   'H2I' : 2.01588,
                   'HM' : 1.00794,
                    'de':1.00794,
                      'time': 1.0,
                      'temperature': 1.0,
                      'energy': 1.0}

    data_grackle = {}
    for key in name_map_dict.keys():
        key_dengo = name_map_dict[key]
        if key_dengo in ["t","T","ge"]:
            data_grackle[key_dengo] = data[key].value
        else:
            data_grackle[key_dengo] = data[key].value / weight_map_dict[key] / u.amu_cgs.value
    save_obj(data_grackle, 'grackle_data')
    return data_grackle, run_time
Exemple #5
0
            fc["HDI"][:] = tiny_number * fc["density"]
        if my_chemistry.metal_cooling == 1:
            fc["metal"][:] = metal_fraction * fc["density"] 


        fc["x-velocity"][:] = 0.0
        fc["y-velocity"][:] = 0.0
        fc["z-velocity"][:] = 0.0
  
        fc["energy"][:] = initial_temperature / \
            fc.chemistry_data.temperature_units
        fc.calculate_temperature()
        fc["energy"][:] *= initial_temperature / fc["temperature"]


        # let gas cool at constant density
        data = evolve_constant_density(
            fc, final_time=final_time,
            safety_factor=safety_factor, verbose=False, ignore_time_evolution = True)

        
        eq_temperature[i] = data["temperature"][-1]
        eq_density[i]     = data["density"][-1]
        eq_n_density[i]   = data["density"][-1] / (fc.calculate_mean_molecular_weight()[0] * mass_hydrogen_cgs)
        eq_pressure[i]    = data["pressure"][-1]

        file.write("%8.8E %8.8E %8.8E %8.8E\n"%(eq_n_density[i], eq_density[i], eq_temperature[i], eq_pressure[i]))
        i = i + 1
        
    file.close()
def cooling_cell(density=12.2,
                 initial_temperature=2.0E4,
                 final_time=30.0,
                 metal_fraction=4.0E-4,
                 make_plot=False,
                 save_output=False,
                 primordial_chemistry=2,
                 outname=None,
                 save_H2_fraction=False,
                 return_result=False,
                 verbose=False,
                 H2_converge=None,
                 *args,
                 **kwargs):

    current_redshift = 0.

    # Set solver parameters
    my_chemistry = chemistry_data()
    my_chemistry.use_grackle = 1
    my_chemistry.with_radiative_cooling = 1
    my_chemistry.primordial_chemistry = primordial_chemistry
    my_chemistry.metal_cooling = 1
    my_chemistry.UVbackground = 1
    my_chemistry.self_shielding_method = 3

    if primordial_chemistry > 1:
        my_chemistry.H2_self_shielding = 2
        my_chemistry.h2_on_dust = 1
        my_chemistry.three_body_rate = 4

    grackle_dir = "/home/aemerick/code/grackle-emerick/"
    my_chemistry.grackle_data_file = os.sep.join(  #['/home/aemerick/code/grackle-emerick/input/CloudyData_UVB=HM2012.h5'])
        [grackle_dir, "input", "CloudyData_UVB=HM2012_shielded.h5"])

    # set the factors
    my_chemistry.LW_factor = kwargs.get("LW_factor", 1.0)
    my_chemistry.k27_factor = kwargs.get("k27_factor", 1.0)
    #if 'LW_factor' in kwargs.keys():
    #    my_chemistry.LW_factor = kwargs['LW_factor']
    #else:
    #    my_chemistry.LW_factor = 1.0

    #if 'k27_factor' in kwargs.keys():
    #    my_chemistry.k27_factor = kwargs['k27_factor']
    #else:
    #    my_chemistry.k27_factor = 1.0

    # Set units
    my_chemistry.comoving_coordinates = 0  # proper units
    my_chemistry.a_units = 1.0
    my_chemistry.a_value = 1. / (1. + current_redshift) / \
        my_chemistry.a_units
    my_chemistry.density_units = mass_hydrogen_cgs  # rho = 1.0 is 1.67e-24 g
    my_chemistry.length_units = cm_per_mpc  # 1 Mpc in cm
    my_chemistry.time_units = sec_per_Myr  # 1 Myr in s
    my_chemistry.velocity_units = my_chemistry.a_units * \
        (my_chemistry.length_units / my_chemistry.a_value) / \
        my_chemistry.time_units

    rval = my_chemistry.initialize()

    fc = FluidContainer(my_chemistry, 1)
    fc["density"][:] = density
    if my_chemistry.primordial_chemistry > 0:
        fc["HI"][:] = 0.76 * fc["density"]
        fc["HII"][:] = tiny_number * fc["density"]
        fc["HeI"][:] = (1.0 - 0.76) * fc["density"]
        fc["HeII"][:] = tiny_number * fc["density"]
        fc["HeIII"][:] = tiny_number * fc["density"]
    if my_chemistry.primordial_chemistry > 1:
        fc["H2I"][:] = tiny_number * fc["density"]
        fc["H2II"][:] = tiny_number * fc["density"]
        fc["HM"][:] = tiny_number * fc["density"]
        fc["de"][:] = tiny_number * fc["density"]
        fc['H2_self_shielding_length'][:] = 1.8E-6
    if my_chemistry.primordial_chemistry > 2:
        fc["DI"][:] = 2.0 * 3.4e-5 * fc["density"]
        fc["DII"][:] = tiny_number * fc["density"]
        fc["HDI"][:] = tiny_number * fc["density"]
    if my_chemistry.metal_cooling == 1:
        fc["metal"][:] = metal_fraction * fc["density"] * \
          my_chemistry.SolarMetalFractionByMass

    fc["x-velocity"][:] = 0.0
    fc["y-velocity"][:] = 0.0
    fc["z-velocity"][:] = 0.0

    fc["energy"][:] = initial_temperature / \
        fc.chemistry_data.temperature_units
    fc.calculate_temperature()
    fc["energy"][:] *= initial_temperature / fc["temperature"]

    # timestepping safety factor
    safety_factor = 0.001

    # let gas cool at constant density

    #if verbose:
    print("Beginning Run")
    data = evolve_constant_density(fc,
                                   final_time=final_time,
                                   H2_converge=H2_converge,
                                   safety_factor=safety_factor,
                                   verbose=verbose)
    #else:
    #    print "Beginning Run"

    #    with NoStdStreams():
    #        data = evolve_constant_density(
    #            fc, final_time=final_time, H2_converge = 1.0E-6,
    #            safety_factor=safety_factor)
    #    print "Ending Run"

    if make_plot:
        p1, = plt.loglog(data["time"].to("Myr"),
                         data["temperature"],
                         color="black",
                         label="T")
        plt.xlabel("Time [Myr]")
        plt.ylabel("T [K]")

        data["mu"] = data["temperature"] / \
            (data["energy"] * (my_chemistry.Gamma - 1.) *
             fc.chemistry_data.temperature_units)
        plt.twinx()
        p2, = plt.semilogx(data["time"].to("Myr"),
                           data["mu"],
                           color="red",
                           label="$\\mu$")
        plt.ylabel("$\\mu$")
        plt.legend([p1, p2], ["T", "$\\mu$"], fancybox=True, loc="center left")
        plt.savefig("cooling_cell.png")

    # save data arrays as a yt dataset
    if outname is None:
        outname = 'cooling_cell_%.2f_%.2f' % (my_chemistry.k27_factor,
                                              my_chemistry.LW_factor)

    if save_output:

        yt.save_as_dataset({}, outname + '.h5', data)

    if my_chemistry.primordial_chemistry > 1:
        H2_fraction = (data['H2I'] + data['H2II']) / data['density']
    else:
        H2_fraction = np.zeros(np.size(data['density']))

    if save_H2_fraction:
        #np.savetxt(outname + ".dat", [data['time'], H2_fraction])

        f = open("all_runs_d_%.2f.dat" % (density), "a")
        #        f.write("# k27 LW f_H2 T time\n")
        f.write("%8.8E %8.8E %8.8E %8.8E %8.8E \n" %
                (my_chemistry.k27_factor, my_chemistry.LW_factor,
                 H2_fraction[-1], data['temperature'][-1], data['time'][-1]))
        f.close()

    if return_result:
        return data
    else:
        return