예제 #1
0
    def __init__(self):
        primordial_simplified = ChemicalNetwork()
        primordial_simplified.add_reaction("k01")
        primordial_simplified.add_reaction("k22")

        primordial_simplified.add_cooling("h2formation")
        primordial_simplified.add_cooling("gloverabel08")

        self.network = primordial_simplified
        self.solution = TestChemicalNetworkSolution()
예제 #2
0
primordial.add_reaction("k09")
primordial.add_reaction("k10")
primordial.add_reaction("k11")
primordial.add_reaction("k12")
primordial.add_reaction("k13")
primordial.add_reaction("k14")
primordial.add_reaction("k15")
primordial.add_reaction("k16")
primordial.add_reaction("k17")
primordial.add_reaction("k18")
primordial.add_reaction("k19")
primordial.add_reaction("k21")
primordial.add_reaction("k22")
primordial.add_reaction("k23")

primordial.add_cooling("brem")
primordial.add_cooling("reHII")
primordial.add_cooling("reHeIII")
primordial.add_cooling("gloverabel08")
primordial.add_cooling("ceHI")
primordial.add_cooling("h2formation")
primordial.add_cooling("reHeII2")
primordial.add_cooling("reHeII1")
primordial.add_cooling("ciHeIS")
primordial.add_cooling("ceHeII")
primordial.add_cooling("ciHI")
primordial.add_cooling("ceHeI")
primordial.add_cooling("gammah")
primordial.add_cooling("ciHeI")
primordial.add_cooling("ciHeII")
예제 #3
0
def setup_network():
    """Initial a ChemicalNetwork object
       for primordial network 9-species model
    Return:
        primordial: ChemicalNetwork with primordial reactions and cooling
    """
    # this register all the rates specified in `primordial_rates.py`
    dengo.primordial_rates.setup_primordial()

    # initialize the chmical network object
    primordial = ChemicalNetwork()

    # add all the reactions
    primordial.add_reaction("k01")
    primordial.add_reaction("k02")
    primordial.add_reaction("k03")
    primordial.add_reaction("k04")
    primordial.add_reaction("k05")
    primordial.add_reaction("k06")
    primordial.add_reaction("k07")
    primordial.add_reaction("k08")
    primordial.add_reaction("k09")
    primordial.add_reaction("k10")
    primordial.add_reaction("k11")
    primordial.add_reaction("k12")
    primordial.add_reaction("k13")
    primordial.add_reaction("k14")
    primordial.add_reaction("k15")
    primordial.add_reaction("k16")
    primordial.add_reaction("k17")
    primordial.add_reaction("k18")
    primordial.add_reaction("k19")
    primordial.add_reaction("k21")
    primordial.add_reaction("k22")
    primordial.add_reaction("k23")

    primordial.add_cooling("brem")
    primordial.add_cooling("reHII")
    primordial.add_cooling("reHeIII")
    primordial.add_cooling("gloverabel08")
    primordial.add_cooling("ceHI")
    primordial.add_cooling("h2formation")
    primordial.add_cooling("h2formation_extra")
    primordial.add_cooling("reHeII2")
    primordial.add_cooling("reHeII1")
    primordial.add_cooling("ciHeIS")
    primordial.add_cooling("ceHeII")
    primordial.add_cooling("ciHI")
    primordial.add_cooling("ceHeI")
    primordial.add_cooling("gammah")
    primordial.add_cooling("ciHeI")
    primordial.add_cooling("ciHeII")
    primordial.add_cooling("cie_cooling")
    primordial.add_cooling("compton")

    # This defines the temperature range for the rate tables
    primordial.init_temperature((1e0, 1e8))
    primordial.enforce_conservation = True
    return primordial
예제 #4
0
import dengo.oxygen_rates, dengo.oxygen_cooling
from dengo.chemistry_constants import tiny, kboltz, mh
from dengo.known_species import *

NCELLS = 4
density = 1.0
temperature = np.logspace(4, 6.7, NCELLS)
temperature[:] = 1e7
X = 1e-3

oxygen = ChemicalNetwork()
oxygen.add_energy_term()

for ca in cooling_registry.values():
    if ca.name.startswith("O"):
        oxygen.add_cooling(ca)

for s in reaction_registry.values():
    if s.name.startswith("O"):
        oxygen.add_reaction(s)

# This defines the temperature range for the rate tables
oxygen.init_temperature((1e0, 1e8))

tiny = 1e-10

init_array = np.ones(NCELLS) * density
init_values = dict()
init_values['OII'] = X * init_array
init_values['OIII'] = init_array * X
init_values['OIV'] = init_array * X
from dengo.chemistry_constants import tiny, kboltz, mh
from dengo.known_species import *

# If only a subset of species are wanted put them here
# and change the commented lines below
want = ("HI", "HII", "de", "ge")

primordial = ChemicalNetwork()
primordial.add_energy_term()

# Set to false if intermediate solution output is not wanted
primordial.write_intermediate_solutions = True

for ca in cooling_registry.values():
    #if not all(sp.name in want for sp in ca.species): continue
    primordial.add_cooling(ca)

for i, rname in enumerate(sorted(reaction_registry)):
    s = reaction_registry[rname]
    #if not all(sp.name in want for sp in s.species): continue
    primordial.add_reaction(s)

# This defines the temperature range for the rate tables
primordial.init_temperature((1e0, 1e8))

# Generate initial conditions (switch to False to disable this)
generate_initial_conditions = True

if generate_initial_conditions:
    import numpy as np
    NCELLS = 4
예제 #6
0
temperature = np.logspace(4, 6.7, NCELLS)
temperature[:] = 5e6
X = 1e-3

combined = ChemicalNetwork()
combined.add_energy_term()

for ca in cooling_registry.values():
    if ca.name.startswith("C") \
    or ca.name.startswith("N") \
    or ca.name.startswith("O") \
    or ca.name.startswith("Ne") \
    or ca.name.startswith("Mg") \
    or ca.name.startswith("Si") \
    or ca.name.startswith("S"):
        combined.add_cooling(ca)

combined.add_cooling("brem")
combined.add_cooling("reHII")
combined.add_cooling("reHeIII")
combined.add_cooling("ceHI")
combined.add_cooling("reHeII2")
combined.add_cooling("reHeII1")
combined.add_cooling("ciHeIS")
combined.add_cooling("ceHeII")
combined.add_cooling("ciHI")
combined.add_cooling("ceHeI")
combined.add_cooling("ciHeI")
combined.add_cooling("ciHeII")

for r in reaction_registry.values():
def Init_values(temperature, density, n_species=9, cooling=True):
    """ Create a initial value dictionary,
        for a given temperature, density, number of species
    Args:
        temperature -- in Kelvin
        density     -- in amu / cm**3
        n_species   -- number of species (6/9)
        cooling

    Returns:
        init_values: initial value dictionary with
                     self-consistent energy/ electron density
        primordial : chemical_network classes

    """

    # initialize and setup the network
    dengo.primordial_rates.setup_primordial()
    primordial = ChemicalNetwork()

    if n_species == 9:
        for i in range(23):
            try:
                primordial.add_reaction("k{0:02d}".format(i + 1))
            except:
                pass
    else:
        for i in range(6):
            try:
                primordial.add_reaction("k{0:02d}".format(i + 1))
            except:
                pass

    # the temperature array required to interpolates the rates
    primordial.init_temperature((1e0, 1e5))

    tiny = 1.0e-20

    # init_array are is in fractional abundances
    init_values = dict()

    if n_species == 6:
        # 6-species model
        init_values["He_1"] = density * (1.0 - 0.76) / 2.
        init_values["He_2"] = density * (1.0 - 0.76) / 2.
        init_values["He_3"] = np.array([tiny])
        init_values["H_1"] = density * (0.76) / 2.
        init_values['H_2'] = density * (0.76) / 2.
    else:
        # 9-species model
        init_values["He_1"] = density * (1.0 - 0.76) / 2.0
        init_values["He_2"] = density * (1.0 - 0.76) / 2.0
        init_values["He_3"] = np.array([tiny])
        init_values["H_1"] = density * (0.76) / 3.
        init_values['H_2'] = density * (0.76) / 3.

        init_values["H_m0"] = np.array([tiny])
        init_values["H2_1"] = density * (0.76) / 3.
        init_values["H2_2"] = np.array([tiny])

    # now everything in mass density
    init_values['de'] = primordial.calculate_free_electrons(init_values)
    # one signle value: again mass density
    init_values['density'] = primordial.calculate_total_density(init_values)

    num_den = {}
    for sp in primordial.required_species:
        try:
            num_den[sp.name] = init_values[sp.name] / sp.weight
        except:
            pass

    # set up initial temperatures values used to define ge
    init_values['T'] = temperature

    # calculate gammaH2
    x = 6100.0 / temperature
    gammaH2 = 2.0 / (5.0 + 2.0 * x * x / (numpy.exp(x) - 1)**2.0) + 1

    gamma_factor = primordial.gamma_factor().subs(num_den).subs({
        'gammaH2':
        gammaH2,
        'gamma':
        5. / 3.,
        'T':
        temperature
    })

    ge = ((temperature * kboltz) * gamma_factor /
          (init_values['density'] * mh))

    T = init_values['density'] * ge * mh / kboltz / gamma_factor
    print("difference in temperature:", T - temperature)
    init_values['ge'] = numpy.array([numpy.float64(ge)])

    if cooling:
        for cooling_action in cooling_registry:
            k = cooling_registry[cooling_action]
            if (k.species).issubset(primordial.required_species):
                if k.name != "cie_cooling":
                    print("adding:", k.name, k.equation)
                    primordial.add_cooling(cooling_action)
                    print('---------------------------')
    return init_values, primordial
density = 1e-3 * 1.67e-24
temperature = np.logspace(4, 6.7, NCELLS)
temperature[:] = 5e6
X = 1e-3

ion_by_ion = ChemicalNetwork(write_intermediate = False,
                             stop_time = 3.1557e13)
ion_by_ion.add_species("de")

#for atom in ["O", "C", "Si", "Mg", "N", "S", "He", "Ne", "H"]:
for atom in ["H", "O", "He"]:
    s, c, r = setup_ionization(atom)
    ion_by_ion.add_collection(s, c, r)
    #ion_by_ion.add_collection(s, [], r)

ion_by_ion.add_cooling('compton')

#s, c, r = setup_primordial()
#ion_by_ion.add_collection(s, c, r)

# This defines the temperature range for the rate tables
ion_by_ion.init_temperature((1e0, 1e12))

# This defines the redsfhit range for the rate tables
ion_by_ion.init_redshift((0.0, 9.0))

# Want intermediate output?
#combined.write_intermediate_solutions = True

tiny = 1e-10